From ed2cadf30df0e7af10397bd21eb3abeb0964d9dd Mon Sep 17 00:00:00 2001 From: Copybara Date: Thu, 14 Nov 2024 17:54:03 -0500 Subject: [PATCH] Project import generated by Copybara. GitOrigin-RevId: 7a1c4c2aea4e5abb9a59bbdf4df8ac959c643d7e --- javascript/on-demand/.gitignore | 3 + javascript/on-demand/README.md | 40 + javascript/on-demand/firebase.json | 9 + javascript/on-demand/package.json | 40 + javascript/on-demand/src/accounts/index.ts | 7 + javascript/on-demand/src/accounts/lutMap.ts | 166 + javascript/on-demand/src/accounts/oracle.ts | 565 ++ .../on-demand/src/accounts/permission.ts | 54 + javascript/on-demand/src/accounts/pullFeed.ts | 1426 +++ javascript/on-demand/src/accounts/queue.ts | 840 ++ .../on-demand/src/accounts/randomness.ts | 430 + javascript/on-demand/src/accounts/state.ts | 215 + .../on-demand/src/anchor-utils/AnchorUtils.ts | 159 + .../on-demand/src/anchor-utils/index.ts | 1 + javascript/on-demand/src/constants.ts | 22 + javascript/on-demand/src/event-utils/index.ts | 43 + javascript/on-demand/src/evm/index.ts | 702 ++ javascript/on-demand/src/evm/message.ts | 145 + javascript/on-demand/src/index.ts | 13 + .../src/instruction-utils/InstructionUtils.ts | 93 + .../on-demand/src/instruction-utils/index.ts | 1 + .../src/oracle-interfaces/gateway.ts | 804 ++ .../on-demand/src/oracle-interfaces/index.ts | 1 + .../on-demand/src/sysvars/associatedToken.ts | 25 + javascript/on-demand/src/sysvars/index.ts | 2 + .../on-demand/src/sysvars/recentSlothashes.ts | 61 + .../on-demand/src/utils/TypescriptUtils.ts | 3 + javascript/on-demand/src/utils/index.ts | 307 + javascript/on-demand/tsconfig.cjs.json | 8 + javascript/on-demand/tsconfig.json | 28 + rust/switchboard-on-demand-client/Cargo.lock | 5197 ++++++++++ rust/switchboard-on-demand-client/Cargo.toml | 35 + rust/switchboard-on-demand-client/README.md | 63 + .../src/accounts/mod.rs | 8 + .../src/accounts/oracle.rs | 106 + .../src/accounts/pull_feed.rs | 169 + .../src/accounts/queue.rs | 137 + .../src/accounts/state.rs | 53 + .../src/associated_token_account.rs | 71 + .../src/crossbar.rs | 245 + .../src/gateway.rs | 260 + .../src/instructions/mod.rs | 10 + .../pull_feed_submit_response_ix.rs | 63 + .../pull_feed_submit_response_many_ix.rs | 58 + rust/switchboard-on-demand-client/src/lib.rs | 65 + rust/switchboard-on-demand-client/src/lut.rs | 237 + .../src/lut_owner.rs | 99 + .../src/oracle_job.rs | 6005 ++++++++++++ .../src/oracle_job.serde.rs | 8611 +++++++++++++++++ .../src/pull_feed.rs | 473 + .../src/recent_slothashes.rs | 32 + rust/switchboard-on-demand/.env | 1 + rust/switchboard-on-demand/.gitignore | 3 + rust/switchboard-on-demand/Cargo.lock | 6269 ++++++++++++ rust/switchboard-on-demand/Cargo.toml | 61 + rust/switchboard-on-demand/DOCS.md | 37 + rust/switchboard-on-demand/README.md | 67 + rust/switchboard-on-demand/firebase.json | 14 + rust/switchboard-on-demand/package.json | 12 + .../.github/workflows/rust.yml | 156 + .../ahash-0.8.4-stdsimd.patch/.gitignore | 3 + .../ahash-0.8.4-stdsimd.patch/Cargo.toml | 103 + .../patches/ahash-0.8.4-stdsimd.patch/FAQ.md | 118 + .../ahash-0.8.4-stdsimd.patch/LICENSE-APACHE | 201 + .../ahash-0.8.4-stdsimd.patch/LICENSE-MIT | 25 + .../ahash-0.8.4-stdsimd.patch/README.md | 108 + .../benchmark_tools/Cargo.toml | 13 + .../benchmark_tools/benchmark_tools.iml | 12 + .../benchmark_tools/src/data_reader.rs | 51 + .../benchmark_tools/src/main.rs | 34 + .../benchmark_tools/src/persisting_hasher.rs | 144 + .../ahash-0.8.4-stdsimd.patch/build.rs | 23 + .../compare/Cargo.toml | 43 + .../compare/Table.png | Bin 0 -> 281849 bytes .../compare/readme.md | 123 + .../compare/resources/sheet.css | 1 + .../compare/tests/compare.rs | 136 + .../ahash-0.8.4-stdsimd.patch/rustfmt.toml | 1 + .../smhasher/ahash-cbindings/Cargo.toml | 20 + .../smhasher/ahash-cbindings/install.sh | 1 + .../smhasher/ahash-cbindings/src/lib.rs | 12 + .../smhasher/ahashOutput.txt | 1137 +++ .../smhasher/clone_smhasher.sh | 1 + .../smhasher/fallbackNoFoldedOutput.txt | 1137 +++ .../smhasher/fallbackOutput.txt | 1516 +++ .../ahash-0.8.4-stdsimd.patch/src/aes_hash.rs | 434 + .../ahash-0.8.4-stdsimd.patch/src/convert.rs | 162 + .../src/fallback_hash.rs | 368 + .../ahash-0.8.4-stdsimd.patch/src/hash_map.rs | 501 + .../src/hash_quality_test.rs | 534 + .../ahash-0.8.4-stdsimd.patch/src/hash_set.rs | 352 + .../ahash-0.8.4-stdsimd.patch/src/lib.rs | 398 + .../src/operations.rs | 378 + .../src/random_state.rs | 529 + .../src/specialize.rs | 218 + .../ahash-0.8.4-stdsimd.patch/tests/bench.rs | 198 + .../tests/map_tests.rs | 234 + .../tests/nopanic.rs | 81 + .../.github/workflows/rust.yml | 169 + .../ahash-0.8.5-stdsimd.patch/.gitignore | 3 + .../ahash-0.8.5-stdsimd.patch/Cargo.toml | 103 + .../patches/ahash-0.8.5-stdsimd.patch/FAQ.md | 118 + .../ahash-0.8.5-stdsimd.patch/LICENSE-APACHE | 201 + .../ahash-0.8.5-stdsimd.patch/LICENSE-MIT | 25 + .../ahash-0.8.5-stdsimd.patch/README.md | 108 + .../benchmark_tools/Cargo.toml | 13 + .../benchmark_tools/benchmark_tools.iml | 12 + .../benchmark_tools/src/data_reader.rs | 51 + .../benchmark_tools/src/main.rs | 34 + .../benchmark_tools/src/persisting_hasher.rs | 144 + .../ahash-0.8.5-stdsimd.patch/build.rs | 23 + .../compare/Cargo.toml | 43 + .../compare/Table.png | Bin 0 -> 281849 bytes .../compare/readme.md | 123 + .../compare/resources/sheet.css | 1 + .../compare/tests/compare.rs | 136 + .../ahash-0.8.5-stdsimd.patch/rustfmt.toml | 1 + .../smhasher/ahash-cbindings/Cargo.toml | 20 + .../smhasher/ahash-cbindings/install.sh | 1 + .../smhasher/ahash-cbindings/src/lib.rs | 12 + .../smhasher/ahashOutput.txt | 1137 +++ .../smhasher/clone_smhasher.sh | 1 + .../smhasher/fallbackNoFoldedOutput.txt | 1137 +++ .../smhasher/fallbackOutput.txt | 1516 +++ .../ahash-0.8.5-stdsimd.patch/src/aes_hash.rs | 434 + .../ahash-0.8.5-stdsimd.patch/src/convert.rs | 162 + .../src/fallback_hash.rs | 368 + .../ahash-0.8.5-stdsimd.patch/src/hash_map.rs | 501 + .../src/hash_quality_test.rs | 534 + .../ahash-0.8.5-stdsimd.patch/src/hash_set.rs | 352 + .../ahash-0.8.5-stdsimd.patch/src/lib.rs | 398 + .../src/operations.rs | 376 + .../src/random_state.rs | 529 + .../src/specialize.rs | 218 + .../ahash-0.8.5-stdsimd.patch/tests/bench.rs | 198 + .../tests/map_tests.rs | 234 + .../tests/nopanic.rs | 81 + .../scripts/compile_docs.ts | 65 + rust/switchboard-on-demand/src/accounts.rs | 1 + .../src/anchor_traits.rs | 38 + .../src/client/event_client.rs | 322 + rust/switchboard-on-demand/src/client/mod.rs | 8 + .../src/client/transaction_builder.rs | 817 ++ .../switchboard-on-demand/src/client/utils.rs | 345 + rust/switchboard-on-demand/src/clock.rs | 15 + rust/switchboard-on-demand/src/decimal.rs | 220 + .../switchboard-on-demand/src/instructions.rs | 1 + rust/switchboard-on-demand/src/lib.rs | 45 + rust/switchboard-on-demand/src/macros.rs | 143 + .../src/on_demand/accounts/mod.rs | 12 + .../src/on_demand/accounts/oracle.rs | 314 + .../src/on_demand/accounts/oracle_stats.rs | 70 + .../src/on_demand/accounts/pull_feed.rs | 339 + .../src/on_demand/accounts/queue.rs | 198 + .../src/on_demand/accounts/randomness.rs | 77 + .../src/on_demand/accounts/state.rs | 90 + .../src/on_demand/error.rs | 73 + .../instructions/guardian_quote_verify.rs | 109 + .../src/on_demand/instructions/mod.rs | 12 + .../instructions/oracle_heartbeat.rs | 149 + .../instructions/oracle_set_configs.rs | 65 + .../on_demand/instructions/permission_set.rs | 71 + .../instructions/queue_garbage_collect.rs | 53 + .../instructions/randomness_commit.rs | 123 + .../src/on_demand/mod.rs | 72 + .../src/on_demand/types.rs | 49 + rust/switchboard-on-demand/src/prelude.rs | 22 + rust/switchboard-on-demand/src/program_id.rs | 39 + .../src/sysvar/address_lookup_table.rs | 37 + rust/switchboard-on-demand/src/sysvar/mod.rs | 3 + rust/switchboard-on-demand/src/types.rs | 3 + rust/switchboard-on-demand/src/utils.rs | 45 + 172 files changed, 57742 insertions(+) create mode 100644 javascript/on-demand/.gitignore create mode 100644 javascript/on-demand/README.md create mode 100644 javascript/on-demand/firebase.json create mode 100644 javascript/on-demand/package.json create mode 100644 javascript/on-demand/src/accounts/index.ts create mode 100644 javascript/on-demand/src/accounts/lutMap.ts create mode 100644 javascript/on-demand/src/accounts/oracle.ts create mode 100644 javascript/on-demand/src/accounts/permission.ts create mode 100644 javascript/on-demand/src/accounts/pullFeed.ts create mode 100644 javascript/on-demand/src/accounts/queue.ts create mode 100644 javascript/on-demand/src/accounts/randomness.ts create mode 100644 javascript/on-demand/src/accounts/state.ts create mode 100644 javascript/on-demand/src/anchor-utils/AnchorUtils.ts create mode 100644 javascript/on-demand/src/anchor-utils/index.ts create mode 100644 javascript/on-demand/src/constants.ts create mode 100644 javascript/on-demand/src/event-utils/index.ts create mode 100644 javascript/on-demand/src/evm/index.ts create mode 100644 javascript/on-demand/src/evm/message.ts create mode 100644 javascript/on-demand/src/index.ts create mode 100644 javascript/on-demand/src/instruction-utils/InstructionUtils.ts create mode 100644 javascript/on-demand/src/instruction-utils/index.ts create mode 100644 javascript/on-demand/src/oracle-interfaces/gateway.ts create mode 100644 javascript/on-demand/src/oracle-interfaces/index.ts create mode 100644 javascript/on-demand/src/sysvars/associatedToken.ts create mode 100644 javascript/on-demand/src/sysvars/index.ts create mode 100644 javascript/on-demand/src/sysvars/recentSlothashes.ts create mode 100644 javascript/on-demand/src/utils/TypescriptUtils.ts create mode 100644 javascript/on-demand/src/utils/index.ts create mode 100644 javascript/on-demand/tsconfig.cjs.json create mode 100644 javascript/on-demand/tsconfig.json create mode 100644 rust/switchboard-on-demand-client/Cargo.lock create mode 100644 rust/switchboard-on-demand-client/Cargo.toml create mode 100644 rust/switchboard-on-demand-client/README.md create mode 100644 rust/switchboard-on-demand-client/src/accounts/mod.rs create mode 100644 rust/switchboard-on-demand-client/src/accounts/oracle.rs create mode 100644 rust/switchboard-on-demand-client/src/accounts/pull_feed.rs create mode 100644 rust/switchboard-on-demand-client/src/accounts/queue.rs create mode 100644 rust/switchboard-on-demand-client/src/accounts/state.rs create mode 100644 rust/switchboard-on-demand-client/src/associated_token_account.rs create mode 100644 rust/switchboard-on-demand-client/src/crossbar.rs create mode 100644 rust/switchboard-on-demand-client/src/gateway.rs create mode 100644 rust/switchboard-on-demand-client/src/instructions/mod.rs create mode 100644 rust/switchboard-on-demand-client/src/instructions/pull_feed_submit_response_ix.rs create mode 100644 rust/switchboard-on-demand-client/src/instructions/pull_feed_submit_response_many_ix.rs create mode 100644 rust/switchboard-on-demand-client/src/lib.rs create mode 100644 rust/switchboard-on-demand-client/src/lut.rs create mode 100644 rust/switchboard-on-demand-client/src/lut_owner.rs create mode 100644 rust/switchboard-on-demand-client/src/oracle_job.rs create mode 100644 rust/switchboard-on-demand-client/src/oracle_job.serde.rs create mode 100644 rust/switchboard-on-demand-client/src/pull_feed.rs create mode 100644 rust/switchboard-on-demand-client/src/recent_slothashes.rs create mode 100644 rust/switchboard-on-demand/.env create mode 100644 rust/switchboard-on-demand/.gitignore create mode 100644 rust/switchboard-on-demand/Cargo.lock create mode 100644 rust/switchboard-on-demand/Cargo.toml create mode 100644 rust/switchboard-on-demand/DOCS.md create mode 100644 rust/switchboard-on-demand/README.md create mode 100644 rust/switchboard-on-demand/firebase.json create mode 100644 rust/switchboard-on-demand/package.json create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/.github/workflows/rust.yml create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/.gitignore create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/Cargo.toml create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/FAQ.md create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/LICENSE-APACHE create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/LICENSE-MIT create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/README.md create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/benchmark_tools/Cargo.toml create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/benchmark_tools/benchmark_tools.iml create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/benchmark_tools/src/data_reader.rs create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/benchmark_tools/src/main.rs create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/benchmark_tools/src/persisting_hasher.rs create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/build.rs create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/compare/Cargo.toml create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/compare/Table.png create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/compare/readme.md create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/compare/resources/sheet.css create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/compare/tests/compare.rs create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/rustfmt.toml create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/smhasher/ahash-cbindings/Cargo.toml create mode 100755 rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/smhasher/ahash-cbindings/install.sh create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/smhasher/ahash-cbindings/src/lib.rs create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/smhasher/ahashOutput.txt create mode 100755 rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/smhasher/clone_smhasher.sh create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/smhasher/fallbackNoFoldedOutput.txt create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/smhasher/fallbackOutput.txt create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/src/aes_hash.rs create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/src/convert.rs create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/src/fallback_hash.rs create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/src/hash_map.rs create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/src/hash_quality_test.rs create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/src/hash_set.rs create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/src/lib.rs create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/src/operations.rs create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/src/random_state.rs create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/src/specialize.rs create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/tests/bench.rs create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/tests/map_tests.rs create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/tests/nopanic.rs create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/.github/workflows/rust.yml create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/.gitignore create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/Cargo.toml create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/FAQ.md create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/LICENSE-APACHE create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/LICENSE-MIT create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/README.md create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/benchmark_tools/Cargo.toml create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/benchmark_tools/benchmark_tools.iml create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/benchmark_tools/src/data_reader.rs create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/benchmark_tools/src/main.rs create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/benchmark_tools/src/persisting_hasher.rs create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/build.rs create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/compare/Cargo.toml create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/compare/Table.png create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/compare/readme.md create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/compare/resources/sheet.css create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/compare/tests/compare.rs create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/rustfmt.toml create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/smhasher/ahash-cbindings/Cargo.toml create mode 100755 rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/smhasher/ahash-cbindings/install.sh create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/smhasher/ahash-cbindings/src/lib.rs create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/smhasher/ahashOutput.txt create mode 100755 rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/smhasher/clone_smhasher.sh create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/smhasher/fallbackNoFoldedOutput.txt create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/smhasher/fallbackOutput.txt create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/src/aes_hash.rs create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/src/convert.rs create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/src/fallback_hash.rs create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/src/hash_map.rs create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/src/hash_quality_test.rs create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/src/hash_set.rs create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/src/lib.rs create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/src/operations.rs create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/src/random_state.rs create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/src/specialize.rs create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/tests/bench.rs create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/tests/map_tests.rs create mode 100644 rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/tests/nopanic.rs create mode 100644 rust/switchboard-on-demand/scripts/compile_docs.ts create mode 100644 rust/switchboard-on-demand/src/accounts.rs create mode 100644 rust/switchboard-on-demand/src/anchor_traits.rs create mode 100644 rust/switchboard-on-demand/src/client/event_client.rs create mode 100644 rust/switchboard-on-demand/src/client/mod.rs create mode 100644 rust/switchboard-on-demand/src/client/transaction_builder.rs create mode 100644 rust/switchboard-on-demand/src/client/utils.rs create mode 100644 rust/switchboard-on-demand/src/clock.rs create mode 100644 rust/switchboard-on-demand/src/decimal.rs create mode 100644 rust/switchboard-on-demand/src/instructions.rs create mode 100644 rust/switchboard-on-demand/src/lib.rs create mode 100644 rust/switchboard-on-demand/src/macros.rs create mode 100644 rust/switchboard-on-demand/src/on_demand/accounts/mod.rs create mode 100644 rust/switchboard-on-demand/src/on_demand/accounts/oracle.rs create mode 100644 rust/switchboard-on-demand/src/on_demand/accounts/oracle_stats.rs create mode 100644 rust/switchboard-on-demand/src/on_demand/accounts/pull_feed.rs create mode 100644 rust/switchboard-on-demand/src/on_demand/accounts/queue.rs create mode 100644 rust/switchboard-on-demand/src/on_demand/accounts/randomness.rs create mode 100644 rust/switchboard-on-demand/src/on_demand/accounts/state.rs create mode 100644 rust/switchboard-on-demand/src/on_demand/error.rs create mode 100644 rust/switchboard-on-demand/src/on_demand/instructions/guardian_quote_verify.rs create mode 100644 rust/switchboard-on-demand/src/on_demand/instructions/mod.rs create mode 100644 rust/switchboard-on-demand/src/on_demand/instructions/oracle_heartbeat.rs create mode 100644 rust/switchboard-on-demand/src/on_demand/instructions/oracle_set_configs.rs create mode 100644 rust/switchboard-on-demand/src/on_demand/instructions/permission_set.rs create mode 100644 rust/switchboard-on-demand/src/on_demand/instructions/queue_garbage_collect.rs create mode 100644 rust/switchboard-on-demand/src/on_demand/instructions/randomness_commit.rs create mode 100644 rust/switchboard-on-demand/src/on_demand/mod.rs create mode 100644 rust/switchboard-on-demand/src/on_demand/types.rs create mode 100644 rust/switchboard-on-demand/src/prelude.rs create mode 100644 rust/switchboard-on-demand/src/program_id.rs create mode 100644 rust/switchboard-on-demand/src/sysvar/address_lookup_table.rs create mode 100644 rust/switchboard-on-demand/src/sysvar/mod.rs create mode 100644 rust/switchboard-on-demand/src/types.rs create mode 100644 rust/switchboard-on-demand/src/utils.rs diff --git a/javascript/on-demand/.gitignore b/javascript/on-demand/.gitignore new file mode 100644 index 0000000..ebce63d --- /dev/null +++ b/javascript/on-demand/.gitignore @@ -0,0 +1,3 @@ +index.cjs +index.js +index.d.ts diff --git a/javascript/on-demand/README.md b/javascript/on-demand/README.md new file mode 100644 index 0000000..2c0306f --- /dev/null +++ b/javascript/on-demand/README.md @@ -0,0 +1,40 @@ +
+ +![Switchboard Logo](https://github.com/switchboard-xyz/switchboard/raw/main/website/static/img/icons/switchboard/avatar.png) + +# Switchboard + +
+ +# Switchboard On-Demand (typedoc: https://switchboard-docs.web.app) +See the full documentation at [Switchboard On-Demand Documentation](https://switchboard-labs.gitbook.io/switchboard-on-demand/) + +Switchboard On-Demand is designed to support high-fidelity financial systems. It allows users to specify how data from both on-chain and off-chain sources is ingested and transformed. + +Unlike many pull-based blockchain oracles that manage data consensus on their own Layer 1 (L1) and then propagate it to users—giving oracle operators an advantage—Switchboard Oracles operate inside confidential runtimes. This setup ensures that oracles cannot observe the data they are collecting or the operations they perform, giving the end user a 'first-look' advantage when data is propagated. + +Switchboard On-Demand is ideal for blockchain-based financial applications and services, offering a solution that is cost-effective, trustless, and user-friendly. + +## Key Features: +- **User-Created Oracles**: In Switchboard, users have the flexibility to build their own oracles according to their specific needs. +- **Confidential Runtimes**: Oracle operations are performed in a way that even the oracles themselves cannot observe, ensuring data integrity and user advantage. +- **High-Fidelity Financial Applications**: Designed with financial applications in mind, Switchboard ensures high accuracy and reliability for transactions and data handling. + +## Getting Started +To start building your own on-demand oracle with Switchboard, you can refer to the oracle specification in our [documentation](https://protos.docs.switchboard.xyz/protos/OracleJob). + +### Example Code Snippet: +```typescript +const [pullIx] = await feedAccount.fetchUpdateIx({ numSignatures: 3 }); +const tx = await sb.asV0Tx({ + connection, + ixs: [pullIx], + signers: [payer], + computeUnitPrice: 200_000, + computeUnitLimitMultiple: 1.3, +}); +await program.provider.connection.sendTransaction(tx, { + // preflightCommitment is REQUIRED to be processed or disabled + preflightCommitment: "processed", +}); +``` diff --git a/javascript/on-demand/firebase.json b/javascript/on-demand/firebase.json new file mode 100644 index 0000000..85681e2 --- /dev/null +++ b/javascript/on-demand/firebase.json @@ -0,0 +1,9 @@ +{ + "hosting": [ + { + "site": "switchboard-docs", + "public": "docs", + "rewrites": [{ "source": "**", "destination": "/index.html" }] + } + ] +} diff --git a/javascript/on-demand/package.json b/javascript/on-demand/package.json new file mode 100644 index 0000000..e0ed251 --- /dev/null +++ b/javascript/on-demand/package.json @@ -0,0 +1,40 @@ +{ + "name": "@switchboard-xyz/on-demand", + "version": "1.2.51", + "description": "A Typescript client to interact with Switchboard On-Demand.", + "license": "ISC", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/esm/index.d.ts", + "files": [ + "dist" + ], + "scripts": { + "build": "tsc && tsc --project tsconfig.cjs.json", + "check-types": "tsc --noEmit", + "docgen": "typedoc --out ./docs/ ./src", + "docgen:deploy": "pnpm docgen && firebase deploy --project docs --only hosting:switchboard-docs", + "prepack": "pnpm build", + "test": "pnpm exec jest --passWithNoTests" + }, + "dependencies": { + "@brokerloop/ttlcache": "^3.2.3", + "@coral-xyz/anchor-30": "npm:@coral-xyz/anchor@0.30.1", + "@solana/web3.js": "^1.95.0", + "@solworks/soltoolkit-sdk": "^0.0.23", + "@switchboard-xyz/common": "^", + "axios": "^1.7.4", + "big.js": "^6.2.1", + "bs58": "^5.0.0", + "js-yaml": "^4.1.0", + "protobufjs": "^7.2.6" + }, + "devDependencies": { + "jest": "^29.7.0", + "typedoc": "^0.25.9", + "typescript": "5.4.5" + }, + "engines": { + "node": ">= 18" + } +} diff --git a/javascript/on-demand/src/accounts/index.ts b/javascript/on-demand/src/accounts/index.ts new file mode 100644 index 0000000..7d843e0 --- /dev/null +++ b/javascript/on-demand/src/accounts/index.ts @@ -0,0 +1,7 @@ +export * from "./lutMap.js"; +export * from "./oracle.js"; +export * from "./permission.js"; +export * from "./pullFeed.js"; +export * from "./queue.js"; +export * from "./randomness.js"; +export * from "./state.js"; diff --git a/javascript/on-demand/src/accounts/lutMap.ts b/javascript/on-demand/src/accounts/lutMap.ts new file mode 100644 index 0000000..ce12eab --- /dev/null +++ b/javascript/on-demand/src/accounts/lutMap.ts @@ -0,0 +1,166 @@ +import { RecentSlotHashes } from "./../sysvars/recentSlothashes.js"; +import * as spl from "./../utils/index.js"; +import { Queue } from "./queue.js"; +import { State } from "./state.js"; + +import type { BN, Program } from "@coral-xyz/anchor-30"; +import type { + AddressLookupTableState, + TransactionInstruction, +} from "@solana/web3.js"; +import { + AddressLookupTableAccount, + AddressLookupTableProgram, + PublicKey, + SystemProgram, +} from "@solana/web3.js"; + +/** + * A map of LUTs to their public keys. + * + * Users can initialize to compact all oracle and feed keys they use into a single + * account, and then use the LUT to load all tx keys efficiently. + */ +export class LutMap { + /** + * The public key of the LUT map account. + */ + static async keyFromSeed( + program: Program, + queue: PublicKey, + authority: PublicKey + ): Promise { + const [lut] = PublicKey.findProgramAddressSync( + [ + Buffer.from("LutMapAccountData"), + queue.toBuffer(), + authority.toBuffer(), + ], + program.programId + ); + return lut; + } + + /** + * Creating a LUT map account will allow a user or protocol to easy manage + * and associate a common account grouping for their feeds to reduce the + * total number of transaction bytes taken by Switchboard. + * This will maximize the flexibility users have in their instructions. + * + * @param program - The program that owns the LUT map account. + * @param queue - The queue account that the LUT map is associated with. + * @param slot - The slot that the LUT map is associated with. + * @returns A promise that resolves to the LUT map and the transaction signature. + */ + static async create( + program: Program, + queue: PublicKey, + slot: BN + ): Promise<[LutMap, string]> { + const payer = (program.provider as any).wallet.payer; + const lutKey = await LutMap.keyFromSeed(program, queue, payer.publicKey); + const sig = await program.rpc.lutMapInit( + { slot }, + { + accounts: { + lutMap: lutKey, + queue: queue, + payer: payer.publicKey, + authority: payer.publicKey, + systemProgram: SystemProgram.programId, + }, + signers: [payer], + } + ); + return [new LutMap(program, lutKey), sig]; + } + + constructor(readonly program: Program, readonly pubkey: PublicKey) {} + + async queueLutExtendIx(params: { + queue: PublicKey; + newKey: PublicKey; + payer: PublicKey; + }): Promise { + const payer = (this.program.provider as any).wallet.payer; + const queueAccount = new Queue(this.program, params.queue); + const queueData = await queueAccount.loadData(); + const lutKey = await LutMap.keyFromSeed( + this.program, + params.queue, + payer.publicKey + ); + const lutSigner = ( + await PublicKey.findProgramAddress( + [Buffer.from("LutSigner"), params.queue.toBuffer()], + this.program.programId + ) + )[0]; + const ix = await this.program.instruction.queueLutExtend( + { newKey: params.newKey }, + { + accounts: { + queue: params.queue, + authority: queueData.authority, + lutSigner, + lut: lutKey, + addressLookupTableProgram: AddressLookupTableProgram.programId, + payer: payer.publicKey, + systemProgram: SystemProgram.programId, + }, + } + ); + return ix; + } + + /** + * Loads the data for this {@linkcode LutMap} account from on chain. + * + * @returns A promise that resolves to the data. + * @throws if the account does not exist. + */ + async loadData(): Promise { + return await this.program.account["lutMapAccountData"].fetch(this.pubkey); + } + + async loadLut(): Promise<[PublicKey, AddressLookupTableState]> { + const data = await this.loadData(); + const lutKey = data.lut; + const lutAccountInfo = + await this.program.provider.connection.getAccountInfo(lutKey); + const lutData = AddressLookupTableAccount.deserialize(lutAccountInfo!.data); + return [lutKey, lutData]; + } + + async syncLut(feeds: PublicKey[]): Promise { + const wrapperData = await this.loadData(); + const [key, data] = await this.loadLut(); + const queueKey = wrapperData.queue; + const queue = new Queue(this.program, queueKey); + const queueData = await queue.loadData(); + const oracles = queueData.oracleKeys.slice(0, queueData.oracleKeysLen); + const neededLutAccounts: PublicKey[] = []; + neededLutAccounts.push(queueKey); + neededLutAccounts.push(spl.NATIVE_MINT); + neededLutAccounts.push(spl.TOKEN_PROGRAM_ID); + neededLutAccounts.push(spl.ASSOCIATED_TOKEN_PROGRAM_ID); + neededLutAccounts.push(State.keyFromSeed(this.program)); + for (const oracle of oracles) { + for (const feed of feeds) { + const [statsKey] = PublicKey.findProgramAddressSync( + [Buffer.from("OracleFeedStats"), feed.toBuffer(), oracle.toBuffer()], + this.program.programId + ); + const feedRewardEscrow = await spl.getAssociatedTokenAddress( + spl.NATIVE_MINT, + feed + ); + neededLutAccounts.push(statsKey); + neededLutAccounts.push(feed); + neededLutAccounts.push(oracle); + neededLutAccounts.push(feedRewardEscrow); + } + } + // TODO: do anneal here + } +} diff --git a/javascript/on-demand/src/accounts/oracle.ts b/javascript/on-demand/src/accounts/oracle.ts new file mode 100644 index 0000000..7fb5920 --- /dev/null +++ b/javascript/on-demand/src/accounts/oracle.ts @@ -0,0 +1,565 @@ +import { InstructionUtils } from "./../instruction-utils/InstructionUtils.js"; +import * as spl from "./../utils/index.js"; +import { Queue } from "./queue.js"; +import { State } from "./state.js"; + +import type { Program } from "@coral-xyz/anchor-30"; +import { BN, BorshAccountsCoder, utils } from "@coral-xyz/anchor-30"; +import type { + AddressLookupTableAccount, + TransactionInstruction, +} from "@solana/web3.js"; +import { + AddressLookupTableProgram, + Keypair, + PublicKey, + SystemProgram, +} from "@solana/web3.js"; + +/** + * This class represents an oracle account on chain. + */ +export class Oracle { + lut: AddressLookupTableAccount | null; + + constructor( + readonly program: Program, + readonly pubkey: PublicKey) { + this.lut = null; + } + + /** + * Creates a new oracle account. linked to the specified queue. + * After creation the oracle still must receive run approval and verify their + * enclave measurement. + * @param program - The program that owns the oracle account. + * @param params.queue - The queue that the oracle will be linked to. + * @returns A promise that resolves to a tuple containing the oracle account + * and the transaction signature. + * + */ + static async create( + program: Program, + params: { + queue: PublicKey; + } + ): Promise<[Oracle, TransactionInstruction[], Keypair]> { + const stateKey = State.keyFromSeed(program); + const state = await State.loadData(program); + const payer = (program.provider as any).wallet.payer; + const oracle = Keypair.generate(); + const oracleStats = ( + await PublicKey.findProgramAddress( + [Buffer.from("OracleStats"), oracle.publicKey.toBuffer()], + program.programId + ) + )[0]; + const lutSigner = ( + await PublicKey.findProgramAddress( + [Buffer.from("LutSigner"), oracle.publicKey.toBuffer()], + program.programId + ) + )[0]; + const [delegationPool] = await PublicKey.findProgramAddress( + [ + Buffer.from("Delegation"), + stateKey.toBuffer(), + oracleStats.toBuffer(), + state.stakePool.toBuffer(), + ], + state.stakeProgram + ); + const recentSlot = await program.provider.connection.getSlot("finalized"); + const [_, lut] = AddressLookupTableProgram.createLookupTable({ + authority: lutSigner, + payer: payer.publicKey, + recentSlot, + }); + const [delegationGroup] = await PublicKey.findProgramAddress( + [ + Buffer.from("Group"), + stateKey.toBuffer(), + state.stakePool.toBuffer(), + params.queue.toBuffer(), + ], + state.stakeProgram + ); + + const ix = await program.instruction.oracleInit( + { + recentSlot: new BN(recentSlot.toString()), + authority: payer.publicKey, + queue: params.queue, + secpAuthority: null, + }, + { + accounts: { + oracle: oracle.publicKey, + oracleStats, + authority: payer.publicKey, + programState: stateKey, + payer: payer.publicKey, + systemProgram: SystemProgram.programId, + tokenProgram: spl.TOKEN_PROGRAM_ID, + tokenMint: spl.NATIVE_MINT, + delegationPool, + lutSigner, + lut, + addressLookupTableProgram: AddressLookupTableProgram.programId, + switchMint: state.switchMint, + wsolVault: spl.getAssociatedTokenAddressSync( + spl.NATIVE_MINT, + oracle.publicKey + ), + switchVault: spl.getAssociatedTokenAddressSync( + state.switchMint, + oracle.publicKey + ), + stakeProgram: state.stakeProgram, + stakePool: state.stakePool, + }, + } + ); + const ix2 = await program.instruction.oracleUpdateDelegation( + { + recentSlot: new BN(recentSlot.toString()), + }, + { + accounts: { + oracle: oracle.publicKey, + oracleStats, + queue: params.queue, + authority: payer.publicKey, + programState: stateKey, + payer: payer.publicKey, + systemProgram: SystemProgram.programId, + tokenProgram: spl.TOKEN_PROGRAM_ID, + delegationPool, + lutSigner, + lut, + addressLookupTableProgram: AddressLookupTableProgram.programId, + switchMint: state.switchMint, + nativeMint: spl.NATIVE_MINT, + wsolVault: PublicKey.findProgramAddressSync( + [ + Buffer.from("RewardPool"), + delegationPool.toBuffer(), + spl.NATIVE_MINT.toBuffer(), + ], + state.stakeProgram + )[0], + switchVault: PublicKey.findProgramAddressSync( + [ + Buffer.from("RewardPool"), + delegationPool.toBuffer(), + state.switchMint.toBuffer(), + ], + state.stakeProgram + )[0], + stakeProgram: state.stakeProgram, + stakePool: state.stakePool, + delegationGroup, + }, + } + ); + return [new Oracle(program, oracle.publicKey), [ix, ix2], oracle]; + } + + /** + * Creates a new oracle account for SVM chains (non-solana). linked to the specified queue. + * After creation the oracle still must receive run approval and verify their + * enclave measurement. + * @param program - The program that owns the oracle account. + * @param params.queue - The queue that the oracle will be linked to. + * @returns A promise that resolves to a tuple containing the oracle account + * and the transaction signature. + * + */ + static async createSVM( + program: Program, + params: { + queue: PublicKey; + sourceOracleKey: PublicKey; + } + ): Promise<[Oracle, TransactionInstruction[]]> { + const stateKey = State.keyFromSeed(program); + const state = await State.loadData(program); + const payer = (program.provider as any).wallet.payer; + // Generate the queue PDA for the given source queue key + const [oracle] = await PublicKey.findProgramAddress( + [ + Buffer.from("Oracle"), + params.queue.toBuffer(), + params.sourceOracleKey.toBuffer(), + ], + program.programId + ); + const oracleStats = ( + await PublicKey.findProgramAddress( + [Buffer.from("OracleStats"), oracle.toBuffer()], + program.programId + ) + )[0]; + const lutSigner = ( + await PublicKey.findProgramAddress( + [Buffer.from("LutSigner"), oracle.toBuffer()], + program.programId + ) + )[0]; + const [delegationPool] = await PublicKey.findProgramAddress( + [ + Buffer.from("Delegation"), + stateKey.toBuffer(), + oracleStats.toBuffer(), + state.stakePool.toBuffer(), + ], + state.stakeProgram + ); + const recentSlot = await program.provider.connection.getSlot("finalized"); + const [_, lut] = AddressLookupTableProgram.createLookupTable({ + authority: lutSigner, + payer: payer.publicKey, + recentSlot, + }); + const [delegationGroup] = await PublicKey.findProgramAddress( + [ + Buffer.from("Group"), + stateKey.toBuffer(), + state.stakePool.toBuffer(), + params.queue.toBuffer(), + ], + state.stakeProgram + ); + + const ix = program.instruction.oracleInitSvm( + { + recentSlot: new BN(recentSlot.toString()), + authority: payer.publicKey, + queue: params.queue, + secpAuthority: null, + sourceOracleKey: params.sourceOracleKey, + }, + { + accounts: { + oracle: oracle, + oracleStats, + authority: payer.publicKey, + programState: stateKey, + payer: payer.publicKey, + systemProgram: SystemProgram.programId, + tokenProgram: spl.TOKEN_PROGRAM_ID, + tokenMint: spl.NATIVE_MINT, + delegationPool, + lutSigner, + lut, + addressLookupTableProgram: AddressLookupTableProgram.programId, + switchMint: state.switchMint, + wsolVault: spl.getAssociatedTokenAddressSync( + spl.NATIVE_MINT, + oracle, + true + ), + switchVault: spl.getAssociatedTokenAddressSync( + state.switchMint, + oracle, + true + ), + stakeProgram: state.stakeProgram, + stakePool: state.stakePool, + }, + } + ); + + return [new Oracle(program, oracle), [ix]]; + } + + /** + * ATODO: wrap this one up with the gateway bridge oracle fn + * @param params + * @returns + */ + static async quoteVerifySvmIx( + program: Program, + params: { + chain?: string; // Unused atm + network?: "mainnet" | "mainnet-beta" | "testnet" | "devnet"; + queue: PublicKey; // Solana queue + attestee: PublicKey; // Solana attestee + attester: PublicKey; // Solana attester guardian we're requesting from + } + ): Promise { + // const [queuePDA, queueBump] = await PublicKey.findProgramAddress( + // [Buffer.from("Queue"), params.queue.toBuffer()], + // program.programId + // ); + + // timestamp handled by bridge fn + // mrEnclave handled by bridge fn + // secp256k1Key handled by bridge fn + // slot has to be handled by us I think + // signature has to be handled by bridge fn + // recoveryId has to be handled by bridge fn + + // guardian key & oracle key + + // source oracle key handled by us: + + // source oracle queue key handled by us: + + // source guardian queue key handled by us: + + // const ix = await program.instruction.guardianQuoteVerifySvm( + // { + // timestamp: new anchor.BN(params.timestamp), + // mrEnclave: params.mrEnclave, // 32-byte array + // _reserved1: params._reserved1, // 32-bit unsigned integer + // secp256k1Key: params.secp256k1Key, // 64-byte array + // slot: new anchor.BN(params.slot), // Slot as u64 + // signature: params.signature, // 64-byte array + // recoveryId: params.recoveryId, // u8 + // sourceOracleKey: params.sourceOracleKey, // Pubkey of source oracle + // sourceOracleQueueKey: params.sourceOracleQueueKey, // Pubkey of oracle queue + // sourceGuardianQueueKey: params.sourceGuardianQueueKey, // Pubkey of guardian queue + // oracleBump: params.oracleBump, // Bump for oracle PDA + // oracleQueueBump: params.oracleQueueBump, // Bump for oracle queue PDA + // guardianQueueBump: params.guardianQueueBump, // Bump for guardian queue PDA + // }, + // { + // accounts: { + // guardian: guardianAccountLoader, // AccountLoader for OracleAccountData + // oracle: oracleAccountLoader, // AccountLoader for OracleAccountData + // oracleStats: oracleStatsAccountLoader, // AccountLoader for OracleStatsAccountData + // payer: payer.publicKey, // Signer for transaction + // systemProgram: SystemProgram.programId, // System program ID + // oracleQueue: oracleQueueAccountLoader, // AccountLoader for QueueAccountData + // guardianQueue: guardianQueueAccountLoader, // AccountLoader for QueueAccountData + // state: stateAccountLoader, // AccountLoader for State + // recentSlothashes: anchor.web3.SYSVAR_SLOT_HASHES_PUBKEY, // Sysvar slot hashes + // lutSigner: lutSignerAccount, // AccountInfo for lut signer + // lut: lutAccount, // AccountInfo for lut (lookup table) + // programState: programStateAccountLoader, // AccountLoader for State + // }, + // signers: [payer], // Add payer as the signer for the instruction + // } + // ); + + throw new Error("Quote verify SVM not implemented yet."); + } + + async updateDelegationRewardPoolsIx(params: { + overrideStakePool?: PublicKey; + overrideMint?: PublicKey; + authority: PublicKey; + }): Promise { + const program = this.program; + const stateKey = State.keyFromSeed(program); + const state = await State.loadData(program); + const switchMint = params.overrideMint ?? state.switchMint; + const stakePool = params.overrideStakePool ?? state.stakePool; + const stakeProgram = state.stakeProgram; + const payer = (program.provider as any).wallet.payer; + const oracleData = await this.loadData(); + const oracleStats = ( + await PublicKey.findProgramAddress( + [Buffer.from("OracleStats"), this.pubkey.toBuffer()], + program.programId + ) + )[0]; + const lutSigner = ( + await PublicKey.findProgramAddress( + [Buffer.from("LutSigner"), this.pubkey.toBuffer()], + program.programId + ) + )[0]; + const [delegationPool] = await PublicKey.findProgramAddress( + [ + Buffer.from("Delegation"), + stateKey.toBuffer(), + oracleStats.toBuffer(), + stakePool.toBuffer(), + ], + stakeProgram + ); + console.log("stakepool", stakePool.toBase58()); + console.log("delegationPool", delegationPool.toBase58()); + const lutSlot = oracleData.lutSlot.toNumber(); + const [_, lut] = AddressLookupTableProgram.createLookupTable({ + authority: lutSigner, + payer: payer.publicKey, + recentSlot: lutSlot, + }); + const [delegationGroup] = await PublicKey.findProgramAddress( + [ + Buffer.from("Group"), + stateKey.toBuffer(), + state.stakePool.toBuffer(), + oracleData.queue.toBuffer(), + ], + stakeProgram + ); + const ix = await program.instruction.oracleUpdateDelegation( + { + recentSlot: new BN(lutSlot.toString()), + }, + { + accounts: { + oracle: this.pubkey, + oracleStats, + queue: oracleData.queue, + authority: params.authority, + programState: stateKey, + payer: payer.publicKey, + systemProgram: SystemProgram.programId, + tokenProgram: spl.TOKEN_PROGRAM_ID, + delegationPool, + lutSigner, + lut, + addressLookupTableProgram: AddressLookupTableProgram.programId, + switchMint: switchMint, + nativeMint: spl.NATIVE_MINT, + wsolVault: PublicKey.findProgramAddressSync( + [ + Buffer.from("RewardPool"), + delegationPool.toBuffer(), + spl.NATIVE_MINT.toBuffer(), + ], + stakeProgram + )[0], + switchVault: PublicKey.findProgramAddressSync( + [ + Buffer.from("RewardPool"), + delegationPool.toBuffer(), + switchMint.toBuffer(), + ], + stakeProgram + )[0], + stakeProgram: stakeProgram, + stakePool: stakePool, + delegationGroup, + }, + } + ); + return ix; + } + + async setConfigsIx(params: { + authority: PublicKey; + }): Promise { + const data = await this.loadData(); + const ix = await this.program.instruction.oracleSetConfigs( + { + authority: params.authority, + newSecpAuthority: null, + }, + { + accounts: { + oracle: this.pubkey, + authority: params.authority, + }, + } + ); + return ix; + } + + /** + * Loads the oracle data for this {@linkcode Oracle} account from on chain. + * + * @returns A promise that resolves to the oracle data. + * @throws if the oracle account does not exist. + */ + async loadData(): Promise { + return await this.program.account["oracleAccountData"].fetch(this.pubkey); + } + + async fetchGateway(): Promise { + const data = await this.loadData(); + const gw = Buffer.from(data.gatewayUri).toString(); + return gw.replace(/\0+$/, ""); + } + + /** + * Loads the oracle data for a list of {@linkcode Oracle} accounts from on chain. + * + * @param program - The program that owns the oracle accounts. + * @param keys - The public keys of the oracle accounts to load. + * @returns A promise that resolves to an array of oracle data. + * @throws if any of the oracle accounts do not exist. + */ + static async loadMany(program: Program, keys: PublicKey[]): Promise { + const coder = new BorshAccountsCoder(program.idl); + const accountType = "oracleAccountData"; + const oracleDatas = await utils.rpc + .getMultipleAccounts(program.provider.connection, keys) + .then((o) => o.map((x) => coder.decode(accountType, x!.account.data))); + return oracleDatas; + } + + /** + * Loads the oracle data and checks if the oracle is verified. + * + * @returns A promise that resolves to a tuple containing a boolean indicating + * if the oracle is verified and the expiration time of the verification. + * @throws if the oracle account does not exist. + */ + async verificationStatus(): Promise<[boolean, number]> { + const data = await this.loadData(); + const now = +new Date() / 1000; + const status = data.enclave.verificationStatus; + const expiration = data.enclave.validUntil; + return [status === 4 && now < expiration, expiration.toNumber()]; + } + + /** + * Get the pubkey of the stats account for this oracle. + * @returns A promise that resolves to the pubkey of the stats account. + */ + async statsKey(): Promise { + return ( + await PublicKey.findProgramAddress( + [Buffer.from("OracleStats"), this.pubkey.toBuffer()], + this.program.programId + ) + )[0]; + } + + async lutKey(): Promise { + const data = await this.loadData(); + const lutSigner = ( + await PublicKey.findProgramAddress( + [Buffer.from("LutSigner"), this.pubkey.toBuffer()], + this.program.programId + ) + )[0]; + const [_, lutKey] = await AddressLookupTableProgram.createLookupTable({ + authority: lutSigner, + payer: PublicKey.default, + recentSlot: data.lutSlot, + }); + return lutKey; + } + + public lookupTableKey(data: any): PublicKey { + const lutSigner = PublicKey.findProgramAddressSync( + [Buffer.from("LutSigner"), this.pubkey.toBuffer()], + this.program.programId + )[0]; + const [_, lutKey] = AddressLookupTableProgram.createLookupTable({ + authority: lutSigner, + payer: PublicKey.default, + recentSlot: data.lutSlot, + }); + return lutKey; + } + + async loadLookupTable(): Promise { + if (this.lut !== null && this.lut !== undefined) { + return this.lut; + } + const lutKey = await this.lutKey(); + const accnt = await this.program.provider.connection.getAddressLookupTable( + lutKey + ); + this.lut = accnt.value!; + return this.lut!; + } +} diff --git a/javascript/on-demand/src/accounts/permission.ts b/javascript/on-demand/src/accounts/permission.ts new file mode 100644 index 0000000..f59e855 --- /dev/null +++ b/javascript/on-demand/src/accounts/permission.ts @@ -0,0 +1,54 @@ +import type { Program } from "@coral-xyz/anchor-30"; +import type { PublicKey, TransactionInstruction } from "@solana/web3.js"; + +export enum SwitchboardPermission { + PermitOracleHeartbeat = 1 << 0, + PermitOracleQueueUsage = 1 << 1, +} + +/** + * Abstraction around the Switchboard-On-Demand Permission meta-account + */ +export class Permission { + /** + * Set the permission for a given granter and grantee. + * + * @param program - The program that owns the permission account. + * @param params - The parameters for setting the permission. + * @returns A promise that resolves to the transaction instruction. + */ + static async setIx( + program: Program, + params: { + authority: PublicKey; + granter: PublicKey; + grantee: PublicKey; + enable?: boolean; + permission: SwitchboardPermission; + } + ): Promise { + const payer = (program.provider as any).wallet.payer; + const ix = await program.instruction.permissionSet( + { + enable: params.enable ?? false, + permission: params.permission, + }, + { + accounts: { + granter: params.granter, + authority: params.authority, + }, + remainingAccounts: [ + { pubkey: params.grantee, isSigner: false, isWritable: true }, + ], + signers: [payer], + } + ); + return ix; + } + + /** + * Disable object instantiation. + */ + private constructor() {} +} diff --git a/javascript/on-demand/src/accounts/pullFeed.ts b/javascript/on-demand/src/accounts/pullFeed.ts new file mode 100644 index 0000000..09857e2 --- /dev/null +++ b/javascript/on-demand/src/accounts/pullFeed.ts @@ -0,0 +1,1426 @@ +import { SLOT_HASHES_SYSVAR_ID } from "../constants.js"; +import type { + FeedEvalResponse, + FetchSignaturesMultiResponse, +} from "../oracle-interfaces/gateway.js"; + +import { InstructionUtils } from "./../instruction-utils/InstructionUtils.js"; +import { RecentSlotHashes } from "./../sysvars/recentSlothashes.js"; +import * as spl from "./../utils/index.js"; +import { + getDefaultDevnetQueue, + getDefaultQueue, + loadLookupTables, +} from "./../utils/index.js"; +import { Oracle } from "./oracle.js"; +import { Queue } from "./queue.js"; +import { State } from "./state.js"; + +import { TTLCache } from "@brokerloop/ttlcache"; +import type { Program } from "@coral-xyz/anchor-30"; +import { BorshAccountsCoder } from "@coral-xyz/anchor-30"; +import * as anchor from "@coral-xyz/anchor-30"; +import { BN } from "@coral-xyz/anchor-30"; +import type { + AccountMeta, + AddressLookupTableAccount, + Connection, + TransactionInstruction, + VersionedTransaction, +} from "@solana/web3.js"; +import { + AddressLookupTableProgram, + Keypair, + PublicKey, + SystemProgram, +} from "@solana/web3.js"; +import type { IOracleJob } from "@switchboard-xyz/common"; +import { OracleJob } from "@switchboard-xyz/common"; +import { CrossbarClient, FeedHash } from "@switchboard-xyz/common"; +import { bs58 } from "@switchboard-xyz/common"; +import Big from "big.js"; + +const QUEUE_CACHE = new TTLCache({ + ttl: 60 * 1000, + max: 50, + clock: Date, +}); + +const PRECISION = 18; + +export interface CurrentResult { + value: BN; + stdDev: BN; + mean: BN; + range: BN; + minValue: BN; + maxValue: BN; + slot: BN; + minSlot: BN; + maxSlot: BN; +} + +export interface CompactResult { + stdDev: number; + mean: number; + slot: BN; +} + +export interface OracleSubmission { + oracle: PublicKey; + slot: BN; + value: BN; +} + +export interface PullFeedAccountData { + submissions: OracleSubmission[]; + authority: PublicKey; + queue: PublicKey; + feedHash: Uint8Array; + initializedAt: BN; + permissions: BN; + maxVariance: BN; + minResponses: number; + name: Uint8Array; + sampleSize: number; + lastUpdateTimestamp: BN; + lutSlot: BN; + result: CurrentResult; + maxStaleness: number; + minSampleSize: number; + historicalResultIdx: number; + historicalResults: CompactResult[]; +} + +export type MultiSubmission = { + values: anchor.BN[]; + signature: Buffer; // TODO: Does this need to be made a Uint8Array too? + recoveryId: number; +}; + +export class OracleResponse { + constructor( + readonly oracle: Oracle, + readonly value: Big | null, + readonly error: string + ) {} + + shortError(): string | undefined { + if (this.error === "[]") { + return undefined; + } + const parts = this.error.split("\n"); + return parts[0]; + } +} + +export type FeedRequest = { + maxVariance: number; + minResponses: number; + jobs: OracleJob[]; +}; + +function padStringWithNullBytes( + input: string, + desiredLength: number = 32 +): string { + const nullByte = "\0"; + while (input.length < desiredLength) { + input += nullByte; + } + return input; +} + +export type FeedSubmission = { value: Big; slot: anchor.BN; oracle: PublicKey }; + +export function toFeedValue( + submissions: FeedSubmission[], + onlyAfter: anchor.BN +): FeedSubmission | null { + let values = submissions.filter((x) => x.slot.gt(onlyAfter)); + if (values.length === 0) { + return null; + } + values = values.sort((x, y) => (x.value.lt(y.value) ? -1 : 1)); + return values[Math.floor(values.length / 2)]; +} + +/** + * Checks if the pull feed account needs to be initialized. + * + * @param connection The connection to use. + * @param programId The program ID. + * @param pubkey The public key of the pull feed account. + * @returns A promise that resolves to a boolean indicating if the account needs to be initialized. + */ +async function checkNeedsInit( + connection: Connection, + programId: PublicKey, + pubkey: PublicKey +): Promise { + const accountInfo = await connection.getAccountInfo(pubkey); + if (accountInfo === null) return true; + + const owner = accountInfo.owner; + if (!owner.equals(programId)) return true; + + return false; +} + +/** + * Abstraction around the Switchboard-On-Demand Feed account + * + * This account is used to store the feed data and the oracle responses + * for a given feed. + */ +export class PullFeed { + gatewayUrl: string; + pubkey: PublicKey; + configs: { + queue: PublicKey; + maxVariance: number; + minResponses: number; + feedHash: Buffer; + minSampleSize: number; + } | null; + jobs: IOracleJob[] | null; + lut: AddressLookupTableAccount | null; + + /** + * Constructs a `PullFeed` instance. + * + * @param program - The Anchor program instance. + * @param pubkey - The public key of the pull feed account. + */ + constructor(readonly program: Program, pubkey: PublicKey | string) { + this.gatewayUrl = ""; + this.pubkey = new PublicKey(pubkey); + this.configs = null; + this.jobs = null; + } + + static generate(program: Program): [PullFeed, Keypair] { + const keypair = Keypair.generate(); + const feed = new PullFeed(program, keypair.publicKey); + return [feed, keypair]; + } + + static async initTx( + program: Program, + params: { + name: string; + queue: PublicKey; + maxVariance: number; + minResponses: number; + minSampleSize: number; + maxStaleness: number; + payer?: PublicKey; + } & ({ feedHash: Buffer } | { jobs: IOracleJob[] }) + ): Promise<[PullFeed, VersionedTransaction]> { + const [pullFeed, keypair] = PullFeed.generate(program); + const ix = await pullFeed.initIx(params); + const tx = await InstructionUtils.asV0TxWithComputeIxs({ + connection: program.provider.connection, + ixs: [ix], + }); + tx.sign([keypair]); + return [pullFeed, tx]; + } + + private getPayer(payer?: PublicKey): PublicKey { + return payer ?? this.program.provider.publicKey ?? PublicKey.default; + } + + /** + * Calls to initialize a pull feed account and to update the configuration account need to + * compute the feed hash for the account (if one is not specified). + */ + private static feedHashFromParams(params: { + queue: PublicKey; + feedHash?: Buffer; + jobs?: IOracleJob[]; + }): Buffer { + const hash = (() => { + if (params.feedHash) { + // If the feed hash is provided, use it. + return params.feedHash; + } else if (params.jobs?.length) { + // Else if jobs are provided, compute the feed hash from the queue and jobs. + return FeedHash.compute(params.queue.toBuffer(), params.jobs); + } + throw new Error('Either "feedHash" or "jobs" must be provided.'); + })(); + if (hash.byteLength === 32) return hash; + throw new Error("Feed hash must be 32 bytes"); + } + + /** + * Initializes a pull feed account. + * + * @param {anchor.Program} program - The Anchor program instance. + * @param {PublicKey} queue - The queue account public key. + * @param {Array} jobs - The oracle jobs to execute. + * @param {number} maxVariance - The maximum variance allowed for the feed. + * @param {number} minResponses - The minimum number of job responses required. + * @param {number} minSampleSize - The minimum number of samples required for setting feed value. + * @param {number} maxStaleness - The maximum number of slots that can pass before a feed value is considered stale. + * @returns {Promise<[PullFeed, string]>} A promise that resolves to a tuple containing the pull feed instance and the transaction signature. + */ + async initIx( + params: { + name: string; + queue: PublicKey; + maxVariance: number; + minResponses: number; + payer?: PublicKey; + minSampleSize: number; + maxStaleness: number; + } & ({ feedHash: Buffer } | { jobs: IOracleJob[] }) + ): Promise { + const feedHash = PullFeed.feedHashFromParams({ + queue: params.queue, + feedHash: "feedHash" in params ? params.feedHash : undefined, + jobs: "jobs" in params ? params.jobs : undefined, + }); + const payerPublicKey = this.getPayer(params.payer); + const maxVariance = Math.floor(params.maxVariance * 1e9); + const lutSigner = ( + await PublicKey.findProgramAddress( + [Buffer.from("LutSigner"), this.pubkey.toBuffer()], + this.program.programId + ) + )[0]; + const recentSlot = await this.program.provider.connection.getSlot( + "finalized" + ); + const [_, lut] = AddressLookupTableProgram.createLookupTable({ + authority: lutSigner, + payer: payerPublicKey, + recentSlot, + }); + const ix = this.program.instruction.pullFeedInit( + { + feedHash: feedHash, + maxVariance: new anchor.BN(maxVariance), + minResponses: params.minResponses, + name: Buffer.from(padStringWithNullBytes(params.name)), + recentSlot: new anchor.BN(recentSlot), + ipfsHash: new Uint8Array(32), // Deprecated. + minSampleSize: params.minSampleSize, + maxStaleness: params.maxStaleness, + }, + { + accounts: { + pullFeed: this.pubkey, + queue: params.queue, + authority: payerPublicKey, + payer: payerPublicKey, + systemProgram: SystemProgram.programId, + programState: State.keyFromSeed(this.program), + rewardEscrow: spl.getAssociatedTokenAddressSync( + spl.NATIVE_MINT, + this.pubkey + ), + tokenProgram: spl.TOKEN_PROGRAM_ID, + associatedTokenProgram: spl.ASSOCIATED_TOKEN_PROGRAM_ID, + wrappedSolMint: spl.NATIVE_MINT, + lutSigner, + lut, + addressLookupTableProgram: AddressLookupTableProgram.programId, + }, + } + ); + return ix; + } + + async closeIx(params: { + payer?: PublicKey; + }): Promise { + const payerPublicKey = this.getPayer(params.payer); + const lutSigner = ( + await PublicKey.findProgramAddress( + [Buffer.from("LutSigner"), this.pubkey.toBuffer()], + this.program.programId + ) + )[0]; + const data = await this.loadData(); + const [_, lut] = AddressLookupTableProgram.createLookupTable({ + authority: lutSigner, + payer: payerPublicKey, + recentSlot: BigInt(data.lutSlot.toString()), + }); + const ix = this.program.instruction.pullFeedClose( + {}, + { + accounts: { + pullFeed: this.pubkey, + authority: data.authority, + payer: payerPublicKey, + rewardEscrow: spl.getAssociatedTokenAddressSync( + spl.NATIVE_MINT, + this.pubkey + ), + lutSigner, + lut, + state: State.keyFromSeed(this.program), + tokenProgram: spl.TOKEN_PROGRAM_ID, + associatedTokenProgram: spl.ASSOCIATED_TOKEN_PROGRAM_ID, + systemProgram: SystemProgram.programId, + addressLookupTableProgram: AddressLookupTableProgram.programId, + }, + } + ); + return ix; + } + + /** + * Set configurations for the feed. + * + * @param params + * @param params.feedHash - The hash of the feed as a `Uint8Array` or hexadecimal `string`. Only results signed with this hash will be accepted. + * @param params.authority - The authority of the feed. + * @param params.maxVariance - The maximum variance allowed for the feed. + * @param params.minResponses - The minimum number of responses required. + * @param params.minSampleSize - The minimum number of samples required for setting feed value. + * @param params.maxStaleness - The maximum number of slots that can pass before a feed value is considered stale. + * @returns A promise that resolves to the transaction instruction to set feed configs. + */ + async setConfigsIx(params: { + name?: string; + authority?: PublicKey; + maxVariance?: number; + minResponses?: number; + feedHash?: Buffer; + jobs?: IOracleJob[]; + minSampleSize?: number; + maxStaleness?: number; + }): Promise { + const data = await this.loadData(); + const name = + params.name !== undefined + ? Buffer.from(padStringWithNullBytes(params.name)) + : null; + const feedHash = + params.feedHash || params.jobs + ? PullFeed.feedHashFromParams({ + queue: data.queue, + feedHash: params.feedHash, + jobs: params.jobs, + }) + : null; + + const ix = this.program.instruction.pullFeedSetConfigs( + { + name: name, + feedHash: feedHash, + authority: params.authority ?? null, + maxVariance: + params.maxVariance !== undefined + ? new anchor.BN(Math.floor(params.maxVariance * 1e9)) + : null, + minResponses: params.minResponses ?? null, + minSampleSize: params.minSampleSize ?? null, + maxStaleness: params.maxStaleness ?? null, + ipfsHash: null, // Deprecated. + }, + { + accounts: { + pullFeed: this.pubkey, + authority: data.authority, + }, + } + ); + return ix; + } + + /** + * Fetch updates for the feed. + * + * @param {object} params_ - The parameters object. + * @param {string} [params_.gateway] - Optionally specify the gateway to use. If not specified, the gateway is automatically fetched. + * @param {number} [params_.numSignatures] - Number of signatures to fetch. + * @param {FeedRequest} [params_.feedConfigs] - Optionally specify the feed configs. If not specified, the feed configs are automatically fetched. + * @param {IOracleJob[]} [params_.jobs] - An array of `IOracleJob` representing the jobs to be executed. + * @param {CrossbarClient} [params_.crossbarClient] - Optionally specify the CrossbarClient to use. + * @param {Array<[anchor.BN, string]>} [recentSlothashes] - An optional array of recent slothashes as `[anchor.BN, string]` tuples. + * @param {FeedEvalResponse[]} [priceSignatures] - An optional array of `FeedEvalResponse` representing the price signatures. + * @param {boolean} [debug=false] - A boolean flag to enable or disable debug mode. Defaults to `false`. + * @returns {Promise<[TransactionInstruction | undefined, OracleResponse[], number, any[]]>} A promise that resolves to a tuple containing: + * - The transaction instruction to fetch updates, or `undefined` if not applicable. + * - An array of `OracleResponse` objects. + * - A number representing the successful responses. + * - An array containing usable lookup tables. + */ + async fetchUpdateIx( + params_?: { + // Optionally specify the gateway to use. Else, the gateway is automatically fetched. + gateway?: string; + // Number of signatures to fetch. + numSignatures?: number; + jobs?: IOracleJob[]; + crossbarClient?: CrossbarClient; + retries?: number; + chain?: string; + network?: "mainnet" | "mainnet-beta" | "testnet" | "devnet"; + solanaRpcUrl?: string; + }, + recentSlothashes?: Array<[anchor.BN, string]>, + priceSignatures?: FeedEvalResponse[], + debug: boolean = false, + payer?: PublicKey + ): Promise< + [ + TransactionInstruction | undefined, + OracleResponse[], + number, + AddressLookupTableAccount[], + string[] + ] + > { + const payerPublicKey = this.getPayer(payer); + if (this.configs === null) { + this.configs = await this.loadConfigs(); + } + + params_ = params_ ?? {}; + params_.retries = params_.retries ?? 3; + const feedConfigs = this.configs; + const numSignatures = + params_?.numSignatures ?? + feedConfigs.minSampleSize + Math.ceil(feedConfigs.minSampleSize / 3); + const isSolana = + params_?.chain === undefined || params_?.chain === "solana"; + const isMainnet = + params_?.network === "mainnet" || params_?.network === "mainnet-beta"; + + let queueAccount = new Queue(this.program, feedConfigs.queue); + + if (!isSolana) { + // TODO: cache this + queueAccount = isMainnet + ? await getDefaultQueue(params_?.solanaRpcUrl) + : await getDefaultDevnetQueue(params_?.solanaRpcUrl); + } + + if (this.gatewayUrl === "") { + this.gatewayUrl = + params_?.gateway ?? + (await queueAccount.fetchAllGateways())[0].gatewayUrl; + } + let jobs = params_?.jobs ?? this.jobs; + if (!jobs?.length) { + const data = await this.loadData(); + jobs = await (params_?.crossbarClient ?? CrossbarClient.default()) + .fetch(Buffer.from(data.feedHash).toString("hex")) + .then((resp) => { + return resp.jobs; + }); + this.jobs = jobs; + } + const params = { + feed: this.pubkey, + gateway: this.gatewayUrl, + ...feedConfigs, + ...params_, + numSignatures, + jobs: jobs, + }; + let err = null; + for (let i = 0; i < params.retries; i++) { + try { + const ix = await PullFeed.fetchUpdateIx( + this.program, + params, + recentSlothashes, + priceSignatures, + debug, + payerPublicKey + ); + return ix; + } catch (err_: any) { + err = err_; + } + } + throw err; + } + + /** + * Loads the feed configurations for this {@linkcode PullFeed} account from on chain. + * @returns A promise that resolves to the feed configurations. + * @throws if the feed account does not exist. + */ + async loadConfigs(): Promise<{ + queue: PublicKey; + maxVariance: number; + minResponses: number; + feedHash: Buffer; + minSampleSize: number; + }> { + const data = await this.loadData(); + const maxVariance = data.maxVariance.toNumber() / 1e9; + return { + queue: data.queue, + maxVariance: maxVariance, + minResponses: data.minResponses, + feedHash: Buffer.from(data.feedHash), + minSampleSize: data.minSampleSize, + }; + } + + /** + * Fetch updates for the feed. + * + * @param params_ - The parameters object. + * @param params_.gateway - Optionally specify the gateway to use. If not specified, the gateway is automatically fetched. + * @param params._chain - Optionally specify the chain to use. If not specified, Solana is used. + * @param params_.numSignatures - Number of signatures to fetch. + * @param params_.feedConfigs - Optionally specify the feed configs. If not specified, the feed configs are automatically fetched. + * @param params_.jobs - An array of `IOracleJob` representing the jobs to be executed. + * @param params_.crossbarClient - Optionally specify the CrossbarClient to use. + * @param recentSlothashes - An optional array of recent slothashes as `[anchor.BN, string]` tuples. + * @param priceSignatures - An optional array of `FeedEvalResponse` representing the price signatures. + * @param debug - A boolean flag to enable or disable debug mode. Defaults to `false`. + * @param payer - Optionally specify the payer public key. + * @returns A promise that resolves to a tuple containing: + * - The transaction instruction to fetch updates, or `undefined` if not applicable. + * - An array of `OracleResponse` objects. + * - A number representing the successful responses. + * - An array containing usable lookup tables. + */ + static async fetchUpdateIx( + program: Program, + params_: { + gateway?: string; + chain?: string; + network?: "mainnet" | "mainnet-beta" | "testnet" | "devnet"; + solanaRpcUrl?: string; + queue: PublicKey; + feed: PublicKey; + numSignatures: number; + maxVariance: number; + minResponses: number; + jobs: IOracleJob[]; + crossbarClient?: CrossbarClient; + }, + recentSlothashes?: Array<[anchor.BN, string]>, + priceSignatures?: FeedEvalResponse[], + debug: boolean = false, + payer?: PublicKey + ): Promise< + [ + TransactionInstruction | undefined, + OracleResponse[], + number, + AddressLookupTableAccount[], + string[] + ] + > { + let slotHashes = recentSlothashes; + if (slotHashes === undefined) { + slotHashes = await RecentSlotHashes.fetchLatestNSlothashes( + program.provider.connection, + 30 + ); + } + const feed = new PullFeed(program, params_.feed); + const params = params_; + const jobs = params.jobs; + const isSolana = params.chain === undefined || params.chain === "solana"; + const isMainnet = + params.network === "mainnet" || params.network === "mainnet-beta"; + let queue = params.queue; + + let failures_: string[] = []; + if (priceSignatures === undefined || priceSignatures === null) { + let solanaProgram = program; + + // get the queue + if (!isSolana) { + // TODO: cache this + const defaultQueue = isMainnet + ? await getDefaultQueue(params.solanaRpcUrl) + : await getDefaultDevnetQueue(params.solanaRpcUrl); + + queue = defaultQueue.pubkey; + solanaProgram = defaultQueue.program; + } + + const { responses, failures } = await Queue.fetchSignatures( + solanaProgram, + { + ...params, + queue, + jobs: jobs!.map((x) => OracleJob.fromObject(x)), + recentHash: slotHashes[0][1], + } + ); + priceSignatures = responses; + failures_ = failures; + } + + let numSuccesses = 0; + if (!priceSignatures) { + return [undefined, [], 0, [], []]; + } + const oracleResponses = priceSignatures.map((x) => { + const oldDP = Big.DP; + Big.DP = 40; + const value = x.success_value ? new Big(x.success_value).div(1e18) : null; + if (value !== null) { + numSuccesses += 1; + } + Big.DP = oldDP; + let oracle = new PublicKey(Buffer.from(x.oracle_pubkey, "hex")); + if (!isSolana) { + [oracle] = PublicKey.findProgramAddressSync( + [Buffer.from("Oracle"), params.queue.toBuffer(), oracle.toBuffer()], + program.programId + ); + } + return new OracleResponse( + new Oracle(program, oracle), + value, + x.failure_error + ); + }); + + const offsets: number[] = new Array(priceSignatures.length).fill(0); + for (let i = 0; i < priceSignatures.length; i++) { + if (priceSignatures[i].failure_error.length > 0) { + let validResp = false; + for (const recentSignature of priceSignatures[i] + .recent_successes_if_failed) { + for (let offset = 0; offset < slotHashes.length; offset++) { + const slotHash = slotHashes[offset]; + if (slotHash[1] === recentSignature.recent_hash) { + priceSignatures[i] = recentSignature; + offsets[i] = offset; + validResp = true; + break; + } + } + if (validResp) { + break; + } + } + } + } + if (debug) { + console.log("priceSignatures", priceSignatures); + } + + let submitSignaturesIx: TransactionInstruction | undefined = undefined; + if (numSuccesses > 0) { + submitSignaturesIx = feed.getSolanaSubmitSignaturesIx({ + resps: priceSignatures, + offsets: offsets, + slot: slotHashes[0][0], + payer, + chain: params.chain, + }); + } + + const lutOwners = [...oracleResponses.map((x) => x.oracle), feed]; + const luts = await loadLookupTables(lutOwners); + if (!numSuccesses) { + throw new Error( + `PullFeed.fetchUpdateIx Failure: ${oracleResponses.map((x) => x.error)}` + ); + } + return [submitSignaturesIx, oracleResponses, numSuccesses, luts, failures_]; + } + + /** + * Fetches updates for multiple feeds at once into SEPARATE intructions (one for each) + * + * @param program - The Anchor program instance. + * @param params_ - The parameters object. + * @param params_.gateway - The gateway URL to use. If not provided, the gateway is automatically fetched. + * @param params_.feeds - An array of feed account public keys. + * @param params_.numSignatures - The number of signatures to fetch. + * @param params_.crossbarClient - Optionally specify the CrossbarClient to use. + * @param recentSlothashes - An optional array of recent slothashes as `[anchor.BN, string]` tuples. + * @param debug - A boolean flag to enable or disable debug mode. Defaults to `false`. + * @param payer - Optionally specify the payer public key. + * @returns A promise that resolves to a tuple containing: + * - The transaction instruction for fetching updates. + * - An array of `AddressLookupTableAccount` to use. + * - The raw response data. + */ + static async fetchUpdateManyIxs( + program: Program, + params_: { + gateway?: string; + feeds: PublicKey[]; + numSignatures: number; + crossbarClient?: CrossbarClient; + payer?: PublicKey; + }, + recentSlothashes?: Array<[anchor.BN, string]>, + debug: boolean = false, + payer?: PublicKey + ): Promise<{ + successes: { + submitSignaturesIx: TransactionInstruction; + oracleResponses: { + value: Big.Big; + error: string; + oracle: Oracle; + }; + numSuccesses: number; + luts: AddressLookupTableAccount[]; + failures: string[]; + }[]; + failures: { + feed: PublicKey; + error: string; + }[]; + }> { + const slotHashes = + recentSlothashes ?? + (await RecentSlotHashes.fetchLatestNSlothashes( + program.provider.connection, + 30 + )); + const feeds = params_.feeds.map((feed) => new PullFeed(program, feed)); + const params = params_; + const feedConfigs: { + maxVariance: number; + minResponses: number; + jobs: any; + }[] = []; + let queue: PublicKey | undefined = undefined; + + // Map from feed hash to feed - this will help in mapping the responses to the feeds + const feedToFeedHash = new Map(); + + // Map from feed hash to responses + const feedHashToResponses = new Map(); + + // Iterate over all feeds to fetch the feed configs + for (const feed of feeds) { + // Load the feed from Solana + const data = await feed.loadData(); + if (queue !== undefined && !queue.equals(data.queue)) { + throw new Error( + "fetchUpdateManyIx: All feeds must have the same queue" + ); + } + queue = data.queue; + const maxVariance = data.maxVariance.toNumber() / 1e9; + const minResponses = data.minResponses; + const feedHash = Buffer.from(data.feedHash).toString("hex"); + + // Store the feed in a map for later use + feedToFeedHash.set(feed.pubkey.toString(), feedHash); + + // Add an entry for the feed in the response map + feedHashToResponses.set(feedHash, []); + + // Pull the job definitions + const jobs = await (params_.crossbarClient ?? CrossbarClient.default()) + .fetch(feedHash) + .then((resp) => { + return resp.jobs; + }); + + // Collect the feed config + feedConfigs.push({ + maxVariance, + minResponses, + jobs, + }); + } + + // Fetch the responses from the oracle(s) + const response = await Queue.fetchSignaturesBatch(program, { + ...params, + recentHash: slotHashes[0][1], + feedConfigs, + queue: queue!, + }); + + const oracles: PublicKey[] = []; + + // Assemble the responses + for (const oracleResponse of response.oracle_responses) { + // Get the oracle public key + const oraclePubkey = new PublicKey( + Buffer.from(oracleResponse.feed_responses[0].oracle_pubkey, "hex") + ); + + // Add it to the list of oracles + oracles.push(oraclePubkey); + + // Map the responses to the feed + for (const feedResponse of oracleResponse.feed_responses) { + const feedHash = feedResponse.feed_hash; + feedHashToResponses.get(feedHash)?.push(feedResponse); + } + } + + // loop over the feeds and create the instructions + const successes = []; + const failures = []; + + for (const feed of feeds) { + const feedHash = feedToFeedHash.get(feed.pubkey.toString()); + + // Get registered responses for this feed + const responses = feedHashToResponses.get(feedHash) ?? []; + + // If there are no responses for this feed, skip + if (responses.length === 0) { + failures.push({ + feed: feed.pubkey, + error: `No responses found for feed hash: ${feedHash}. Skipping.`, + }); + continue; + } + + const oracleResponses = responses.map((x) => { + const oldDP = Big.DP; + Big.DP = 40; + const value = x.success_value + ? new Big(x.success_value).div(1e18) + : null; + Big.DP = oldDP; + return { + value, + error: x.failure_error, + oracle: new Oracle( + program, + new PublicKey(Buffer.from(x.oracle_pubkey, "hex")) + ), + }; + }); + + // offsets currently deprecated + const offsets: number[] = Array(responses.length).fill(0); + + if (debug) { + console.log("priceSignatures", responses); + } + + let submitSignaturesIx: TransactionInstruction | undefined = undefined; + let numSuccesses = 0; + if (responses.length > 0) { + const validResponses = responses.filter( + (x) => (x.signature ?? "").length > 0 + ); + numSuccesses = validResponses.length; + if (numSuccesses > 0) { + submitSignaturesIx = feed.getSolanaSubmitSignaturesIx({ + resps: validResponses, + offsets: offsets, + slot: slotHashes[0][0], + payer: params.payer ?? program.provider.publicKey, + }); + } + } + + // Bounce if there are no successes + if (!numSuccesses) { + const failure = { + feed: feed.pubkey, + error: `PullFeed.fetchUpdateIx Failure: ${oracleResponses.map( + (x) => x.error + )}`, + }; + failures.push(failure); + continue; + } + + // Get lookup tables for the oracles + const lutOwners = [...oracleResponses.map((x) => x.oracle), feed]; + const luts = await loadLookupTables(lutOwners); + + // Add the result to the successes array + successes.push({ + feed: feed.pubkey, + submitSignaturesIx, + oracleResponses, + numSuccesses, + luts, + failures: responses.map((x) => x.failure_error), + }); + } + + return { + successes, + failures, + }; + } + + /** + * Prefetch all lookup tables needed for the feed and queue. + * @returns A promise that resolves to an array of lookup tables. + * @throws if the lookup tables cannot be loaded. + */ + async preHeatLuts(): Promise { + const data = await this.loadData(); + const queue = new Queue(this.program, data.queue); + const oracleKeys = await queue.fetchOracleKeys(); + const oracles = oracleKeys.map((k) => new Oracle(this.program, k)); + const lutOwners = [...oracles, queue, this]; + const luts = await loadLookupTables(lutOwners); + return luts; + } + + /** + * Fetches updates for multiple feeds at once into a SINGLE tightly packed intruction + * + * @param program - The Anchor program instance. + * @param params_ - The parameters object. + * @param params_.gateway - The gateway URL to use. If not provided, the gateway is automatically fetched. + * @param params_.feeds - An array of feed account public keys. + * @param params_.numSignatures - The number of signatures to fetch. + * @param params_.crossbarClient - Optionally specify the CrossbarClient to use. + * @param recentSlothashes - An optional array of recent slothashes as `[anchor.BN, string]` tuples. + * @param debug - A boolean flag to enable or disable debug mode. Defaults to `false`. + * @returns A promise that resolves to a tuple containing: + * - The transaction instruction for fetching updates. + * - An array of `AddressLookupTableAccount` to use. + * - The raw response data. + */ + static async fetchUpdateManyIx( + program: Program, + params_: { + gateway?: string; + feeds: PublicKey[]; + numSignatures: number; + crossbarClient?: CrossbarClient; + payer?: PublicKey; + }, + recentSlothashes?: Array<[anchor.BN, string]>, + debug: boolean = false + ): Promise< + [ + TransactionInstruction, + AddressLookupTableAccount[], + FetchSignaturesMultiResponse + ] + > { + const slotHashes = + recentSlothashes ?? + (await RecentSlotHashes.fetchLatestNSlothashes( + program.provider.connection, + 30 + )); + const feeds = params_.feeds.map((feed) => new PullFeed(program, feed)); + const params = params_; + const feedConfigs: { + maxVariance: number; + minResponses: number; + jobs: any; + }[] = []; + let queue: PublicKey | undefined = undefined; + for (const feed of feeds) { + const data = await feed.loadData(); + if (queue !== undefined && !queue.equals(data.queue)) { + throw new Error( + "fetchUpdateManyIx: All feeds must have the same queue" + ); + } + queue = data.queue; + const maxVariance = data.maxVariance.toNumber() / 1e9; + const minResponses = data.minResponses; + const jobs = await (params_.crossbarClient ?? CrossbarClient.default()) + .fetch(Buffer.from(data.feedHash).toString("hex")) + .then((resp) => resp.jobs); + feedConfigs.push({ + maxVariance, + minResponses, + jobs, + }); + } + const response = await Queue.fetchSignaturesMulti(program, { + ...params, + recentHash: slotHashes[0][1], + feedConfigs, + queue: queue!, + }); + const oracles: PublicKey[] = []; + const submissions: any[] = []; + const maxI128 = new BN(2).pow(new BN(127)).sub(new BN(1)); + for (let i = 0; i < response.oracle_responses.length; i++) { + oracles.push( + new PublicKey( + Buffer.from( + response.oracle_responses[i].feed_responses[0].oracle_pubkey, + "hex" + ) + ) + ); + const oracleResponse = response.oracle_responses[i]; + const feedResponses = oracleResponse.feed_responses; + const multisSubmission = { + values: feedResponses.map((x: any) => { + if ((x.success_value ?? "") === "") { + return maxI128; + } + return new anchor.BN(x.success_value); + }), + signature: Buffer.from(oracleResponse.signature, "base64"), + recoveryId: oracleResponse.recovery_id, + }; + submissions.push(multisSubmission); + } + + const payerPublicKey = + params.payer ?? program.provider.publicKey ?? PublicKey.default; + const oracleFeedStats = oracles.map( + (oracle) => + PublicKey.findProgramAddressSync( + [Buffer.from("OracleStats"), oracle.toBuffer()], + program.programId + )[0] + ); + const instructionData = { + slot: new anchor.BN(slotHashes[0][0]), + submissions, + }; + + const accounts = { + queue: queue!, + programState: State.keyFromSeed(program), + recentSlothashes: SLOT_HASHES_SYSVAR_ID, + payer: payerPublicKey, + systemProgram: SystemProgram.programId, + rewardVault: spl.getAssociatedTokenAddressSync(spl.NATIVE_MINT, queue!), + tokenProgram: spl.TOKEN_PROGRAM_ID, + tokenMint: spl.NATIVE_MINT, + }; + const remainingAccounts: AccountMeta[] = [ + ...feeds.map((k) => ({ + pubkey: k.pubkey, + isSigner: false, + isWritable: true, + })), + ...oracles.map((k) => ({ + pubkey: k, + isSigner: false, + isWritable: false, + })), + ...oracleFeedStats.map((k) => ({ + pubkey: k, + isSigner: false, + isWritable: true, + })), + ]; + const lutLoaders: any[] = []; + for (const feed of feeds) { + lutLoaders.push(feed.loadLookupTable()); + } + for (const oracleKey of oracles) { + const oracle = new Oracle(program, oracleKey); + lutLoaders.push(oracle.loadLookupTable()); + } + const luts = await Promise.all(lutLoaders); + const ix = program.instruction.pullFeedSubmitResponseMany(instructionData, { + accounts, + remainingAccounts, + }); + return [ix, luts, response]; + } + + /** + * Compiles a transaction instruction to submit oracle signatures for a given feed. + * + * @param resps The oracle responses. This may be obtained from the `Gateway` class. + * @param slot The slot at which the oracles signed the feed with the current slothash. + * @returns A promise that resolves to the transaction instruction. + */ + getSolanaSubmitSignaturesIx(params: { + resps: FeedEvalResponse[]; + offsets: number[]; + slot: anchor.BN; + payer?: PublicKey; + chain?: string; + }): TransactionInstruction { + const program = this.program; + const payerPublicKey = + params.payer ?? program.provider.publicKey ?? PublicKey.default; + const resps = params.resps.filter((x) => (x.signature ?? "").length > 0); + const isSolana = params.chain === "solana" || params.chain === undefined; + + let queue = new PublicKey( + Buffer.from(resps[0].queue_pubkey.toString(), "hex") + ); + const sourceQueueKey = new PublicKey( + Buffer.from(resps[0].queue_pubkey.toString(), "hex") + ); + let queueBump = 0; + + if (!isSolana) { + [queue, queueBump] = PublicKey.findProgramAddressSync( + [Buffer.from("Queue"), queue.toBuffer()], + program.programId + ); + } + + const oracles = resps.map((x) => { + const sourceOracleKey = new PublicKey( + Buffer.from(x.oracle_pubkey.toString(), "hex") + ); + if (isSolana) { + return sourceOracleKey; + } else { + const [oraclePDA] = PublicKey.findProgramAddressSync( + [Buffer.from("Oracle"), queue.toBuffer(), sourceOracleKey.toBuffer()], + program.programId + ); + return oraclePDA; + } + }); + + const oracleFeedStats = oracles.map( + (oracle) => + PublicKey.findProgramAddressSync( + [Buffer.from("OracleStats"), oracle.toBuffer()], + program.programId + )[0] + ); + + const submissions = resps.map((resp, idx) => ({ + value: new anchor.BN(resp.success_value.toString()), + signature: resp.signature, + recoveryId: resp.recovery_id, + + // offsets aren't used in the non-solana endpoint + slotOffset: isSolana ? params.offsets[idx] : undefined, + })); + + const instructionData = { + slot: new anchor.BN(params.slot), + submissions: submissions.map((x: any) => { + x.signature = Buffer.from(x.signature, "base64"); + return x; + }), + sourceQueueKey: isSolana ? undefined : sourceQueueKey, + queueBump: isSolana ? undefined : queueBump, + }; + + const accounts = { + feed: this.pubkey, + queue: queue, + programState: State.keyFromSeed(program), + recentSlothashes: SLOT_HASHES_SYSVAR_ID, + payer: payerPublicKey, + systemProgram: SystemProgram.programId, + rewardVault: spl.getAssociatedTokenAddressSync( + spl.NATIVE_MINT, + queue, + !isSolana + ), + tokenProgram: spl.TOKEN_PROGRAM_ID, + tokenMint: spl.NATIVE_MINT, + }; + + const remainingAccounts: AccountMeta[] = [ + ...oracles.map((k) => ({ + pubkey: k, + isSigner: false, + isWritable: false, + })), + ...oracleFeedStats.map((k) => ({ + pubkey: k, + isSigner: false, + isWritable: true, + })), + ]; + + if (isSolana) { + return program.instruction.pullFeedSubmitResponse(instructionData, { + accounts, + remainingAccounts, + }); + } else { + return program.instruction.pullFeedSubmitResponseSvm(instructionData, { + accounts, + remainingAccounts, + }); + } + } + + /** + * Checks if the pull feed account has been initialized. + * + * @returns A promise that resolves to a boolean indicating if the account has been initialized. + */ + async isInitializedAsync(): Promise { + return !(await checkNeedsInit( + this.program.provider.connection, + this.program.programId, + this.pubkey + )); + } + + /** + * Loads the feed data for this {@linkcode PullFeed} account from on chain. + * + * @returns A promise that resolves to the feed data. + * @throws if the feed account does not exist. + */ + async loadData(): Promise { + return await this.program.account["pullFeedAccountData"].fetch(this.pubkey); + } + + /** + * Loads the feed data for this {@linkcode PullFeed} account from on chain. + * + * @returns A promise that resolves to the values currently stored in the feed. + * @throws if the feed account does not exist. + */ + async loadValues(): Promise< + Array<{ value: Big; slot: anchor.BN; oracle: PublicKey }> + > { + const data = await this.loadData(); + return data.submissions + .filter((x: any) => !x.oracle.equals(PublicKey.default)) + .map((x: any) => { + Big.DP = 40; + return { + value: new Big(x.value.toString()).div(1e18), + slot: new BN(x.slot.toString()), + oracle: new PublicKey(x.oracle), + }; + }); + } + + /** + * Loads the feed data for this {@linkcode PullFeed} account from on chain. + * + * @param onlyAfter Call will ignore data signed before this slot. + * @returns A promise that resolves to the observed value as it would be + * seen on-chain. + */ + async loadObservedValue(onlyAfter: anchor.BN): Promise<{ + value: Big; + slot: anchor.BN; + oracle: PublicKey; + } | null> { + const values = await this.loadValues(); + return toFeedValue(values, onlyAfter); + } + + /** + * Watches for any on-chain updates to the feed data. + * + * @param callback The callback to call when the feed data is updated. + * @returns A promise that resolves to a subscription ID. + */ + async subscribeToValueChanges(callback: any): Promise { + const coder = new BorshAccountsCoder(this.program.idl); + const subscriptionId = this.program.provider.connection.onAccountChange( + this.pubkey, + async (accountInfo, context) => { + const feed = coder.decode("pullFeedAccountData", accountInfo.data); + await callback( + feed.submissions + .filter((x: any) => !x.oracle.equals(PublicKey.default)) + .map((x: any) => { + Big.DP = 40; + return { + value: new Big(x.value.toString()).div(1e18), + slot: new anchor.BN(x.slot.toString()), + oracle: new PublicKey(x.oracle), + }; + }) + ); + }, + "processed" + ); + return subscriptionId; + } + + /** + * Watches for any on-chain updates to any data feed. + * + * @param program The Anchor program instance. + * @param callback The callback to call when the feed data is updated. + * @returns A promise that resolves to a subscription ID. + */ + static async subscribeToAllUpdates( + program: Program, + callback: ( + event: [number, { pubkey: PublicKey; submissions: FeedSubmission[] }] + ) => Promise + ): Promise { + const coder = new BorshAccountsCoder(program.idl); + const subscriptionId = program.provider.connection.onProgramAccountChange( + program.programId, + async (keyedAccountInfo, ctx) => { + const { accountId, accountInfo } = keyedAccountInfo; + try { + const feed = coder.decode("pullFeedAccountData", accountInfo.data); + await callback([ + ctx.slot, + { + pubkey: accountId, + submissions: feed.submissions + .filter((x) => !x.oracle.equals(PublicKey.default)) + .map((x) => { + Big.DP = 40; + return { + value: new Big(x.value.toString()).div(1e18), + slot: new anchor.BN(x.slot.toString()), + oracle: new PublicKey(x.oracle), + }; + }), + }, + ]); + } catch (e) { + console.log(`ParseFailure: ${e}`); + } + }, + "processed", + [ + { + memcmp: { + bytes: "ZoV7s83c7bd", + offset: 0, + }, + }, + ] + ); + return subscriptionId; + } + + public lookupTableKey(data: any): PublicKey { + const lutSigner = PublicKey.findProgramAddressSync( + [Buffer.from("LutSigner"), this.pubkey.toBuffer()], + this.program.programId + )[0]; + + const [_, lutKey] = AddressLookupTableProgram.createLookupTable({ + authority: lutSigner, + payer: PublicKey.default, + recentSlot: data.lutSlot, + }); + return lutKey; + } + + async loadLookupTable(): Promise { + if (this.lut !== null && this.lut !== undefined) { + return this.lut; + } + const data = await this.loadData(); + const lutKey = this.lookupTableKey(data); + const accnt = await this.program.provider.connection.getAddressLookupTable( + lutKey + ); + this.lut = accnt.value!; + return this.lut!; + } + + async loadHistoricalValuesCompact( + data_?: PullFeedAccountData + ): Promise { + const data = data_ ?? (await this.loadData()); + const values = data.historicalResults + .filter((x) => x.slot.gt(new BN(0))) + .sort((a, b) => a.slot.cmp(b.slot)); + return values; + } +} diff --git a/javascript/on-demand/src/accounts/queue.ts b/javascript/on-demand/src/accounts/queue.ts new file mode 100644 index 0000000..799eb57 --- /dev/null +++ b/javascript/on-demand/src/accounts/queue.ts @@ -0,0 +1,840 @@ +import type { + FeedEvalBatchResponse, + FeedEvalResponse, + FetchSignaturesBatchResponse, + FetchSignaturesMultiResponse, +} from "../oracle-interfaces/gateway.js"; +import { Gateway } from "../oracle-interfaces/gateway.js"; +import { + isMainnetConnection, + ON_DEMAND_DEVNET_PID, + ON_DEMAND_MAINNET_PID, +} from "../utils"; + +import * as spl from "./../utils/index.js"; +import type { SwitchboardPermission } from "./permission.js"; +import { Permission } from "./permission.js"; +import type { FeedRequest } from "./pullFeed.js"; +import { State } from "./state.js"; + +import * as anchor from "@coral-xyz/anchor-30"; +import { BorshAccountsCoder, type Program, utils } from "@coral-xyz/anchor-30"; +import type { + AddressLookupTableAccount, + TransactionInstruction, +} from "@solana/web3.js"; +import { + AddressLookupTableProgram, + Keypair, + PublicKey, + SystemProgram, +} from "@solana/web3.js"; +import { FeedHash, type OracleJob } from "@switchboard-xyz/common"; + +function withTimeout( + promise: Promise, + timeoutMs: number +): Promise { + // Create a timeout promise that resolves to null after timeoutMs milliseconds + const timeoutPromise = new Promise((resolve) => + setTimeout(resolve, timeoutMs, null) + ); + + // Race the timeout promise against the original promise + return Promise.race([promise, timeoutPromise]); +} +/** + * Removes trailing null bytes from a string. + * + * @param input The input string. + * @returns The input string with trailing null bytes removed. + */ +function removeTrailingNullBytes(input: string): string { + // Regular expression to match trailing null bytes + const trailingNullBytesRegex = /\x00+$/; + // Remove trailing null bytes using the replace() method + return input.replace(trailingNullBytesRegex, ""); +} + +function runWithTimeout( + task: Promise, + timeoutMs: number +): Promise { + return new Promise((resolve, reject) => { + // Set up the timeout + const timer = setTimeout(() => { + resolve("timeout"); + }, timeoutMs); + + task.then( + (result) => { + clearTimeout(timer); + resolve(result); + }, + (error) => { + clearTimeout(timer); + reject(error); + } + ); + }); +} + +/** + * Abstraction around the Switchboard-On-Demand Queue account + * + * This account is used to store the queue data for a given feed. + */ +export class Queue { + static async createIx( + program: Program, + params: { + allowAuthorityOverrideAfter?: number; + requireAuthorityHeartbeatPermission?: boolean; + requireUsagePermission?: boolean; + maxQuoteVerificationAge?: number; + reward?: number; + nodeTimeout?: number; + lutSlot?: number; + } + ): Promise<[Queue, Keypair, TransactionInstruction]> { + const stateKey = State.keyFromSeed(program); + const state = await State.loadData(program); + const queue = Keypair.generate(); + const allowAuthorityOverrideAfter = + params.allowAuthorityOverrideAfter ?? 60 * 60; + const requireAuthorityHeartbeatPermission = + params.requireAuthorityHeartbeatPermission ?? true; + const requireUsagePermission = params.requireUsagePermission ?? false; + const maxQuoteVerificationAge = + params.maxQuoteVerificationAge ?? 60 * 60 * 24 * 7; + const reward = params.reward ?? 1000000; + const nodeTimeout = params.nodeTimeout ?? 300; + const payer = (program.provider as any).wallet.payer; + // Prepare accounts for the transaction + const lutSigner = ( + await PublicKey.findProgramAddress( + [Buffer.from("LutSigner"), queue.publicKey.toBuffer()], + program.programId + ) + )[0]; + const [delegationGroup] = await PublicKey.findProgramAddress( + [ + Buffer.from("Group"), + stateKey.toBuffer(), + state.stakePool.toBuffer(), + queue.publicKey.toBuffer(), + ], + state.stakeProgram + ); + const recentSlot = + params.lutSlot ?? + (await program.provider.connection.getSlot("finalized")); + const [_, lut] = AddressLookupTableProgram.createLookupTable({ + authority: lutSigner, + payer: payer.publicKey, + recentSlot, + }); + + let stakePool = state.stakePool; + if (stakePool.equals(PublicKey.default)) { + stakePool = payer.publicKey; + } + const queueAccount = new Queue(program, queue.publicKey); + const ix = await program.instruction.queueInit( + { + allowAuthorityOverrideAfter, + requireAuthorityHeartbeatPermission, + requireUsagePermission, + maxQuoteVerificationAge, + reward, + nodeTimeout, + recentSlot: new anchor.BN(recentSlot), + }, + { + accounts: { + queue: queue.publicKey, + queueEscrow: await spl.getAssociatedTokenAddress( + spl.NATIVE_MINT, + queue.publicKey + ), + authority: payer.publicKey, + payer: payer.publicKey, + systemProgram: SystemProgram.programId, + tokenProgram: spl.TOKEN_PROGRAM_ID, + nativeMint: spl.NATIVE_MINT, + programState: State.keyFromSeed(program), + lutSigner: await queueAccount.lutSigner(), + lut: await queueAccount.lutKey(recentSlot), + addressLookupTableProgram: AddressLookupTableProgram.programId, + delegationGroup, + stakeProgram: state.stakeProgram, + stakePool: stakePool, + associatedTokenProgram: spl.ASSOCIATED_TOKEN_PROGRAM_ID, + }, + signers: [payer, queue], + } + ); + return [new Queue(program, queue.publicKey), queue, ix]; + } + + /** + * Creates a new instance of the `Queue` account with a PDA for SVM (non-solana) chains. + * @param program The anchor program instance. + * @param params The initialization parameters for the queue. + * @returns + */ + static async createIxSVM( + program: Program, + params: { + sourceQueueKey: PublicKey; + allowAuthorityOverrideAfter?: number; + requireAuthorityHeartbeatPermission?: boolean; + requireUsagePermission?: boolean; + maxQuoteVerificationAge?: number; + reward?: number; + nodeTimeout?: number; + lutSlot?: number; + } + ): Promise<[Queue, TransactionInstruction]> { + const stateKey = State.keyFromSeed(program); + const state = await State.loadData(program); + + // Generate the queue PDA for the given source queue key + const [queue] = await PublicKey.findProgramAddress( + [Buffer.from("Queue"), params.sourceQueueKey.toBuffer()], + program.programId + ); + const allowAuthorityOverrideAfter = + params.allowAuthorityOverrideAfter ?? 60 * 60; + const requireAuthorityHeartbeatPermission = + params.requireAuthorityHeartbeatPermission ?? true; + const requireUsagePermission = params.requireUsagePermission ?? false; + const maxQuoteVerificationAge = + params.maxQuoteVerificationAge ?? 60 * 60 * 24 * 7; + const reward = params.reward ?? 1000000; + const nodeTimeout = params.nodeTimeout ?? 300; + const payer = (program.provider as any).wallet.payer; + // Prepare accounts for the transaction + const lutSigner = ( + await PublicKey.findProgramAddress( + [Buffer.from("LutSigner"), queue.toBuffer()], + program.programId + ) + )[0]; + const [delegationGroup] = await PublicKey.findProgramAddress( + [ + Buffer.from("Group"), + stateKey.toBuffer(), + state.stakePool.toBuffer(), + queue.toBuffer(), + ], + state.stakeProgram + ); + const recentSlot = + params.lutSlot ?? + (await program.provider.connection.getSlot("finalized")); + const [_, lut] = AddressLookupTableProgram.createLookupTable({ + authority: lutSigner, + payer: payer.publicKey, + recentSlot, + }); + + let stakePool = state.stakePool; + if (stakePool.equals(PublicKey.default)) { + stakePool = payer.publicKey; + } + const queueAccount = new Queue(program, queue); + const ix = program.instruction.queueInitSvm( + { + allowAuthorityOverrideAfter, + requireAuthorityHeartbeatPermission, + requireUsagePermission, + maxQuoteVerificationAge, + reward, + nodeTimeout, + recentSlot: new anchor.BN(recentSlot), + sourceQueueKey: params.sourceQueueKey, + }, + { + accounts: { + queue: queue, + queueEscrow: await spl.getAssociatedTokenAddress( + spl.NATIVE_MINT, + queue, + true + ), + authority: payer.publicKey, + payer: payer.publicKey, + systemProgram: SystemProgram.programId, + tokenProgram: spl.TOKEN_PROGRAM_ID, + nativeMint: spl.NATIVE_MINT, + programState: State.keyFromSeed(program), + lutSigner: await queueAccount.lutSigner(), + lut: await queueAccount.lutKey(recentSlot), + addressLookupTableProgram: AddressLookupTableProgram.programId, + delegationGroup, + stakeProgram: state.stakeProgram, + stakePool: stakePool, + associatedTokenProgram: spl.ASSOCIATED_TOKEN_PROGRAM_ID, + }, + signers: [payer], + } + ); + return [new Queue(program, queue), ix]; + } + + /** + * Add an Oracle to a queue and set permissions + * @param program + * @param params + */ + async overrideSVM(params: { + oracle: PublicKey; + secp256k1Signer: Buffer; + maxQuoteVerificationAge: number; + mrEnclave: Buffer; + slot: number; + }) { + const stateKey = State.keyFromSeed(this.program); + const state = await State.loadData(this.program); + const programAuthority = state.authority; + const { authority } = await this.loadData(); + if (!authority.equals(programAuthority)) { + throw new Error("Override failed: Invalid authority"); + } + + const ix = this.program.instruction.queueOverrideSvm( + { + secp256K1Signer: Array.from(params.secp256k1Signer), + maxQuoteVerificationAge: new anchor.BN(params.maxQuoteVerificationAge), + mrEnclave: params.mrEnclave, + slot: new anchor.BN(params.slot), + }, + { + accounts: { + queue: this.pubkey, + oracle: params.oracle, + authority, + state: stateKey, + }, + } + ); + return ix; + } + + async initDelegationGroupIx(params: { + lutSlot?: number; + overrideStakePool?: PublicKey; + }): Promise { + const queueAccount = new Queue(this.program, this.pubkey); + const lutSlot = params.lutSlot ?? (await this.loadData()).lutSlot; + const payer = (this.program.provider as any).wallet.payer; + const stateKey = State.keyFromSeed(this.program); + const state = await State.loadData(this.program); + const stakePool = params.overrideStakePool ?? state.stakePool; + const [delegationGroup] = await PublicKey.findProgramAddress( + [ + Buffer.from("Group"), + stateKey.toBuffer(), + stakePool.toBuffer(), + this.pubkey.toBuffer(), + ], + state.stakeProgram + ); + const isMainnet = isMainnetConnection(this.program.provider.connection); + let pid = ON_DEMAND_MAINNET_PID; + if (!isMainnet) { + pid = ON_DEMAND_DEVNET_PID; + } + const [queueEscrowSigner] = await PublicKey.findProgramAddress( + [Buffer.from("Signer"), this.pubkey.toBuffer()], + pid + ); + const ix = await this.program.instruction.queueInitDelegationGroup( + {}, + { + accounts: { + queue: this.pubkey, + queueEscrow: await spl.getAssociatedTokenAddress( + spl.NATIVE_MINT, + this.pubkey + ), + queueEscrowSigner, + payer: payer.publicKey, + systemProgram: SystemProgram.programId, + tokenProgram: spl.TOKEN_PROGRAM_ID, + nativeMint: spl.NATIVE_MINT, + programState: stateKey, + lutSigner: await this.lutSigner(), + lut: await this.lutKey(lutSlot), + addressLookupTableProgram: AddressLookupTableProgram.programId, + delegationGroup: delegationGroup, + stakeProgram: state.stakeProgram, + stakePool: stakePool, + }, + } + ); + return ix; + } + + /** + * Fetches signatures from a random gateway on the queue. + * + * REST API endpoint: /api/v1/fetch_signatures + * + * @param recentHash The chain metadata to sign with. Blockhash or slothash. + * @param jobs The oracle jobs to perform. + * @param numSignatures The number of oracles to fetch signatures from. + * @returns A promise that resolves to the feed evaluation responses. + * @throws if the request fails. + */ + static async fetchSignatures( + program: Program, + params: { + gateway?: string; + queue: PublicKey; + recentHash?: string; + jobs: OracleJob[]; + numSignatures?: number; + maxVariance?: number; + minResponses?: number; + } + ): Promise<{ responses: FeedEvalResponse[]; failures: string[] }> { + const queueAccount = new Queue(program, params.queue); + return queueAccount.fetchSignatures(params); + } + + static async fetchSignaturesMulti( + program: Program, + params: { + gateway?: string; + queue: PublicKey; + recentHash?: string; + feedConfigs: FeedRequest[]; + minResponses?: number; + } + ): Promise { + const queueAccount = new Queue(program, params.queue!); + return queueAccount.fetchSignaturesMulti(params); + } + + static async fetchSignaturesBatch( + program: Program, + params: { + gateway?: string; + queue: PublicKey; + recentHash?: string; + feedConfigs: FeedRequest[]; + minResponses?: number; + } + ): Promise { + const queueAccount = new Queue(program, params.queue!); + return queueAccount.fetchSignaturesBatch(params); + } + + /** + * @deprecated + * Deprecated. Use {@linkcode @switchboard-xyz/common#FeedHash.compute} instead. + */ + static async fetchFeedHash( + program: Program, + params: { + gateway?: string; + queue: PublicKey; + recentHash?: string; + jobs: OracleJob[]; + numSignatures?: number; + maxVariance?: number; + minResponses?: number; + } + ): Promise { + const queueAccount = new Queue(program, params.queue); + const oracleSigs = await queueAccount.fetchSignatures(params); + return Buffer.from(oracleSigs[0].feed_hash, "hex"); + } + + /** + * Constructs a `OnDemandQueue` instance. + * + * @param program The Anchor program instance. + * @param pubkey The public key of the queue account. + */ + constructor(readonly program: Program, readonly pubkey: PublicKey) { + if (this.pubkey === undefined) { + throw new Error("NoPubkeyProvided"); + } + } + + /** + * Loads the queue data from on chain and returns the listed oracle keys. + * + * @returns A promise that resolves to an array of oracle public keys. + */ + async fetchOracleKeys(): Promise { + const program = this.program; + const queueData = (await program.account["queueAccountData"].fetch( + this.pubkey + )) as any; + const oracles = queueData.oracleKeys.slice(0, queueData.oracleKeysLen); + return oracles; + } + + /** + * Loads the queue data from on chain and returns the listed gateways. + * + * @returns A promise that resolves to an array of gateway URIs. + */ + async fetchAllGateways(): Promise { + const queue = this.pubkey; + const program = this.program; + const coder = new BorshAccountsCoder(program.idl); + const oracles = await this.fetchOracleKeys(); + const oracleAccounts = await utils.rpc.getMultipleAccounts( + program.provider.connection, + oracles + ); + const gatewayUris = oracleAccounts + .map((x: any) => coder.decode("oracleAccountData", x.account.data)) + .map((x: any) => String.fromCharCode(...x.gatewayUri)) + .map((x: string) => removeTrailingNullBytes(x)) + .filter((x: string) => x.length > 0) + .filter((x: string) => !x.includes("infstones")); + + const tests: Promise[] = []; + for (const i in gatewayUris) { + const gw = new Gateway(program, gatewayUris[i], oracles[i]); + tests.push(gw.test()); + } + + let gateways: Gateway[] = []; + for (let i = 0; i < tests.length; i++) { + try { + const isGood = await withTimeout(tests[i], 2000); + if (isGood) { + gateways.push(new Gateway(program, gatewayUris[i], oracles[i])); + } + } catch (e) { + console.log("Timeout", e); + } + } + gateways = gateways.sort(() => Math.random() - 0.5); + return gateways as Gateway[]; + } + + /** + * Loads the queue data from on chain and returns a random gateway. + * @returns A promise that resolves to a gateway interface + */ + async fetchGateway(): Promise { + const gateways = await this.fetchAllGateways(); + if (gateways.length === 0) { + throw new Error("NoGatewayAvailable"); + } + return gateways[Math.floor(Math.random() * gateways.length)]; + } + + /** + * Fetches signatures from a random gateway on the queue. + * + * REST API endpoint: /api/v1/fetch_signatures + * + * @param gateway The gateway to fetch signatures from. If not provided, a gateway will be automatically selected. + * @param recentHash The chain metadata to sign with. Blockhash or slothash. + * @param jobs The oracle jobs to perform. + * @param numSignatures The number of oracles to fetch signatures from. + * @param maxVariance The maximum variance allowed in the responses. + * @param minResponses The minimum number of responses to attempt to fetch. + * @returns A promise that resolves to the feed evaluation responses. + * @throws if the request fails. + */ + async fetchSignatures(params: { + gateway?: string; + recentHash?: string; + jobs: OracleJob[]; + numSignatures?: number; + maxVariance?: number; + minResponses?: number; + useTimestamp?: boolean; + chain?: string; + }): Promise<{ responses: FeedEvalResponse[]; failures: string[] }> { + let gateway = new Gateway(this.program, params.gateway ?? ""); + if (params.gateway === undefined) { + gateway = await this.fetchGateway(); + } + return await gateway.fetchSignatures(params); + } + + async fetchSignaturesMulti(params: { + gateway?: string; + queue: PublicKey; + recentHash?: string; + feedConfigs: FeedRequest[]; + minResponses?: number; + }): Promise { + let gateway = new Gateway(this.program, params.gateway ?? ""); + if (params.gateway === undefined) { + gateway = await this.fetchGateway(); + } + return await gateway.fetchSignaturesMulti(params); + } + + async fetchSignaturesBatch(params: { + gateway?: string; + queue: PublicKey; + recentHash?: string; + feedConfigs: FeedRequest[]; + minResponses?: number; + }): Promise { + let gateway = new Gateway(this.program, params.gateway ?? ""); + if (params.gateway === undefined) { + gateway = await this.fetchGateway(); + } + return await gateway.fetchSignaturesBatch(params); + } + + /** + * Loads the queue data for this {@linkcode Queue} account from on chain. + * + * @returns A promise that resolves to the queue data. + * @throws if the queue account does not exist. + */ + async loadData(): Promise { + return await this.program.account["queueAccountData"].fetch(this.pubkey); + } + + /** + * Adds a new MR enclave to the queue. + * This will allow the queue to accept signatures from the given MR enclave. + * @param mrEnclave The MR enclave to add. + * @returns A promise that resolves to the transaction instruction. + * @throws if the request fails. + * @throws if the MR enclave is already added. + * @throws if the MR enclave is invalid. + * @throws if the MR enclave is not a valid length. + */ + async addMrEnclaveIx(params: { + mrEnclave: Uint8Array; + }): Promise { + const stateKey = State.keyFromSeed(this.program); + const state = await State.loadData(this.program); + const programAuthority = state.authority; + const { authority } = await this.loadData(); + const ix = await this.program.instruction.queueAddMrEnclave( + { mrEnclave: params.mrEnclave }, + { + accounts: { + queue: this.pubkey, + authority, + programAuthority, + state: stateKey, + }, + } + ); + return ix; + } + + /** + * Removes an MR enclave from the queue. + * This will prevent the queue from accepting signatures from the given MR enclave. + * @param mrEnclave The MR enclave to remove. + * @returns A promise that resolves to the transaction instruction. + * @throws if the request fails. + * @throws if the MR enclave is not present. + */ + async rmMrEnclaveIx(params: { + mrEnclave: Uint8Array; + }): Promise { + const stateKey = State.keyFromSeed(this.program); + const state = await State.loadData(this.program); + const programAuthority = state.authority; + const { authority } = await this.loadData(); + const ix = await this.program.instruction.queueRemoveMrEnclave( + { mrEnclave: params.mrEnclave }, + { + accounts: { + queue: this.pubkey, + authority, + programAuthority, + state: stateKey, + }, + } + ); + return ix; + } + + /** + * Sets the queue configurations. + * @param params.authority The new authority for the queue. + * @param params.reward The new reward for the queue. + * @param params.nodeTimeout The new node timeout for the queue. + * @returns A promise that resolves to the transaction instruction. + */ + async setConfigsIx(params: { + authority?: PublicKey; + reward?: number; + nodeTimeout?: number; + }): Promise { + const data = await this.loadData(); + const stateKey = State.keyFromSeed(this.program); + let nodeTimeout: anchor.BN | null = null; + if (params.nodeTimeout !== undefined) { + nodeTimeout = new anchor.BN(params.nodeTimeout); + } + const ix = await this.program.instruction.queueSetConfigs( + { + authority: params.authority ?? null, + reward: params.reward ?? null, + nodeTimeout: nodeTimeout, + }, + { + accounts: { + queue: this.pubkey, + authority: data.authority, + state: stateKey, + }, + } + ); + return ix; + } + + /** + * Sets the oracle permission on the queue. + * @param params.oracle The oracle to set the permission for. + * @param params.permission The permission to set. + * @param params.enabled Whether the permission is enabled. + * @returns A promise that resolves to the transaction instruction */ + async setOraclePermissionIx(params: { + oracle: PublicKey; + permission: SwitchboardPermission; + enable: boolean; + }): Promise { + const data = await this.loadData(); + return Permission.setIx(this.program, { + authority: data.authority, + grantee: params.oracle, + granter: this.pubkey, + permission: params.permission, + enable: params.enable, + }); + } + + /** + * Removes all MR enclaves from the queue. + * @returns A promise that resolves to an array of transaction instructions. + * @throws if the request fails. + */ + async rmAllMrEnclaveIxs(): Promise> { + const { mrEnclaves, mrEnclavesLen } = await this.loadData(); + const activeEnclaves = mrEnclaves.slice(0, mrEnclavesLen); + const ixs: Array = []; + for (const mrEnclave of activeEnclaves) { + ixs.push( + await this.rmMrEnclaveIx({ + mrEnclave, + }) + ); + } + return ixs; + } + + /** + * Fetches most recently added and verified Oracle Key. + * @returns A promise that resolves to an oracle public key. + * @throws if the request fails. + */ + async fetchFreshOracle(): Promise { + const coder = new BorshAccountsCoder(this.program.idl); + const now = Math.floor(+new Date() / 1000); + const oracles = await this.fetchOracleKeys(); + const oracleAccounts = await utils.rpc.getMultipleAccounts( + this.program.provider.connection, + oracles + ); + const oracleUris = oracleAccounts + .map((x: any) => coder.decode("oracleAccountData", x.account.data)) + .map((x: any) => String.fromCharCode(...x.gatewayUri)) + .map((x: string) => removeTrailingNullBytes(x)) + .filter((x: string) => x.length > 0); + + const tests: Promise[] = []; + for (const i in oracleUris) { + const gw = new Gateway(this.program, oracleUris[i], oracles[i]); + tests.push(gw.test()); + } + + const zip: any = []; + for (let i = 0; i < oracles.length; i++) { + try { + const isGood = await withTimeout(tests[i], 2000); + if (!isGood) { + continue; + } + } catch (e) { + console.log("Gateway Timeout", e); + } + zip.push({ + data: coder.decode( + "oracleAccountData", + oracleAccounts[i]!.account!.data + ), + key: oracles[i], + }); + } + const validOracles = zip + .filter((x: any) => x.data.enclave.verificationStatus === 4) // value 4 is for verified + .filter((x: any) => x.data.enclave.validUntil > now + 3600); // valid for 1 hour at least + const chosen = + validOracles[Math.floor(Math.random() * validOracles.length)]; + return chosen.key; + } + + /** + * Get the PDA for the queue (SVM chains that are not solana) + * @returns Queue PDA Pubkey + */ + queuePDA(): PublicKey { + return Queue.queuePDA(this.program, this.pubkey); + } + + /** + * Get the PDA for the queue (SVM chains that are not solana) + * @param program Anchor program + * @param pubkey Queue pubkey + * @returns Queue PDA Pubkey + */ + static queuePDA(program: Program, pubkey: PublicKey): PublicKey { + const [queuePDA] = PublicKey.findProgramAddressSync( + [Buffer.from("Queue"), pubkey.toBuffer()], + program.programId + ); + return queuePDA; + } + + async lutSigner(): Promise { + return ( + await PublicKey.findProgramAddress( + [Buffer.from("LutSigner"), this.pubkey.toBuffer()], + this.program.programId + ) + )[0]; + } + + async lutKey(lutSlot: number): Promise { + const lutSigner = await this.lutSigner(); + const [_, lutKey] = await AddressLookupTableProgram.createLookupTable({ + authority: lutSigner, + payer: PublicKey.default, + recentSlot: lutSlot, + }); + return lutKey; + } + + async loadLookupTable(): Promise { + const data = await this.loadData(); + const lutKey = await this.lutKey(data.lutSlot); + const accnt = await this.program.provider.connection.getAddressLookupTable( + lutKey + ); + return accnt.value!; + } +} diff --git a/javascript/on-demand/src/accounts/randomness.ts b/javascript/on-demand/src/accounts/randomness.ts new file mode 100644 index 0000000..8a14043 --- /dev/null +++ b/javascript/on-demand/src/accounts/randomness.ts @@ -0,0 +1,430 @@ +import { SLOT_HASHES_SYSVAR_ID } from "../constants.js"; +import type { RandomnessRevealResponse } from "../oracle-interfaces/gateway.js"; +import { Gateway } from "../oracle-interfaces/gateway.js"; + +import { InstructionUtils } from "./../instruction-utils/InstructionUtils.js"; +import { RecentSlotHashes } from "./../sysvars/recentSlothashes.js"; +import * as spl from "./../utils/index.js"; +import { Oracle } from "./oracle.js"; +import { Queue } from "./queue.js"; +import { State } from "./state.js"; + +import { + BN, + BorshAccountsCoder, + type Program, + utils, +} from "@coral-xyz/anchor-30"; +import * as anchor from "@coral-xyz/anchor-30"; +import type { TransactionInstruction } from "@solana/web3.js"; +import { + AddressLookupTableAccount, + AddressLookupTableProgram, + ComputeBudgetProgram, + Keypair, + MessageV0, + PublicKey, + SystemProgram, + Transaction, +} from "@solana/web3.js"; +import { sendTxWithJito } from "@solworks/soltoolkit-sdk/build/modules/TransactionWrapper.js"; +import * as bs58 from "bs58"; +import * as fs from "fs"; + +/** + * Switchboard commit-reveal randomness. + * This account type controls commit-reveal style randomness employing + * Intel SGX enclaves as a randomness security mechanism. + * For this flow, a user must commit to a future slot that would be unknown + * to all parties at the time of commitment. The user must then reveal the + * randomness by then sending the future slot hash to the oracle which can + * then be signed by the secret key secured within the Trusted Execution Environment. + * + * In this manner, the only way for one to predict the randomness is to: + * 1. Have access to the randomness oracle + * 2. have control of the solana network slot leader at the time of commit + * 3. Have an unpatched Intel SGX vulnerability/advisory that the Switchboard + * protocol failed to auto-prune. + */ +export class Randomness { + /** + * Constructs a `Randomness` instance. + * + * @param {Program} program - The Anchor program instance. + * @param {PublicKey} pubkey - The public key of the randomness account. + */ + constructor(readonly program: Program, readonly pubkey: PublicKey) {} + + /** + * Loads the randomness data for this {@linkcode Randomness} account from on chain. + * + * @returns {Promise} A promise that resolves to the randomness data. + * @throws Will throw an error if the randomness account does not exist. + */ + async loadData(): Promise { + return await this.program.account["randomnessAccountData"].fetch( + this.pubkey + ); + } + + /** + * Creates a new `Randomness` account. + * + * @param {Program} program - The Anchor program instance. + * @param {Keypair} kp - The keypair of the new `Randomness` account. + * @param {PublicKey} queue - The queue account to associate with the new `Randomness` account. + * @param {PublicKey} [payer_] - The payer for the transaction. If not provided, the default payer from the program provider is used. + * @returns {Promise<[Randomness, TransactionInstruction]>} A promise that resolves to a tuple containing the new `Randomness` account and the transaction instruction. + */ + static async create( + program: Program, + kp: Keypair, + queue: PublicKey, + payer_?: PublicKey + ): Promise<[Randomness, TransactionInstruction]> { + const lutSigner = ( + await PublicKey.findProgramAddress( + [Buffer.from("LutSigner"), kp.publicKey.toBuffer()], + program.programId + ) + )[0]; + const recentSlot = await program.provider.connection.getSlot("finalized"); + const [_, lut] = AddressLookupTableProgram.createLookupTable({ + authority: lutSigner, + payer: PublicKey.default, + recentSlot, + }); + const ix = program.instruction.randomnessInit( + { + recentSlot: new anchor.BN(recentSlot.toString()), + }, + { + accounts: { + randomness: kp.publicKey, + queue, + authority: program.provider.publicKey!, + payer: program.provider.publicKey!, + rewardEscrow: spl.getAssociatedTokenAddressSync( + spl.NATIVE_MINT, + kp.publicKey + ), + systemProgram: SystemProgram.programId, + tokenProgram: spl.TOKEN_PROGRAM_ID, + associatedTokenProgram: spl.ASSOCIATED_TOKEN_PROGRAM_ID, + wrappedSolMint: spl.NATIVE_MINT, + programState: State.keyFromSeed(program), + lutSigner, + lut, + addressLookupTableProgram: AddressLookupTableProgram.programId, + }, + } + ); + return [new Randomness(program, kp.publicKey), ix]; + } + + /** + * Generate a randomness `commit` solana transaction instruction. + * This will commit the randomness account to use currentSlot + 1 slothash + * as the non-repeating randomness seed. + * + * @param {PublicKey} queue - The queue public key for the commit instruction. + * @param {PublicKey} [authority_] - The optional authority public key. + * @returns {Promise} A promise that resolves to the transaction instruction. + */ + async commitIx( + queue: PublicKey, + authority_?: PublicKey + ): Promise { + const queueAccount = new Queue(this.program, queue); + const oracle = await queueAccount.fetchFreshOracle(); + const authority = authority_ ?? (await this.loadData()).authority; + const ix = await this.program.instruction.randomnessCommit( + {}, + { + accounts: { + randomness: this.pubkey, + queue: queue, + oracle: oracle, + recentSlothashes: SLOT_HASHES_SYSVAR_ID, + authority, + }, + } + ); + return ix; + } + + /** + * Generate a randomness `reveal` solana transaction instruction. + * This will reveal the randomness using the assigned oracle. + * + * @returns {Promise} A promise that resolves to the transaction instruction. + */ + async revealIx(): Promise { + const data = await this.loadData(); + const oracleKey = data.oracle; + const oracle = new Oracle(this.program, oracleKey); + const oracleData = await oracle.loadData(); + const gatewayUrl = String.fromCharCode(...oracleData.gatewayUri).replace( + /\0+$/, + "" + ); + + const gateway = new Gateway(this.program, gatewayUrl); + const gatewayRevealResponse = await gateway.fetchRandomnessReveal({ + randomnessAccount: this.pubkey, + slothash: bs58.encode(data.seedSlothash), + slot: data.seedSlot.toNumber(), + }); + const stats = PublicKey.findProgramAddressSync( + [Buffer.from("OracleRandomnessStats"), oracleKey.toBuffer()], + this.program.programId + )[0]; + const ix = await this.program.instruction.randomnessReveal( + { + signature: Buffer.from(gatewayRevealResponse.signature, "base64"), + recoveryId: gatewayRevealResponse.recovery_id, + value: gatewayRevealResponse.value, + }, + { + accounts: { + randomness: this.pubkey, + oracle: oracleKey, + queue: data.queue, + stats, + authority: data.authority, + payer: this.program.provider.publicKey!, + recentSlothashes: SLOT_HASHES_SYSVAR_ID, + systemProgram: SystemProgram.programId, + rewardEscrow: spl.getAssociatedTokenAddressSync( + spl.NATIVE_MINT, + this.pubkey + ), + tokenProgram: spl.TOKEN_PROGRAM_ID, + associatedTokenProgram: spl.ASSOCIATED_TOKEN_PROGRAM_ID, + wrappedSolMint: spl.NATIVE_MINT, + programState: State.keyFromSeed(this.program), + }, + } + ); + return ix; + } + + /** + * Commit and reveal randomness in a single transaction. + * + * @param {TransactionInstruction[]} callback - The callback to execute after the reveal in the same transaction. + * @param {Keypair[]} signers - The signers to sign the transaction. + * @param {PublicKey} queue - The queue public key. + * @param {object} [configs] - The configuration options. + * @param {number} [configs.computeUnitPrice] - The price per compute unit in microlamports. + * @param {number} [configs.computeUnitLimit] - The compute unit limit. + * @returns {Promise} A promise that resolves when the transaction is confirmed. + */ + async commitAndReveal( + callback: TransactionInstruction[], + signers: Keypair[], + queue: PublicKey, + configs?: { + computeUnitPrice?: number; + computeUnitLimit?: number; + } + ): Promise { + const queueAccount = new Queue(this.program, queue); + const oracle = await queueAccount.fetchFreshOracle(); + const computeUnitPrice = configs?.computeUnitPrice ?? 1; + const computeUnitLimit = configs?.computeUnitLimit ?? 200_000; + const connection = this.program.provider.connection; + const payer = (this.program.provider as any).wallet.payer; + for (;;) { + const data = await this.loadData(); + if (data.seedSlot.toNumber() !== 0) { + console.log("Randomness slot already committed. Jumping to reveal."); + break; + } + const tx = await InstructionUtils.asV0TxWithComputeIxs({ + connection: this.program.provider.connection, + ixs: [ + ComputeBudgetProgram.setComputeUnitPrice({ + microLamports: computeUnitPrice, + }), + await this.commitIx(oracle, data.authority), + ], + }); + tx.sign([payer]); + const sim = await connection.simulateTransaction(tx, { + commitment: "processed", + }); + if (sim.value.err !== null) { + console.log(sim.value.logs); + throw new Error( + `Failed to simulate commit transaction: ${JSON.stringify( + sim.value.err + )}` + ); + } + const sig = await connection.sendTransaction(tx, { + maxRetries: 2, + skipPreflight: true, + }); + console.log(`Commit transaction sent: ${sig}`); + try { + await sendTxWithJito({ + serialisedTx: tx.serialize(), + sendOptions: {}, + region: "mainnet", + }); + } catch (e) { + // console.log("Skipping Jito send"); + } + try { + await connection.confirmTransaction(sig); + console.log(`Commit transaction confirmed: ${sig}`); + break; + } catch (e) { + console.log("Failed to confirm commit transaction. Retrying..."); + await new Promise((f) => setTimeout(f, 1000)); + continue; + } + } + await new Promise((f) => setTimeout(f, 1000)); + for (;;) { + const data = await this.loadData(); + if (data.revealSlot.toNumber() !== 0) { + break; + } + let revealIx: TransactionInstruction | undefined = undefined; + try { + revealIx = await this.revealIx(); + } catch (e) { + console.log(e); + console.log("Failed to grab reveal signature. Retrying..."); + await new Promise((f) => setTimeout(f, 1000)); + continue; + } + const tx = await InstructionUtils.asV0TxWithComputeIxs({ + connection: this.program.provider.connection, + ixs: [ + ComputeBudgetProgram.setComputeUnitPrice({ + microLamports: computeUnitPrice, + }), + ComputeBudgetProgram.setComputeUnitLimit({ units: computeUnitLimit }), + revealIx!, + ...callback, + ], + }); + + tx.sign(signers); + const sim = await connection.simulateTransaction(tx, { + commitment: "processed", + }); + if (sim.value.err !== null) { + console.log(sim.value.logs); + throw new Error( + `Failed to simulate commit transaction: ${JSON.stringify( + sim.value.err + )}` + ); + } + const sig = await connection.sendTransaction(tx, { + maxRetries: 2, + skipPreflight: true, + }); + console.log(`RevealAndCallback transaction sent: ${sig}`); + try { + await sendTxWithJito({ + serialisedTx: tx.serialize(), + sendOptions: {}, + region: "mainnet", + }); + } catch (e) { + // console.log("Skipping Jito send"); + } + await connection.confirmTransaction(sig); + console.log(`RevealAndCallback transaction confirmed: ${sig}`); + } + } + + /** + * Serialize ix to file. + * + * @param {TransactionInstruction[]} revealIxs - The reveal instruction of a transaction. + * @param {string} [fileName="serializedIx.bin"] - The name of the file to save the serialized IX to. + * @throws Will throw an error if the request fails. + * @returns {Promise} A promise that resolves when the file has been written. + */ + async serializeIxToFile( + revealIxs: TransactionInstruction[], + fileName: string = "serializedIx.bin" + ): Promise { + const tx = await InstructionUtils.asV0TxWithComputeIxs({ + connection: this.program.provider.connection, + ixs: revealIxs, + payer: PublicKey.default, + }); + + fs.writeFile(fileName, tx.serialize(), (err) => { + if (err) { + console.error("Failed to write to file:", err); + throw err; + } + }); + } + + /** + * Creates a new `Randomness` account and prepares a commit transaction instruction. + * + * @param {Program} program - The Anchor program instance. + * @param {PublicKey} queue - The queue account to associate with the new `Randomness` account. + * @returns {Promise<[Randomness, Keypair, TransactionInstruction[]]>} A promise that resolves to a tuple containing the new `Randomness` instance, the keypair, and an array of transaction instructions. + */ + static async createAndCommitIxs( + program: Program, + queue: PublicKey + ): Promise<[Randomness, Keypair, TransactionInstruction[]]> { + const kp = Keypair.generate(); + const lutSigner = ( + await PublicKey.findProgramAddress( + [Buffer.from("LutSigner"), kp.publicKey.toBuffer()], + program.programId + ) + )[0]; + const recentSlot = await program.provider.connection.getSlot("finalized"); + const [_, lut] = AddressLookupTableProgram.createLookupTable({ + authority: lutSigner, + payer: PublicKey.default, + recentSlot, + }); + const queueAccount = new Queue(program, queue); + const oracle = await queueAccount.fetchFreshOracle(); + const creationIx = program.instruction.randomnessInit( + {}, + { + accounts: { + randomness: kp.publicKey, + queue, + authority: program.provider.publicKey!, + payer: program.provider.publicKey!, + rewardEscrow: spl.getAssociatedTokenAddressSync( + spl.NATIVE_MINT, + kp.publicKey + ), + systemProgram: SystemProgram.programId, + tokenProgram: spl.TOKEN_PROGRAM_ID, + associatedTokenProgram: spl.ASSOCIATED_TOKEN_PROGRAM_ID, + wrappedSolMint: spl.NATIVE_MINT, + programState: State.keyFromSeed(program), + lutSigner, + lut, + addressLookupTableProgram: AddressLookupTableProgram.programId, + }, + } + ); + const newRandomness = new Randomness(program, kp.publicKey); + const commitIx = await newRandomness.commitIx( + oracle, + program.provider.publicKey! + ); + + return [newRandomness, kp, [creationIx, commitIx]]; + } +} diff --git a/javascript/on-demand/src/accounts/state.ts b/javascript/on-demand/src/accounts/state.ts new file mode 100644 index 0000000..7746eb0 --- /dev/null +++ b/javascript/on-demand/src/accounts/state.ts @@ -0,0 +1,215 @@ +import { Queue } from "./queue.js"; + +import type { BN, Program } from "@coral-xyz/anchor-30"; +import type { TransactionInstruction } from "@solana/web3.js"; +import { PublicKey, SystemProgram } from "@solana/web3.js"; + +/** + * Abstraction around the Switchboard-On-Demand State account + * + * This account is used to store the state data for a given program. + */ +export class State { + public pubkey: PublicKey; + + /** + * Derives a state PDA (Program Derived Address) from the program. + * + * @param {Program} program - The Anchor program instance. + * @returns {PublicKey} The derived state account's public key. + */ + static keyFromSeed(program: Program): PublicKey { + const [state] = PublicKey.findProgramAddressSync( + [Buffer.from("STATE")], + program.programId + ); + return state; + } + + /** + * Initializes the state account. + * + * @param {Program} program - The Anchor program instance. + * @returns {Promise<[State, string]>} A promise that resolves to the state account and the transaction signature. + */ + static async create(program: Program): Promise<[State, String]> { + const payer = (program.provider as any).wallet.payer; + const sig = await program.rpc.stateInit( + {}, + { + accounts: { + state: State.keyFromSeed(program), + payer: payer.publicKey, + systemProgram: SystemProgram.programId, + }, + signers: [payer], + } + ); + + return [new State(program), sig]; + } + + /** + * Constructs a `State` instance. + * + * @param {Program} program - The Anchor program instance. + */ + constructor(readonly program: Program) { + const pubkey = State.keyFromSeed(program); + this.pubkey = pubkey; + } + + /** + * Set program-wide configurations. + * + * @param {object} params - The configuration parameters. + * @param {PublicKey} [params.guardianQueue] - The guardian queue account. + * @param {PublicKey} [params.newAuthority] - The new authority account. + * @param {BN} [params.minQuoteVerifyVotes] - The minimum number of votes required to verify a quote. + * @param {PublicKey} [params.stakeProgram] - The stake program account. + * @param {PublicKey} [params.stakePool] - The stake pool account. + * @param {number} [params.permitAdvisory] - The permit advisory value. + * @param {number} [params.denyAdvisory] - The deny advisory value. + * @param {boolean} [params.testOnlyDisableMrEnclaveCheck] - A flag to disable MrEnclave check for testing purposes. + * @param {PublicKey} [params.switchMint] - The switch mint account. + * @param {BN} [params.epochLength] - The epoch length. + * @param {boolean} [params.resetEpochs] - A flag to reset epochs. + * @param {boolean} [params.enableStaking] - A flag to enable staking. + * @returns {Promise} A promise that resolves to the transaction instruction. + */ + async setConfigsIx(params: { + guardianQueue?: PublicKey; + newAuthority?: PublicKey; + minQuoteVerifyVotes?: BN; + stakeProgram?: PublicKey; + stakePool?: PublicKey; + permitAdvisory?: number; + denyAdvisory?: number; + testOnlyDisableMrEnclaveCheck?: boolean; + switchMint?: PublicKey; + epochLength?: BN; + resetEpochs?: boolean; + enableStaking?: boolean; + addCostWl?: PublicKey; + rmCostWl?: PublicKey; + }): Promise { + const state = await this.loadData(); + const queue = params.guardianQueue ?? state.guardianQueue; + const program = this.program; + const payer = (program.provider as any).wallet.payer; + const testOnlyDisableMrEnclaveCheck = + params.testOnlyDisableMrEnclaveCheck ?? + state.testOnlyDisableMrEnclaveCheck; + const resetEpochs = params.resetEpochs ?? false; + const ix = await this.program.instruction.stateSetConfigs( + { + newAuthority: params.newAuthority ?? state.authority, + testOnlyDisableMrEnclaveCheck: testOnlyDisableMrEnclaveCheck ? 1 : 0, + stakePool: params.stakePool ?? state.stakePool, + stakeProgram: params.stakeProgram ?? state.stakeProgram, + addAdvisory: params.permitAdvisory, + rmAdvisory: params.denyAdvisory, + epochLength: params.epochLength ?? state.epochLength, + resetEpochs: resetEpochs, + lutSlot: state.lutSlot, + switchMint: params.switchMint ?? state.switchMint, + enableStaking: params.enableStaking ?? state.enableStaking, + authority: params.newAuthority ?? state.authority, + addCostWl: params.addCostWl ?? PublicKey.default, + rmCostWl: params.rmCostWl ?? PublicKey.default, + }, + { + accounts: { + state: this.pubkey, + authority: state.authority, + queue, + payer: payer.publicKey, + systemProgram: SystemProgram.programId, + }, + } + ); + return ix; + } + + /** + * Register a guardian with the global guardian queue. + * + * @param {object} params - The parameters object. + * @param {PublicKey} params.guardian - The guardian account. + * @returns {Promise} A promise that resolves to the transaction instruction. + */ + async registerGuardianIx(params: { + guardian: PublicKey; + }): Promise { + const state = await this.loadData(); + const program = this.program; + const payer = (program.provider as any).wallet.payer; + const ix = await this.program.instruction.guardianRegister( + {}, + { + accounts: { + oracle: params.guardian, + state: this.pubkey, + guardianQueue: state.guardianQueue, + authority: state.authority, + }, + signers: [payer], + } + ); + return ix; + } + + /** + * Unregister a guardian from the global guardian queue. + * + * @param {object} params - The parameters object. + * @param {PublicKey} params.guardian - The guardian account. + * @returns {Promise} A promise that resolves to the transaction instruction. + */ + async unregisterGuardianIx(params: { + guardian: PublicKey; + }): Promise { + const state = await this.loadData(); + const guardianQueue = new Queue(this.program, state.guardianQueue); + const queueData = await guardianQueue.loadData(); + const idx = queueData.guardians.findIndex((key) => + key.equals(params.guardian) + ); + const program = this.program; + const payer = (program.provider as any).wallet.payer; + const ix = await this.program.instruction.guardianUnregister( + { idx }, + { + accounts: { + oracle: params.guardian, + state: this.pubkey, + guardianQueue: state.guardianQueue, + authority: state.authority, + }, + signers: [payer], + } + ); + return ix; + } + + /** + * Loads the state data from on chain. + * + * @returns A promise that resolves to the state data. + * @throws if the state account does not exist. + */ + async loadData(): Promise { + return await this.program.account["state"].fetch(this.pubkey); + } + + /** + * Loads the state data from on chain. + * + * @returns A promise that resolves to the state data. + * @throws if the state account does not exist. + */ + static async loadData(program: Program): Promise { + const state = new State(program); + return await state.loadData(); + } +} diff --git a/javascript/on-demand/src/anchor-utils/AnchorUtils.ts b/javascript/on-demand/src/anchor-utils/AnchorUtils.ts new file mode 100644 index 0000000..58a3592 --- /dev/null +++ b/javascript/on-demand/src/anchor-utils/AnchorUtils.ts @@ -0,0 +1,159 @@ +import { + isMainnetConnection, + ON_DEMAND_DEVNET_PID, + ON_DEMAND_MAINNET_PID, +} from "../utils"; + +import * as anchor from "@coral-xyz/anchor-30"; +import NodeWallet from "@coral-xyz/anchor-30/dist/cjs/nodewallet.js"; +import type { Commitment } from "@solana/web3.js"; +import { Connection, Keypair, PublicKey } from "@solana/web3.js"; +import * as fs from "fs"; +import yaml from "js-yaml"; +import os from "os"; +import path from "path"; + +type SolanaConfig = { + rpcUrl: string; + webSocketUrl: string; + keypairPath: string; + commitment: Commitment; + keypair: Keypair; + connection: Connection; + provider: anchor.AnchorProvider; + wallet: NodeWallet; + program: anchor.Program | null; +}; + +/* + * AnchorUtils is a utility class that provides helper functions for working with + * the Anchor framework. It is a static class, meaning that it does not need to be + * instantiated to be used. It is a collection of helper functions that can be used + * to simplify common tasks when working with Anchor. + */ +export class AnchorUtils { + /** + * Initializes a wallet from a file. + * + * @param {string} filePath - The path to the file containing the wallet's secret key. + * @returns {Promise<[NodeWallet, Keypair]>} A promise that resolves to a tuple containing the wallet and the keypair. + */ + static async initWalletFromFile( + filePath: string + ): Promise<[NodeWallet, Keypair]> { + const keypair = await AnchorUtils.initKeypairFromFile(filePath); + const wallet: NodeWallet = new NodeWallet(keypair); + return [wallet, keypair]; + } + + /** + * Initializes a keypair from a file. + * + * @param {string} filePath - The path to the file containing the keypair's secret key. + * @returns {Promise} A promise that resolves to the keypair. + */ + static async initKeypairFromFile(filePath: string): Promise { + const secretKeyString = fs.readFileSync(filePath, { encoding: "utf8" }); + const secretKey: Uint8Array = Uint8Array.from(JSON.parse(secretKeyString)); + const keypair: Keypair = Keypair.fromSecretKey(secretKey); + return keypair; + } + + /** + * Loads an Anchor program from the environment. + * + * @returns {Promise} A promise that resolves to the loaded Anchor program. + */ + static async loadProgramFromEnv(): Promise { + const config = await AnchorUtils.loadEnv(); + const isMainnet = isMainnetConnection(config.connection); + let pid = ON_DEMAND_MAINNET_PID; + if (!isMainnet) { + pid = ON_DEMAND_DEVNET_PID; + } + const idl = (await anchor.Program.fetchIdl(pid, config.provider))!; + const program = new anchor.Program(idl, config.provider); + return new anchor.Program(idl, config.provider); + } + + /** + * Loads the same environment set for the Solana CLI. + * + * @returns {Promise} A promise that resolves to the Solana configuration. + */ + static async loadEnv(): Promise { + const configPath = path.join( + os.homedir(), + ".config", + "solana", + "cli", + "config.yml" + ); + const fileContents = fs.readFileSync(configPath, "utf8"); + const data = yaml.load(fileContents); + const defaultCon = new Connection("https://api.devnet.solana.com"); + const defaultKeypair = Keypair.generate(); + const config: SolanaConfig = { + rpcUrl: data.json_rpc_url, + webSocketUrl: data.websocket_url, + keypairPath: data.keypair_path, + commitment: data.commitment as Commitment, + keypair: data.keypair_path, + connection: defaultCon, + provider: new anchor.AnchorProvider( + defaultCon, + new NodeWallet(defaultKeypair), + {} + ), + wallet: new NodeWallet(defaultKeypair), + program: null, + }; + config.keypair = ( + await AnchorUtils.initWalletFromFile(config.keypairPath) + )[1]; + config.connection = new Connection(config.rpcUrl, { + commitment: "confirmed", + }); + config.wallet = new NodeWallet(config.keypair); + config.provider = new anchor.AnchorProvider( + config.connection, + config.wallet, + { + preflightCommitment: "confirmed", + commitment: "confirmed", + } + ); + const isMainnet = await isMainnetConnection(config.connection); + let pid = ON_DEMAND_MAINNET_PID; + if (!isMainnet) { + pid = ON_DEMAND_DEVNET_PID; + } + const idl = (await anchor.Program.fetchIdl(pid, config.provider))!; + const program = new anchor.Program(idl, config.provider); + config.program = program; + + return config; + } + + /** + * Parse out anchor events from the logs present in the program IDL. + * + * @param {anchor.Program} program - The Anchor program instance. + * @param {string[]} logs - The array of logs to parse. + * @returns {any[]} An array of parsed events. + */ + static loggedEvents(program: anchor.Program, logs: string[]): any[] { + const coder = new anchor.BorshEventCoder(program.idl); + const out: any[] = []; + logs.forEach((log) => { + if (log.startsWith("Program data: ")) { + const strings = log.split(" "); + if (strings.length !== 3) return; + try { + out.push(coder.decode(strings[2])); + } catch {} + } + }); + return out; + } +} diff --git a/javascript/on-demand/src/anchor-utils/index.ts b/javascript/on-demand/src/anchor-utils/index.ts new file mode 100644 index 0000000..3bdae69 --- /dev/null +++ b/javascript/on-demand/src/anchor-utils/index.ts @@ -0,0 +1 @@ +export * from "./AnchorUtils.js"; diff --git a/javascript/on-demand/src/constants.ts b/javascript/on-demand/src/constants.ts new file mode 100644 index 0000000..4d44eb2 --- /dev/null +++ b/javascript/on-demand/src/constants.ts @@ -0,0 +1,22 @@ +import { PublicKey } from "@solana/web3.js"; + +/** + * The public key of the Solana SPL Associated Token Account program. + */ +export const SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID = new PublicKey( + "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" +); + +/** + * The public key of the Solana SlotHashes sysvar. + */ +export const SLOT_HASHES_SYSVAR_ID = new PublicKey( + "SysvarS1otHashes111111111111111111111111111" +); + +/** + * The public key of the Solana Instructions sysvar. + */ +export const IX_SYSVAR_ID = new PublicKey( + "Sysvar1nstructions1111111111111111111111111" +); diff --git a/javascript/on-demand/src/event-utils/index.ts b/javascript/on-demand/src/event-utils/index.ts new file mode 100644 index 0000000..0cd141d --- /dev/null +++ b/javascript/on-demand/src/event-utils/index.ts @@ -0,0 +1,43 @@ +const I128MAX = "170141183460469231731687303715884105727"; + +function splitFromTail(input_: string, places: number): [string, string] { + const input = input_.padStart(18, "0"); + const splitIndex = input.length - places; + if (splitIndex <= 0) { + return ["", input]; // if the string is shorter than N characters, the first part is empty + } + const firstPart = input.slice(0, splitIndex); + const lastCharacters = input.slice(splitIndex); + return [firstPart, lastCharacters]; +} + +export class PullFeedValueEvent { + constructor(public readonly raw: any) {} + toRows(): Array<{ feed: string; oracle: string; value: string | null }> { + const out: any[] = []; + if (!Array.isArray(this.raw?.data?.feeds)) return out; + + for (const feedIdx in this.raw.data.feeds) { + const feed = this.raw.data.feeds[feedIdx]; + for (const oracleIdx in this.raw.data.oracles) { + const oracle = this.raw.data.oracles[oracleIdx]; + const value = this.raw.data.values[feedIdx][oracleIdx]; + const valueParts = splitFromTail(value.toString(), 18); + if (value.toString() === I128MAX) { + out.push({ + feed: feed.toString(), + oracle: oracle.toString(), + value: null, + }); + } else { + out.push({ + feed: feed.toString(), + oracle: oracle.toString(), + value: `${valueParts[0]}.${valueParts[1]}`, + }); + } + } + } + return out; + } +} diff --git a/javascript/on-demand/src/evm/index.ts b/javascript/on-demand/src/evm/index.ts new file mode 100644 index 0000000..a18872d --- /dev/null +++ b/javascript/on-demand/src/evm/index.ts @@ -0,0 +1,702 @@ +import { Queue } from "../accounts/index.js"; +import type { + BridgeEnclaveResponse, + FeedEvalResponse, + Gateway, +} from "../oracle-interfaces/index.js"; +import { + ON_DEMAND_DEVNET_GUARDIAN_QUEUE, + ON_DEMAND_DEVNET_PID, + ON_DEMAND_DEVNET_QUEUE, + ON_DEMAND_MAINNET_GUARDIAN_QUEUE, + ON_DEMAND_MAINNET_PID, + ON_DEMAND_MAINNET_QUEUE, +} from "../utils/index.js"; + +import { + createAttestationHexString, + createUpdateHexString, + createV0AttestationHexString, +} from "./message.js"; + +import NodeWallet from "@coral-xyz/anchor-30/dist/cjs/nodewallet.js"; +export * as message from "./message.js"; +import * as anchor from "@coral-xyz/anchor-30"; +import { Big, OracleJob } from "@switchboard-xyz/common"; +import * as bs58 from "bs58"; + +// Common options for feed updates +export interface FeedUpdateCommonOptions { + jobs: OracleJob[]; // Array of job definitions + numSignatures?: number; // Number of signatures to fetch + maxVariance?: number; // Maximum variance allowed for the feed + minResponses?: number; // Minimum number of responses to consider the feed valid + recentHash?: string; // Hex string of length 64 (32 bytes) which does not start with 0x + aggregatorId?: string; // Specify the aggregator ID if the feed already exists + blockNumber?: number; // The block number + gateway?: Gateway; // Gateway (optional) +} + +// Define a type for the input parameters +export type FeedUpdateParams = FeedUpdateCommonOptions; + +// Attestation options +export interface AttestationOptions { + guardianQueue: Queue; // The guardian queue account + recentHash: string; // The blockhash to get the attestation for + blockNumber: number; // The timestamp + queueId: string; // The queue ID (queue pubkey as hex) + oracleId: string; // The oracle ID (oracle pubkey as hex) + gateway?: Gateway; // The gateway account (optional) +} + +// Feed simulation result +export interface FeedSimulateResult { + result: number; + feedId: string; + response: FeedEvalResponse; +} + +// Feed update result +export interface FeedUpdateResult { + feedId: string; + result: number; + encoded: string; + response: FeedEvalResponse; +} + +// Attestation result +export interface AttestationResult { + oracleId: string; // Attestee oracle pubkey as hex + queueId: string; // Attestee queue pubkey as hex + guardian: string; // Guardian pubkey as hex + encoded: string; // The attestation as a hex string + response: BridgeEnclaveResponse; // The attestation response from guardian +} + +// Fetch feed response +export interface FetchFeedResponse { + results: FeedEvalResponse[]; + encoded: string[]; +} + +// Fetch result response +export interface FetchResultResponse extends FetchFeedResponse { + feedId: string; +} + +// Fetch results response +export interface FetchResultsArgs { + feedIds: string[]; + chainId: number; + crossbarUrl?: string; + minResponses?: number; + maxVariance?: number; + numSignatures?: number; + syncOracles?: boolean; + syncGuardians?: boolean; + gateway?: string; +} + +// Fetch result args +export interface FetchResultArgs { + feedId: string; + chainId: number; + crossbarUrl?: string; + minResponses?: number; + maxVariance?: number; + numSignatures?: number; + syncOracles?: boolean; + syncGuardians?: boolean; + gateway?: string; +} + +// Feed evaluation response +export interface FetchRandomnessArgs { + chainId: number; + crossbarUrl: string; + randomnessId: string; + timestamp?: number; + minStalenessSeconds?: number; +} + +/** + * Get an oracle job from object definition + * @param params the job parameters + * @returns + */ +export function createJob(params: { tasks: any }): OracleJob { + return OracleJob.fromObject(params); +} + +/** + * Get the feed update data for a particular feed + * @dev - this function is heavily rate limited + * @param params the feed update parameters + * @param queue the queue account + * @returns the feed simulation result and feed id + */ +export async function simulateFeed( + params: FeedUpdateParams, + queue: Queue +): Promise { + const gateway = params.gateway ?? (await queue.fetchGateway()); + const result = ( + await gateway.fetchSignatures({ + ...params, + useTimestamp: true, + recentHash: bs58.encode( + Buffer.from(params.recentHash ?? "0".repeat(64), "hex") + ), + }) + ).responses[0]; + + return { + result: new Big(result.success_value).div(new Big(10).pow(18)).toNumber(), + feedId: result.feed_hash, + response: result, + }; +} + +/** + * Get the feed update data for a particular feed + * @param params the feed update parameters + * @param queue the queue account + * @returns the feed update data, the byte arrays that need to be sent to the target chain + */ +export async function getFeedUpdateData( + params: FeedUpdateParams, + queue: Queue +): Promise { + return (await getFeedUpdateWithContext(params, queue)).responses.map( + (r) => r.encoded + ); +} + +/** + * Get the feed update data for a particular feed + * @param params the feed update parameters + * @param queue the queue account + * @returns the feed update data with context (numeric result data, oracle response, AND encoded response) + */ +export async function getFeedUpdateWithContext( + params: FeedUpdateParams, + queue: Queue +): Promise<{ + responses: FeedUpdateResult[]; + failures: string[]; +}> { + // Set the blockhash + const blockhash = params.recentHash ?? "0".repeat(64); + + // if we just want the time feed, return + if (params.jobs.length === 0) { + { + return { + responses: [], + failures: [], + }; + } + } + + // Get the Feed Update if the feed exists + // Setup the updates array + const updates = await getUpdate( + { + ...params, + recentHash: blockhash, + }, + queue + ); + + return updates; +} + +/** + * Get the update message for the EVM for a particular feed + * This is useful for feeds that have already been created on chain + * @param params - FeedUpdateCommonOptions: Parameters for the upsert message + * @param queue - Queue: The queue account + * @returns - Promise - The update message as a hex string + */ +export async function getUpdate( + params: FeedUpdateCommonOptions, + queue: Queue +): Promise<{ + responses: FeedUpdateResult[]; + failures: string[]; +}> { + if (!params.recentHash) { + params.recentHash = "0".repeat(64); + } + + // slice if the recentHash starts with 0x + if (params.recentHash.startsWith("0x")) { + params.recentHash = params.recentHash.slice(2); + } + + const gateway = params.gateway ?? (await queue.fetchGateway()); + + const { responses, failures } = await gateway.fetchSignatures({ + ...params, + useTimestamp: true, + recentHash: bs58.encode(Buffer.from(params.recentHash, "hex")), + }); + const response: FeedUpdateResult[] = []; + + for (const result of responses) { + if (!result.success_value) { + failures.push(result.failure_error.toString()); + continue; + } + + // Decode from Base64 to a Buffer + const signatureBuffer = new Uint8Array( + Buffer.from(result.signature, "base64") + ); + + // Assuming each component (r and s) is 32 bytes long + const r = Buffer.from(signatureBuffer.slice(0, 32)).toString("hex"); + const s = Buffer.from(signatureBuffer.slice(32, 64)).toString("hex"); + const v = result.recovery_id; + + // Create the upsert message + const updateString = createUpdateHexString({ + discriminator: 1, + feedId: params.aggregatorId ?? result.feed_hash.toString(), + result: result.success_value.toString(), + blockNumber: params.blockNumber?.toString() ?? "0", + timestamp: result.timestamp?.toString(), + r, + s, + v, + }); + + // Add the response to the array + const res = { + feedId: result.feed_hash, + result: new Big(result.success_value).div(new Big(10).pow(18)).toNumber(), + encoded: updateString, + response: result, + }; + + // Add the response to the array + response.push(res); + } + + // Sort the response by timestamp, ascending + response.sort((a, b) => a.response.timestamp - b.response.timestamp); + + // Return the response + return { + responses: response, + failures, + }; +} + +/** + * Get attestation for a particular oracle on a particular queue + * @param options - AttestationOptions: Options for the attestation + * @returns - Promise - The attestation as a hex string + */ +export async function getAttestation( + options: AttestationOptions +): Promise { + const { guardianQueue, recentHash, queueId, oracleId, gateway, blockNumber } = + options; + const gatewayAccount = gateway ?? (await guardianQueue.fetchGateway()); + const chainHash = recentHash.startsWith("0x") + ? recentHash.slice(2) + : recentHash; + const attestation = await gatewayAccount.fetchBridgingMessage({ + chainHash, + queuePubkey: queueId, + oraclePubkey: oracleId, + }); + + if (!options.recentHash) { + options.recentHash = "0".repeat(64); + } + + // slice if the recentHash starts with 0x + if (options.recentHash.startsWith("0x")) { + options.recentHash = options.recentHash.slice(2); + } + + // Decode from Base64 to a Buffer + const signatureBuffer = new Uint8Array( + Buffer.from(attestation.signature, "base64") + ); + + // Assuming each component (r and s) is 32 bytes long + const r = Buffer.from(signatureBuffer.slice(0, 32)).toString("hex"); + const s = Buffer.from(signatureBuffer.slice(32, 64)).toString("hex"); + const v = attestation.recovery_id; + + // Create the attestation bassed on message contents (it'll either be v0 or ordinary) + if (attestation.oracle_ed25519_enclave_signer) { + const hexString = createV0AttestationHexString({ + discriminator: 2, + oracleId, + queueId, + ed25519Key: attestation.oracle_ed25519_enclave_signer, + secp256k1Key: attestation.oracle_secp256k1_enclave_signer, + r, + s, + v, + mrEnclave: attestation.mr_enclave, + blockNumber: blockNumber.toString(), + }); + + return { + oracleId, + queueId, + guardian: attestation.guardian, + encoded: hexString, + response: attestation, + }; + } else if (attestation.timestamp) { + const hexString = createAttestationHexString({ + discriminator: 2, + oracleId, + queueId, + secp256k1Key: attestation.oracle_secp256k1_enclave_signer, + timestamp: attestation.timestamp.toString(), + mrEnclave: attestation.mr_enclave, + r, + s, + v, + blockNumber: blockNumber.toString(), + guardianId: attestation.guardian, + }); + + return { + oracleId: attestation.oracle, + queueId: attestation.queue, + guardian: attestation.guardian, + encoded: hexString, + response: attestation, + }; + } else { + throw new Error("Invalid attestation response"); + } +} + +/** + * Get the default devnet queue for the Switchboard program + * @param solanaRPCUrl - (optional) string: The Solana RPC URL + * @returns - Promise - The default devnet queue + */ +export async function getDefaultDevnetQueue( + solanaRPCUrl: string = "https://api.devnet.solana.com" +): Promise { + return getQueue( + solanaRPCUrl, + ON_DEMAND_DEVNET_PID.toString(), + ON_DEMAND_DEVNET_QUEUE.toString() + ); +} + +/** + * Get the default devnet guardian queue for the Switchboard program + * @param solanaRPCUrl - (optional) string: The Solana RPC URL + * @returns - Promise - The default devnet guardian queue + */ +export async function getDefaultDevnetGuardianQueue( + solanaRPCUrl: string = "https://api.devnet.solana.com" +): Promise { + return getQueue( + solanaRPCUrl, + ON_DEMAND_DEVNET_PID.toString(), + ON_DEMAND_DEVNET_GUARDIAN_QUEUE.toString() + ); +} + +/** + * Get the default queue for the Switchboard program + * @param solanaRPCUrl - (optional) string: The Solana RPC URL + * @returns - Promise - The default queue + * @NOTE - SWITCHBOARD PID AND QUEUE PUBKEY ARE WRONG + */ +export async function getDefaultQueue( + solanaRPCUrl: string = "https://api.mainnet-beta.solana.com" +): Promise { + return getQueue( + solanaRPCUrl, + ON_DEMAND_MAINNET_PID.toString(), + ON_DEMAND_MAINNET_QUEUE.toString() + ); +} + +/** + * Get the default guardian queue for the Switchboard program + * @param solanaRPCUrl - (optional) string: The Solana RPC URL + * @returns - Promise - The default guardian queue + * @NOTE - SWITCHBOARD PID AND GUARDIAN QUEUE PUBKEY ARE WRONG + */ +export async function getDefaultGuardianQueue( + solanaRPCUrl: string = "https://api.mainnet-beta.solana.com" +): Promise { + return getQueue( + solanaRPCUrl, + ON_DEMAND_MAINNET_PID.toString(), + ON_DEMAND_MAINNET_GUARDIAN_QUEUE.toString() + ); +} + +/** + * Get the queue for the Switchboard program + * @param solanaRPCUrl - string: The Solana RPC URL + * @param switchboardProgramId - string: The Switchboard program ID + * @param queueAddress - string: The queue address + * @returns - Promise - The queue + */ +export async function getQueue( + solanaRPCUrl: string, + switchboardProgramId: string, + queueAddress: string +): Promise { + const { PublicKey, Keypair, Connection } = anchor.web3; + const wallet: NodeWallet = new NodeWallet(new Keypair()); + const connection = new Connection(solanaRPCUrl, "confirmed"); + const PID = new PublicKey(switchboardProgramId); + const queue = new PublicKey(queueAddress); + const provider = new anchor.AnchorProvider(connection, wallet, {}); + const idl = (await anchor.Program.fetchIdl(PID, provider))!; + const program = new anchor.Program(idl, provider); + const queueAccount = new Queue(program, queue); + return queueAccount; +} + +/** + * Crossbar API for EVM + */ + +/** + * Fetch result from the Switchboard API + * @param param0 The parameters to fetch results + * @returns + */ +export async function fetchResult({ + feedId, + chainId, + crossbarUrl, + minResponses, + maxVariance, + numSignatures, + syncOracles, + syncGuardians, +}: FetchResultArgs): Promise { + if (!crossbarUrl) { + crossbarUrl = "https://crossbar.switchboard.xyz"; + } + return { + feedId, + ...(await fetchUpdateData( + crossbarUrl, + chainId.toString(), + feedId, + minResponses, + maxVariance, + numSignatures, + syncOracles, + syncGuardians + )), + }; +} + +/** + * Fetch results from the Switchboard API + * @param param0 The parameters to fetch results + * @returns + */ +export async function fetchResults({ + feedIds, + chainId, + crossbarUrl, + minResponses, + maxVariance, + numSignatures, + syncOracles, + syncGuardians, +}: FetchResultsArgs): Promise { + if (!crossbarUrl) { + crossbarUrl = "https://crossbar.switchboard.xyz"; + } + + const responses = await Promise.all( + feedIds.map((feedId) => { + return fetchUpdateData( + crossbarUrl, + chainId.toString(), + feedId, + minResponses, + maxVariance, + numSignatures, + syncOracles, + syncGuardians + ); + }) + ); + + return responses.map((response, index) => { + return { + feedId: feedIds[index], + ...response, + }; + }); +} + +/** + * Fetch data to settle randomness + * @param param0 The parameters to fetch randomness + * @returns + */ +export async function fetchRandomness({ + chainId, + crossbarUrl, + randomnessId, + timestamp, + minStalenessSeconds, +}: FetchRandomnessArgs): Promise<{ + encoded: string; + response: { + signature: string; + recovery_id: number; + value: string; + }; +}> { + if (!crossbarUrl) { + crossbarUrl = "https://crossbar.switchboard.xyz"; + } + + return fetchRandomnessData( + crossbarUrl, + chainId.toString(), + randomnessId, + timestamp, + minStalenessSeconds + ); +} + +/** + * Fetch update data from the Switchboard API + * @param crossbarUrl The Crossbar URL + * @param chainId The chain ID + * @param feedId The feed ID + * @param minResponses Minimum number of responses + * @param maxVariance Maximum variance + * @param numSignatures Number of signatures + * @param syncOracles Sync oracles + * @param syncGuardians Sync guardians + * @param gateway Gateway + * @returns + */ +async function fetchUpdateData( + crossbarUrl: string, + chainId: string, + feedId: string, + minResponses: number = 1, + maxVariance: number = 1e9, + numSignatures: number = 1, + syncOracles: boolean = true, + syncGuardians: boolean = true, + gateway?: string +): Promise { + const cleanedCrossbarUrl = crossbarUrl.endsWith("/") + ? crossbarUrl.slice(0, -1) + : crossbarUrl; + + const url = new URL(`${cleanedCrossbarUrl}/updates/evm/${chainId}/${feedId}`); + + // Add query parameters to the URL + if (minResponses !== undefined) { + url.searchParams.append("minResponses", minResponses.toString()); + } + if (maxVariance !== undefined) { + url.searchParams.append("maxVariance", maxVariance.toString()); + } + if (numSignatures !== undefined) { + url.searchParams.append("numSignatures", numSignatures.toString()); + } + if (syncOracles !== undefined) { + url.searchParams.append("syncOracles", syncOracles.toString()); + } + if (syncGuardians !== undefined) { + url.searchParams.append("syncGuardians", syncGuardians.toString()); + } + if (gateway !== undefined) { + url.searchParams.append("gateway", gateway); + } + + try { + const response = await fetch(url.toString(), { + method: "GET", + }); + + if (!response.ok) { + throw new Error(`Error fetching data: ${response.statusText}`); + } + + const data = await response.json(); + return data; + } catch (error) { + console.error("Error fetching feed data:", error); + throw error; + } +} + +/** + * Fetch randomness data from the Switchboard API + * @param chainId The chain ID + * @param randomnessId The randomness ID configured on-chain + * @param timestamp The timestamp that the randomness was configured at + * @param minStalenessSeconds The minimum staleness of the data in seconds + * @returns + */ +async function fetchRandomnessData( + crossbarUrl: string, + chainId: string, + randomnessId: string, + timestamp?: number, + minStalenessSeconds?: number +): Promise<{ + encoded: string; + response: { + signature: string; + recovery_id: number; + value: string; + }; +}> { + const cleanedCrossbarUrl = crossbarUrl.endsWith("/") + ? crossbarUrl.slice(0, -1) + : crossbarUrl; + const url = new URL( + `${cleanedCrossbarUrl}/randomness/evm/${chainId}/${randomnessId}` + ); + + // Add query parameters to the URL + if (timestamp !== undefined) { + url.searchParams.append("timestamp", timestamp.toString()); + } + if (minStalenessSeconds !== undefined) { + url.searchParams.append( + "minStalenessSeconds", + minStalenessSeconds.toString() + ); + } + + try { + const response = await fetch(url.toString(), { + method: "GET", + }); + if (!response.ok) { + throw new Error(`Error fetching data: ${response.statusText}`); + } + const data = await response.json(); + return data; + } catch (error) { + console.error("Error fetching randomness data:", error); + throw error; + } +} diff --git a/javascript/on-demand/src/evm/message.ts b/javascript/on-demand/src/evm/message.ts new file mode 100644 index 0000000..62da664 --- /dev/null +++ b/javascript/on-demand/src/evm/message.ts @@ -0,0 +1,145 @@ +// Components for an EVM update message +// This is for updating an existing feed +export type UpdateHexStringParams = { + discriminator: 1; // 1 for update, 3 for update with snapshot + feedId: string; // 32-byte feed id + result: string; // 16-byte result (i128 BE encoded) + blockNumber: string; // 8-byte block number (u64 BE encoded) + timestamp?: string; // 8-byte timestamp (u64 BE encoded) + r: string; // 32-byte r value + s: string; // 32-byte s value + v: number; // 1-byte v value +}; + +// Components for an EVM attestation message +// This is for bridging new oracles onto the target chain +export type AttestationHexStringParams = { + discriminator: 2; // 2 for attestation + oracleId: string; // 32-byte oracle id + queueId: string; // 32-byte queue id + secp256k1Key: string; // 64-byte secp256k1 key + blockNumber: string; // 8-byte block number (u64 BE encoded) + mrEnclave: string; // 32-byte mr enclave + r: string; // 32-byte r value + s: string; // 32-byte s value + v: number; // 1-byte v value + timestamp: string; // 8-byte timestamp (u64 BE encoded) + guardianId: string; // 32-byte guardian id +}; + +// Components for an EVM attestation message +// This is for bridging new oracles onto the target chain +export type V0AttestationHexStringParams = { + discriminator: 2; // 2 for attestation + oracleId: string; // 32-byte oracle id + queueId: string; // 32-byte queue id + ed25519Key: string; // 32-byte ed25519 key + secp256k1Key: string; // 64-byte secp256k1 key + blockNumber: string; // 8-byte block number (u64 BE encoded) + mrEnclave: string; // 32-byte mr enclave + r: string; // 32-byte r value + s: string; // 32-byte s value + v: number; // 1-byte v value +}; + +// Components for an EVM randomness reveal message +// This is for revealing randomness +export type RandomnessRevealHexStringParams = { + discriminator: 4; // 4 for randomness reveal + randomnessId: string; // 32-byte randomness id + result: string; // 32-byte result + r: string; // 32-byte r value + s: string; // 32-byte s value + v: number; // 1-byte v value +}; + +/** + * Create an EVM-serializable update message + * @param param0 - UpdateHexStringParams: Components for an EVM update message + * @returns hex string + */ +export function createUpdateHexString({ + feedId, + discriminator, + result, + blockNumber, + r, + s, + v, + timestamp, +}: UpdateHexStringParams): string { + const discriminatorHex = discriminator.toString(16).padStart(2, "0"); + const resultHex = BigInt(result).toString(16).padStart(32, "0"); + const blockNumberHex = BigInt(blockNumber).toString(16).padStart(16, "0"); + const vHex = v.toString(16).padStart(2, "0"); + const timestampHex = timestamp + ? BigInt(timestamp).toString(16).padStart(16, "0") + : ""; + return `0x${discriminatorHex}${feedId}${resultHex}${r}${s}${vHex}${blockNumberHex}${timestampHex}`; +} + +/** + * Create an EVM-serializable attestation message + * @param param0 - AttestationHexStringParams: Components for an EVM attestation message + * @returns hex string + */ +export function createAttestationHexString({ + discriminator, + oracleId, + queueId, + timestamp, + secp256k1Key, + r, + s, + v, + blockNumber, + mrEnclave, + guardianId, +}: AttestationHexStringParams): string { + const discriminatorHex = discriminator.toString(16).padStart(2, "0"); + const blockNumberHex = BigInt(blockNumber).toString(16).padStart(16, "0"); + const timestampHex = BigInt(timestamp).toString(16).padStart(16, "0"); + const vHex = v.toString(16).padStart(2, "0"); + return `0x${discriminatorHex}${oracleId}${queueId}${mrEnclave}${secp256k1Key}${blockNumberHex}${r}${s}${vHex}${timestampHex}${guardianId}`; +} + +/** + * Create an EVM-serializable attestation message + * @param param0 - AttestationHexStringParams: Components for an EVM attestation message + * @returns hex string + */ +export function createV0AttestationHexString({ + discriminator, + oracleId, + queueId, + ed25519Key, + secp256k1Key, + r, + s, + v, + blockNumber, + mrEnclave, +}: V0AttestationHexStringParams): string { + const discriminatorHex = discriminator.toString(16).padStart(2, "0"); + const blockNumberHex = BigInt(blockNumber).toString(16).padStart(16, "0"); + const vHex = v.toString(16).padStart(2, "0"); + return `0x${discriminatorHex}${oracleId}${queueId}${mrEnclave}${ed25519Key}${secp256k1Key}${blockNumberHex}${r}${s}${vHex}`; +} + +/** + * Create an EVM-serializable randomness reveal message + * @param param0 - RandomnessRevealHexStringParams: Components for an EVM randomness reveal message + * @returns hex string + */ +export function createRandomnessRevealHexString({ + discriminator, + randomnessId, + result, + r, + s, + v, +}: RandomnessRevealHexStringParams): string { + const discriminatorHex = discriminator.toString(16).padStart(2, "0"); + const vHex = v.toString(16).padStart(2, "0"); + return `0x${discriminatorHex}${randomnessId}${result}${r}${s}${vHex}`; +} diff --git a/javascript/on-demand/src/index.ts b/javascript/on-demand/src/index.ts new file mode 100644 index 0000000..dc9e637 --- /dev/null +++ b/javascript/on-demand/src/index.ts @@ -0,0 +1,13 @@ +export * from "./accounts/index.js"; +export * from "./anchor-utils/index.js"; +export * from "./constants.js"; +export * from "./event-utils/index.js"; +export * as EVM from "./evm/index.js"; +export * from "./instruction-utils/index.js"; +export * from "./oracle-interfaces/index.js"; +export * from "./sysvars/index.js"; +export * from "./utils/index.js"; +export { CrossbarClient, OracleJob } from "@switchboard-xyz/common"; +import { InstructionUtils } from "./instruction-utils/index.js"; + +export const asV0Tx = InstructionUtils.asV0TxWithComputeIxs; diff --git a/javascript/on-demand/src/instruction-utils/InstructionUtils.ts b/javascript/on-demand/src/instruction-utils/InstructionUtils.ts new file mode 100644 index 0000000..0d02a4f --- /dev/null +++ b/javascript/on-demand/src/instruction-utils/InstructionUtils.ts @@ -0,0 +1,93 @@ +import * as anchor from "@coral-xyz/anchor-30"; +import type { + AddressLookupTableAccount, + Connection, + PublicKey, + Signer, + TransactionInstruction, +} from "@solana/web3.js"; +import { ComputeBudgetProgram } from "@solana/web3.js"; +import { TransactionMessage, VersionedTransaction } from "@solana/web3.js"; + +/* + * Utilities namespace for instruction related functions + * */ +export class InstructionUtils { + /** + * Function to convert transaction instructions to a versioned transaction. + * + * @param {object} params - The parameters object. + * @param {Connection} params.connection - The connection to use. + * @param {TransactionInstruction[]} params.ixs - The transaction instructions. + * @param {PublicKey} [params.payer] - The payer for the transaction. + * @param {number} [params.computeUnitLimitMultiple] - The compute units to cap the transaction as a multiple of the simulated units consumed (e.g., 1.25x). + * @param {number} [params.computeUnitPrice] - The price per compute unit in microlamports. + * @param {AddressLookupTableAccount[]} [params.lookupTables] - The address lookup tables. + * @param {Signer[]} [params.signers] - The signers for the transaction. + * @returns {Promise} A promise that resolves to the versioned transaction. + */ + static async asV0TxWithComputeIxs(params: { + connection: Connection; + ixs: TransactionInstruction[]; + payer?: PublicKey; + computeUnitLimitMultiple?: number; + computeUnitPrice?: number; + lookupTables?: AddressLookupTableAccount[]; + signers?: Signer[]; + }): Promise { + let payer = params.payer; + if (payer === undefined && (params.signers ?? []).length === 0) { + throw new Error("Payer not provided"); + } + if (payer === undefined) { + payer = params.signers![0].publicKey; + } + const priorityFeeIx = ComputeBudgetProgram.setComputeUnitPrice({ + microLamports: params.computeUnitPrice ?? 0, + }); + const simulationComputeLimitIx = ComputeBudgetProgram.setComputeUnitLimit({ + units: 1_400_000, // 1.4M compute units + }); + const recentBlockhash = (await params.connection.getLatestBlockhash()) + .blockhash; + + const simulateMessageV0 = new TransactionMessage({ + recentBlockhash, + instructions: [priorityFeeIx, simulationComputeLimitIx, ...params.ixs], + payerKey: payer, + }).compileToV0Message(params.lookupTables ?? []); + const simulateTx = new VersionedTransaction(simulateMessageV0); + try { + simulateTx.serialize(); + } catch (e: any) { + if (e instanceof RangeError) { + throw new Error( + "Transaction failed to serialize: Transaction too large" + ); + } + throw e; + } + const simulationResult = await params.connection.simulateTransaction( + simulateTx, + { + commitment: "processed", + sigVerify: false, + } + ); + + const simulationUnitsConsumed = simulationResult.value.unitsConsumed!; + const computeLimitIx = ComputeBudgetProgram.setComputeUnitLimit({ + units: Math.floor( + simulationUnitsConsumed * (params.computeUnitLimitMultiple ?? 1) + ), + }); + const messageV0 = new TransactionMessage({ + recentBlockhash, + instructions: [priorityFeeIx, computeLimitIx, ...params.ixs], + payerKey: payer, + }).compileToV0Message(params.lookupTables ?? []); + const tx = new VersionedTransaction(messageV0); + tx.sign(params.signers ?? []); + return tx; + } +} diff --git a/javascript/on-demand/src/instruction-utils/index.ts b/javascript/on-demand/src/instruction-utils/index.ts new file mode 100644 index 0000000..d499541 --- /dev/null +++ b/javascript/on-demand/src/instruction-utils/index.ts @@ -0,0 +1 @@ +export * from "./InstructionUtils.js"; diff --git a/javascript/on-demand/src/oracle-interfaces/gateway.ts b/javascript/on-demand/src/oracle-interfaces/gateway.ts new file mode 100644 index 0000000..caeb80f --- /dev/null +++ b/javascript/on-demand/src/oracle-interfaces/gateway.ts @@ -0,0 +1,804 @@ +import type { FeedRequest } from "./../accounts/pullFeed.js"; + +import { TTLCache } from "@brokerloop/ttlcache"; +import type * as anchor from "@coral-xyz/anchor-30"; +import type { PublicKey } from "@solana/web3.js"; +import { OracleJob } from "@switchboard-xyz/common"; +import type { AxiosInstance } from "axios"; +import axios from "axios"; +import * as bs58 from "bs58"; + +const GATEWAY_PING_CACHE = new TTLCache({ + ttl: 100, + max: 50, + clock: Date, +}); + +// const httpsAgent = new HttpsAgent({ +// rejectUnauthorized: false, // WARNING: This disables SSL/TLS certificate verification. +// }); +const TIMEOUT = 10_000; + +const axiosClient: () => AxiosInstance = (() => { + let instance: AxiosInstance; + + return () => { + if (!instance) { + instance = axios.create(); + } + return instance; + }; +})(); + +/** + * The response from the gateway after fetching signatures. + * Variables are snake_case for serialization. + */ +export type FeedEvalResponse = { + /** + * Hex encoded oracle pubkey + */ + oracle_pubkey: string; + /** + * Hex encoded queue pubkey + */ + queue_pubkey: string; + /** + * Hex encoded oracle signing pubkey + */ + oracle_signing_pubkey: string; + /** + * Hex encoded feed id + */ + feed_hash: string; + /** + * Hex encoded blockhash/slothash the response was signed with. + */ + recent_hash: string; + /** + * Errors encountered while fetching feed value + */ + failure_error: string; + /** + * Feed values derived + */ + success_value: string; + /** + * Signed message of the result and blockhash + */ + msg: string; + /** + * Oracle signature of the result and blockhash + * + * Sha256(success_feed_hashes || results || slothash) + */ + signature: string; + recovery_id: number; + + /** + * If the feed fetch failed, get other recent successes + */ + recent_successes_if_failed: Array; + + /** + * Timestamp marking when the result was fetched + */ + timestamp?: number; +}; + +export type FeedEvalManyResponse = { + feed_responses: FeedEvalResponse[]; + signature: string; + recovery_id: number; + errors: string[]; +}; + +export type FetchSignaturesMultiResponse = { + oracle_responses: FeedEvalManyResponse[]; + errors: string[]; +}; + +export type FeedEvalBatchResponse = { + feed_responses: FeedEvalResponse[]; + errors: string[]; +}; + +export type FetchSignaturesBatchResponse = { + oracle_responses: FeedEvalBatchResponse[]; + errors: string[]; +}; + +/** + * The response from the gateway after revealing randomness. + * Variables are snake_case for serialization. + */ +export type RandomnessRevealResponse = { + /** + * Signature of the randomness using the oracle's enclave key + */ + signature: string; + /** + * Recovery ID of the signature + */ + recovery_id: number; + /** + * The randomness value + */ + value: Array; +}; + +/** + * The response from the gateway after attesting an enclave. + */ +export type AttestEnclaveResponse = { + /** + * The guardian's public key + */ + guardian: string; + /** + * The signature of the guardian + */ + signature: string; + /** + * The recovery ID of the signature + */ + recovery_id: number; +}; + +/** + * The response from the ping endpoint. + */ +export type PingResponse = { + /** + * The oracle's public key + */ + oracle_pubkey: string; + + /** + * The oracle's authority pubkey + */ + oracle_authority: string; + + /** + * The oracle's queue pubkey + */ + queue: string; + + /** + * The registered rate limit for oracle + */ + rate_limit: number; + + /** + * The oracle's version + */ + version: string; + + /** + * The oracle's enclave measurement + */ + mr_enclave: string; + + /** + * Is the oracle a push oracle + */ + is_push_oracle: boolean; + + /** + * Is the oracle a pull oracle + */ + is_pull_oracle: boolean; + + /** + * Is the oracle a guardian + */ + is_gateway: boolean; + + /** + * Is the oracle a guardian + */ + is_guardian: boolean; +}; + +/** + * The Quote info from the gateway_fetch_quote endpoint + */ +export type FetchQuoteResponse = { + /** + * The oracle's pubkey + */ + oracle_pubkey: string; + + /** + * The oracle's queue pubkey + */ + queue: string; + + /** + * The current timestamp used for generating the checksum + */ + now: number; + + /** + * The oracle's enclave measurement + */ + mr_enclave: string; + + /** + * The oracle's ed25519 pubkey + */ + ed25519_pubkey: string; + + /** + * The oracle's secp256k1 pubkey + */ + secp256k1_pubkey: string; + + /** + * The base64 encoded quote + */ + quote: string; +}; + +export interface BridgeEnclaveResponse { + /** + * The guardian's public key + */ + guardian: string; + + /** + * The oracle's public key + */ + oracle: string; + + /** + * The queue (pubkey) that the oracle belongs to + */ + queue: string; + + /** + * The enclave measurement for the oracle + */ + mr_enclave: string; + + /** + * The chain hash read on the guardian + */ + chain_hash: string; + + /** + * The secp256k1 enclave signer for the oracle + */ + oracle_secp256k1_enclave_signer: string; + + /** + * The checksum of the attestation message + */ + msg: string; + + /** + * (UNUSED) The attestation message before being hashed + */ + msg_prehash: string; + + /** + * The ed25519 enclave signer for the oracle + */ + oracle_ed25519_enclave_signer?: string; + + /** + * The timestamp of the attestation + */ + timestamp?: number; + + /** + * The signature from the guardian + */ + signature: string; + recovery_id: number; +} + +/** + * base64 encodes an array of oracle jobs. to send to a gateway + */ +function encodeJobs(jobArray: OracleJob[]): string[] { + return jobArray.map((job) => { + const encoded = OracleJob.encodeDelimited( + OracleJob.fromObject(job) + ).finish(); + // const decoded = OracleJob.decodeDelimited(encoded); + return Buffer.from(encoded).toString("base64"); + }); +} + +/** + * The gateway class is used to interface with the switchboard gateway REST API. + */ +export class Gateway { + /** + * Constructs a `Gateway` instance. + * + * @param program The Anchor program instance. + * @param gatewayUrl The URL of the switchboard gateway. + */ + constructor( + readonly program: anchor.Program, + readonly gatewayUrl: string, + readonly oracleKey?: PublicKey + ) {} + + /** + * Fetches signatures from the gateway. + * + * REST API endpoint: /api/v1/fetch_signatures + * + * @param recentHash The chain metadata to sign with. Blockhash or slothash. + * @param encodedJobs The base64 encoded oracle jobs. + * @param numSignatures The number of oracles to fetch signatures from. + * @returns A promise that resolves to the feed evaluation responses. + * @throws if the request fails. + */ + async fetchSignaturesFromEncoded(params: { + recentHash?: string; + encodedJobs: string[]; + numSignatures: number; + maxVariance: number; + minResponses: number; + useTimestamp?: boolean; + }): Promise<{ responses: FeedEvalResponse[]; failures: string[] }> { + // TODO: have total NumOracles count against rate limit per IP + const { recentHash, encodedJobs, numSignatures } = params; + const url = `${this.gatewayUrl}/gateway/api/v1/fetch_signatures`; + const headers = { "Content-Type": "application/json" }; + const maxVariance = params.maxVariance * 1e9; + const body = JSON.stringify({ + api_version: "1.0.0", + jobs_b64_encoded: encodedJobs, + recent_chainhash: recentHash ?? bs58.encode(Buffer.alloc(32, 0)), + signature_scheme: "Secp256k1", + hash_scheme: "Sha256", + num_oracles: numSignatures, + max_variance: maxVariance, + min_responses: params.minResponses, + use_timestamp: params.useTimestamp ?? false, + }); + return axiosClient() + .post(url, body, { + headers, + timeout: TIMEOUT, + }) + .then((r) => r.data); + } + + async ping(): Promise { + const url = `${this.gatewayUrl}/gateway/api/v1/ping`; + const method = "POST"; + const headers = { "Content-Type": "application/json" }; + const body = JSON.stringify({ api_version: "1.0.0" }); + return axiosClient() + .post(url, body, { method, headers, timeout: TIMEOUT }) + .then((r) => r.data); + } + + /** + * + * Fetches signatures from the gateway. + * REST API endpoint: /api/v1/gateway_attest_enclave + * @param timestamp The timestamp of the attestation + * @param quote The quote of the attestation + * @param oracle_pubkey The oracle's public key + * @param oracle_reward_wallet The oracle's reward wallet + * @param oracle_ed25519_enclave_signer The oracle's ed25519 enclave signer + * @param oracle_secp256k1_enclave_signer The oracle's secp256k1 enclave signer + * @param recentHash The chain metadata to sign with. Blockhash or slothash. + * @returns A promise that resolves to the attestation response. + * @throws if the request fails. + */ + async fetchAttestation(params: { + timestamp: number; + quote: string; + oracle_pubkey: string; + oracle_reward_wallet: string; + oracle_ed25519_enclave_signer: string; + oracle_secp256k1_enclave_signer: string; + recentHash: string; + }): Promise { + const api_version = "1.0.0"; + const url = `${this.gatewayUrl}/gateway/api/v1/gateway_attest_enclave`; + const method = "POST"; + const headers = { "Content-Type": "application/json" }; + const body = JSON.stringify({ + api_version, + timestamp: params.timestamp, + quote: params.quote, + oracle_pubkey: params.oracle_pubkey, + oracle_reward_wallet: params.oracle_reward_wallet, + oracle_ed25519_enclave_signer: params.oracle_ed25519_enclave_signer, + oracle_secp256k1_enclave_signer: params.oracle_secp256k1_enclave_signer, + chain_hash: params.recentHash, + }); + + return axiosClient() + .post(url, { method, headers, data: body, timeout: TIMEOUT }) + .then((r) => r.data); + } + + /** + * Fetches a quote from the gateway. + * + * REST API endpoint: /api/v1/gateway_fetch_quote + * + * + * @param blockhash The blockhash to fetch the quote for. + * @param get_for_oracle Whether to fetch the quote for the oracle. + * @param get_for_guardian Whether to fetch the quote for the guardian. + * @returns A promise that resolves to the quote response. + * @throws if the request fails. + */ + async fetchQuote(params: { + blockhash: string; + get_for_oracle: boolean; + get_for_guardian: boolean; + }): Promise { + const api_version = "1.0.0"; + const url = `${this.endpoint()}/gateway/api/v1/gateway_fetch_quote`; + const method = "POST"; + const headers = { "Content-Type": "application/json" }; + const body = JSON.stringify({ + api_version, + blockhash: params.blockhash, + get_for_oracle: params.get_for_oracle, + get_for_guardian: params.get_for_guardian, + }); + return axiosClient() + .post(url, { method, headers, data: body, timeout: TIMEOUT }) + .then(async (r) => { + return r.data; + }); + } + + // alberthermida@Switchboard ts % curl -X POST \ + // -H "Content-Type: application/json" \ + // -d '{ + // "api_version": "1.0.0", + // "blockhash": "0000000000000000000000000000000000000000000000000000000000000000", + // "get_for_oracle": true, + // "get_for_guardian": false + // }' \ + // https://vu-ams-02.switchboard-oracles.xyz/gateway/api/v1/gateway_fetch_quote + + /** + * Fetches signatures from the gateway. + * + * REST API endpoint: /api/v1/fetch_signatures + * + * @param recentHash The chain metadata to sign with. Blockhash or slothash. + * @param jobs The oracle jobs to perform. + * @param numSignatures The number of oracles to fetch signatures from. + * @param maxVariance The maximum variance allowed in the feed values. + * @param minResponses The minimum number of responses of jobs to succeed. + * @param useTimestamp Whether to use the timestamp in the response & to encode update signature. + * @returns A promise that resolves to the feed evaluation responses. + * @throws if the request fails. + */ + async fetchSignatures(params: { + recentHash?: string; + jobs: OracleJob[]; + numSignatures?: number; + maxVariance?: number; + minResponses?: number; + useTimestamp?: boolean; + }): Promise<{ responses: FeedEvalResponse[]; failures: string[] }> { + params.numSignatures = params.numSignatures ?? 1; + params.maxVariance = params.maxVariance ?? 1; + params.minResponses = params.minResponses ?? 1; + const { + recentHash, + jobs, + numSignatures, + maxVariance, + minResponses, + useTimestamp, + } = params; + const encodedJobs = encodeJobs(jobs); + const res = await this.fetchSignaturesFromEncoded({ + recentHash, + encodedJobs, + numSignatures, + maxVariance, + minResponses, + useTimestamp, + }); + return res; + } + + async fetchSignaturesMulti(params: { + recentHash?: string; + feedConfigs: FeedRequest[]; + numSignatures?: number; + useTimestamp?: boolean; + }): Promise { + const { recentHash, feedConfigs, useTimestamp, numSignatures } = params; + const encodedConfigs = feedConfigs.map((config) => { + const encodedJobs = encodeJobs(config.jobs); + return { + encodedJobs, + maxVariance: config.maxVariance ?? 1, + minResponses: config.minResponses ?? 1, + }; + }); + const res = await this.fetchSignaturesFromEncodedMulti({ + recentHash, + encodedConfigs, + numSignatures: numSignatures ?? 1, + useTimestamp, + }); + return res; + } + + async fetchSignaturesFromEncodedMulti(params: { + recentHash?: string; + encodedConfigs: { + encodedJobs: string[]; + maxVariance: number; + minResponses: number; + }[]; + numSignatures: number; + useTimestamp?: boolean; + }): Promise { + // TODO: have total NumOracles count against rate limit per IP + const { recentHash, encodedConfigs, numSignatures } = params; + const url = `${this.gatewayUrl}/gateway/api/v1/fetch_signatures_multi`; + const method = "POST"; + const headers = { "Content-Type": "application/json" }; + const body = { + api_version: "1.0.0", + num_oracles: numSignatures, + recent_hash: recentHash ?? bs58.encode(Buffer.alloc(32, 0)), + signature_scheme: "Secp256k1", + hash_scheme: "Sha256", + feed_requests: [] as any, + }; + for (const config of encodedConfigs) { + const maxVariance = Math.floor(Number(config.maxVariance ?? 1) * 1e9); + body.feed_requests.push({ + jobs_b64_encoded: config.encodedJobs, + max_variance: maxVariance, + min_responses: config.minResponses ?? 1, + use_timestamp: params.useTimestamp ?? false, + }); + } + const data = JSON.stringify(body); + try { + const resp = await axiosClient()(url, { method, headers, data }).then( + (r) => r.data + ); + return resp; + } catch (err) { + console.error("fetchSignaturesFromEncodedMulti error", err); + throw err; + } + } + + /** + * Fetches signatures from the gateway without pre-encoded jobs + * REST API endpoint: /api/v1/fetch_signatures_batch + * + * @param recentHash The chain metadata to sign with. Blockhash or slothash. + * @param feedConfigs The feed configurations to fetch signatures for. + * @param numSignatures The number of oracles to fetch signatures from. + * @param useTimestamp Whether to use the timestamp in the response & to encode update signature. + * @returns A promise that resolves to the feed evaluation responses. + * @throws if the request fails. + */ + async fetchSignaturesBatch(params: { + recentHash?: string; + feedConfigs: FeedRequest[]; + numSignatures?: number; + useTimestamp?: boolean; + }): Promise { + const { recentHash, feedConfigs, useTimestamp, numSignatures } = params; + const encodedConfigs = feedConfigs.map((config) => { + const encodedJobs = encodeJobs(config.jobs); + return { + encodedJobs, + maxVariance: config.maxVariance ?? 1, + minResponses: config.minResponses ?? 1, + }; + }); + const res = await this.fetchSignaturesFromEncodedBatch({ + recentHash, + encodedConfigs, + numSignatures: numSignatures ?? 1, + useTimestamp, + }); + return res; + } + + /** + * Fetches signatures from the gateway. + * REST API endpoint: /api/v1/fetch_signatures_batch + * + * @param recentHash The chain metadata to sign with. Blockhash or slothash. + * @param encodedConfigs The encoded feed configurations to fetch signatures for. + * @param numSignatures The number of oracles to fetch signatures from. + * @param useTimestamp Whether to use the timestamp in the response & to encode update signature. + * @returns A promise that resolves to the feed evaluation responses. + * @throws if the request fails. + */ + async fetchSignaturesFromEncodedBatch(params: { + recentHash?: string; + encodedConfigs: { + encodedJobs: string[]; + maxVariance: number; + minResponses: number; + }[]; + numSignatures: number; + useTimestamp?: boolean; + }): Promise { + const { recentHash, encodedConfigs, numSignatures } = params; + const url = `${this.gatewayUrl}/gateway/api/v1/fetch_signatures_batch`; + const method = "POST"; + const headers = { "Content-Type": "application/json" }; + const body = { + api_version: "1.0.0", + num_oracles: numSignatures, + recent_hash: recentHash ?? bs58.encode(Buffer.alloc(32, 0)), + signature_scheme: "Secp256k1", + hash_scheme: "Sha256", + feed_requests: [] as any, + }; + for (const config of encodedConfigs) { + const maxVariance = Math.floor(Number(config.maxVariance ?? 1) * 1e9); + body.feed_requests.push({ + jobs_b64_encoded: config.encodedJobs, + max_variance: maxVariance, + min_responses: config.minResponses ?? 1, + use_timestamp: params.useTimestamp ?? false, + }); + } + const data = JSON.stringify(body); + + // get size of data + try { + const resp = await axiosClient()(url, { method, headers, data }).then( + (r) => { + return { + ...r.data, + }; + } + ); + + return resp; + } catch (err) { + console.error("fetchSignaturesFromEncodedBatch error", err); + throw err; + } + } + + /** + * Sends a request to the gateway bridge enclave. + * + * REST API endpoint: /api/v1/gateway_bridge_enclave + * + * @param chainHash The chain hash to include in the request. + * @param oraclePubkey The public key of the oracle. + * @param queuePubkey The public key of the queue. + * @returns A promise that resolves to the response. + * @throws if the request fails. + */ + async fetchBridgingMessage(params: { + chainHash: string; + oraclePubkey: string; + queuePubkey: string; + }): Promise { + const url = `${this.gatewayUrl}/gateway/api/v1/gateway_bridge_enclave`; + const method = "POST"; + const headers = { "Content-Type": "application/json" }; + const body = { + api_version: "1.0.0", + chain_hash: params.chainHash, + oracle_pubkey: params.oraclePubkey, + queue_pubkey: params.queuePubkey, + }; + const data = JSON.stringify(body); + + try { + const resp = await axiosClient()(url, { method, headers, data }).then( + (r) => r.data + ); + return resp; + } catch (error: any) { + throw error; + } + } + + /** + * Fetches the randomness reveal from the gateway. + * @param params The parameters for the randomness reveal. + * @returns The randomness reveal response. + */ + async fetchRandomnessReveal( + params: + | { + randomnessAccount: PublicKey; + slothash: string; + slot: number; + } + | { + randomnessId: string; + timestamp: number; + minStalenessSeconds: number; + } + ): Promise { + const url = `${this.gatewayUrl}/gateway/api/v1/randomness_reveal`; + const method = "POST"; + const responseType = "text"; + const headers = { "Content-Type": "application/json" }; + + // Handle Solana and Cross-Chain Randomness + let data: string; + if ("slot" in params) { + // Solana Randomness + data = JSON.stringify({ + slothash: [...bs58.decode(params.slothash)], + randomness_key: params.randomnessAccount.toBuffer().toString("hex"), + slot: params.slot, + }); + } else { + // Cross-chain randomness + data = JSON.stringify({ + timestamp: params.timestamp, + min_staleness_seconds: params.minStalenessSeconds, + randomness_key: params.randomnessId, + }); + } + try { + const txtResponse = await axiosClient()(url, { + method, + headers, + data, + responseType, + }); + return JSON.parse(txtResponse.data); + } catch (err) { + console.error("fetchRandomnessReveal error", err); + throw err; + } + } + + async test(): Promise { + const url = `${this.gatewayUrl}/gateway/api/v1/test`; + const cachedResponse = GATEWAY_PING_CACHE.get(this.gatewayUrl); + if (cachedResponse !== undefined) { + return cachedResponse; + } + try { + const txt = await axiosClient()(url); + if (txt.data.length !== 0) { + GATEWAY_PING_CACHE.set(this.gatewayUrl, true); + return true; + } + } catch {} + GATEWAY_PING_CACHE.set(this.gatewayUrl, false); + return false; + } + + endpoint(): string { + return this.gatewayUrl; + } + + toString(): string { + return JSON.stringify({ + gatewayUrl: this.gatewayUrl, + programId: this.program.programId.toBase58(), + }); + } + + [Symbol.toPrimitive](hint: string) { + if (hint === "string") { + return `Gateway: ${this.toString()}`; + } + return null; + } +} diff --git a/javascript/on-demand/src/oracle-interfaces/index.ts b/javascript/on-demand/src/oracle-interfaces/index.ts new file mode 100644 index 0000000..292b4f3 --- /dev/null +++ b/javascript/on-demand/src/oracle-interfaces/index.ts @@ -0,0 +1 @@ +export * from "./gateway.js"; diff --git a/javascript/on-demand/src/sysvars/associatedToken.ts b/javascript/on-demand/src/sysvars/associatedToken.ts new file mode 100644 index 0000000..cd73410 --- /dev/null +++ b/javascript/on-demand/src/sysvars/associatedToken.ts @@ -0,0 +1,25 @@ +import { SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID } from "../constants.js"; + +import { TOKEN_PROGRAM_ID } from "./../utils/index.js"; + +import { PublicKey } from "@solana/web3.js"; + +export class AssociatedTokenProgram { + private constructor() {} + /** + * Find the associated token address for the given wallet and token mint + */ + findAssociatedTokenAddress( + walletAddress: PublicKey, + tokenMintAddress: PublicKey + ): [PublicKey, number] { + return PublicKey.findProgramAddressSync( + [ + walletAddress.toBuffer(), + TOKEN_PROGRAM_ID.toBuffer(), + tokenMintAddress.toBuffer(), + ], + SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID + ); + } +} diff --git a/javascript/on-demand/src/sysvars/index.ts b/javascript/on-demand/src/sysvars/index.ts new file mode 100644 index 0000000..d337316 --- /dev/null +++ b/javascript/on-demand/src/sysvars/index.ts @@ -0,0 +1,2 @@ +export * from "./associatedToken.js"; +export * from "./recentSlothashes.js"; diff --git a/javascript/on-demand/src/sysvars/recentSlothashes.ts b/javascript/on-demand/src/sysvars/recentSlothashes.ts new file mode 100644 index 0000000..106ceb9 --- /dev/null +++ b/javascript/on-demand/src/sysvars/recentSlothashes.ts @@ -0,0 +1,61 @@ +import { SLOT_HASHES_SYSVAR_ID } from "../constants.js"; + +import * as anchor from "@coral-xyz/anchor-30"; +import type { Connection } from "@solana/web3.js"; +import bs58 from "bs58"; + +/** + * Abstraction around the SysvarS1otHashes111111111111111111111111111 sysvar + * This sysvar is used to store the recent slot hashes + */ +export class RecentSlotHashes { + /** + * Disable object instantiation. + */ + private constructor() {} + /** + * Fetches the latest slot hash from the sysvar. + * @param connection The connection to use. + * @returns A promise that resolves to the latest slot number and hash. + */ + public static async fetchLatest( + connection: Connection + ): Promise<[anchor.BN, string]> { + const accountInfo = await connection.getAccountInfo(SLOT_HASHES_SYSVAR_ID, { + commitment: "confirmed", + dataSlice: { length: 40, offset: 8 }, + }); + if (!accountInfo) { + throw new Error("Failed to get account info"); + } + const buffer = accountInfo.data; + const slotNumber = buffer.readBigUInt64LE(0); + const encoded = bs58.encode(Uint8Array.prototype.slice.call(buffer, 8)); + return [new anchor.BN(slotNumber.toString()), encoded]; + } + + public static async fetchLatestNSlothashes( + connection: Connection, + n: number + ): Promise> { + const accountInfo = await connection.getAccountInfo(SLOT_HASHES_SYSVAR_ID, { + commitment: "confirmed", + dataSlice: { length: 40 * Math.floor(n), offset: 8 }, + }); + if (!accountInfo) { + throw new Error("Failed to get account info"); + } + const out: Array<[anchor.BN, string]> = []; + const buffer = accountInfo.data; + for (let i = 0; i < n; i++) { + const slotNumber = buffer.readBigUInt64LE(i * 40); + const hashStart = i * 40 + 8; + const hashEnd = hashStart + 32; + const encoded = bs58.encode( + Uint8Array.prototype.slice.call(buffer, hashStart, hashEnd) + ); + out.push([new anchor.BN(slotNumber.toString()), encoded]); + } + return out; + } +} diff --git a/javascript/on-demand/src/utils/TypescriptUtils.ts b/javascript/on-demand/src/utils/TypescriptUtils.ts new file mode 100644 index 0000000..2cfd4c4 --- /dev/null +++ b/javascript/on-demand/src/utils/TypescriptUtils.ts @@ -0,0 +1,3 @@ +export function sleep(milliseconds: number) { + return new Promise((resolve) => setTimeout(resolve, milliseconds)); +} diff --git a/javascript/on-demand/src/utils/index.ts b/javascript/on-demand/src/utils/index.ts new file mode 100644 index 0000000..531db6b --- /dev/null +++ b/javascript/on-demand/src/utils/index.ts @@ -0,0 +1,307 @@ +export * from "./TypescriptUtils.js"; +import { Oracle } from "../accounts/oracle.js"; +import type { PullFeed } from "../accounts/pullFeed.js"; +import { Queue } from "../accounts/queue.js"; + +import * as anchor from "@coral-xyz/anchor-30"; +import NodeWallet from "@coral-xyz/anchor-30/dist/cjs/nodewallet.js"; +import type { AddressLookupTableAccount } from "@solana/web3.js"; +import { Connection, PublicKey } from "@solana/web3.js"; +import type { IOracleJob } from "@switchboard-xyz/common"; +import { CrossbarClient } from "@switchboard-xyz/common"; + +type Account = { + pubkey: PublicKey; + loadLookupTable: () => Promise; +}; + +export function createLoadLookupTables() { + const promiseMap: Map> = new Map(); + + async function loadLookupTables( + accounts: Account[], + ): Promise { + for (const account of accounts) { + const pubkey = account.pubkey.toString(); + if (pubkey && account.loadLookupTable) { + if (!promiseMap.has(pubkey)) { + promiseMap.set(pubkey, account.loadLookupTable()); + } + } + } + + const out = []; + for (const account of accounts) { + out.push(promiseMap.get(account.pubkey.toString())); + } + return Promise.all(out); + } + + return loadLookupTables; +} + +export const loadLookupTables = createLoadLookupTables(); + +// Mainnet ID's +export const ON_DEMAND_MAINNET_PID = new PublicKey( + "SBondMDrcV3K4kxZR1HNVT7osZxAHVHgYXL5Ze1oMUv", +); +export const ON_DEMAND_MAINNET_GUARDIAN_QUEUE = new PublicKey( + "B7WgdyAgzK7yGoxfsBaNnY6d41bTybTzEh4ZuQosnvLK", +); +export const ON_DEMAND_MAINNET_QUEUE = new PublicKey( + "A43DyUGA7s8eXPxqEjJY6EBu1KKbNgfxF8h17VAHn13w", +); + +// Devnet ID's +export const ON_DEMAND_DEVNET_PID = new PublicKey( + "Aio4gaXjXzJNVLtzwtNVmSqGKpANtXhybbkhtAC94ji2", +); +export const ON_DEMAND_DEVNET_GUARDIAN_QUEUE = new PublicKey( + "BeZ4tU4HNe2fGQGUzJmNS2UU2TcZdMUUgnCH6RPg4Dpi", +); +export const ON_DEMAND_DEVNET_QUEUE = new PublicKey( + "EYiAmGSdsQTuCw413V5BzaruWuCCSDgTPtBGvLkXHbe7", +); + +/** + * Check if the connection is to the mainnet + * @param connection - Connection: The connection + * @returns - Promise - Whether the connection is to the mainnet + */ +export async function isMainnetConnection( + connection: Connection, +): Promise { + try { + const block = await connection.getBlock(116650000); + if (!block) { + return false; + } + + return block.blockhash === "AZxydBEE2JTJZMEPyCJCycKHe4Jau6j9Evw9oT3Aujts"; + } catch (e) { + return false; + } +} + +/** + * Get the program ID for the Switchboard program based on the connection + * @param connection - Connection: The connection + * @returns - Promise - The program ID + */ +export async function getProgramId(connection: Connection): Promise { + const isMainnet = await isMainnetConnection(connection); + return isMainnet ? ON_DEMAND_MAINNET_PID : ON_DEMAND_DEVNET_PID; +} + +/** + * Get the default devnet queue for the Switchboard program + * @param solanaRPCUrl - (optional) string: The Solana RPC URL + * @returns - Promise - The default devnet queue + */ +export async function getDefaultDevnetQueue( + solanaRPCUrl: string = "https://api.devnet.solana.com", +): Promise { + return getQueue( + solanaRPCUrl, + ON_DEMAND_DEVNET_PID.toString(), + ON_DEMAND_DEVNET_QUEUE.toString(), + ); +} + +/** + * Get the default devnet guardian queue for the Switchboard program + * @param solanaRPCUrl - (optional) string: The Solana RPC URL + * @returns - Promise - The default devnet guardian queue + */ +export async function getDefaultDevnetGuardianQueue( + solanaRPCUrl: string = "https://api.devnet.solana.com", +): Promise { + return getQueue( + solanaRPCUrl, + ON_DEMAND_DEVNET_PID.toString(), + ON_DEMAND_DEVNET_GUARDIAN_QUEUE.toString(), + ); +} + +/** + * Get the default queue for the Switchboard program + * @param solanaRPCUrl - (optional) string: The Solana RPC URL + * @returns - Promise - The default queue + * @NOTE - SWITCHBOARD PID AND QUEUE PUBKEY ARE WRONG + */ +export async function getDefaultQueue( + solanaRPCUrl: string = "https://api.mainnet-beta.solana.com", +): Promise { + if (await isMainnetConnection(new Connection(solanaRPCUrl, "confirmed"))) { + return getQueue( + solanaRPCUrl, + ON_DEMAND_MAINNET_PID.toString(), + ON_DEMAND_MAINNET_QUEUE.toString(), + ); + } else { + return getQueue( + solanaRPCUrl, + ON_DEMAND_DEVNET_PID.toString(), + ON_DEMAND_DEVNET_QUEUE.toString(), + ); + } +} + +/** + * Get the default guardian queue for the Switchboard program + * @param solanaRPCUrl - (optional) string: The Solana RPC URL + * @returns - Promise - The default guardian queue + * @NOTE - SWITCHBOARD PID AND GUARDIAN QUEUE PUBKEY ARE WRONG + */ +export async function getDefaultGuardianQueue( + solanaRPCUrl: string = "https://api.mainnet-beta.solana.com", +): Promise { + return getQueue( + solanaRPCUrl, + ON_DEMAND_MAINNET_PID.toString(), + ON_DEMAND_MAINNET_GUARDIAN_QUEUE.toString(), + ); +} + +/** + * Get the queue for the Switchboard program + * @param solanaRPCUrl - string: The Solana RPC URL + * @param switchboardProgramId - string: The Switchboard program ID + * @param queueAddress - string: The queue address + * @returns - Promise - The queue + */ +export async function getQueue( + solanaRPCUrl: string, + switchboardProgramId: string, + queueAddress: string, +): Promise { + const { PublicKey, Keypair, Connection } = anchor.web3; + const wallet: NodeWallet = new NodeWallet(new Keypair()); + const connection = new Connection(solanaRPCUrl, "confirmed"); + const PID = new PublicKey(switchboardProgramId); + const queue = new PublicKey(queueAddress); + const provider = new anchor.AnchorProvider(connection, wallet, {}); + const idl = (await anchor.Program.fetchIdl(PID, provider))!; + const program = new anchor.Program(idl, provider); + const queueAccount = new Queue(program, queue); + return queueAccount; +} + +/** + * Get the unique LUT keys for the queue, all oracles in the queue, and all feeds + * provided + * @param queue - Queue: The queue + * @param feeds - PullFeed[]: The feeds + * @returns - Promise: The unique LUT keys + */ +export async function fetchAllLutKeys( + queue: Queue, + feeds: PullFeed[], +): Promise { + const oracles = await queue.fetchOracleKeys(); + const lutOwners: any[] = []; + lutOwners.push(queue); + for (const feed of feeds) { + lutOwners.push(feed); + } + for (const oracle of oracles) { + lutOwners.push(new Oracle(queue.program, oracle)); + } + const lutPromises = lutOwners.map((lutOwner) => { + return lutOwner.loadLookupTable(); + }); + const luts = await Promise.all(lutPromises); + const keyset = new Set(); + for (const lut of luts) { + for (const key of lut.state.addresses) { + keyset.add(key.toString()); + } + } + return Array.from(keyset).map((key) => new PublicKey(key)); +} + +/** + * @param queue Queue pubkey as base58 string + * @param jobs Array of jobs to store (Oracle Jobs Object) + * @param crossbarUrl + * @returns + */ +export async function storeFeed( + queue: string, + jobs: IOracleJob[], + crossbarUrl: string = "https://crossbar.switchboard.xyz", +): Promise<{ + cid: string; + feedHash: string; + queueHex: string; +}> { + const crossbar = crossbarUrl.endsWith("/") + ? crossbarUrl.slice(0, -1) + : crossbarUrl; + + const x = new CrossbarClient(crossbar); + return await x.store(queue, jobs); +} + +export async function getAssociatedTokenAddress( + mint: PublicKey, + owner: PublicKey, + allowOwnerOffCurve = false, + programId = TOKEN_PROGRAM_ID, + associatedTokenProgramId = ASSOCIATED_TOKEN_PROGRAM_ID, +): Promise { + if (!allowOwnerOffCurve && !PublicKey.isOnCurve(owner.toBuffer())) { + throw new Error("TokenOwnerOffCurveError"); + } + + const [address] = await PublicKey.findProgramAddress( + [owner.toBuffer(), programId.toBuffer(), mint.toBuffer()], + associatedTokenProgramId, + ); + + return address; +} + +export function getAssociatedTokenAddressSync( + mint: PublicKey, + owner: PublicKey, + allowOwnerOffCurve = false, + programId = TOKEN_PROGRAM_ID, + associatedTokenProgramId = ASSOCIATED_TOKEN_PROGRAM_ID, +): PublicKey { + if (!allowOwnerOffCurve && !PublicKey.isOnCurve(owner.toBuffer())) { + throw new Error("TokenOwnerOffCurveError"); + } + + const [address] = PublicKey.findProgramAddressSync( + [owner.toBuffer(), programId.toBuffer(), mint.toBuffer()], + associatedTokenProgramId, + ); + + return address; +} + +export const TOKEN_PROGRAM_ID = new PublicKey( + "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", +); + +/** Address of the SPL Token 2022 program */ +export const TOKEN_2022_PROGRAM_ID = new PublicKey( + "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb", +); + +/** Address of the SPL Associated Token Account program */ +export const ASSOCIATED_TOKEN_PROGRAM_ID = new PublicKey( + "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL", +); + +/** Address of the special mint for wrapped native SOL in spl-token */ +export const NATIVE_MINT = new PublicKey( + "So11111111111111111111111111111111111111112", +); + +/** Address of the special mint for wrapped native SOL in spl-token-2022 */ +export const NATIVE_MINT_2022 = new PublicKey( + "9pan9bMn5HatX4EJdBwg9VgCa7Uz5HL8N1m5D3NdXejP", +); diff --git a/javascript/on-demand/tsconfig.cjs.json b/javascript/on-demand/tsconfig.cjs.json new file mode 100644 index 0000000..4fc7028 --- /dev/null +++ b/javascript/on-demand/tsconfig.cjs.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "module": "CommonJS", + "outDir": "./dist/cjs", + "declarationDir": "./dist/types/cjs" + } +} diff --git a/javascript/on-demand/tsconfig.json b/javascript/on-demand/tsconfig.json new file mode 100644 index 0000000..9f0730a --- /dev/null +++ b/javascript/on-demand/tsconfig.json @@ -0,0 +1,28 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "ES6", + "outDir": "./dist/esm", + "rootDir": "./src", + "noImplicitAny": false, + "strict": true, + "esModuleInterop": true, + "declaration": true, + "declarationDir": "./dist/types/esm", + "declarationMap": true, + "moduleResolution": "node", + "baseUrl": "./", + "paths": { + "@coral-xyz/anchor-30": ["node_modules/@coral-xyz/anchor-30"], + "@solana/web3.js": ["node_modules/@solana/web3.js"] + }, + "typeRoots": ["./node_modules/@types", "./types"], + "skipLibCheck": true, + "strictNullChecks": false, + "strictPropertyInitialization": false, + "sourceMap": true, + "inlineSources": true + }, + "include": ["src"], + "exclude": ["node_modules"] +} diff --git a/rust/switchboard-on-demand-client/Cargo.lock b/rust/switchboard-on-demand-client/Cargo.lock new file mode 100644 index 0000000..2e8eb15 --- /dev/null +++ b/rust/switchboard-on-demand-client/Cargo.lock @@ -0,0 +1,5197 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "Inflector" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" +dependencies = [ + "lazy_static", + "regex", +] + +[[package]] +name = "addr2line" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "aead" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b613b8e1e3cf911a086f53f03bf286f52fd7a7258e4fa606f0ef220d39d8877" +dependencies = [ + "generic-array", +] + +[[package]] +name = "aes" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e8b47f52ea9bae42228d07ec09eb676433d7c4ed1ebdf0f1d1c29ed446f1ab8" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", + "opaque-debug", +] + +[[package]] +name = "aes-gcm-siv" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589c637f0e68c877bbd59a4599bbe849cac8e5f3e4b5a3ebae8f528cd218dcdc" +dependencies = [ + "aead", + "aes", + "cipher", + "ctr", + "polyval", + "subtle", + "zeroize", +] + +[[package]] +name = "ahash" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" +dependencies = [ + "getrandom 0.2.15", + "once_cell", + "version_check", +] + +[[package]] +name = "ahash" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72832d73be48bac96a5d7944568f305d829ed55b0ce3b483647089dfaf6cf704" +dependencies = [ + "cfg-if", + "getrandom 0.2.15", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +dependencies = [ + "alloc-no-stdlib", +] + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "ansi_term" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" +dependencies = [ + "winapi", +] + +[[package]] +name = "anyhow" +version = "1.0.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" + +[[package]] +name = "anyhow_ext" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a135cb522bf5b2254ed712979bc242f60c13f7906c1e4585d5fef36ae9017528" +dependencies = [ + "anyhow", +] + +[[package]] +name = "ark-bn254" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a22f4561524cd949590d78d7d4c5df8f592430d221f7f3c9497bbafd8972120f" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-std", +] + +[[package]] +name = "ark-ec" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" +dependencies = [ + "ark-ff", + "ark-poly", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", + "itertools 0.10.5", + "num-traits", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm", + "ark-ff-macros", + "ark-serialize", + "ark-std", + "derivative", + "digest 0.10.7", + "itertools 0.10.5", + "num-bigint 0.4.6", + "num-traits", + "paste", + "rustc_version", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint 0.4.6", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-poly" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" +dependencies = [ + "ark-ff", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-serialize-derive", + "ark-std", + "digest 0.10.7", + "num-bigint 0.4.6", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + +[[package]] +name = "arrayref" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" + +[[package]] +name = "arrayvec" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" + +[[package]] +name = "ascii" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eab1c04a571841102f5345a8fc0f6bb3d31c315dec879b5c6e42e40ce7ffa34e" + +[[package]] +name = "asn1-rs" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6fd5ddaf0351dff5b8da21b2fb4ff8e08ddd02857f0bf69c47639106c0fff0" +dependencies = [ + "asn1-rs-derive", + "asn1-rs-impl", + "displaydoc", + "nom", + "num-traits", + "rusticata-macros", + "thiserror", + "time", +] + +[[package]] +name = "asn1-rs-derive" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "726535892e8eae7e70657b4c8ea93d26b8553afb1ce617caee529ef96d7dee6c" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "synstructure", +] + +[[package]] +name = "asn1-rs-impl" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2777730b2039ac0f95f093556e61b6d26cebed5393ca6f152717777cec3a42ed" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "assert_matches" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9" + +[[package]] +name = "async-channel" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" +dependencies = [ + "concurrent-queue", + "event-listener", + "futures-core", +] + +[[package]] +name = "async-compression" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd066d0b4ef8ecb03a55319dc13aa6910616d0f44008a045bb1835af830abff5" +dependencies = [ + "brotli", + "flate2", + "futures-core", + "memchr", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "async-mutex" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479db852db25d9dbf6204e6cb6253698f175c15726470f78af0d918e99d6156e" +dependencies = [ + "event-listener", +] + +[[package]] +name = "async-trait" +version = "0.1.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.70", +] + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi 0.1.19", + "libc", + "winapi", +] + +[[package]] +name = "autocfg" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" + +[[package]] +name = "backtrace" +version = "0.3.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + +[[package]] +name = "base58" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6107fe1be6682a68940da878d9e9f5e90ca5745b3dec9fd1bb393c8777d4f581" + +[[package]] +name = "base64" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64ct" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +dependencies = [ + "serde", +] + +[[package]] +name = "bitmaps" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "031043d04099746d8db04daf1fa424b2bc8bd69d92b25962dcde24da39ab64a2" +dependencies = [ + "typenum", +] + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "blake3" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30cca6d3674597c30ddf2c587bf8d9d65c9a84d2326d941cc79c9842dfe0ef52" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", + "digest 0.10.7", +] + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "block-padding", + "generic-array", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block-padding" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" + +[[package]] +name = "borsh" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15bf3650200d8bffa99015595e10f1fbd17de07abbc25bb067da79e769939bfa" +dependencies = [ + "borsh-derive 0.9.3", + "hashbrown 0.11.2", +] + +[[package]] +name = "borsh" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4114279215a005bc675e386011e594e1d9b800918cea18fcadadcce864a2046b" +dependencies = [ + "borsh-derive 0.10.3", + "hashbrown 0.13.2", +] + +[[package]] +name = "borsh" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6362ed55def622cddc70a4746a68554d7b687713770de539e59a739b249f8ed" +dependencies = [ + "borsh-derive 1.5.1", + "cfg_aliases", +] + +[[package]] +name = "borsh-derive" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6441c552f230375d18e3cc377677914d2ca2b0d36e52129fe15450a2dce46775" +dependencies = [ + "borsh-derive-internal 0.9.3", + "borsh-schema-derive-internal 0.9.3", + "proc-macro-crate 0.1.5", + "proc-macro2", + "syn 1.0.109", +] + +[[package]] +name = "borsh-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0754613691538d51f329cce9af41d7b7ca150bc973056f1156611489475f54f7" +dependencies = [ + "borsh-derive-internal 0.10.3", + "borsh-schema-derive-internal 0.10.3", + "proc-macro-crate 0.1.5", + "proc-macro2", + "syn 1.0.109", +] + +[[package]] +name = "borsh-derive" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3ef8005764f53cd4dca619f5bf64cafd4664dada50ece25e4d81de54c80cc0b" +dependencies = [ + "once_cell", + "proc-macro-crate 3.1.0", + "proc-macro2", + "quote", + "syn 2.0.70", + "syn_derive", +] + +[[package]] +name = "borsh-derive-internal" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5449c28a7b352f2d1e592a8a28bf139bc71afb0764a14f3c02500935d8c44065" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "borsh-derive-internal" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afb438156919598d2c7bad7e1c0adf3d26ed3840dbc010db1a882a65583ca2fb" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "borsh-schema-derive-internal" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdbd5696d8bfa21d53d9fe39a714a18538bad11492a42d066dbbc395fb1951c0" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "borsh-schema-derive-internal" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634205cc43f74a1b9046ef87c4540ebda95696ec0f315024860cad7c5b0f5ccd" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "brotli" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74f7971dbd9326d58187408ab83117d8ac1bb9c17b085fdacd1cf2f598719b6b" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "4.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a45bd2e4095a8b518033b128020dd4a55aab1c0a381ba4404a472630f4bc362" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bs58" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "bv" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8834bb1d8ee5dc048ee3124f2c7c1afcc6bc9aed03f11e9dfd8c69470a5db340" +dependencies = [ + "feature-probe", + "serde", +] + +[[package]] +name = "bytecheck" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" +dependencies = [ + "bytecheck_derive", + "ptr_meta", + "simdutf8", +] + +[[package]] +name = "bytecheck_derive" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "bytemuck" +version = "1.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b236fc92302c97ed75b38da1f4917b5cdda4984745740f153a5d3059e48d725e" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ee891b04274a59bd38b412188e24b849617b2e45a0fd8d057deb63e7403761b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.70", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" + +[[package]] +name = "caps" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "190baaad529bcfbde9e1a19022c42781bdb6ff9de25721abdb8fd98c0807730b" +dependencies = [ + "libc", + "thiserror", +] + +[[package]] +name = "cc" +version = "1.0.99" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c51067fd44124faa7f870b4b1c969379ad32b2ba805aa959430ceaa384f695" +dependencies = [ + "jobserver", + "libc", + "once_cell", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "chrono" +version = "0.4.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "serde", + "wasm-bindgen", + "windows-targets 0.52.6", +] + +[[package]] +name = "cipher" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ee52072ec15386f770805afd189a01c8841be8696bed250fa2f13c4c0d6dfb7" +dependencies = [ + "generic-array", +] + +[[package]] +name = "clap" +version = "2.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" +dependencies = [ + "ansi_term", + "atty", + "bitflags 1.3.2", + "strsim 0.8.0", + "textwrap 0.11.0", + "unicode-width", + "vec_map", +] + +[[package]] +name = "clap" +version = "3.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" +dependencies = [ + "atty", + "bitflags 1.3.2", + "clap_lex", + "indexmap 1.9.3", + "once_cell", + "strsim 0.10.0", + "termcolor", + "textwrap 0.16.1", +] + +[[package]] +name = "clap_lex" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" +dependencies = [ + "os_str_bytes", +] + +[[package]] +name = "combine" +version = "3.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da3da6baa321ec19e1cc41d31bf599f00c783d0517095cdaf0332e3fe8d20680" +dependencies = [ + "ascii", + "byteorder", + "either", + "memchr", + "unreachable", +] + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "console" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" +dependencies = [ + "encode_unicode", + "lazy_static", + "libc", + "unicode-width", + "windows-sys 0.52.0", +] + +[[package]] +name = "console_error_panic_hook" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" +dependencies = [ + "cfg-if", + "wasm-bindgen", +] + +[[package]] +name = "console_log" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89f72f65e8501878b8a004d5a1afb780987e2ce2b4532c562e367a72c57499f" +dependencies = [ + "log", + "web-sys", +] + +[[package]] +name = "const-oid" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4c78c047431fee22c1a7bb92e00ad095a02a983affe4d8a72e2a2c62c1b94f3" + +[[package]] +name = "constant_time_eq" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" + +[[package]] +name = "cpufeatures" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "crypto-mac" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" +dependencies = [ + "generic-array", + "subtle", +] + +[[package]] +name = "ctr" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "049bb91fb4aaf0e3c7efa6cd5ef877dbbbd15b39dad06d9948de4ec8a75761ea" +dependencies = [ + "cipher", +] + +[[package]] +name = "curve25519-dalek" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90f9d052967f590a76e62eb387bd0bbb1b000182c3cefe5364db6b7211651bc0" +dependencies = [ + "byteorder", + "digest 0.9.0", + "rand_core 0.5.1", + "serde", + "subtle", + "zeroize", +] + +[[package]] +name = "darling" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim 0.11.1", + "syn 2.0.70", +] + +[[package]] +name = "darling_macro" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.70", +] + +[[package]] +name = "dashmap" +version = "4.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e77a43b28d0668df09411cb0bc9a8c2adc40f9a048afe863e05fd43251e8e39c" +dependencies = [ + "cfg-if", + "num_cpus", +] + +[[package]] +name = "dashmap" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "804c8821570c3f8b70230c2ba75ffa5c0f9a4189b9a432b6656c536712acae28" +dependencies = [ + "cfg-if", + "crossbeam-utils", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + +[[package]] +name = "data-encoding" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" + +[[package]] +name = "der" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6919815d73839e7ad218de758883aae3a257ba6759ce7a9992501efbb53d705c" +dependencies = [ + "const-oid", +] + +[[package]] +name = "der-parser" +version = "8.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbd676fbbab537128ef0278adb5576cf363cff6aa22a7b24effe97347cfab61e" +dependencies = [ + "asn1-rs", + "displaydoc", + "nom", + "num-bigint 0.4.6", + "num-traits", + "rusticata-macros", +] + +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", +] + +[[package]] +name = "derivation-path" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e5c37193a1db1d8ed868c03ec7b152175f26160a5b740e5e484143877e0adf0" + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "dialoguer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59c6f2989294b9a498d3ad5491a79c6deb604617378e1cdc4bfc1c1361fe2f87" +dependencies = [ + "console", + "shell-words", + "tempfile", + "zeroize", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer 0.10.4", + "crypto-common", + "subtle", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.70", +] + +[[package]] +name = "dlopen2" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09b4f5f101177ff01b8ec4ecc81eead416a8aa42819a2869311b3420fa114ffa" +dependencies = [ + "dlopen2_derive", + "libc", + "once_cell", + "winapi", +] + +[[package]] +name = "dlopen2_derive" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6cbae11b3de8fce2a456e8ea3dada226b35fe791f0dc1d360c0941f0bb681f3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.70", +] + +[[package]] +name = "eager" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abe71d579d1812060163dff96056261deb5bf6729b100fa2e36a68b9649ba3d3" + +[[package]] +name = "ed25519" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91cff35c70bba8a626e3185d8cd48cc11b5437e1a5bcd15b9b5fa3c64b6dfee7" +dependencies = [ + "signature", +] + +[[package]] +name = "ed25519-dalek" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" +dependencies = [ + "curve25519-dalek", + "ed25519", + "rand 0.7.3", + "serde", + "sha2 0.9.9", + "zeroize", +] + +[[package]] +name = "ed25519-dalek-bip32" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d2be62a4061b872c8c0873ee4fc6f101ce7b889d039f019c5fa2af471a59908" +dependencies = [ + "derivation-path", + "ed25519-dalek", + "hmac 0.12.1", + "sha2 0.10.8", +] + +[[package]] +name = "either" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" + +[[package]] +name = "encode_unicode" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" + +[[package]] +name = "encoding_rs" +version = "0.8.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "enum-iterator" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fd242f399be1da0a5354aa462d57b4ab2b4ee0683cc552f7c007d2d12d36e94" +dependencies = [ + "enum-iterator-derive", +] + +[[package]] +name = "enum-iterator-derive" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1ab991c1362ac86c61ab6f556cff143daa22e5a15e4e189df818b2fd19fe65b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.70", +] + +[[package]] +name = "env_logger" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a12e6657c4c97ebab115a42dcee77225f7f482cdd841cf7088c657a42e9e00e7" +dependencies = [ + "atty", + "humantime", + "log", + "regex", + "termcolor", +] + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "errno" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + +[[package]] +name = "fastrand" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" + +[[package]] +name = "feature-probe" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835a3dc7d1ec9e75e2b5fb4ba75396837112d2060b03f7d43bc1897c7f7211da" + +[[package]] +name = "flate2" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futures" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" + +[[package]] +name = "futures-executor" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" + +[[package]] +name = "futures-macro" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.70", +] + +[[package]] +name = "futures-sink" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" + +[[package]] +name = "futures-task" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" + +[[package]] +name = "futures-util" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "serde", + "typenum", + "version_check", +] + +[[package]] +name = "gethostname" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1ebd34e35c46e00bb73e81363248d627782724609fe1b6396f553f68fe3862e" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "gimli" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" + +[[package]] +name = "goblin" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7666983ed0dd8d21a6f6576ee00053ca0926fb281a5522577a4dbd0f1b54143" +dependencies = [ + "log", + "plain", + "scroll", +] + +[[package]] +name = "h2" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap 2.2.6", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hash32" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" +dependencies = [ + "byteorder", +] + +[[package]] +name = "hashbrown" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" +dependencies = [ + "ahash 0.7.8", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash 0.7.8", +] + +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash 0.8.4", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "histogram" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12cb882ccb290b8646e554b157ab0b71e64e8d5bef775cd66b6531e52d302669" + +[[package]] +name = "hmac" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840" +dependencies = [ + "crypto-mac", + "digest 0.9.0", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "hmac-drbg" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17ea0a1394df5b6574da6e0c1ade9e78868c9fb0a4e5ef4428e32da4676b85b1" +dependencies = [ + "digest 0.9.0", + "generic-array", + "hmac 0.8.1", +] + +[[package]] +name = "http" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +dependencies = [ + "bytes", + "http", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "humantime" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" + +[[package]] +name = "hyper" +version = "0.14.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a152ddd61dfaec7273fe8419ab357f33aee0d914c5f4efbf0d96fa749eea5ec9" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" +dependencies = [ + "futures-util", + "http", + "hyper", + "rustls", + "tokio", + "tokio-rustls", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "im" +version = "15.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0acd33ff0285af998aaf9b57342af478078f53492322fafc47450e09397e0e9" +dependencies = [ + "bitmaps", + "rand_core 0.6.4", + "rand_xoshiro", + "rayon", + "serde", + "sized-chunks", + "typenum", + "version_check", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", +] + +[[package]] +name = "indexmap" +version = "2.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" +dependencies = [ + "equivalent", + "hashbrown 0.14.5", +] + +[[package]] +name = "indicatif" +version = "0.17.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "763a5a8f45087d6bcea4222e7b72c291a054edf80e4ef6efd2a4979878c7bea3" +dependencies = [ + "console", + "instant", + "number_prefix", + "portable-atomic", + "unicode-width", +] + +[[package]] +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "ipnet" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" + +[[package]] +name = "jobserver" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" +dependencies = [ + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "jsonrpc-core" +version = "18.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14f7f76aef2d054868398427f6c54943cf3d1caa9a7ec7d0c38d69df97a965eb" +dependencies = [ + "futures", + "futures-executor", + "futures-util", + "log", + "serde", + "serde_derive", + "serde_json", +] + +[[package]] +name = "keccak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +dependencies = [ + "cpufeatures", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libc" +version = "0.2.155" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" + +[[package]] +name = "libsecp256k1" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9d220bc1feda2ac231cb78c3d26f27676b8cf82c96971f7aeef3d0cf2797c73" +dependencies = [ + "arrayref", + "base64 0.12.3", + "digest 0.9.0", + "hmac-drbg", + "libsecp256k1-core", + "libsecp256k1-gen-ecmult", + "libsecp256k1-gen-genmult", + "rand 0.7.3", + "serde", + "sha2 0.9.9", + "typenum", +] + +[[package]] +name = "libsecp256k1-core" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0f6ab710cec28cef759c5f18671a27dae2a5f952cdaaee1d8e2908cb2478a80" +dependencies = [ + "crunchy", + "digest 0.9.0", + "subtle", +] + +[[package]] +name = "libsecp256k1-gen-ecmult" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccab96b584d38fac86a83f07e659f0deafd0253dc096dab5a36d53efe653c5c3" +dependencies = [ + "libsecp256k1-core", +] + +[[package]] +name = "libsecp256k1-gen-genmult" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67abfe149395e3aa1c48a2beb32b068e2334402df8181f818d3aee2b304c4f5d" +dependencies = [ + "libsecp256k1-core", +] + +[[package]] +name = "light-poseidon" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5b439809cdfc0d86ecc7317f1724df13dfa665df48991b79e90e689411451f7" +dependencies = [ + "ark-bn254", + "ark-ff", + "thiserror", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "memmap2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" +dependencies = [ + "libc", +] + +[[package]] +name = "memoffset" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" +dependencies = [ + "autocfg", +] + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "merlin" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58c38e2799fc0978b65dfff8023ec7843e2330bb462f19198840b34b6582397d" +dependencies = [ + "byteorder", + "keccak", + "rand_core 0.6.4", + "zeroize", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" +dependencies = [ + "adler", +] + +[[package]] +name = "mio" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +dependencies = [ + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.48.0", +] + +[[package]] +name = "nix" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "libc", + "memoffset 0.7.1", + "pin-utils", +] + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "num" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8536030f9fea7127f841b45bb6243b27255787fb4eb83958aa1ef9d2fdc0c36" +dependencies = [ + "num-bigint 0.2.6", + "num-complex", + "num-integer", + "num-iter", + "num-rational", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-complex" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6b19411a9719e753aff12e5187b74d60d3dc449ec3f4dc21e3989c3f554bc95" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-derive" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.70", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c000134b5dbf44adc5cb772486d335293351644b801551abe8f75c84cfa4aef" +dependencies = [ + "autocfg", + "num-bigint 0.2.6", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi 0.3.9", + "libc", +] + +[[package]] +name = "num_enum" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a015b430d3c108a207fd776d2e2196aaf8b1cf8cf93253e3a097ff3085076a1" +dependencies = [ + "num_enum_derive 0.6.1", +] + +[[package]] +name = "num_enum" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02339744ee7253741199f897151b38e72257d13802d4ee837285cc2990a90845" +dependencies = [ + "num_enum_derive 0.7.2", +] + +[[package]] +name = "num_enum_derive" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", + "syn 2.0.70", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "681030a937600a36906c185595136d26abfebb4aa9c65701cefcaf8578bb982b" +dependencies = [ + "proc-macro-crate 3.1.0", + "proc-macro2", + "quote", + "syn 2.0.70", +] + +[[package]] +name = "number_prefix" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" + +[[package]] +name = "object" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "081b846d1d56ddfc18fdf1a922e4f6e07a11768ea1b92dec44e42b72712ccfce" +dependencies = [ + "memchr", +] + +[[package]] +name = "oid-registry" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bedf36ffb6ba96c2eb7144ef6270557b52e54b20c0a8e1eb2ff99a6c6959bff" +dependencies = [ + "asn1-rs", +] + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "os_str_bytes" +version = "6.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1" + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.52.6", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pbjson" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7e6349fa080353f4a597daffd05cb81572a9c031a6d4fff7e504947496fcc68" +dependencies = [ + "base64 0.21.7", + "serde", +] + +[[package]] +name = "pbkdf2" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "216eaa586a190f0a738f2f918511eecfa90f13295abec0e457cdebcceda80cbd" +dependencies = [ + "crypto-mac", +] + +[[package]] +name = "pbkdf2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "pem" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8835c273a76a90455d7344889b0964598e3316e2a79ede8e36f16bdcf2228b8" +dependencies = [ + "base64 0.13.1", +] + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "percentage" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fd23b938276f14057220b707937bcb42fa76dda7560e57a2da30cb52d557937" +dependencies = [ + "num", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkcs8" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cabda3fb821068a9a4fab19a683eac3af12edf0f34b94a8be53c4972b8149d0" +dependencies = [ + "der", + "spki", + "zeroize", +] + +[[package]] +name = "pkg-config" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" + +[[package]] +name = "plain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" + +[[package]] +name = "polyval" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8419d2b623c7c0896ff2d5d96e2cb4ede590fed28fcc34934f4c33c036e620a1" +dependencies = [ + "cfg-if", + "cpufeatures", + "opaque-debug", + "universal-hash", +] + +[[package]] +name = "portable-atomic" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "proc-macro-crate" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" +dependencies = [ + "toml", +] + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit 0.19.15", +] + +[[package]] +name = "proc-macro-crate" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" +dependencies = [ + "toml_edit 0.21.1", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "prost" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13db3d3fde688c61e2446b4d843bc27a7e8af269a69440c0308021dc92333cc" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-derive" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18bec9b0adc4eba778b33684b7ba3e7137789434769ee3ce3930463ef904cfca" +dependencies = [ + "anyhow", + "itertools 0.13.0", + "proc-macro2", + "quote", + "syn 2.0.70", +] + +[[package]] +name = "ptr_meta" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "qstring" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d464fae65fff2680baf48019211ce37aaec0c78e9264c84a3e484717f965104e" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "qualifier_attr" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e2e25ee72f5b24d773cae88422baddefff7714f97aab68d96fe2b6fc4a28fb2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.70", +] + +[[package]] +name = "quinn" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cc2c5017e4b43d5995dcea317bc46c1e09404c0a9664d2908f7f02dfe943d75" +dependencies = [ + "bytes", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls", + "thiserror", + "tokio", + "tracing", +] + +[[package]] +name = "quinn-proto" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "141bf7dfde2fbc246bfd3fe12f2455aa24b0fbd9af535d8c86c7bd1381ff2b1a" +dependencies = [ + "bytes", + "rand 0.8.5", + "ring 0.16.20", + "rustc-hash", + "rustls", + "rustls-native-certs", + "slab", + "thiserror", + "tinyvec", + "tracing", +] + +[[package]] +name = "quinn-udp" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "055b4e778e8feb9f93c4e439f71dc2156ef13360b432b799e179a8c4cdf0b1d7" +dependencies = [ + "bytes", + "libc", + "socket2", + "tracing", + "windows-sys 0.48.0", +] + +[[package]] +name = "quote" +version = "1.0.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.15", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "rand_xoshiro" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f97cdb2a36ed4183de61b2f824cc45c9f1037f28afe0a322e9fff4c108b5aaa" +dependencies = [ + "rand_core 0.6.4", +] + +[[package]] +name = "rayon" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "rcgen" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffbe84efe2f38dea12e9bfc1f65377fdf03e53a18cb3b995faedf7934c7e785b" +dependencies = [ + "pem", + "ring 0.16.20", + "time", + "yasna", +] + +[[package]] +name = "redox_syscall" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c82cf8cff14456045f55ec4241383baeff27af886adb72ffb2162f99911de0fd" +dependencies = [ + "bitflags 2.6.0", +] + +[[package]] +name = "regex" +version = "1.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" + +[[package]] +name = "rend" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" +dependencies = [ + "bytecheck", +] + +[[package]] +name = "reqwest" +version = "0.11.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" +dependencies = [ + "async-compression", + "base64 0.21.7", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "hyper", + "hyper-rustls", + "ipnet", + "js-sys", + "log", + "mime", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls", + "rustls-pemfile", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "system-configuration", + "tokio", + "tokio-rustls", + "tokio-util", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webpki-roots 0.25.4", + "winreg", +] + +[[package]] +name = "ring" +version = "0.16.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +dependencies = [ + "cc", + "libc", + "once_cell", + "spin 0.5.2", + "untrusted 0.7.1", + "web-sys", + "winapi", +] + +[[package]] +name = "ring" +version = "0.17.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.15", + "libc", + "spin 0.9.8", + "untrusted 0.9.0", + "windows-sys 0.52.0", +] + +[[package]] +name = "rkyv" +version = "0.7.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cba464629b3394fc4dbc6f940ff8f5b4ff5c7aef40f29166fd4ad12acbc99c0" +dependencies = [ + "bitvec", + "bytecheck", + "bytes", + "hashbrown 0.12.3", + "ptr_meta", + "rend", + "rkyv_derive", + "seahash", + "tinyvec", + "uuid", +] + +[[package]] +name = "rkyv_derive" +version = "0.7.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7dddfff8de25e6f62b9d64e6e432bf1c6736c57d20323e15ee10435fbda7c65" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "rpassword" +version = "7.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80472be3c897911d0137b2d2b9055faf6eeac5b14e324073d83bc17b191d7e3f" +dependencies = [ + "libc", + "rtoolbox", + "windows-sys 0.48.0", +] + +[[package]] +name = "rtoolbox" +version = "0.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c247d24e63230cdb56463ae328478bd5eac8b8faa8c69461a77e8e323afac90e" +dependencies = [ + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "rust_decimal" +version = "1.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1790d1c4c0ca81211399e0e0af16333276f375209e71a37b67698a373db5b47a" +dependencies = [ + "arrayvec", + "borsh 1.5.1", + "bytes", + "num-traits", + "rand 0.8.5", + "rkyv", + "serde", + "serde_json", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + +[[package]] +name = "rusticata-macros" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632" +dependencies = [ + "nom", +] + +[[package]] +name = "rustix" +version = "0.38.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +dependencies = [ + "bitflags 2.6.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustls" +version = "0.21.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" +dependencies = [ + "log", + "ring 0.17.8", + "rustls-webpki", + "sct", +] + +[[package]] +name = "rustls-native-certs" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" +dependencies = [ + "openssl-probe", + "rustls-pemfile", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64 0.21.7", +] + +[[package]] +name = "rustls-webpki" +version = "0.101.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +dependencies = [ + "ring 0.17.8", + "untrusted 0.9.0", +] + +[[package]] +name = "rustversion" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" + +[[package]] +name = "ryu" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" + +[[package]] +name = "schannel" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "scroll" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04c565b551bafbef4157586fa379538366e4385d42082f255bfd96e4fe8519da" +dependencies = [ + "scroll_derive", +] + +[[package]] +name = "scroll_derive" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1db149f81d46d2deba7cd3c50772474707729550221e69588478ebf9ada425ae" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.70", +] + +[[package]] +name = "sct" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" +dependencies = [ + "ring 0.17.8", + "untrusted 0.9.0", +] + +[[package]] +name = "seahash" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" + +[[package]] +name = "security-framework" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0" +dependencies = [ + "bitflags 2.6.0", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "317936bbbd05227752583946b9e66d7ce3b489f84e11a94a510b4437fef407d7" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" + +[[package]] +name = "serde" +version = "1.0.209" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99fce0ffe7310761ca6bf9faf5115afbc19688edd00171d81b1bb1b116c63e09" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_bytes" +version = "0.11.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "387cc504cb06bb40a96c8e04e951fe01854cf6bc921053c954e4a606d9675c6a" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_derive" +version = "1.0.209" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5831b979fd7b5439637af1752d535ff49f4860c0f341d1baeb6faf0f4242170" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.70", +] + +[[package]] +name = "serde_json" +version = "1.0.120" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_with" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07ff71d2c147a7b57362cead5e22f772cd52f6ab31cfcd9edcd7f6aeb2a0afbe" +dependencies = [ + "serde", + "serde_with_macros", +] + +[[package]] +name = "serde_with_macros" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "881b6f881b17d13214e5d494c939ebab463d01264ce1811e9d4ac3a882e7695f" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.70", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.7", +] + +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.7", +] + +[[package]] +name = "sha3" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f81199417d4e5de3f04b1e871023acea7389672c4135918f05aa9cbf2f2fa809" +dependencies = [ + "block-buffer 0.9.0", + "digest 0.9.0", + "keccak", + "opaque-debug", +] + +[[package]] +name = "sha3" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +dependencies = [ + "digest 0.10.7", + "keccak", +] + +[[package]] +name = "shell-words" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" + +[[package]] +name = "signal-hook-registry" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +dependencies = [ + "libc", +] + +[[package]] +name = "signature" +version = "1.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" + +[[package]] +name = "simdutf8" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" + +[[package]] +name = "sized-chunks" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16d69225bde7a69b235da73377861095455d298f2b970996eec25ddbb42b3d1e" +dependencies = [ + "bitmaps", + "typenum", +] + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "socket2" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "solana-account-decoder" +version = "1.17.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ec4cebccef07b65c46854b62237a29e7ccc92ef21ef1c90be346f9de0c4e7a4" +dependencies = [ + "Inflector", + "base64 0.21.7", + "bincode", + "bs58", + "bv", + "lazy_static", + "serde", + "serde_derive", + "serde_json", + "solana-config-program", + "solana-sdk", + "spl-token", + "spl-token-2022", + "spl-token-metadata-interface", + "thiserror", + "zstd", +] + +[[package]] +name = "solana-clap-utils" +version = "1.17.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "089f1edd0e325e5664f33b11df131ff47ed93cd74d75a2d434c8b7f9e976267a" +dependencies = [ + "chrono", + "clap 2.34.0", + "rpassword", + "solana-remote-wallet", + "solana-sdk", + "thiserror", + "tiny-bip39", + "uriparse", + "url", +] + +[[package]] +name = "solana-client" +version = "1.17.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d4eb6c673b6a8768ba687d620d02ec544d86525ce6d7e3858e9730463ed41b4" +dependencies = [ + "async-trait", + "bincode", + "dashmap 4.0.2", + "futures", + "futures-util", + "indexmap 2.2.6", + "indicatif", + "log", + "quinn", + "rayon", + "solana-connection-cache", + "solana-measure", + "solana-metrics", + "solana-pubsub-client", + "solana-quic-client", + "solana-rpc-client", + "solana-rpc-client-api", + "solana-rpc-client-nonce-utils", + "solana-sdk", + "solana-streamer", + "solana-thin-client", + "solana-tpu-client", + "solana-udp-client", + "thiserror", + "tokio", +] + +[[package]] +name = "solana-config-program" +version = "1.17.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98d262cd78922735637ef0ccf179e43bc0acd430f9004cd7e987e95d04b44f47" +dependencies = [ + "bincode", + "chrono", + "serde", + "serde_derive", + "solana-program-runtime", + "solana-sdk", +] + +[[package]] +name = "solana-connection-cache" +version = "1.17.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84f1aa4f1d78bdf5f76f4f351d05c0b861025c8b4e46503d8c2aa8d97a7139d4" +dependencies = [ + "async-trait", + "bincode", + "crossbeam-channel", + "futures-util", + "indexmap 2.2.6", + "log", + "rand 0.8.5", + "rayon", + "rcgen", + "solana-measure", + "solana-metrics", + "solana-sdk", + "thiserror", + "tokio", +] + +[[package]] +name = "solana-frozen-abi" +version = "1.17.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92dc68e28d42991c6579079f9be29e2e30fb20474cbcd7be1d97e052081c8050" +dependencies = [ + "ahash 0.8.4", + "blake3", + "block-buffer 0.10.4", + "bs58", + "bv", + "byteorder", + "cc", + "either", + "generic-array", + "im", + "lazy_static", + "log", + "memmap2", + "rustc_version", + "serde", + "serde_bytes", + "serde_derive", + "serde_json", + "sha2 0.10.8", + "solana-frozen-abi-macro", + "subtle", + "thiserror", +] + +[[package]] +name = "solana-frozen-abi-macro" +version = "1.17.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "999084a6d587bc79a059eb4c34c2e1419913612bb6224bb95660567c0f12449d" +dependencies = [ + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.70", +] + +[[package]] +name = "solana-logger" +version = "1.17.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84a56a1696678acd5237565c3092354c923f84dc1fbcd9b824c91fbfefc10740" +dependencies = [ + "env_logger", + "lazy_static", + "log", +] + +[[package]] +name = "solana-measure" +version = "1.17.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cad3ae58ed767c409a792b045b4580c96b658b1672f4389f4dca7ca6a124693c" +dependencies = [ + "log", + "solana-sdk", +] + +[[package]] +name = "solana-metrics" +version = "1.17.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b6764575759cf274c7579df7d3b8c45d4859706c9da4a1964110ab6e622c5e9" +dependencies = [ + "crossbeam-channel", + "gethostname", + "lazy_static", + "log", + "reqwest", + "solana-sdk", + "thiserror", +] + +[[package]] +name = "solana-net-utils" +version = "1.17.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8570303599bc8c05b66550b919344dfde14dc79b17fa0c1d743a9c6dd7bac040" +dependencies = [ + "bincode", + "clap 3.2.25", + "crossbeam-channel", + "log", + "nix", + "rand 0.8.5", + "serde", + "serde_derive", + "socket2", + "solana-logger", + "solana-sdk", + "solana-version", + "tokio", + "url", +] + +[[package]] +name = "solana-perf" +version = "1.17.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68c658d1eff3672cb97c3501b9838fe1afdcac65d456c3e74b4c46f5245c8b05" +dependencies = [ + "ahash 0.8.4", + "bincode", + "bv", + "caps", + "curve25519-dalek", + "dlopen2", + "fnv", + "lazy_static", + "libc", + "log", + "nix", + "rand 0.8.5", + "rayon", + "rustc_version", + "serde", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-metrics", + "solana-rayon-threadlimit", + "solana-sdk", + "solana-vote-program", +] + +[[package]] +name = "solana-program" +version = "1.17.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e9aa19fa728ed701584c398607f26c773ede20e1c38e4a6c3ae79ed56521374" +dependencies = [ + "ark-bn254", + "ark-ec", + "ark-ff", + "ark-serialize", + "base64 0.21.7", + "bincode", + "bitflags 2.6.0", + "blake3", + "borsh 0.10.3", + "borsh 0.9.3", + "bs58", + "bv", + "bytemuck", + "cc", + "console_error_panic_hook", + "console_log", + "curve25519-dalek", + "getrandom 0.2.15", + "itertools 0.10.5", + "js-sys", + "lazy_static", + "libc", + "libsecp256k1", + "light-poseidon", + "log", + "memoffset 0.9.1", + "num-bigint 0.4.6", + "num-derive 0.3.3", + "num-traits", + "parking_lot", + "rand 0.8.5", + "rustc_version", + "rustversion", + "serde", + "serde_bytes", + "serde_derive", + "serde_json", + "sha2 0.10.8", + "sha3 0.10.8", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-sdk-macro", + "thiserror", + "tiny-bip39", + "wasm-bindgen", + "zeroize", +] + +[[package]] +name = "solana-program-runtime" +version = "1.17.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27f91b73c2c061b3e5f85345879a932460ff946ab363eb25166b751944e6f6dc" +dependencies = [ + "base64 0.21.7", + "bincode", + "eager", + "enum-iterator", + "itertools 0.10.5", + "libc", + "log", + "num-derive 0.3.3", + "num-traits", + "percentage", + "rand 0.8.5", + "rustc_version", + "serde", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-measure", + "solana-metrics", + "solana-sdk", + "solana_rbpf", + "thiserror", +] + +[[package]] +name = "solana-pubsub-client" +version = "1.17.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b3939e4174d01c3bd9ef1385122de065e11fc6d660649388fae61effc2e0fa" +dependencies = [ + "crossbeam-channel", + "futures-util", + "log", + "reqwest", + "semver", + "serde", + "serde_derive", + "serde_json", + "solana-account-decoder", + "solana-rpc-client-api", + "solana-sdk", + "thiserror", + "tokio", + "tokio-stream", + "tokio-tungstenite", + "tungstenite", + "url", +] + +[[package]] +name = "solana-quic-client" +version = "1.17.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdd2ba399377ec18fe9bd45cb290bb92668df8adba1f884d4b6adab8e0c27ed5" +dependencies = [ + "async-mutex", + "async-trait", + "futures", + "itertools 0.10.5", + "lazy_static", + "log", + "quinn", + "quinn-proto", + "rcgen", + "rustls", + "solana-connection-cache", + "solana-measure", + "solana-metrics", + "solana-net-utils", + "solana-rpc-client-api", + "solana-sdk", + "solana-streamer", + "thiserror", + "tokio", +] + +[[package]] +name = "solana-rayon-threadlimit" +version = "1.17.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ada8292386cdf61aff5f9d00670abeefa3310b391f1a50c760c34c1ea52ea1a1" +dependencies = [ + "lazy_static", + "num_cpus", +] + +[[package]] +name = "solana-remote-wallet" +version = "1.17.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad77919e1081817f5b38b29ac74d93348aa653b5f987ee53d281fba206b7bd26" +dependencies = [ + "console", + "dialoguer", + "log", + "num-derive 0.3.3", + "num-traits", + "parking_lot", + "qstring", + "semver", + "solana-sdk", + "thiserror", + "uriparse", +] + +[[package]] +name = "solana-rpc-client" +version = "1.17.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f681deb63fe05f365dddb4c3d2f596cf2cc54a81d6fb24746503c284b35266f8" +dependencies = [ + "async-trait", + "base64 0.21.7", + "bincode", + "bs58", + "indicatif", + "log", + "reqwest", + "semver", + "serde", + "serde_derive", + "serde_json", + "solana-account-decoder", + "solana-rpc-client-api", + "solana-sdk", + "solana-transaction-status", + "solana-version", + "solana-vote-program", + "tokio", +] + +[[package]] +name = "solana-rpc-client-api" +version = "1.17.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be2823b1ffc18604c8f0ef6c6a4da24e4da6f420aea09f5afe57f6594044ebb8" +dependencies = [ + "base64 0.21.7", + "bs58", + "jsonrpc-core", + "reqwest", + "semver", + "serde", + "serde_derive", + "serde_json", + "solana-account-decoder", + "solana-sdk", + "solana-transaction-status", + "solana-version", + "spl-token-2022", + "thiserror", +] + +[[package]] +name = "solana-rpc-client-nonce-utils" +version = "1.17.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc934849ef622beff13951b9a49a350e9d9d30a80dfa5f98043b516a08dfe64a" +dependencies = [ + "clap 2.34.0", + "solana-clap-utils", + "solana-rpc-client", + "solana-sdk", + "thiserror", +] + +[[package]] +name = "solana-sdk" +version = "1.17.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "774c2379f8aaa8b5877029410dacd4e663d167cb93b09b2f3c2647c63df4f2eb" +dependencies = [ + "assert_matches", + "base64 0.21.7", + "bincode", + "bitflags 2.6.0", + "borsh 0.10.3", + "bs58", + "bytemuck", + "byteorder", + "chrono", + "derivation-path", + "digest 0.10.7", + "ed25519-dalek", + "ed25519-dalek-bip32", + "generic-array", + "hmac 0.12.1", + "itertools 0.10.5", + "js-sys", + "lazy_static", + "libsecp256k1", + "log", + "memmap2", + "num-derive 0.3.3", + "num-traits", + "num_enum 0.6.1", + "pbkdf2 0.11.0", + "qstring", + "qualifier_attr", + "rand 0.7.3", + "rand 0.8.5", + "rustc_version", + "rustversion", + "serde", + "serde_bytes", + "serde_derive", + "serde_json", + "serde_with", + "sha2 0.10.8", + "sha3 0.10.8", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-logger", + "solana-program", + "solana-sdk-macro", + "thiserror", + "uriparse", + "wasm-bindgen", +] + +[[package]] +name = "solana-sdk-macro" +version = "1.17.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "015ca49e4cec213f034468b5d1fd2faea554be32e2144c90c409304121d781e6" +dependencies = [ + "bs58", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.70", +] + +[[package]] +name = "solana-streamer" +version = "1.17.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af376501d990f281b9249c5072ceef73bd5fc10700e877b27c1737b14cf447a2" +dependencies = [ + "async-channel", + "bytes", + "crossbeam-channel", + "futures-util", + "histogram", + "indexmap 2.2.6", + "itertools 0.10.5", + "libc", + "log", + "nix", + "pem", + "percentage", + "pkcs8", + "quinn", + "quinn-proto", + "rand 0.8.5", + "rcgen", + "rustls", + "solana-metrics", + "solana-perf", + "solana-sdk", + "thiserror", + "tokio", + "x509-parser", +] + +[[package]] +name = "solana-thin-client" +version = "1.17.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "749ba2ec60049a0c855fd971757465b82f5b99962f0c106f3bf83db2e8265637" +dependencies = [ + "bincode", + "log", + "rayon", + "solana-connection-cache", + "solana-rpc-client", + "solana-rpc-client-api", + "solana-sdk", +] + +[[package]] +name = "solana-tpu-client" +version = "1.17.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8aa49abe807db6f2a4e6ff5e5ade1835940f1ee311bbb94bfd9d05abf959ea62" +dependencies = [ + "async-trait", + "bincode", + "futures-util", + "indexmap 2.2.6", + "indicatif", + "log", + "rayon", + "solana-connection-cache", + "solana-measure", + "solana-metrics", + "solana-pubsub-client", + "solana-rpc-client", + "solana-rpc-client-api", + "solana-sdk", + "thiserror", + "tokio", +] + +[[package]] +name = "solana-transaction-status" +version = "1.17.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "884c541fae17c7cd3dd851f9e05a5adf3afd1b18122839fb4a3604feb4129386" +dependencies = [ + "Inflector", + "base64 0.21.7", + "bincode", + "borsh 0.10.3", + "bs58", + "lazy_static", + "log", + "serde", + "serde_derive", + "serde_json", + "solana-account-decoder", + "solana-sdk", + "spl-associated-token-account", + "spl-memo", + "spl-token", + "spl-token-2022", + "thiserror", +] + +[[package]] +name = "solana-udp-client" +version = "1.17.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfa91410ff195d0b7a4e46f4cef9cf3699961ee02654fe0ca590c01958ca59fe" +dependencies = [ + "async-trait", + "solana-connection-cache", + "solana-net-utils", + "solana-sdk", + "solana-streamer", + "thiserror", + "tokio", +] + +[[package]] +name = "solana-version" +version = "1.17.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45ced655d4e15fe1d52b4ecfb93c656dab933b2fd414a6879981e0ab1c854010" +dependencies = [ + "log", + "rustc_version", + "semver", + "serde", + "serde_derive", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-sdk", +] + +[[package]] +name = "solana-vote-program" +version = "1.17.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa36601af633b2854b2e38ceb7604f50f7e5739a150d57865ebb6e586ed142f6" +dependencies = [ + "bincode", + "log", + "num-derive 0.3.3", + "num-traits", + "rustc_version", + "serde", + "serde_derive", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-metrics", + "solana-program", + "solana-program-runtime", + "solana-sdk", + "thiserror", +] + +[[package]] +name = "solana-zk-token-sdk" +version = "1.17.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40f5be2f291d3a1692fc878dc98a841032df7672ba0878bbef43677e705b19cd" +dependencies = [ + "aes-gcm-siv", + "base64 0.21.7", + "bincode", + "bytemuck", + "byteorder", + "curve25519-dalek", + "getrandom 0.1.16", + "itertools 0.10.5", + "lazy_static", + "merlin", + "num-derive 0.3.3", + "num-traits", + "rand 0.7.3", + "serde", + "serde_json", + "sha3 0.9.1", + "solana-program", + "solana-sdk", + "subtle", + "thiserror", + "zeroize", +] + +[[package]] +name = "solana_rbpf" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "103318aa365ff7caa8cf534f2246b5eb7e5b34668736d52b1266b143f7a21196" +dependencies = [ + "byteorder", + "combine", + "goblin", + "hash32", + "libc", + "log", + "rand 0.8.5", + "rustc-demangle", + "scroll", + "thiserror", + "winapi", +] + +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + +[[package]] +name = "spki" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d01ac02a6ccf3e07db148d2be087da624fea0221a16152ed01f0496a6b0a27" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "spl-associated-token-account" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "385e31c29981488f2820b2022d8e731aae3b02e6e18e2fd854e4c9a94dc44fc3" +dependencies = [ + "assert_matches", + "borsh 0.10.3", + "num-derive 0.4.2", + "num-traits", + "solana-program", + "spl-token", + "spl-token-2022", + "thiserror", +] + +[[package]] +name = "spl-discriminator" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cce5d563b58ef1bb2cdbbfe0dfb9ffdc24903b10ae6a4df2d8f425ece375033f" +dependencies = [ + "bytemuck", + "solana-program", + "spl-discriminator-derive", +] + +[[package]] +name = "spl-discriminator-derive" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07fd7858fc4ff8fb0e34090e41d7eb06a823e1057945c26d480bfc21d2338a93" +dependencies = [ + "quote", + "spl-discriminator-syn", + "syn 2.0.70", +] + +[[package]] +name = "spl-discriminator-syn" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18fea7be851bd98d10721782ea958097c03a0c2a07d8d4997041d0ece6319a63" +dependencies = [ + "proc-macro2", + "quote", + "sha2 0.10.8", + "syn 2.0.70", + "thiserror", +] + +[[package]] +name = "spl-memo" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f180b03318c3dbab3ef4e1e4d46d5211ae3c780940dd0a28695aba4b59a75a" +dependencies = [ + "solana-program", +] + +[[package]] +name = "spl-pod" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2881dddfca792737c0706fa0175345ab282b1b0879c7d877bad129645737c079" +dependencies = [ + "borsh 0.10.3", + "bytemuck", + "solana-program", + "solana-zk-token-sdk", + "spl-program-error", +] + +[[package]] +name = "spl-program-error" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "249e0318493b6bcf27ae9902600566c689b7dfba9f1bdff5893e92253374e78c" +dependencies = [ + "num-derive 0.4.2", + "num-traits", + "solana-program", + "spl-program-error-derive", + "thiserror", +] + +[[package]] +name = "spl-program-error-derive" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1845dfe71fd68f70382232742e758557afe973ae19e6c06807b2c30f5d5cb474" +dependencies = [ + "proc-macro2", + "quote", + "sha2 0.10.8", + "syn 2.0.70", +] + +[[package]] +name = "spl-tlv-account-resolution" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "062e148d3eab7b165582757453632ffeef490c02c86a48bfdb4988f63eefb3b9" +dependencies = [ + "bytemuck", + "solana-program", + "spl-discriminator", + "spl-pod", + "spl-program-error", + "spl-type-length-value", +] + +[[package]] +name = "spl-token" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08459ba1b8f7c1020b4582c4edf0f5c7511a5e099a7a97570c9698d4f2337060" +dependencies = [ + "arrayref", + "bytemuck", + "num-derive 0.3.3", + "num-traits", + "num_enum 0.6.1", + "solana-program", + "thiserror", +] + +[[package]] +name = "spl-token-2022" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4abf34a65ba420584a0c35f3903f8d727d1f13ababbdc3f714c6b065a686e86" +dependencies = [ + "arrayref", + "bytemuck", + "num-derive 0.4.2", + "num-traits", + "num_enum 0.7.2", + "solana-program", + "solana-zk-token-sdk", + "spl-memo", + "spl-pod", + "spl-token", + "spl-token-metadata-interface", + "spl-transfer-hook-interface", + "spl-type-length-value", + "thiserror", +] + +[[package]] +name = "spl-token-metadata-interface" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c16ce3ba6979645fb7627aa1e435576172dd63088dc7848cb09aa331fa1fe4f" +dependencies = [ + "borsh 0.10.3", + "solana-program", + "spl-discriminator", + "spl-pod", + "spl-program-error", + "spl-type-length-value", +] + +[[package]] +name = "spl-transfer-hook-interface" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "051d31803f873cabe71aec3c1b849f35248beae5d19a347d93a5c9cccc5d5a9b" +dependencies = [ + "arrayref", + "bytemuck", + "solana-program", + "spl-discriminator", + "spl-pod", + "spl-program-error", + "spl-tlv-account-resolution", + "spl-type-length-value", +] + +[[package]] +name = "spl-type-length-value" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a468e6f6371f9c69aae760186ea9f1a01c2908351b06a5e0026d21cfc4d7ecac" +dependencies = [ + "bytemuck", + "solana-program", + "spl-discriminator", + "spl-pod", + "spl-program-error", +] + +[[package]] +name = "strsim" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "subtle" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" + +[[package]] +name = "switchboard-on-demand-client" +version = "0.2.4" +dependencies = [ + "anyhow_ext", + "arrayref", + "base58", + "base64 0.22.1", + "bincode", + "borsh 0.9.3", + "bs58", + "bytemuck", + "dashmap 6.0.1", + "futures", + "hex", + "lazy_static", + "pbjson", + "prost", + "reqwest", + "rust_decimal", + "serde", + "serde_derive", + "serde_json", + "sha2 0.10.8", + "solana-client", + "solana-sdk", + "tokio", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0209b68b3613b093e0ec905354eccaedcfe83b8cb37cbdeae64026c3064c16" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn_derive" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1329189c02ff984e9736652b1631330da25eaa6bc639089ed4915d25446cbe7b" +dependencies = [ + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.70", +] + +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + +[[package]] +name = "synstructure" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "unicode-xid", +] + +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "tempfile" +version = "3.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" +dependencies = [ + "cfg-if", + "fastrand", + "rustix", + "windows-sys 0.52.0", +] + +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "textwrap" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" +dependencies = [ + "unicode-width", +] + +[[package]] +name = "textwrap" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23d434d3f8967a09480fb04132ebe0a3e088c173e6d0ee7897abbdf4eab0f8b9" + +[[package]] +name = "thiserror" +version = "1.0.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.70", +] + +[[package]] +name = "time" +version = "0.3.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + +[[package]] +name = "time-macros" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tiny-bip39" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffc59cb9dfc85bb312c3a78fd6aa8a8582e310b0fa885d5bb877f6dcc601839d" +dependencies = [ + "anyhow", + "hmac 0.8.1", + "once_cell", + "pbkdf2 0.4.0", + "rand 0.7.3", + "rustc-hash", + "sha2 0.9.9", + "thiserror", + "unicode-normalization", + "wasm-bindgen", + "zeroize", +] + +[[package]] +name = "tinyvec" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba4f4a02a7a80d6f274636f0aa95c7e383b912d41fe721a31f29e29698585a4a" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "num_cpus", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.48.0", +] + +[[package]] +name = "tokio-macros" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.70", +] + +[[package]] +name = "tokio-rustls" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c" +dependencies = [ + "futures-util", + "log", + "rustls", + "tokio", + "tokio-rustls", + "tungstenite", + "webpki-roots 0.25.4", +] + +[[package]] +name = "tokio-util" +version = "0.7.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_datetime" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap 2.2.6", + "toml_datetime", + "winnow", +] + +[[package]] +name = "toml_edit" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" +dependencies = [ + "indexmap 2.2.6", + "toml_datetime", + "winnow", +] + +[[package]] +name = "tower-service" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" + +[[package]] +name = "tracing" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.70", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +dependencies = [ + "once_cell", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "tungstenite" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e3dac10fd62eaf6617d3a904ae222845979aec67c615d1c842b4002c7666fb9" +dependencies = [ + "byteorder", + "bytes", + "data-encoding", + "http", + "httparse", + "log", + "rand 0.8.5", + "rustls", + "sha1", + "thiserror", + "url", + "utf-8", + "webpki-roots 0.24.0", +] + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "unicode-bidi" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "unicode-normalization" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-width" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" + +[[package]] +name = "unicode-xid" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" + +[[package]] +name = "universal-hash" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f214e8f697e925001e66ec2c6e37a4ef93f0f78c2eed7814394e10c62025b05" +dependencies = [ + "generic-array", + "subtle", +] + +[[package]] +name = "unreachable" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" +dependencies = [ + "void", +] + +[[package]] +name = "untrusted" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "uriparse" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0200d0fc04d809396c2ad43f3c95da3582a2556eba8d453c1087f4120ee352ff" +dependencies = [ + "fnv", + "lazy_static", +] + +[[package]] +name = "url" +version = "2.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "uuid" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314" + +[[package]] +name = "vec_map" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "void" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.70", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.70", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" + +[[package]] +name = "web-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-roots" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b291546d5d9d1eab74f069c77749f2cb8504a12caa20f0f2de93ddbf6f411888" +dependencies = [ + "rustls-webpki", +] + +[[package]] +name = "webpki-roots" +version = "0.25.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "winreg" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "x509-parser" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0ecbeb7b67ce215e40e3cc7f2ff902f94a223acf44995934763467e7b1febc8" +dependencies = [ + "asn1-rs", + "base64 0.13.1", + "data-encoding", + "der-parser", + "lazy_static", + "nom", + "oid-registry", + "rusticata-macros", + "thiserror", + "time", +] + +[[package]] +name = "yasna" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e17bb3549cc1321ae1296b9cdc2698e2b6cb1992adfa19a8c72e5b7a738f44cd" +dependencies = [ + "time", +] + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.70", +] + +[[package]] +name = "zeroize" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4756f7db3f7b5574938c3eb1c117038b8e07f95ee6718c0efad4ac21508f1efd" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.70", +] + +[[package]] +name = "zstd" +version = "0.11.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "5.0.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" +dependencies = [ + "libc", + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.12+zstd.1.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a4e40c320c3cb459d9a9ff6de98cff88f4751ee9275d140e2be94a2b74e4c13" +dependencies = [ + "cc", + "pkg-config", +] diff --git a/rust/switchboard-on-demand-client/Cargo.toml b/rust/switchboard-on-demand-client/Cargo.toml new file mode 100644 index 0000000..47fc3c6 --- /dev/null +++ b/rust/switchboard-on-demand-client/Cargo.toml @@ -0,0 +1,35 @@ +[package] +name = "switchboard-on-demand-client" +description = "Switchboard On Demand Client: Interact with the Switchboard On Demand and Crossbar API" +version = "0.2.6" +edition = "2021" +license = "MIT" + +[dependencies] +anyhow_ext = "0.2.1" +arrayref = "0.3.7" +base58 = "0.2.0" +base64 = "0.22.1" +bincode = "1.3.3" +borsh = "0.9.3" +bs58 = { version = "0.4", features = ["alloc"] } +bytemuck = "1.16.1" +futures = "0.3.30" +hex = "0.4.3" +lazy_static = "1.5.0" +pbjson = "0.7.0" +prost = "0.13.1" +reqwest = { version = "0.11", features = ["json", "rustls-tls"], default-features = false } +rust_decimal = "1.35.0" +serde = { version = "1.0", features = ["derive"] } +serde_derive = "1.0.209" +serde_json = "1.0" +sha2 = "0.10.8" +dashmap = "6.0.1" +solana-client = "^1.16" +solana-sdk = "^1.16" +tokio = { version = "^1", features = ["full"] } + +[features] +devnet = [] +solana_sdk_1_16 = [] diff --git a/rust/switchboard-on-demand-client/README.md b/rust/switchboard-on-demand-client/README.md new file mode 100644 index 0000000..7000fad --- /dev/null +++ b/rust/switchboard-on-demand-client/README.md @@ -0,0 +1,63 @@ +# Switchboard-On-Demand-Client + +This crate is designed to interact with Switchboard on-demand, the Crossbar service, and queue gateways. + +## Crossbar +A middleman service to fetch oracle jobs from IPFS and to return feed price simulations. This is useful for updating a price constantly instead of sending requests directly to oracles. + +## Gateways +The frontend to interact with Switchboard oracles. + +## Example + +```rust +#[tokio::main] +async fn main() { + let client = RpcClient::new("https://api.devnet.solana.com".to_string()); + let queue_key = Pubkey::from_str("FfD96yeXs4cxZshoPPSKhSPgVQxLAJUT3gefgh84m1Di").unwrap(); + let feed = Pubkey::from_str("7Zi7LkGGARDKhUEFPBUQDsVZ9L965LPEv2rBRdmSXCWh").unwrap(); + let kp = read_keypair_file("authority.json").unwrap(); + + let queue = QueueAccountData::load(&client, &queue_key).await.unwrap(); + let gw = &queue.fetch_gateways(&client).await.unwrap()[0]; + let crossbar = CrossbarClient::default(None); + let feed_data = PullFeed::load_data(&client, &feed).await.unwrap(); + let feed_hash = feed_data.feed_hash(); + + let simulation = crossbar.simulate_feeds(&[&feed_hash]).await.unwrap(); + println!("simulation: {:#?}", simulation); + + let ctx = SbContext::new(); + let (ix, responses, num_success, luts) = PullFeed::fetch_update_ix( + ctx.clone(), + &client, + FetchUpdateParams { + feed, + payer: kp.pubkey(), + gateway: gw.clone(), + crossbar: Some(crossbar), + ..Default::default() + }, + ) + .await + .unwrap(); + + let blockhash = client.get_latest_blockhash().await.unwrap(); + let msg = Message::try_compile( + &kp.pubkey(), + &[ + ComputeBudgetInstruction::set_compute_unit_limit(1_400_000), + ComputeBudgetInstruction::set_compute_unit_price(35_000), + ix.clone() + ], + &luts, + blockhash) + .unwrap(); + + let versioned_tx = VersionedTransaction::try_new(V0(msg), &[&kp]).unwrap(); + let result: Response = client + .simulate_transaction(&versioned_tx) + .await + .unwrap(); + println!("ix: {:#?}", result); +} diff --git a/rust/switchboard-on-demand-client/src/accounts/mod.rs b/rust/switchboard-on-demand-client/src/accounts/mod.rs new file mode 100644 index 0000000..186c080 --- /dev/null +++ b/rust/switchboard-on-demand-client/src/accounts/mod.rs @@ -0,0 +1,8 @@ +pub mod state; +pub use state::*; +pub mod pull_feed; +pub use pull_feed::*; +pub mod queue; +pub use queue::*; +pub mod oracle; +pub use oracle::*; diff --git a/rust/switchboard-on-demand-client/src/accounts/oracle.rs b/rust/switchboard-on-demand-client/src/accounts/oracle.rs new file mode 100644 index 0000000..97013f8 --- /dev/null +++ b/rust/switchboard-on-demand-client/src/accounts/oracle.rs @@ -0,0 +1,106 @@ +use crate::*; +use bytemuck; +use solana_sdk::pubkey::Pubkey; + +pub const KEY_ROTATE_KEEPALIVE_SLOTS: u64 = 1500; +pub const MAX_STALE_SECONDS: i64 = 300; + +#[repr(C)] +#[derive(Debug, Copy, Clone, bytemuck::Pod, bytemuck::Zeroable)] +pub struct OracleAccountData { + /// Represents the state of the quote verifiers enclave. + pub enclave: Quote, + + // Accounts Config + /// The authority of the EnclaveAccount which is permitted to make account changes. + pub authority: Pubkey, + /// Queue used for attestation to verify a MRENCLAVE measurement. + pub queue: Pubkey, + + // Metadata Config + /// The unix timestamp when the quote was created. + pub created_at: i64, + + /// The last time the quote heartbeated on-chain. + pub last_heartbeat: i64, + + pub secp_authority: [u8; 64], + + /// URI location of the verifier's gateway. + pub gateway_uri: [u8; 64], + pub permissions: u64, + /// Whether the quote is located on the AttestationQueues buffer. + pub is_on_queue: u8, + _padding1: [u8; 7], + pub lut_slot: u64, + pub last_reward_epoch: u64, + + _ebuf4: [u8; 16], + _ebuf3: [u8; 32], + _ebuf2: [u8; 64], + _ebuf1: [u8; 1024], +} + +#[repr(C)] +#[derive(Debug, Copy, Clone, bytemuck::Pod, bytemuck::Zeroable)] +pub struct Quote { + /// The address of the signer generated within an enclave. + pub enclave_signer: Pubkey, + /// The quotes MRENCLAVE measurement dictating the contents of the secure enclave. + pub mr_enclave: [u8; 32], + /// The VerificationStatus of the quote. + pub verification_status: u8, + padding1: [u8; 7], + /// The unix timestamp when the quote was last verified. + pub verification_timestamp: i64, + /// The unix timestamp when the quotes verification status expires. + pub valid_until: i64, + /// The off-chain registry where the verifiers quote can be located. + pub quote_registry: [u8; 32], + /// Key to lookup the buffer data on IPFS or an alternative decentralized storage solution. + pub registry_key: [u8; 64], + /// The secp256k1 public key of the enclave signer. Derived from the enclave_signer. + pub secp256k1_signer: [u8; 64], + pub last_ed25519_signer: Pubkey, + pub last_secp256k1_signer: [u8; 64], + pub last_rotate_slot: u64, + pub guardian_approvers: [Pubkey; 64], + pub guardian_approvers_len: u8, + padding2: [u8; 7], + pub staging_ed25519_signer: Pubkey, + pub staging_secp256k1_signer: [u8; 64], + /// Reserved. + _ebuf4: [u8; 32], + _ebuf3: [u8; 128], + _ebuf2: [u8; 256], + _ebuf1: [u8; 512], +} + +impl OracleAccountData { + pub fn stats_key(oracle: &Pubkey) -> Pubkey { + Pubkey::find_program_address( + &[ORACLE_STATS_SEED, &oracle.to_bytes()], + &SWITCHBOARD_ON_DEMAND_PROGRAM_ID, + ) + .0 + } + + pub fn gateway_uri(&self) -> Option { + let uri = self.gateway_uri; + let uri = String::from_utf8_lossy(&uri); + let uri = uri + .split_at(uri.find('\0').unwrap_or(uri.len())) + .0 + .to_string(); + if uri.is_empty() { + return None; + } + Some(uri) + } +} + +impl LutOwner for OracleAccountData { + fn lut_slot(&self) -> u64 { + self.lut_slot + } +} diff --git a/rust/switchboard-on-demand-client/src/accounts/pull_feed.rs b/rust/switchboard-on-demand-client/src/accounts/pull_feed.rs new file mode 100644 index 0000000..81af4cf --- /dev/null +++ b/rust/switchboard-on-demand-client/src/accounts/pull_feed.rs @@ -0,0 +1,169 @@ +use crate::*; +use bytemuck; +use rust_decimal::Decimal; +use solana_sdk::pubkey::Pubkey; + +pub const PRECISION: u32 = 18; +pub const MAX_SAMPLES: usize = 32; + +#[repr(C)] +#[derive(Debug, Clone, Copy, bytemuck::Pod, bytemuck::Zeroable)] +pub struct CurrentResult { + /// The median value of the submissions needed for quorom size + pub value: i128, + /// The standard deviation of the submissions needed for quorom size + pub std_dev: i128, + /// The mean of the submissions needed for quorom size + pub mean: i128, + /// The range of the submissions needed for quorom size + pub range: i128, + /// The minimum value of the submissions needed for quorom size + pub min_value: i128, + /// The maximum value of the submissions needed for quorom size + pub max_value: i128, + /// The number of samples used to calculate this result + pub num_samples: u8, + pub padding1: [u8; 7], + /// The slot at which this value was signed. + pub slot: u64, + /// The slot at which the first considered submission was made + pub min_slot: u64, + /// The slot at which the last considered submission was made + pub max_slot: u64, +} +impl CurrentResult { + /// The median value of the submissions needed for quorom size + pub fn value(&self) -> Decimal { + Decimal::from_i128_with_scale(self.value, PRECISION) + } + + /// The standard deviation of the submissions needed for quorom size + pub fn std_dev(&self) -> Decimal { + Decimal::from_i128_with_scale(self.std_dev, PRECISION) + } + + /// The mean of the submissions needed for quorom size + pub fn mean(&self) -> Decimal { + Decimal::from_i128_with_scale(self.mean, PRECISION) + } + + /// The range of the submissions needed for quorom size + pub fn range(&self) -> Decimal { + Decimal::from_i128_with_scale(self.range, PRECISION) + } + + /// The minimum value of the submissions needed for quorom size + pub fn min_value(&self) -> Decimal { + Decimal::from_i128_with_scale(self.min_value, PRECISION) + } + + /// The maximum value of the submissions needed for quorom size + pub fn max_value(&self) -> Decimal { + Decimal::from_i128_with_scale(self.max_value, PRECISION) + } + + pub fn result_slot(&self) -> u64 { + self.slot + } + + pub fn min_slot(&self) -> u64 { + self.min_slot + } + + pub fn max_slot(&self) -> u64 { + self.max_slot + } +} + +#[repr(C)] +#[derive(Debug, Clone, Copy, bytemuck::Pod, bytemuck::Zeroable)] +pub struct OracleSubmission { + /// The public key of the oracle that submitted this value. + pub oracle: Pubkey, + /// The slot at which this value was signed. + pub slot: u64, + /// The slot at which this value was landed on chain. + pub landed_at: u64, + /// The value that was submitted. + pub value: i128, +} + +/// A representation of the data in a pull feed account. +#[repr(C)] +#[derive(Debug, Clone, Copy, bytemuck::Pod, bytemuck::Zeroable)] +pub struct PullFeedAccountData { + /// The oracle submissions for this feed. + pub submissions: [OracleSubmission; 32], + /// The public key of the authority that can update the feed hash that + /// this account will use for registering updates. + pub authority: Pubkey, + /// The public key of the queue which oracles must be bound to in order to + /// submit data to this feed. + pub queue: Pubkey, + /// SHA-256 hash of the job schema oracles will execute to produce data + /// for this feed. + pub feed_hash: [u8; 32], + /// The slot at which this account was initialized. + pub initialized_at: i64, + pub permissions: u64, + pub max_variance: u64, + pub min_responses: u32, + pub name: [u8; 32], + _padding1: [u8; 3], + pub min_sample_size: u8, + pub last_update_timestamp: i64, + pub lut_slot: u64, + pub ipfs_hash: [u8; 32], // deprecated + pub result: CurrentResult, + pub max_staleness: u32, + _ebuf4: [u8; 20], + _ebuf3: [u8; 24], + _ebuf2: [u8; 256], + _ebuf1: [u8; 512], +} + +impl OracleSubmission { + pub fn is_empty(&self) -> bool { + self.slot == 0 + } + + pub fn value(&self) -> Decimal { + Decimal::from_i128_with_scale(self.value, PRECISION) + } +} + +impl PullFeedAccountData { + /// The median value of the submissions needed for quorom size + pub fn value(&self) -> Decimal { + self.result.value() + } + + /// The range of the submissions needed for quorom size + pub fn range(&self) -> Decimal { + self.result.range() + } + + /// The minimum value of the submissions needed for quorom size + pub fn min_value(&self) -> Decimal { + self.result.min_value() + } + + /// The maximum value of the submissions needed for quorom size + pub fn max_value(&self) -> Decimal { + self.result.max_value() + } + + pub fn result_slot(&self) -> u64 { + self.result.slot + } + + pub fn feed_hash(&self) -> String { + hex::encode(self.feed_hash) + } +} + +impl LutOwner for PullFeedAccountData { + fn lut_slot(&self) -> u64 { + self.lut_slot + } +} diff --git a/rust/switchboard-on-demand-client/src/accounts/queue.rs b/rust/switchboard-on-demand-client/src/accounts/queue.rs new file mode 100644 index 0000000..a769be2 --- /dev/null +++ b/rust/switchboard-on-demand-client/src/accounts/queue.rs @@ -0,0 +1,137 @@ +use crate::Gateway; +use crate::LutOwner; +use crate::OracleAccountData; +use anyhow_ext::anyhow; +use anyhow_ext::Error as AnyhowError; +use bytemuck::{Pod, Zeroable}; +use futures::future::join_all; +use solana_client::nonblocking::rpc_client::RpcClient; +use solana_sdk::pubkey::Pubkey; + +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct QueueAccountData { + /// The address of the authority which is permitted to add/remove allowed enclave measurements. + pub authority: Pubkey, + /// Allowed enclave measurements. + pub mr_enclaves: [[u8; 32]; 32], + /// The addresses of the quote oracles who have a valid + /// verification status and have heartbeated on-chain recently. + pub oracle_keys: [Pubkey; 128], + /// The maximum allowable time until a EnclaveAccount needs to be re-verified on-chain. + pub max_quote_verification_age: i64, + /// The unix timestamp when the last quote oracle heartbeated on-chain. + pub last_heartbeat: i64, + pub node_timeout: i64, + /// The minimum number of lamports a quote oracle needs to lock-up in order to heartbeat and verify other quotes. + pub oracle_min_stake: u64, + pub allow_authority_override_after: i64, + + /// The number of allowed enclave measurements. + pub mr_enclaves_len: u32, + /// The length of valid quote oracles for the given attestation queue. + pub oracle_keys_len: u32, + /// The reward paid to quote oracles for attesting on-chain. + pub reward: u32, + /// Incrementer used to track the current quote oracle permitted to run any available functions. + pub curr_idx: u32, + /// Incrementer used to garbage collect and remove stale quote oracles. + pub gc_idx: u32, + + pub require_authority_heartbeat_permission: u8, + pub require_authority_verify_permission: u8, + pub require_usage_permissions: u8, + pub signer_bump: u8, + + pub mint: Pubkey, + pub lut_slot: u64, + pub allow_subsidies: u8, + + /// Reserved. + _ebuf6: [u8; 23], + _ebuf5: [u8; 32], + _ebuf4: [u8; 64], + _ebuf3: [u8; 128], + _ebuf2: [u8; 256], + _ebuf1: [u8; 512], +} +unsafe impl Pod for QueueAccountData {} +unsafe impl Zeroable for QueueAccountData {} + +impl QueueAccountData { + pub fn size() -> usize { + 8 + std::mem::size_of::() + } + + /// Loads the oracles currently in the queue. + pub fn oracle_keys(&self) -> Vec { + self.oracle_keys[..self.oracle_keys_len as usize].to_vec() + } + + /// Loads the QueueAccountData from the given key. + pub async fn load(client: &RpcClient, key: &Pubkey) -> Result { + let account = client.get_account_data(key).await?; + let buf = account[8..].to_vec(); + let parsed: &QueueAccountData = bytemuck::try_from_bytes(&buf) + .map_err(|e| anyhow!("Failed to parse QueueAccountData: {:?}", e))?; + Ok(parsed.clone()) + } + + /// Fetches all oracle accounts from the oracle keys and returns them as a list of (Pubkey, OracleAccountData). + pub async fn fetch_oracle_accounts( + &self, + client: &RpcClient, + ) -> Result, AnyhowError> { + let keys = self.oracle_keys(); + let accounts_data = client + .get_multiple_accounts(&keys) + .await? + .into_iter() + .map(|account| { + let buf = account.unwrap_or_default().data[8..].to_vec(); + let oracle_account: &OracleAccountData = bytemuck::try_from_bytes(&buf).unwrap(); + oracle_account.clone() + }) + .collect::>(); + let result = keys + .into_iter() + .zip(accounts_data.into_iter()) + .collect::>(); + Ok(result) + } + + /// Fetches all gateways from the oracle accounts and tests them to see if they are reachable. + /// Returns a list of reachable gateways. + /// # Arguments + /// * `client` - The RPC client to use for fetching the oracle accounts. + /// # Returns + /// A list of reachable gateways. + pub async fn fetch_gateways(&self, client: &RpcClient) -> Result, AnyhowError> { + let gateways = self + .fetch_oracle_accounts(&client) + .await? + .into_iter() + .map(|x| x.1) + .filter_map(|x| x.gateway_uri()) + .map(|x| Gateway::new(x)) + .collect::>(); + let mut test_futures = Vec::new(); + for gateway in gateways.iter() { + test_futures.push(gateway.test_gateway()); + } + let results = join_all(test_futures).await; + let mut good_gws = Vec::new(); + for (i, is_good) in results.into_iter().enumerate() { + if is_good { + good_gws.push(gateways[i].clone()); + } + } + Ok(good_gws) + } +} + +impl LutOwner for QueueAccountData { + fn lut_slot(&self) -> u64 { + self.lut_slot + } +} diff --git a/rust/switchboard-on-demand-client/src/accounts/state.rs b/rust/switchboard-on-demand-client/src/accounts/state.rs new file mode 100644 index 0000000..10b950a --- /dev/null +++ b/rust/switchboard-on-demand-client/src/accounts/state.rs @@ -0,0 +1,53 @@ +use crate::SWITCHBOARD_ON_DEMAND_PROGRAM_ID; +use solana_sdk::pubkey::Pubkey; + +const STATE_SEED: &[u8] = b"STATE"; + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct StateEpochInfo { + pub id: u64, + pub _reserved1: u64, + pub slot_end: u64, +} + +#[derive(Copy, Clone)] +#[repr(C)] +pub struct State { + pub bump: u8, + pub test_only_disable_mr_enclave_check: u8, + pub enable_staking: u8, + padding1: [u8; 5], + pub authority: Pubkey, + pub guardian_queue: Pubkey, + pub reserved1: u64, + pub epoch_length: u64, + pub current_epoch: StateEpochInfo, + pub next_epoch: StateEpochInfo, + pub finalized_epoch: StateEpochInfo, + // xswitch vault + pub stake_pool: Pubkey, + pub stake_program: Pubkey, + pub switch_mint: Pubkey, + pub sgx_advisories: [u16; 32], + pub advisories_len: u8, + padding2: u8, + // When oracles receive a reward, this is the percent of the total rewards + // that are distributed equally regardless of the stake amount. + pub flat_reward_cut_percentage: u8, + pub enable_slashing: u8, + pub subsidy_amount: u32, + pub lut_slot: u64, + _ebuf3: [u8; 256], + _ebuf2: [u8; 512], + _ebuf1: [u8; 1024], +} +impl State { + pub fn key() -> Pubkey { + Pubkey::find_program_address(&[STATE_SEED], &Self::pid()).0 + } + + pub fn pid() -> Pubkey { + *SWITCHBOARD_ON_DEMAND_PROGRAM_ID + } +} diff --git a/rust/switchboard-on-demand-client/src/associated_token_account.rs b/rust/switchboard-on-demand-client/src/associated_token_account.rs new file mode 100644 index 0000000..8830b70 --- /dev/null +++ b/rust/switchboard-on-demand-client/src/associated_token_account.rs @@ -0,0 +1,71 @@ +use lazy_static::lazy_static; +use solana_sdk::pubkey::Pubkey; +use std::str::FromStr; + +lazy_static! { + pub static ref SPL_TOKEN_PROGRAM_ID: Pubkey = + Pubkey::from_str("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA").unwrap(); + pub static ref SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID: Pubkey = + Pubkey::from_str("ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL").unwrap(); + pub static ref NATIVE_MINT: Pubkey = + Pubkey::from_str("So11111111111111111111111111111111111111112").unwrap(); +} + +pub fn get_associated_token_address_and_bump_seed( + wallet_address: &Pubkey, + token_mint_address: &Pubkey, + program_id: &Pubkey, + token_program_id: &Pubkey, +) -> (Pubkey, u8) { + get_associated_token_address_and_bump_seed_internal( + wallet_address, + token_mint_address, + program_id, + token_program_id, + ) +} + +/// Derives the associated token account address for the given wallet address +/// and token mint +pub fn get_associated_token_address( + wallet_address: &Pubkey, + token_mint_address: &Pubkey, +) -> Pubkey { + get_associated_token_address_with_program_id( + wallet_address, + token_mint_address, + &SPL_TOKEN_PROGRAM_ID, + ) +} + +/// Derives the associated token account address for the given wallet address, +/// token mint and token program id +pub fn get_associated_token_address_with_program_id( + wallet_address: &Pubkey, + token_mint_address: &Pubkey, + token_program_id: &Pubkey, +) -> Pubkey { + get_associated_token_address_and_bump_seed( + wallet_address, + token_mint_address, + &SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID, + token_program_id, + ) + .0 +} + +fn get_associated_token_address_and_bump_seed_internal( + wallet_address: &Pubkey, + token_mint_address: &Pubkey, + program_id: &Pubkey, + token_program_id: &Pubkey, +) -> (Pubkey, u8) { + Pubkey::find_program_address( + &[ + &wallet_address.to_bytes(), + &token_program_id.to_bytes(), + &token_mint_address.to_bytes(), + ], + program_id, + ) +} diff --git a/rust/switchboard-on-demand-client/src/crossbar.rs b/rust/switchboard-on-demand-client/src/crossbar.rs new file mode 100644 index 0000000..9cadefb --- /dev/null +++ b/rust/switchboard-on-demand-client/src/crossbar.rs @@ -0,0 +1,245 @@ +#![allow(non_snake_case)] +use anyhow_ext::anyhow; +use anyhow_ext::Context; +use anyhow_ext::Error as AnyhowError; +use base58::ToBase58; +use reqwest::Client; +use serde::{Deserialize, Serialize}; +use solana_sdk::pubkey::Pubkey; +use solana_sdk::genesis_config::ClusterType; + +#[derive(Serialize, Deserialize)] +pub struct StoreResponse { + pub cid: String, + pub feedHash: String, + pub queueHex: String, +} + +#[derive(Serialize, Deserialize)] +pub struct FetchSolanaUpdatesResponse { + pub success: bool, + pub pullIx: String, + pub responses: Vec, + pub lookupTables: Vec, +} + +#[derive(Serialize, Deserialize)] +pub struct Response { + pub oracle: String, + pub result: Option, + pub errors: String, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct SimulateSolanaFeedsResponse { + pub feed: String, + pub feedHash: String, + pub results: Vec>, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct SimulateFeedsResponse { + pub feedHash: String, + pub results: Vec, +} + +#[derive(Clone, Debug)] +pub struct CrossbarClient { + crossbar_url: String, + verbose: bool, + client: Client, +} + +fn cluster_type_to_string(cluster_type: ClusterType) -> String { + match cluster_type { + ClusterType::MainnetBeta => "mainnet-beta", + ClusterType::Testnet => "testnet", + ClusterType::Devnet => "devnet", + ClusterType::Development => "development", + } + .to_string() +} + +impl Default for CrossbarClient { + fn default() -> Self { + Self::new("https://crossbar.switchboard.xyz", false) + } +} + +impl CrossbarClient { + + pub fn new(crossbar_url: &str, verbose: bool) -> Self { + Self { + crossbar_url: crossbar_url.to_string(), + verbose, + client: Client::new(), + } + } + + /// Fetch feed jobs from the crossbar gateway + /// # Arguments + /// * `feed_hash` - The feed hash of the jobs it performs + /// # Returns + /// * `Result` - The response from the crossbar gateway, + /// containing the json formatted oracle jobs + pub async fn fetch(&self, feed_hash: &str) -> Result { + let url = format!("{}/fetch/{}", self.crossbar_url, feed_hash); + let resp = self + .client + .get(&url) + .send() + .await + .context("Failed to send fetch request")?; + + let status = resp.status(); + if !status.is_success() { + if self.verbose { + eprintln!("{}", resp.text().await.context("Failed to fetch response")?); + } + return Err(anyhow!("Bad status code {}", status.as_u16())); + } + + Ok(resp.json().await.context("Failed to parse response")?) + } + + /// Store feed jobs in the crossbar gateway to a pinned IPFS address + pub async fn store( + &self, + queue_address: Pubkey, + jobs: &[serde_json::Value], + ) -> Result { + let queue = bs58::decode(queue_address.to_string()) + .into_vec() + .context("Failed to decode queue address")?; + let queue_hex = queue.to_base58(); + let payload = serde_json::json!({ "queue": queue_hex, "jobs": jobs }); + + let url = format!("{}/store", self.crossbar_url); + let resp = self + .client + .post(&url) + .json(&payload) + .header("Content-Type", "application/json") + .send() + .await + .context("Failed to send store request")?; + + let status = resp.status(); + if !status.is_success() { + if self.verbose { + eprintln!( + "{}: {}", + status, + resp.text().await.context("Failed to fetch response")? + ); + } + return Err(anyhow!("Bad status code {}", status.as_u16())); + } + + Ok(resp.json().await.context("Failed to parse response")?) + } + + pub async fn fetch_solana_updates( + &self, + network: ClusterType, + feed_pubkeys: &[Pubkey], + num_signatures: Option, + ) -> Result, AnyhowError> { + if feed_pubkeys.is_empty() { + return Err(anyhow!("Feed pubkeys are empty")); + } + + let feeds_param: Vec<_> = feed_pubkeys.into_iter().map(|x| x.to_string()).collect(); + let feeds_param = feeds_param.join(","); + let network = cluster_type_to_string(network); + let mut url = format!( + "{}/updates/solana/{}/{}", + self.crossbar_url, network, feeds_param + ); + if let Some(num_signatures) = num_signatures { + url.push_str(&format!("?numSignatures={}", num_signatures)); + } + + let resp = self.client.get(&url).send().await?; + + let status = resp.status(); + if !status.is_success() { + if self.verbose { + eprintln!( + "{}: {}", + status, + resp.text().await.context("Failed to fetch response")? + ); + } + return Err(anyhow!("Bad status code {}", status.as_u16())); + } + + Ok(resp.json().await.context("Failed to parse response")?) + } + + /// Simulate feed responses from the crossbar gateway + pub async fn simulate_solana_feeds( + &self, + network: ClusterType, + feed_pubkeys: &[Pubkey], + ) -> Result, AnyhowError> { + if feed_pubkeys.is_empty() { + return Err(anyhow!("Feed pubkeys are empty")); + } + + let feeds_param: Vec<_> = feed_pubkeys.into_iter().map(|x| x.to_string()).collect(); + let feeds_param = feeds_param.join(","); + let network = cluster_type_to_string(network); + let url = format!( + "{}/simulate/solana/{}/{}", + self.crossbar_url, network, feeds_param + ); + let resp = self.client.get(&url).send().await?; + + let status = resp.status(); + let raw = resp.text().await.context("Failed to fetch response")?; + if !status.is_success() { + if self.verbose { + eprintln!("{}: {}", status, raw); + } + return Err(anyhow!("Bad status code {}", status.as_u16())); + } + + Ok(serde_json::from_str(&raw)?) + } + + /// Simulate feed responses from the crossbar gateway + /// # Arguments + /// * `feed_hashes` - The feed hashes to simulate + pub async fn simulate_feeds( + &self, + feed_hashes: &[&str], + ) -> Result, AnyhowError> { + if feed_hashes.is_empty() { + return Err(anyhow!("Feed hashes are empty")); + } + + let feeds_param = feed_hashes.join(","); + let url = format!("{}/simulate/{}", self.crossbar_url, feeds_param); + let resp = self + .client + .get(&url) + .send() + .await + .context("Failed to send simulate feeds request")?; + + let status = resp.status(); + if !status.is_success() { + if self.verbose { + eprintln!( + "{}: {}", + status, + resp.text().await.context("Failed to fetch response")? + ); + } + return Err(anyhow!("Bad status code {}", status.as_u16())); + } + + Ok(resp.json().await.context("Failed to parse response")?) + } +} diff --git a/rust/switchboard-on-demand-client/src/gateway.rs b/rust/switchboard-on-demand-client/src/gateway.rs new file mode 100644 index 0000000..98ac93a --- /dev/null +++ b/rust/switchboard-on-demand-client/src/gateway.rs @@ -0,0 +1,260 @@ +use crate::oracle_job::OracleJob; +use base64::prelude::*; +use prost::Message; +use reqwest::header::CONTENT_TYPE; +use reqwest::Client; +use serde::{Deserialize, Serialize}; +use std::sync::Arc; +use std::time::Duration; + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct FeedEvalResponse { + pub oracle_pubkey: String, + pub queue_pubkey: String, + pub oracle_signing_pubkey: String, + pub feed_hash: String, + pub recent_hash: String, + pub failure_error: String, + pub success_value: String, + pub msg: String, + pub signature: String, + pub recovery_id: i32, + pub recent_successes_if_failed: Vec, + pub timestamp: Option, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct FeedEvalResponseSingle { + pub responses: Vec, + pub caller: String, + pub failures: Vec, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct FeedEvalManyResponse { + pub feed_responses: Vec, + pub signature: String, + pub recovery_id: i32, + pub errors: Vec>, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct FetchSignaturesMultiResponse { + pub oracle_responses: Vec, + pub errors: Vec>, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct RandomnessRevealResponse { + pub signature: String, + pub recovery_id: i32, + pub value: Vec, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct AttestEnclaveResponse { + pub guardian: String, + pub signature: String, + pub recovery_id: i32, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct PingResponse { + pub oracle_pubkey: String, + pub oracle_authority: String, + pub queue: String, + pub rate_limit: i32, + pub version: String, + pub mr_enclave: String, + pub is_push_oracle: bool, + pub is_pull_oracle: bool, + pub is_gateway: bool, + pub is_guardian: bool, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct FetchQuoteResponse { + pub oracle_pubkey: String, + pub queue: String, + pub now: i64, + pub mr_enclave: String, + pub ed25519_pubkey: String, + pub secp256k1_pubkey: String, + pub quote: String, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct BridgeEnclaveResponse { + pub guardian: String, + pub oracle: String, + pub queue: String, + pub mr_enclave: String, + pub chain_hash: String, + pub oracle_ed25519_enclave_signer: String, + pub oracle_secp256k1_enclave_signer: String, + pub msg: String, + pub msg_prehash: String, + pub signature: String, + pub recovery_id: i32, +} + +#[derive(Debug, Clone, Default)] +pub struct Gateway { + gateway_url: String, + client: Arc, +} + +impl Gateway { + pub fn new(gateway_url: String) -> Self { + let client = Client::builder() + .timeout(Duration::from_secs(10)) + // Switchboard does its own keypair authentication + .danger_accept_invalid_certs(true) + .build() + .unwrap(); + + Self { + gateway_url, + client: Arc::new(client), + } + } + + /// Fetches signatures from the gateway + /// # Arguments + /// * `params` - FetchSignaturesParams + /// * `params.recent_hash` - The recent hash of the feed + /// * `params.encoded_jobs` - The encoded jobs + /// * `params.num_signatures` - The number of signatures to fetch + /// * `params.max_variance` - The maximum variance + /// * `params.min_responses` - The minimum number of responses + /// * `params.use_timestamp` - Whether to use the timestamp + /// # Returns + /// * `Result` + pub async fn fetch_signatures_from_encoded( + &self, + params: FetchSignaturesParams, + ) -> Result { + let url = format!("{}/gateway/api/v1/fetch_signatures", self.gateway_url); + let body = serde_json::json!({ + "api_version": "1.0.0", + "jobs_b64_encoded": params.encoded_jobs, + "recent_chainhash": params.recent_hash.unwrap_or_else(|| bs58::encode(vec![0; 32]).into_string()), + "signature_scheme": "Secp256k1", + "hash_scheme": "Sha256", + "num_oracles": params.num_signatures, + "max_variance": (params.max_variance.unwrap_or(1) as f64 * 1e9) as u64, + "min_responses": params.min_responses.unwrap_or(1), + "use_timestamp": params.use_timestamp.unwrap_or(false), + }); + + let res = self + .client + .post(&url) + .header(CONTENT_TYPE, "application/json") + .json(&body) + .send() + .await?; + + let raw = res.text().await?; + let res = serde_json::from_str::(&raw).unwrap(); + + Ok(res) + } + + /// Fetches signatures from the gateway using the multi-feed method + /// # Arguments + /// * `params` - FetchSignaturesMultiParams + /// * `params.recent_hash` - The recent hash of the feed + /// * `params.feed_configs` - The feed configurations + /// * `params.num_signatures` - The number of signatures to fetch + /// * `params.use_timestamp` - Whether to use the timestamp + /// # Returns + /// * `Result` + pub async fn fetch_signatures_multi( + &self, + params: FetchSignaturesMultiParams, + ) -> Result { + let url = format!("{}/gateway/api/v1/fetch_signatures_multi", self.gateway_url); + let mut feed_requests = vec![]; + + for config in params.feed_configs { + let max_variance = (config.max_variance.unwrap_or(1) as f64 * 1e9) as u64; + feed_requests.push(serde_json::json!({ + "jobs_b64_encoded": config.encoded_jobs, + "max_variance": max_variance, + "min_responses": config.min_responses.unwrap_or(1), + "use_timestamp": params.use_timestamp.unwrap_or(false), + })); + } + + let body = serde_json::json!({ + "api_version": "1.0.0", + "num_oracles": params.num_signatures.unwrap_or(1), + "recent_hash": params.recent_hash.unwrap_or_else(|| bs58::encode(vec![0; 32]).into_string()), + "signature_scheme": "Secp256k1", + "hash_scheme": "Sha256", + "feed_requests": feed_requests, + }); + + let res = self + .client + .post(&url) + .header(CONTENT_TYPE, "application/json") + .json(&body) + .send() + .await?; + let res = res.json::().await?; + + Ok(res) + } + + pub async fn test_gateway(&self) -> bool { + let client = &self.client; + // Make HTTP request + let url = format!("{}/gateway/api/v1/test", self.gateway_url); + let response = client.get(&url).send().await; + + // Process response + if let Ok(resp) = response { + if let Ok(text) = resp.text().await { + !text.is_empty() + } else { + false + } + } else { + false + } + } +} + +#[derive(Debug)] +pub struct FetchSignaturesParams { + pub recent_hash: Option, + pub encoded_jobs: Vec, + pub num_signatures: u32, + pub max_variance: Option, + pub min_responses: Option, + pub use_timestamp: Option, +} + +#[derive(Debug)] +pub struct FeedConfig { + pub encoded_jobs: Vec, + pub max_variance: Option, + pub min_responses: Option, +} + +#[derive(Debug)] +pub struct FetchSignaturesMultiParams { + pub recent_hash: Option, + pub feed_configs: Vec, + pub num_signatures: Option, + pub use_timestamp: Option, +} + +pub fn encode_jobs(job_array: Vec) -> Vec { + job_array + .into_iter() + .map(|job| BASE64_STANDARD.encode(&job.encode_length_delimited_to_vec())) + .collect() +} diff --git a/rust/switchboard-on-demand-client/src/instructions/mod.rs b/rust/switchboard-on-demand-client/src/instructions/mod.rs new file mode 100644 index 0000000..ef5c61d --- /dev/null +++ b/rust/switchboard-on-demand-client/src/instructions/mod.rs @@ -0,0 +1,10 @@ +pub mod pull_feed_submit_response_ix; +pub use pull_feed_submit_response_ix::*; +pub mod pull_feed_submit_response_many_ix; +pub use pull_feed_submit_response_many_ix::*; +use sha2::{Digest, Sha256}; + +pub fn get_discriminator(name: &str) -> Vec { + let name = format!("global:{}", name); + Sha256::digest(&name)[..8].to_vec() +} diff --git a/rust/switchboard-on-demand-client/src/instructions/pull_feed_submit_response_ix.rs b/rust/switchboard-on-demand-client/src/instructions/pull_feed_submit_response_ix.rs new file mode 100644 index 0000000..b4e6a21 --- /dev/null +++ b/rust/switchboard-on-demand-client/src/instructions/pull_feed_submit_response_ix.rs @@ -0,0 +1,63 @@ +use crate::get_discriminator; +use borsh::{BorshDeserialize, BorshSerialize}; +use solana_sdk::instruction::AccountMeta; +use solana_sdk::pubkey::Pubkey; + +#[derive(Clone, Debug)] +pub struct PullFeedSubmitResponse { + pub feed: Pubkey, + pub queue: Pubkey, + pub program_state: Pubkey, + pub recent_slothashes: Pubkey, + pub payer: Pubkey, + pub system_program: Pubkey, + pub reward_vault: Pubkey, + pub token_program: Pubkey, + pub token_mint: Pubkey, +} + +impl PullFeedSubmitResponse { + pub fn to_account_metas(&self, _is_signer: Option) -> Vec { + vec![ + AccountMeta::new(self.feed, false), + AccountMeta::new_readonly(self.queue, false), + AccountMeta::new_readonly(self.program_state, false), + AccountMeta::new_readonly(self.recent_slothashes, false), + AccountMeta::new(self.payer, true), + AccountMeta::new_readonly(self.system_program, false), + AccountMeta::new(self.reward_vault, false), + AccountMeta::new_readonly(self.token_program, false), + AccountMeta::new_readonly(self.token_mint, false), + ] + } +} + +// 82 bytes +#[derive(Clone, BorshSerialize, BorshDeserialize)] +pub struct Submission { + pub value: i128, + pub signature: [u8; 64], + pub recovery_id: u8, + // If the oracle failed to produce response at the user request slot and it + // responds with an older signed vlaue state which slot its signed with by + // offset of requested. + pub offset: u8, +} +#[derive(Clone, BorshSerialize, BorshDeserialize)] +pub struct PullFeedSubmitResponseParams { + pub slot: u64, + pub submissions: Vec, +} +impl PullFeedSubmitResponseParams { + pub fn to_vec(&self) -> Vec { + let mut buffer: Vec = Vec::new(); + self.serialize(&mut buffer).unwrap(); + buffer + } + + pub fn data(&self) -> Vec { + let mut res = get_discriminator("pull_feed_submit_response").to_vec(); + res.extend_from_slice(&self.to_vec()); + res + } +} diff --git a/rust/switchboard-on-demand-client/src/instructions/pull_feed_submit_response_many_ix.rs b/rust/switchboard-on-demand-client/src/instructions/pull_feed_submit_response_many_ix.rs new file mode 100644 index 0000000..454e88e --- /dev/null +++ b/rust/switchboard-on-demand-client/src/instructions/pull_feed_submit_response_many_ix.rs @@ -0,0 +1,58 @@ +use crate::get_discriminator; +use borsh::{BorshDeserialize, BorshSerialize}; +use solana_sdk::instruction::AccountMeta; +use solana_sdk::pubkey::Pubkey; + +#[derive(Clone, Debug)] +pub struct PullFeedSubmitResponseMany { + pub queue: Pubkey, + pub program_state: Pubkey, + pub recent_slothashes: Pubkey, + // mut + pub payer: Pubkey, + pub system_program: Pubkey, + // mut + pub reward_vault: Pubkey, + pub token_program: Pubkey, + pub token_mint: Pubkey, +} + +impl PullFeedSubmitResponseMany { + pub fn to_account_metas(&self, _is_signer: Option) -> Vec { + vec![ + AccountMeta::new_readonly(self.queue, false), + AccountMeta::new_readonly(self.program_state, false), + AccountMeta::new_readonly(self.recent_slothashes, false), + AccountMeta::new(self.payer, true), + AccountMeta::new_readonly(self.system_program, false), + AccountMeta::new(self.reward_vault, false), + AccountMeta::new_readonly(self.token_program, false), + AccountMeta::new_readonly(self.token_mint, false), + ] + } +} + +#[derive(Clone, BorshSerialize, BorshDeserialize)] +pub struct MultiSubmission { + pub values: Vec, // i128::MAX is a sentinel value for missing data + pub signature: [u8; 64], + pub recovery_id: u8, +} +#[derive(Clone, BorshSerialize, BorshDeserialize)] +pub struct PullFeedSubmitResponseManyParams { + pub slot: u64, + pub submissions: Vec, +} +impl PullFeedSubmitResponseManyParams { + pub fn to_vec(&self) -> Vec { + let mut buffer: Vec = Vec::new(); + self.serialize(&mut buffer).unwrap(); + buffer + } + + pub fn data(&self) -> Vec { + let mut res = get_discriminator("pull_feed_submit_response_many").to_vec(); + res.extend_from_slice(&self.to_vec()); + res + } +} diff --git a/rust/switchboard-on-demand-client/src/lib.rs b/rust/switchboard-on-demand-client/src/lib.rs new file mode 100644 index 0000000..a33b8c0 --- /dev/null +++ b/rust/switchboard-on-demand-client/src/lib.rs @@ -0,0 +1,65 @@ +pub mod instructions; +pub use instructions::*; +pub mod crossbar; +pub use crossbar::*; +pub mod gateway; +pub use gateway::*; +pub mod pull_feed; +pub use pull_feed::*; +pub mod associated_token_account; +pub mod oracle_job; +pub use associated_token_account::*; +pub mod recent_slothashes; +pub use recent_slothashes::*; +pub mod accounts; +pub use accounts::*; +#[cfg(feature = "solana_sdk_1_16")] +pub mod lut; +#[cfg(feature = "solana_sdk_1_16")] +pub use lut::*; +pub mod lut_owner; +use crate::oracle_job::OracleJob; +use anyhow_ext::Error as AnyhowError; +use lazy_static::lazy_static; +pub use lut_owner::*; +use solana_sdk::hash; +use solana_sdk::instruction::Instruction; +use solana_sdk::message::Message; +use solana_sdk::pubkey::Pubkey; +use solana_sdk::signature::Signer; +use solana_sdk::signer::keypair::Keypair; +use solana_sdk::transaction::Transaction; +use std::str::FromStr; + +lazy_static! { + pub static ref ON_DEMAND_MAINNET_PID: Pubkey = + Pubkey::from_str("SBondMDrcV3K4kxZR1HNVT7osZxAHVHgYXL5Ze1oMUv").unwrap(); + pub static ref ON_DEMAND_DEVNET_PID: Pubkey = + Pubkey::from_str("Aio4gaXjXzJNVLtzwtNVmSqGKpANtXhybbkhtAC94ji2").unwrap(); + pub static ref SWITCHBOARD_ON_DEMAND_PROGRAM_ID: Pubkey = + if cfg!(feature = "devnet") { + *ON_DEMAND_DEVNET_PID + } else { + *ON_DEMAND_MAINNET_PID + }; +} + +pub const STATE_SEED: &[u8] = b"STATE"; +pub const ORACLE_FEED_STATS_SEED: &[u8] = b"OracleFeedStats"; +pub const ORACLE_RANDOMNESS_STATS_SEED: &[u8] = b"OracleRandomnessStats"; +pub const ORACLE_STATS_SEED: &[u8] = b"OracleStats"; +pub const LUT_SIGNER_SEED: &[u8] = b"LutSigner"; +pub const DELEGATION_SEED: &[u8] = b"Delegation"; +pub const DELEGATION_GROUP_SEED: &[u8] = b"Group"; +pub const REWARD_POOL_VAULT_SEED: &[u8] = b"RewardPool"; + +pub fn ix_to_tx( + ixs: &[Instruction], + signers: &[&Keypair], + blockhash: hash::Hash, +) -> Result { + let msg = Message::new(ixs, Some(&signers[0].pubkey())); + let mut tx = Transaction::new_unsigned(msg); + tx.try_sign(&signers.to_vec(), blockhash)?; + Ok(tx) +} diff --git a/rust/switchboard-on-demand-client/src/lut.rs b/rust/switchboard-on-demand-client/src/lut.rs new file mode 100644 index 0000000..6aa2999 --- /dev/null +++ b/rust/switchboard-on-demand-client/src/lut.rs @@ -0,0 +1,237 @@ +#[cfg(feature = "frozen-abi")] +use solana_frozen_abi_macro::{AbiEnumVisitor, AbiExample}; +use bincode; +use { + serde_derive::{Deserialize, Serialize}, + solana_sdk::{ + clock::Slot, + instruction::InstructionError, + pubkey::Pubkey, + slot_hashes::{SlotHashes, MAX_ENTRIES}, + }, + std::borrow::Cow, +}; +use std::str::FromStr; +use anyhow_ext::Error as AnyhowError; +use anyhow_ext::anyhow; +use borsh::{BorshSerialize, BorshDeserialize}; + +/// The maximum number of addresses that a lookup table can hold +pub const LOOKUP_TABLE_MAX_ADDRESSES: usize = 256; + +/// The serialized size of lookup table metadata +pub const LOOKUP_TABLE_META_SIZE: usize = 56; + +/// Derives the address of an address table account from a wallet address and a recent block's slot. +pub fn derive_lookup_table_address( + authority_address: &Pubkey, + recent_block_slot: Slot, +) -> (Pubkey, u8) { + let lut_pid = Pubkey::from_str("AddressLookupTab1e1111111111111111111111111").unwrap(); + Pubkey::find_program_address( + &[authority_address.as_ref(), &recent_block_slot.to_le_bytes()], + &lut_pid, + ) +} + +/// Activation status of a lookup table +#[derive(Debug, PartialEq, Eq, Clone)] +pub enum LookupTableStatus { + Activated, + Deactivating { remaining_blocks: usize }, + Deactivated, +} + +/// Address lookup table metadata +#[cfg_attr(feature = "frozen-abi", derive(AbiExample))] +#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)] +pub struct LookupTableMeta { + /// Lookup tables cannot be closed until the deactivation slot is + /// no longer "recent" (not accessible in the `SlotHashes` sysvar). + pub deactivation_slot: Slot, + /// The slot that the table was last extended. Address tables may + /// only be used to lookup addresses that were extended before + /// the current bank's slot. + pub last_extended_slot: Slot, + /// The start index where the table was last extended from during + /// the `last_extended_slot`. + pub last_extended_slot_start_index: u8, + /// Authority address which must sign for each modification. + pub authority: Option, + // Padding to keep addresses 8-byte aligned + pub _padding: u16, + // Raw list of addresses follows this serialized structure in + // the account's data, starting from `LOOKUP_TABLE_META_SIZE`. +} + +impl Default for LookupTableMeta { + fn default() -> Self { + Self { + deactivation_slot: Slot::MAX, + last_extended_slot: 0, + last_extended_slot_start_index: 0, + authority: None, + _padding: 0, + } + } +} + +impl LookupTableMeta { + pub fn new(authority: Pubkey) -> Self { + LookupTableMeta { + authority: Some(authority), + ..LookupTableMeta::default() + } + } + + /// Returns whether the table is considered active for address lookups + pub fn is_active(&self, current_slot: Slot, slot_hashes: &SlotHashes) -> bool { + match self.status(current_slot, slot_hashes) { + LookupTableStatus::Activated => true, + LookupTableStatus::Deactivating { .. } => true, + LookupTableStatus::Deactivated => false, + } + } + + /// Return the current status of the lookup table + pub fn status(&self, current_slot: Slot, slot_hashes: &SlotHashes) -> LookupTableStatus { + if self.deactivation_slot == Slot::MAX { + LookupTableStatus::Activated + } else if self.deactivation_slot == current_slot { + LookupTableStatus::Deactivating { + remaining_blocks: MAX_ENTRIES.saturating_add(1), + } + } else if let Some(slot_hash_position) = slot_hashes.position(&self.deactivation_slot) { + // Deactivation requires a cool-down period to give in-flight transactions + // enough time to land and to remove indeterminism caused by transactions loading + // addresses in the same slot when a table is closed. The cool-down period is + // equivalent to the amount of time it takes for a slot to be removed from the + // slot hash list. + // + // By using the slot hash to enforce the cool-down, there is a side effect + // of not allowing lookup tables to be recreated at the same derived address + // because tables must be created at an address derived from a recent slot. + LookupTableStatus::Deactivating { + remaining_blocks: MAX_ENTRIES.saturating_sub(slot_hash_position), + } + } else { + LookupTableStatus::Deactivated + } + } +} + +/// Program account states +#[cfg_attr(feature = "frozen-abi", derive(AbiEnumVisitor, AbiExample))] +#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)] +#[allow(clippy::large_enum_variant)] +pub enum ProgramState { + /// Account is not initialized. + Uninitialized, + /// Initialized `LookupTable` account. + LookupTable(LookupTableMeta), +} + +#[cfg_attr(feature = "frozen-abi", derive(AbiExample))] +#[derive(Debug, PartialEq, Eq, Clone)] +pub struct AddressLookupTable<'a> { + pub meta: LookupTableMeta, + pub addresses: Cow<'a, [Pubkey]>, +} + +impl<'a> AddressLookupTable<'a> { + /// Serialize an address table's updated meta data and zero + /// any leftover bytes. + pub fn overwrite_meta_data( + data: &mut [u8], + lookup_table_meta: LookupTableMeta, + ) -> Result<(), InstructionError> { + let meta_data = data + .get_mut(0..LOOKUP_TABLE_META_SIZE) + .ok_or(InstructionError::InvalidAccountData)?; + meta_data.fill(0); + bincode::serialize_into(meta_data, &ProgramState::LookupTable(lookup_table_meta)) + .map_err(|_| InstructionError::GenericError)?; + Ok(()) + } + + /// Get the length of addresses that are active for lookups + pub fn get_active_addresses_len( + &self, + current_slot: Slot, + slot_hashes: &SlotHashes, + ) -> Result { + if !self.meta.is_active(current_slot, slot_hashes) { + // Once a lookup table is no longer active, it can be closed + // at any point, so returning a specific error for deactivated + // lookup tables could result in a race condition. + return Err(anyhow!("Lookup table is not active")); + } + + // If the address table was extended in the same slot in which it is used + // to lookup addresses for another transaction, the recently extended + // addresses are not considered active and won't be accessible. + let active_addresses_len = if current_slot > self.meta.last_extended_slot { + self.addresses.len() + } else { + self.meta.last_extended_slot_start_index as usize + }; + + Ok(active_addresses_len) + } + + /// Lookup addresses for provided table indexes. Since lookups are performed on + /// tables which are not read-locked, this implementation needs to be careful + /// about resolving addresses consistently. + pub fn lookup( + &self, + current_slot: Slot, + indexes: &[u8], + slot_hashes: &SlotHashes, + ) -> Result, AnyhowError> { + let active_addresses_len = self.get_active_addresses_len(current_slot, slot_hashes)?; + let active_addresses = &self.addresses[0..active_addresses_len]; + indexes + .iter() + .map(|idx| active_addresses.get(*idx as usize).cloned()) + .collect::>() + .ok_or(anyhow!("Invalid address index")) + } + + /// Serialize an address table including its addresses + pub fn serialize_for_tests(self) -> Result, InstructionError> { + let mut data = vec![0; LOOKUP_TABLE_META_SIZE]; + Self::overwrite_meta_data(&mut data, self.meta)?; + self.addresses.iter().for_each(|address| { + data.extend_from_slice(address.as_ref()); + }); + Ok(data) + } + + /// Efficiently deserialize an address table without allocating + /// for stored addresses. + pub fn deserialize(data: &'a [u8]) -> Result, InstructionError> { + let program_state: ProgramState = + bincode::deserialize(data).map_err(|_| InstructionError::InvalidAccountData)?; + + let meta = match program_state { + ProgramState::LookupTable(meta) => Ok(meta), + ProgramState::Uninitialized => Err(InstructionError::UninitializedAccount), + }?; + + let raw_addresses_data = data.get(LOOKUP_TABLE_META_SIZE..).ok_or({ + // Should be impossible because table accounts must + // always be LOOKUP_TABLE_META_SIZE in length + InstructionError::InvalidAccountData + })?; + let addresses: &[Pubkey] = bytemuck::try_cast_slice(raw_addresses_data).map_err(|_| { + // Should be impossible because raw address data + // should be aligned and sized in multiples of 32 bytes + InstructionError::InvalidAccountData + })?; + + Ok(Self { + meta, + addresses: Cow::Borrowed(addresses), + }) + } +} diff --git a/rust/switchboard-on-demand-client/src/lut_owner.rs b/rust/switchboard-on-demand-client/src/lut_owner.rs new file mode 100644 index 0000000..8e236e9 --- /dev/null +++ b/rust/switchboard-on-demand-client/src/lut_owner.rs @@ -0,0 +1,99 @@ +#[allow(unused_imports)] +use crate::*; +use crate::LUT_SIGNER_SEED; +use crate::SWITCHBOARD_ON_DEMAND_PROGRAM_ID; +use anyhow_ext::anyhow; +use anyhow_ext::Error as AnyhowError; +use solana_client::nonblocking::rpc_client::RpcClient; +use solana_sdk::account::Account; +#[cfg(not(feature = "solana_sdk_1_16"))] +use solana_sdk::address_lookup_table::instruction::derive_lookup_table_address; +#[cfg(not(feature = "solana_sdk_1_16"))] +use solana_sdk::address_lookup_table::state::AddressLookupTable; +#[cfg(not(feature = "solana_sdk_1_16"))] +use solana_sdk::address_lookup_table::AddressLookupTableAccount; +#[cfg(feature = "solana_sdk_1_16")] +use solana_sdk::address_lookup_table_account::AddressLookupTableAccount; +use solana_sdk::pubkey::Pubkey; + +pub fn find_lut_signer(k: &Pubkey) -> Pubkey { + Pubkey::find_program_address( + &[LUT_SIGNER_SEED, k.as_ref()], + &SWITCHBOARD_ON_DEMAND_PROGRAM_ID, + ) + .0 +} + +pub trait LutOwner { + fn lut_slot(&self) -> u64; +} + +pub async fn load_lookup_table( + client: &RpcClient, + self_key: Pubkey, +) -> Result { + let account = client + .get_account_data(&self_key) + .await + .map_err(|_| anyhow!("LutOwner.load_lookup_table: Oracle not found"))?; + let account = account[8..].to_vec(); + let data = bytemuck::try_from_bytes::(&account) + .map_err(|_| anyhow!("LutOwner.load_lookup_table: Invalid data"))?; + let lut_slot = data.lut_slot(); + let lut_signer = find_lut_signer(&self_key); + let lut_key = derive_lookup_table_address(&lut_signer, lut_slot).0; + let lut_account = client + .get_account_data(&lut_key) + .await + .map_err(|_| anyhow!("LutOwner.load_lookup_table: LUT not found"))?; + let parsed_lut = AddressLookupTable::deserialize(&lut_account) + .map_err(|_| anyhow!("LutOwner.load_lookup_table: Invalid LUT data"))?; + Ok(AddressLookupTableAccount { + addresses: parsed_lut.addresses.to_vec(), + key: lut_key, + }) +} + +fn account_to_vec(account: Option) -> Vec { + match account { + Some(account) => account.data.get(8..).unwrap_or(&[]).to_vec(), + None => vec![], + } +} + +pub async fn load_lookup_tables( + client: &RpcClient, + keys: &[Pubkey], +) -> Result, AnyhowError> { + let accounts_data = client + .get_multiple_accounts(&keys) + .await? + .into_iter() + .map(account_to_vec) + .collect::>(); + let mut lut_keys = Vec::new(); + let mut out = Vec::new(); + for (idx, account) in accounts_data.iter().enumerate() { + let data = bytemuck::try_from_bytes::(&account) + .map_err(|_| anyhow!("LutOwner.load_lookup_tables: Invalid data"))?; + let lut_slot = data.lut_slot(); + let lut_signer = find_lut_signer(&keys[idx]); + let lut_key = derive_lookup_table_address(&lut_signer, lut_slot).0; + lut_keys.push(lut_key); + } + let lut_datas = client + .get_multiple_accounts(&lut_keys) + .await? + .into_iter() + .map(|data| data.unwrap_or_default().data.to_vec()) + .collect::>>(); + for (idx, lut_data) in lut_datas.iter().enumerate() { + let parsed_lut = AddressLookupTable::deserialize(&lut_data) + .map_err(|_| anyhow!("LutOwner.load_lookup_tables: Invalid LUT data"))?; + out.push(AddressLookupTableAccount { + addresses: parsed_lut.addresses.to_vec(), + key: lut_keys[idx], + }); + } + Ok(out) +} diff --git a/rust/switchboard-on-demand-client/src/oracle_job.rs b/rust/switchboard-on-demand-client/src/oracle_job.rs new file mode 100644 index 0000000..a647e42 --- /dev/null +++ b/rust/switchboard-on-demand-client/src/oracle_job.rs @@ -0,0 +1,6005 @@ +// @generated +/// / Represnts a list of tasks to be performed by a switchboard oracle. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct OracleJob { + /// / The chain of tasks to perform for this OracleJob. + #[prost(message, repeated, tag = "1")] + pub tasks: ::prost::alloc::vec::Vec, +} +/// Nested message and enum types in `OracleJob`. +pub mod oracle_job { + /// + /// The adapter will report the text body of a successful HTTP request to the + /// specified url, or return an error if the response status code is greater + /// than or equal to 400. + /// + /// _**Input**_: None + /// + /// _**Returns**_: String representation of the http response. + /// + /// _**Example**_: Basic HttpTask + /// + /// ```json + /// {"httpTask": {"url": " } + /// ``` + /// + /// _**Example**_: HttpTask example with headers + /// + /// ```json + /// { "httpTask": { "url": " "method": "METHOD_POST", "headers": \[ { "key": "MY_HEADER_KEY", "value": "MY_HEADER_VALUE" } \], "body": "{\"MY_BODY_KEY\":\"MY_BODY_VALUE\"}" } } + /// ``` + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct HttpTask { + /// / A string containing the URL to direct this HTTP request to. + #[prost(string, optional, tag = "1")] + pub url: ::core::option::Option<::prost::alloc::string::String>, + /// / The type of HTTP request to make. + #[prost(enumeration = "http_task::Method", optional, tag = "2")] + pub method: ::core::option::Option, + /// / A list of headers to add to this HttpTask. + #[prost(message, repeated, tag = "3")] + pub headers: ::prost::alloc::vec::Vec, + /// / A stringified body (if any) to add to this HttpTask. + #[prost(string, optional, tag = "4")] + pub body: ::core::option::Option<::prost::alloc::string::String>, + } + /// Nested message and enum types in `HttpTask`. + pub mod http_task { + /// / An object that represents a header to add to an HTTP request. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct Header { + /// / A header key such as `Authorization` or `Content-Type` + #[prost(string, optional, tag = "1")] + pub key: ::core::option::Option<::prost::alloc::string::String>, + /// / A value for the given header key like `Basic MYAUTHKEY` or `application/json` + #[prost(string, optional, tag = "2")] + pub value: ::core::option::Option<::prost::alloc::string::String>, + } + /// / An enumeration representing the types of HTTP requests available to make. + #[derive( + Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration, + )] + #[repr(i32)] + pub enum Method { + /// / Unset HTTP method will default to METHOD_GET + Unkown = 0, + /// / Perform an HTTP 'GET' request. + Get = 1, + /// / Perform an HTTP 'POST' request. + Post = 2, + } + impl Method { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + Method::Unkown => "METHOD_UNKOWN", + Method::Get => "METHOD_GET", + Method::Post => "METHOD_POST", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "METHOD_UNKOWN" => Some(Self::Unkown), + "METHOD_GET" => Some(Self::Get), + "METHOD_POST" => Some(Self::Post), + _ => None, + } + } + } + } + /// + /// The adapter walks the path specified and returns the value found at that result. If returning + /// JSON data from the HttpGet or HttpPost adapters, you must use this adapter to parse the response. + /// + /// _**Input**_: String representation of a JSON object. + /// + /// _**Returns**_: A numerical result. + /// + /// _**Example**_: Parses the price field from a JSON object + /// + /// ```json + /// {"jsonParse": {"path": "$.price"} } + /// ``` + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct JsonParseTask { + /// / JSONPath formatted path to the element. + /// / + #[prost(string, optional, tag = "1")] + pub path: ::core::option::Option<::prost::alloc::string::String>, + /// / The technique that will be used to aggregate the results if walking the specified path returns multiple numerical results. + #[prost( + enumeration = "json_parse_task::AggregationMethod", + optional, + tag = "2" + )] + pub aggregation_method: ::core::option::Option, + } + /// Nested message and enum types in `JsonParseTask`. + pub mod json_parse_task { + /// / The methods of combining a list of numerical results. + #[derive( + Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration, + )] + #[repr(i32)] + pub enum AggregationMethod { + None = 0, + /// / Grab the minimum value of the results. + Min = 1, + /// / Grab the maximum value of the results. + Max = 2, + /// / Sum up all of the results. + Sum = 3, + /// / Average all of the results. + Mean = 4, + /// / Grab the median of the results. + Median = 5, + } + impl AggregationMethod { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + AggregationMethod::None => "NONE", + AggregationMethod::Min => "MIN", + AggregationMethod::Max => "MAX", + AggregationMethod::Sum => "SUM", + AggregationMethod::Mean => "MEAN", + AggregationMethod::Median => "MEDIAN", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "NONE" => Some(Self::None), + "MIN" => Some(Self::Min), + "MAX" => Some(Self::Max), + "SUM" => Some(Self::Sum), + "MEAN" => Some(Self::Mean), + "MEDIAN" => Some(Self::Median), + _ => None, + } + } + } + } + /// + /// Returns the median (middle) of all the results returned by the provided subtasks and subjobs. Nested tasks must return a Number. + /// + /// _**Input**_: None + /// + /// _**Returns**_: A numerical result. + /// + /// _**Example**_: Returns the median numerical result of 3 tasks. + /// + /// ```json + /// {"medianTask": {"tasks": \[{"valueTask": {"value": 10}},{"valueTask": {"value": 20}},{"valueTask": {"value": 30}}\]}} + /// ``` + /// + /// _**Example**_: Returns the median numerical result of 3 jobs. + /// + /// ```json + /// {"medianTask": {"jobs": \[{"tasks": [{"httpTask": {"url": " {"path": "$.price"}}\]},{"tasks": \[{"httpTask": {"url": " {"path": "$.price"}}\]},{"tasks": [{"httpTask": {"url": " {"path": "$[0][7]"}}]}]}} + /// ``` + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct MedianTask { + /// / A list of subtasks to process and produce a list of result values. + #[prost(message, repeated, tag = "1")] + pub tasks: ::prost::alloc::vec::Vec, + /// / A list of subjobs to process and produce a list of result values. + #[prost(message, repeated, tag = "2")] + pub jobs: ::prost::alloc::vec::Vec, + /// / The minimum number of values before a successful median can be yielded. + #[prost(int32, optional, tag = "3")] + pub min_successful_required: ::core::option::Option, + /// / The maximum range between the minimum and maximum values before a successful median can be yielded. + #[prost(string, optional, tag = "4")] + pub max_range_percent: ::core::option::Option<::prost::alloc::string::String>, + } + /// + /// Returns the mean (average) of all the results returned by the provided subtasks and subjobs. Nested tasks or jobs must return a Number. + /// + /// _**Input**_: None + /// + /// _**Returns**_: A numerical result. + /// + /// _**Example**_: Returns the mean numerical result of 3 tasks. + /// + /// ```json + /// {"meanTask": {"tasks": \[{"valueTask": {"value": 10}},{"valueTask": {"value": 20}},{"valueTask": {"value": 30}}\]}} + /// ``` + /// + /// _**Example**_: Returns the mean numerical result of 3 jobs. + /// + /// ```json + /// {"meanTask": {"jobs": \[{"tasks": [{"httpTask": {"url": " {"path": "$.price"}}\]},{"tasks": \[{"httpTask": {"url": " {"path": "$.price"}}\]},{"tasks": [{"httpTask": {"url": " {"path": "$[0][7]"}}]}]}} + /// ``` + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct MeanTask { + /// / A list of subtasks to process and produce a list of result values. + #[prost(message, repeated, tag = "1")] + pub tasks: ::prost::alloc::vec::Vec, + /// / A list of subjobs to process and produce a list of result values. + #[prost(message, repeated, tag = "2")] + pub jobs: ::prost::alloc::vec::Vec, + } + /// + /// Returns the maximum value of all the results returned by the provided subtasks and subjobs. Nested tasks or jobs must return a Number. + /// + /// _**Input**_: None + /// + /// _**Returns**_: A numerical result. + /// + /// _**Example**_: Returns the maximum numerical result from 3 tasks. + /// + /// ```json + /// {"maxTask": {"tasks": \[{"valueTask": {"value": 10}},{"valueTask": {"value": 20}},{"valueTask": {"value": 30}}\]}} + /// ``` + /// + /// _**Example**_: Returns the maximum numerical result from 3 jobs. + /// + /// ```json + /// {"maxTask": {"jobs": \[{"tasks": [{"httpTask": {"url": " {"path": "$.price"}}\]},{"tasks": \[{"httpTask": {"url": " {"path": "$.price"}}\]},{"tasks": [{"httpTask": {"url": " {"path": "$[0][7]"}}]}]}} + /// ``` + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct MaxTask { + /// / A list of subtasks to process and produce a list of result values. + #[prost(message, repeated, tag = "1")] + pub tasks: ::prost::alloc::vec::Vec, + /// / A list of subjobs to process and produce a list of result values. + #[prost(message, repeated, tag = "2")] + pub jobs: ::prost::alloc::vec::Vec, + } + /// + /// Returns the minimum value of all the results returned by the provided subtasks and subjobs. Nested tasks or jobs must return a Number. + /// + /// _**Input**_: None + /// + /// _**Returns**_: A numerical result. + /// + /// _**Example**_: Returns the minimum numerical result from 3 tasks. + /// + /// ```json + /// {"minTask": {"tasks": \[{"valueTask": {"value": 10}},{"valueTask": {"value": 20}},{"valueTask": {"value": 30}}\]}} + /// ``` + /// + /// _**Example**_: Returns the minimum numerical result from 3 jobs. + /// + /// ```json + /// {"minTask": {"jobs": \[{"tasks": [{"httpTask": {"url": " {"path": "$.price"}}\]},{"tasks": \[{"httpTask": {"url": " {"path": "$.price"}}\]},{"tasks": [{"httpTask": {"url": " {"path": "$[0][7]"}}]}]}} + /// ``` + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct MinTask { + /// / A list of subtasks to process and produce a list of result values. + #[prost(message, repeated, tag = "1")] + pub tasks: ::prost::alloc::vec::Vec, + /// / A list of subjobs to process and produce a list of result values. + #[prost(message, repeated, tag = "2")] + pub jobs: ::prost::alloc::vec::Vec, + } + /// + /// Returns a specified value. + /// + /// _**Input**_: None + /// + /// _**Returns**_: A numerical result. + /// + /// _**Example**_: Returns the value 10 + /// + /// ```json + /// {"valueTask": {"value": 10} } + /// ``` + /// + /// _**Example**_: Returns the currentRound result of an aggregator + /// + /// ```json + /// {"valueTask": {"aggregatorPubkey": "GvDMxPzN1sCj7L26YDK2HnMRXEQmQ2aemov8YBtPS7vR"} } + /// ``` + /// + /// _**Example**_: Returns the value stored in a CacheTask variable + /// + /// ```json + /// {"valueTask": {"big": "${ONE}"} } + /// ``` + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct ValueTask { + #[prost(oneof = "value_task::Value", tags = "1, 2, 3, 4, 5")] + pub value: ::core::option::Option, + } + /// Nested message and enum types in `ValueTask`. + pub mod value_task { + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Value { + /// / The value that will be returned from this task. + #[prost(double, tag = "1")] + Value(f64), + /// / Specifies an aggregatorr to pull the value of. + #[prost(string, tag = "2")] + AggregatorPubkey(::prost::alloc::string::String), + /// / A stringified big.js. `Accepts variable expansion syntax.` + #[prost(string, tag = "3")] + Big(::prost::alloc::string::String), + /// / A stringified hex number (0x prefix is optional). + #[prost(string, tag = "4")] + Hex(::prost::alloc::string::String), + /// A utf8 string. + #[prost(string, tag = "5")] + Utf8(::prost::alloc::string::String), + } + } + /// + /// Opens and maintains a websocket for light speed data retrieval. + /// + /// _**Input**_: None + /// + /// _**Returns**_: String representation of the websocket subscription message. + /// + /// _**Example**_: Opens a coinbase websocket + /// + /// ```json + /// { "websocketTask": { "url": "wss://ws-feed.pro.coinbase.com", "subscription": "{\"type\":\"subscribe\",\"product_ids\":\[\"BTC-USD\"\],\"channels\":\[\"ticker\",{\"name\":\"ticker\",\"product_ids\":[\"BTC-USD\"\]}]}", "maxDataAgeSeconds": 15, "filter": "$\[?(@.type == 'ticker' && @.product_id == 'BTC-USD')\]" } } + /// ``` + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct WebsocketTask { + /// / The websocket url. + #[prost(string, optional, tag = "1")] + pub url: ::core::option::Option<::prost::alloc::string::String>, + /// / The websocket message to notify of a new subscription. + #[prost(string, optional, tag = "2")] + pub subscription: ::core::option::Option<::prost::alloc::string::String>, + /// / Minimum amount of time required between when the horses are taking out. + #[prost(int32, optional, tag = "3")] + pub max_data_age_seconds: ::core::option::Option, + /// / Incoming message JSONPath filter. + /// / Example: "$\[?(@.channel == 'ticker' && @.market == 'BTC/USD')\]" + #[prost(string, optional, tag = "4")] + pub filter: ::core::option::Option<::prost::alloc::string::String>, + } + /// + /// This task will run the `attempt` on the subtasks in an effort to produce a valid numerical result. If `attempt`. fails to produce an acceptable result, `on_failure` subtasks will be run instead. + /// + /// _**Input**_: The current running numerical result output from a task. + /// + /// _**Returns**_: A numerical result, else run `on_failure` subtasks. + /// + /// _**Example**_: Returns the numerical result from the conditionalTask's subtasks, else `on_failure` returns the numerical result from its subtasks. + /// + /// ```json + /// {"conditionalTask":{"attempt":\[{"tasks":[{"jupiterSwapTask":{"inTokenAddress":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","outTokenAddress":"DUALa4FC2yREwZ59PHeu1un4wis36vHRv5hWVBmzykCJ"}}\]}],"onFailure":\[{"lpExchangeRateTask":{"orcaPoolAddress":"7yJ4gMRJhEoCR48aPE3EAWRmCoygakik81ZS1sajaTnE"}}\]}} + /// ``` + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct ConditionalTask { + /// / A list of subtasks to process in an attempt to produce a valid numerical result. + #[prost(message, repeated, tag = "1")] + pub attempt: ::prost::alloc::vec::Vec, + /// / A list of subtasks that will be run if `attempt` subtasks are unable to produce an acceptable + /// / result. + #[prost(message, repeated, tag = "2")] + pub on_failure: ::prost::alloc::vec::Vec, + } + /// + /// This task will divide a numerical input by a scalar value from a job of subtasks, an aggregator, or a big. + /// + /// _**Input**_: The current running numerical result output from a scalar value, an aggregator, a job of subtasks or a big. + /// + /// _**Returns**_: A numerical result. + /// + /// _**Example**_: Returns the numerical result by dividing by a job of subtasks. + /// + /// ```json + /// {"tasks":\[{"valueTask":{"value":100}},{"divideTask":{"job":{"tasks":[{"valueTask":{"value":10}}\]}}}]} + /// ``` + /// + /// _**Example**_: Returns the numerical result by dividing by an aggregator. + /// + /// ```json + /// {"tasks":\[{"valueTask":{"value":100}},{"divideTask":{"aggregatorPubkey":"GvDMxPzN1sCj7L26YDK2HnMRXEQmQ2aemov8YBtPS7vR"}}\]} + /// ``` + /// + /// _**Example**_: Returns the numerical result by dividing by a big. + /// + /// ```json + /// {"tasks":\[{"cacheTask":{"cacheItems":[{"variableName":"TEN","job":{"tasks":[{"valueTask":{"value":10}}\]}}]}},{"valueTask":{"value":100}},{"divideTask":{"big":"${TEN}"}}]} + /// ``` + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct DivideTask { + #[prost(oneof = "divide_task::Denominator", tags = "1, 2, 3, 4")] + pub denominator: ::core::option::Option, + } + /// Nested message and enum types in `DivideTask`. + pub mod divide_task { + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Denominator { + /// / Specifies a basic scalar denominator to divide by. + #[prost(double, tag = "1")] + Scalar(f64), + /// / Specifies another aggregator resut to divide by. + #[prost(string, tag = "2")] + AggregatorPubkey(::prost::alloc::string::String), + /// / A job whose result is computed before dividing our numerical input by that result. + #[prost(message, tag = "3")] + Job(super::super::OracleJob), + /// / A stringified big.js. `Accepts variable expansion syntax.` + #[prost(string, tag = "4")] + Big(::prost::alloc::string::String), + } + } + /// + /// This task will multiply a numerical input by a scalar value from a job of subtasks, an aggregator, or a big. + /// + /// _**Input**_: The current running numerical result output from a scalar value, an aggregator, a job of subtasks or a big. + /// + /// _**Returns**_: A numerical result. + /// + /// _**Example**_: Returns the numerical result by multiplying by a job of subtasks. + /// + /// ```json + /// {"tasks":\[{"valueTask":{"value":100}},{"multiplyTask":{"job":{"tasks":[{"valueTask":{"value":10}}\]}}}]} + /// ``` + /// + /// _**Example**_: Returns the numerical result by multiplying by an aggregator. + /// + /// ```json + /// {"tasks":\[{"valueTask":{"value":100}},{"multiplyTask":{"aggregatorPubkey":"GvDMxPzN1sCj7L26YDK2HnMRXEQmQ2aemov8YBtPS7vR"}}\]} + /// ``` + /// + /// _**Example**_: Returns the numerical result by multiplying by a big. + /// + /// ```json + /// {"tasks":\[{"cacheTask":{"cacheItems":[{"variableName":"TEN","job":{"tasks":[{"valueTask":{"value":10}}\]}}]}},{"valueTask":{"value":100}},{"multiplyTask":{"big":"${TEN}"}}]} + /// ``` + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct MultiplyTask { + #[prost(oneof = "multiply_task::Multiple", tags = "1, 2, 3, 4")] + pub multiple: ::core::option::Option, + } + /// Nested message and enum types in `MultiplyTask`. + pub mod multiply_task { + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Multiple { + /// / Specifies a scalar to multiply by. + #[prost(double, tag = "1")] + Scalar(f64), + /// / Specifies an aggregator to multiply by. + #[prost(string, tag = "2")] + AggregatorPubkey(::prost::alloc::string::String), + /// / A job whose result is computed before multiplying our numerical input by that result. + #[prost(message, tag = "3")] + Job(super::super::OracleJob), + /// / A stringified big.js. `Accepts variable expansion syntax.` + #[prost(string, tag = "4")] + Big(::prost::alloc::string::String), + } + } + /// + /// This task will add a numerical input by a scalar value from a job of subtasks, an aggregator, or a big. + /// + /// _**Input**_: The current running numerical result output from a scalar value, an aggregator, a job of subtasks or a big. + /// + /// _**Returns**_: A numerical result. + /// + /// _**Example**_: Returns the numerical result by adding by a job of subtasks. + /// + /// ```json + /// {"tasks":\[{"valueTask":{"value":100}},{"addTask":{"job":{"tasks":[{"valueTask":{"value":10}}\]}}}]} + /// ``` + /// + /// _**Example**_: Returns the numerical result by multiplying by an aggregator. + /// + /// ```json + /// {"tasks":\[{"valueTask":{"value":100}},{"addTask":{"aggregatorPubkey":"GvDMxPzN1sCj7L26YDK2HnMRXEQmQ2aemov8YBtPS7vR"}}\]} + /// ``` + /// + /// _**Example**_: Returns the numerical result by multiplying by a big. + /// + /// ```json + /// {"tasks":\[{"cacheTask":{"cacheItems":[{"variableName":"TEN","job":{"tasks":[{"valueTask":{"value":10}}\]}}]}},{"valueTask":{"value":100}},{"addTask":{"big":"${TEN}"}}]} + /// ``` + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct AddTask { + #[prost(oneof = "add_task::Addition", tags = "1, 2, 3, 4")] + pub addition: ::core::option::Option, + } + /// Nested message and enum types in `AddTask`. + pub mod add_task { + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Addition { + /// / Specifies a scalar to add by. + #[prost(double, tag = "1")] + Scalar(f64), + /// / Specifies an aggregator to add by. + #[prost(string, tag = "2")] + AggregatorPubkey(::prost::alloc::string::String), + /// / A job whose result is computed before adding our numerical input by that result. + #[prost(message, tag = "3")] + Job(super::super::OracleJob), + /// / A stringified big.js. `Accepts variable expansion syntax.` + #[prost(string, tag = "4")] + Big(::prost::alloc::string::String), + } + } + /// + /// This task will subtract a numerical input by a scalar value from a job of subtasks, an aggregator, or a big. + /// + /// _**Input**_: The current running numerical result output from a scalar value, an aggregator, a job of subtasks or a big. + /// + /// _**Returns**_: A numerical result. + /// + /// _**Example**_: Returns the numerical result by subtracting by a job of subtasks. + /// + /// ```json + /// {"tasks":\[{"valueTask":{"value":100}},{"subtractTask":{"job":{"tasks":[{"valueTask":{"value":10}}\]}}}]} + /// ``` + /// + /// _**Example**_: Returns the numerical result by multiplying by an aggregator. + /// + /// ```json + /// {"tasks":\[{"valueTask":{"value":100}},{"subtractTask":{"aggregatorPubkey":"GvDMxPzN1sCj7L26YDK2HnMRXEQmQ2aemov8YBtPS7vR"}}\]} + /// ``` + /// + /// _**Example**_: Returns the numerical result by multiplying by a big. + /// + /// ```json + /// {"tasks":\[{"cacheTask":{"cacheItems":[{"variableName":"TEN","job":{"tasks":[{"valueTask":{"value":10}}\]}}]}},{"valueTask":{"value":100}},{"subtractTask":{"big":"${TEN}"}}]} + /// ``` + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct SubtractTask { + #[prost(oneof = "subtract_task::Subtraction", tags = "1, 2, 3, 4")] + pub subtraction: ::core::option::Option, + } + /// Nested message and enum types in `SubtractTask`. + pub mod subtract_task { + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Subtraction { + /// / Specifies a scalar to subtract by. + #[prost(double, tag = "1")] + Scalar(f64), + /// / Specifies an aggregator to subtract by. + #[prost(string, tag = "2")] + AggregatorPubkey(::prost::alloc::string::String), + /// / A job whose result is computed before subtracting our numerical input by that result. + #[prost(message, tag = "3")] + Job(super::super::OracleJob), + /// / A stringified big.js. `Accepts variable expansion syntax.` + #[prost(string, tag = "4")] + Big(::prost::alloc::string::String), + } + } + /// + /// Fetch LP token price info from a number of supported exchanges. + /// + /// See our blog post on [Fair LP Token Oracles](/blog/2022/01/20/Fair-LP-Token-Oracles) + /// + /// *NOTE**: This is not the swap price but the price of the underlying LP token. + /// + /// _**Input**_: None + /// + /// _**Returns**_: The price of an LP token for a given AMM pool. + /// + /// _**Example**_: Fetch the Orca LP token price of the SOL/USDC pool + /// + /// ```json + /// { "lpTokenPriceTask": { "orcaPoolAddress": "APDFRM3HMr8CAGXwKHiu2f5ePSpaiEJhaURwhsRrUUt9" } } + /// ``` + /// + /// _**Example**_: Fetch the fair price Orca LP token price of the SOL/USDC pool + /// + /// ```json + /// { "lpTokenPriceTask": { "orcaPoolAddress": "APDFRM3HMr8CAGXwKHiu2f5ePSpaiEJhaURwhsRrUUt9", "useFairPrice": true, "priceFeedAddresses": \[ "GvDMxPzN1sCj7L26YDK2HnMRXEQmQ2aemov8YBtPS7vR", "BjUgj6YCnFBZ49wF54ddBVA9qu8TeqkFtkbqmZcee8uW" \] } } + /// ``` + /// + /// _**Example**_: Fetch the fair price Raydium LP token price of the SOL/USDC pool + /// + /// ```json + /// { "lpTokenPriceTask": { "raydiumPoolAddress": "58oQChx4yWmvKdwLLZzBi4ChoCc2fqCUWBkwMihLYQo2", "useFairPrice": true,"priceFeedAddresses": \["GvDMxPzN1sCj7L26YDK2HnMRXEQmQ2aemov8YBtPS7vR","BjUgj6YCnFBZ49wF54ddBVA9qu8TeqkFtkbqmZcee8uW" \] } } + /// ``` + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct LpTokenPriceTask { + /// / A list of Switchboard aggregator accounts used to calculate the fair LP price. This ensures the price is based on the previous round to mitigate flash loan price manipulation. + #[prost(string, repeated, tag = "5")] + pub price_feed_addresses: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + /// / A list of OracleJobs to execute in order to yield the price feed jobs to use for the fair price formula. + #[prost(message, repeated, tag = "6")] + pub price_feed_jobs: ::prost::alloc::vec::Vec, + /// / If enabled and price_feed_addresses provided, the oracle will calculate the fair LP price based on the liquidity pool reserves. See our blog post for more information: + #[prost(bool, optional, tag = "7")] + pub use_fair_price: ::core::option::Option, + #[prost(oneof = "lp_token_price_task::PoolAddress", tags = "1, 2, 3, 4")] + pub pool_address: ::core::option::Option, + } + /// Nested message and enum types in `LpTokenPriceTask`. + pub mod lp_token_price_task { + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum PoolAddress { + /// / Mercurial finance pool address. A full list can be found here: + #[prost(string, tag = "1")] + MercurialPoolAddress(::prost::alloc::string::String), + /// / Saber pool address. A full list can be found here: + #[prost(string, tag = "2")] + SaberPoolAddress(::prost::alloc::string::String), + /// / Orca pool address. A full list can be found here: + #[prost(string, tag = "3")] + OrcaPoolAddress(::prost::alloc::string::String), + /// / The Raydium liquidity pool ammId. A full list can be found here: + #[prost(string, tag = "4")] + RaydiumPoolAddress(::prost::alloc::string::String), + } + } + /// + /// Fetch the current swap price for a given liquidity pool + /// + /// _**Input**_: None + /// + /// _**Returns**_: The swap price for a given AMM pool. + /// + /// _**Example**_: Fetch the exchange rate from the Orca SOL/USDC pool + /// + /// ```json + /// { "lpExchangeRateTask": { "orcaPoolAddress": "APDFRM3HMr8CAGXwKHiu2f5ePSpaiEJhaURwhsRrUUt9" } } + /// ``` + /// + /// _**Example**_: Fetch the exchange rate from the Raydium SOL/USDC pool + /// + /// ```json + /// { "lpExchangeRateTask": { "raydiumPoolAddress": "58oQChx4yWmvKdwLLZzBi4ChoCc2fqCUWBkwMihLYQo2" } } + /// ``` + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct LpExchangeRateTask { + /// / Used alongside mercurial_pool_address to specify the input token for a swap. + #[prost(string, optional, tag = "1")] + pub in_token_address: ::core::option::Option<::prost::alloc::string::String>, + /// / Used alongside mercurial_pool_address to specify the output token for a swap. + #[prost(string, optional, tag = "2")] + pub out_token_address: ::core::option::Option<::prost::alloc::string::String>, + #[prost( + oneof = "lp_exchange_rate_task::PoolAddress", + tags = "3, 4, 5, 6, 7, 8" + )] + pub pool_address: ::core::option::Option, + } + /// Nested message and enum types in `LpExchangeRateTask`. + pub mod lp_exchange_rate_task { + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum PoolAddress { + /// / Mercurial finance pool address. A full list can be found here: + #[prost(string, tag = "3")] + MercurialPoolAddress(::prost::alloc::string::String), + /// / Saber pool address. A full list can be found here: + #[prost(string, tag = "4")] + SaberPoolAddress(::prost::alloc::string::String), + /// / **@deprecated** Use orcaPoolAddress + #[prost(string, tag = "5")] + OrcaPoolTokenMintAddress(::prost::alloc::string::String), + /// / The Raydium liquidity pool ammId. A full list can be found here: + #[prost(string, tag = "6")] + RaydiumPoolAddress(::prost::alloc::string::String), + /// / Pool address for an Orca LP pool or whirlpool. + /// / A full list of Orca LP pools can be found here: + #[prost(string, tag = "7")] + OrcaPoolAddress(::prost::alloc::string::String), + /// / The Port reserve pubkey. A full list can be found here: + #[prost(string, tag = "8")] + PortReserveAddress(::prost::alloc::string::String), + } + } + /// / Find a pattern within a string of a previous task and extract a group number. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct RegexExtractTask { + /// / Regex pattern to find. + #[prost(string, optional, tag = "1")] + pub pattern: ::core::option::Option<::prost::alloc::string::String>, + /// / Group number to extract. + #[prost(int32, optional, tag = "2")] + pub group_number: ::core::option::Option, + } + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct XStepPriceTask { + #[prost(oneof = "x_step_price_task::StepSource", tags = "1, 2")] + pub step_source: ::core::option::Option, + } + /// Nested message and enum types in `XStepPriceTask`. + pub mod x_step_price_task { + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum StepSource { + /// / median task containing the job definitions to fetch the STEP/USD price + #[prost(message, tag = "1")] + StepJob(super::MedianTask), + /// / existing aggregator pubkey for STEP/USD + #[prost(string, tag = "2")] + StepAggregatorPubkey(::prost::alloc::string::String), + } + } + /// + /// Takes a twap over a set period for a certain aggregator. Aggregators have an optional history buffer account storing the last N accepted results. The TwapTask will iterate over an aggregators history buffer and calculate the time weighted average of the samples within a given time period. + /// + /// _**Input**_: None + /// + /// _**Returns**_: The time weighted average of an aggregator over a given time period. + /// + /// _**Example**_: The 1hr Twap of the SOL/USD Aggregator, requiring at least 60 samples. + /// + /// ```json + /// { "twapTask": { "aggregatorPubkey": "GvDMxPzN1sCj7L26YDK2HnMRXEQmQ2aemov8YBtPS7vR", "period": 3600, "minSamples": 60, "weightByPropagationTime": true } } + /// ``` + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct TwapTask { + /// / The target aggregator for the TWAP. + #[prost(string, optional, tag = "1")] + pub aggregator_pubkey: ::core::option::Option<::prost::alloc::string::String>, + /// / Period, in seconds, the twap should account for + #[prost(int32, optional, tag = "2")] + pub period: ::core::option::Option, + /// / Weight samples by their propagation time + #[prost(bool, optional, tag = "3")] + pub weight_by_propagation_time: ::core::option::Option, + /// / Minimum number of samples in the history to calculate a valid result + #[prost(uint32, optional, tag = "4")] + pub min_samples: ::core::option::Option, + /// / Ending unix timestamp to collect values up to + #[prost(int32, optional, tag = "5")] + pub ending_unix_timestamp: ::core::option::Option, + /// / Execute the task to get the ending unix timestamp + #[prost(message, optional, tag = "6")] + pub ending_unix_timestamp_task: ::core::option::Option, + } + /// / Fetch the latest swap price on Serum's orderbook + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct SerumSwapTask { + /// / The serum pool to fetch swap price for + #[prost(string, optional, tag = "1")] + pub serum_pool_address: ::core::option::Option<::prost::alloc::string::String>, + } + /// + /// Round the current running result to an exponential power. + /// + /// _**Input**_: The current running numerical result. + /// + /// _**Returns**_: The input raised to an exponential power. + /// + /// _**Example**_: Raise 2 to the power of 3, 2^3 + /// + /// ```json + /// {"tasks":\[{"valueTask":{"value":2}},{"powTask":{"scalar":3}}\]} + /// ``` + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct PowTask { + #[prost(oneof = "pow_task::Exponent", tags = "1, 2, 3")] + pub exponent: ::core::option::Option, + } + /// Nested message and enum types in `PowTask`. + pub mod pow_task { + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Exponent { + /// / Take the working value to the exponent of value. + #[prost(double, tag = "1")] + Scalar(f64), + /// / Take the working value to the exponent of the aggregators value. + #[prost(string, tag = "2")] + AggregatorPubkey(::prost::alloc::string::String), + /// / A stringified big.js. `Accepts variable expansion syntax.` + #[prost(string, tag = "3")] + Big(::prost::alloc::string::String), + } + } + /// / Fetch the lending rates for various Solana protocols + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct LendingRateTask { + /// / 01, apricot, francium, jet, larix, mango, port, solend, tulip + #[prost(string, optional, tag = "1")] + pub protocol: ::core::option::Option<::prost::alloc::string::String>, + /// / A token mint address supported by the chosen protocol + #[prost(string, optional, tag = "2")] + pub asset_mint: ::core::option::Option<::prost::alloc::string::String>, + #[prost(enumeration = "lending_rate_task::Field", optional, tag = "3")] + pub field: ::core::option::Option, + } + /// Nested message and enum types in `LendingRateTask`. + pub mod lending_rate_task { + #[derive( + Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration, + )] + #[repr(i32)] + pub enum Field { + /// / deposit lending rate + DepositRate = 0, + /// / borrow lending rate + BorrowRate = 1, + } + impl Field { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + Field::DepositRate => "FIELD_DEPOSIT_RATE", + Field::BorrowRate => "FIELD_BORROW_RATE", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "FIELD_DEPOSIT_RATE" => Some(Self::DepositRate), + "FIELD_BORROW_RATE" => Some(Self::BorrowRate), + _ => None, + } + } + } + } + /// / Fetch the current price for a Mango perpetual market + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct MangoPerpMarketTask { + /// / Mainnet address for a mango perpetual market. A full list can be found here: + #[prost(string, optional, tag = "1")] + pub perp_market_address: ::core::option::Option<::prost::alloc::string::String>, + } + /// + /// Fetch the simulated price for a swap on JupiterSwap. + /// + /// _**Input**_: None + /// + /// _**Returns**_: The swap price on Jupiter for a given input and output token mint address. + /// + /// _**Example**_: Fetch the JupiterSwap price for exchanging 1 SOL into USDC. + /// + /// ```json + /// { "jupiterSwapTask": { "inTokenAddress": "So11111111111111111111111111111111111111112", "outTokenAddress": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v" } } + /// ``` + /// + /// _**Example**_: Fetch the JupiterSwap price for exchanging 1000 SOL into USDC. + /// + /// ```json + /// { "jupiterSwapTask": { "inTokenAddress": "So11111111111111111111111111111111111111112", "outTokenAddress": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", "baseAmount": "1000" } } + /// ``` + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct JupiterSwapTask { + /// / The input token address. + #[prost(string, optional, tag = "1")] + pub in_token_address: ::core::option::Option<::prost::alloc::string::String>, + /// / The output token address. + #[prost(string, optional, tag = "2")] + pub out_token_address: ::core::option::Option<::prost::alloc::string::String>, + /// / The allowable slippage on the swap in decimal form (e.g. 0.5 is 0.5% slippage) + #[prost(double, optional, tag = "9")] + pub slippage: ::core::option::Option, + #[prost(oneof = "jupiter_swap_task::RoutesFilters", tags = "4, 5")] + pub routes_filters: ::core::option::Option, + #[prost(oneof = "jupiter_swap_task::SwapAmount", tags = "3, 6, 7, 8")] + pub swap_amount: ::core::option::Option, + } + /// Nested message and enum types in `JupiterSwapTask`. + pub mod jupiter_swap_task { + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct FilterList { + /// / A list of Jupiter AMM labels to allow or deny (e.g. 'Raydium', 'Orca') + #[prost(string, repeated, tag = "1")] + pub labels: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + } + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum RoutesFilters { + /// / A list of AMM markets to allow. + #[prost(message, tag = "4")] + AllowList(FilterList), + /// / A list of AMM markets to deny. + #[prost(message, tag = "5")] + DenyList(FilterList), + } + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum SwapAmount { + /// / The amount of `in_token_address` tokens to swap. + #[prost(double, tag = "3")] + BaseAmount(f64), + /// / The amount of `out_token_address` tokens to swap. + #[prost(double, tag = "6")] + QuoteAmount(f64), + /// / The amount of `in_token_address` tokens to swap. + #[prost(string, tag = "7")] + BaseAmountString(::prost::alloc::string::String), + /// / The amount of `out_token_address` tokens to swap. + #[prost(string, tag = "8")] + QuoteAmountString(::prost::alloc::string::String), + } + } + /// / Fetch the current price of a perpetual market. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct PerpMarketTask { + #[prost(oneof = "perp_market_task::MarketAddress", tags = "1, 2, 3, 4")] + pub market_address: ::core::option::Option, + } + /// Nested message and enum types in `PerpMarketTask`. + pub mod perp_market_task { + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum MarketAddress { + /// / Market address for a mango perpetual market. A full list can be found here: + #[prost(string, tag = "1")] + MangoMarketAddress(::prost::alloc::string::String), + /// / Market address for a drift perpetual market. A full list can be found here: + #[prost(string, tag = "2")] + DriftMarketAddress(::prost::alloc::string::String), + /// / Market address for a zeta perpetual market. + #[prost(string, tag = "3")] + ZetaMarketAddress(::prost::alloc::string::String), + /// / Market address for a 01 protocol perpetual market. + #[prost(string, tag = "4")] + ZoMarketAddress(::prost::alloc::string::String), + } + } + /// + /// Fetch the current price of a Solana oracle protocol. + /// + /// _**Input**_: None + /// + /// _**Returns**_: The current price of an on-chain oracle. + /// + /// _**Example**_: The Switchboard SOL/USD oracle price. + /// + /// ```json + /// { "oracleTask": { "switchboardAddress": "GvDMxPzN1sCj7L26YDK2HnMRXEQmQ2aemov8YBtPS7vR" } } + /// ``` + /// + /// _**Example**_: The Pyth SOL/USD oracle price. + /// + /// ```json + /// { "oracleTask": { "pythAddress": "H6ARHf6YXhGYeQfUzQNGk6rDNnLBQKrenN712K4AQJEG" } } + /// ``` + /// + /// _**Example**_: The Chainlink SOL/USD oracle price. + /// + /// ```json + /// { "oracleTask": { "chainlinkAddress": "CcPVS9bqyXbD9cLnTbhhHazLsrua8QMFUHTutPtjyDzq" } } + /// ``` + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct OracleTask { + /// / Value (as a percentage) that the lower bound confidence interval is of the actual value. + /// / Confidence intervals that are larger that this treshold are rejected. + /// / + /// / The confidence interval should be provided as a raw percentage value. For example, to + /// / represent 10%, enter the value as 10, not 0.1. + #[prost(double, optional, tag = "4")] + pub pyth_allowed_confidence_interval: ::core::option::Option, + #[prost(message, optional, tag = "5")] + pub chainlink_configs: ::core::option::Option, + #[prost(message, optional, tag = "6")] + pub pyth_configs: ::core::option::Option, + #[prost(oneof = "oracle_task::AggregatorAddress", tags = "1, 2, 3")] + pub aggregator_address: ::core::option::Option, + } + /// Nested message and enum types in `OracleTask`. + pub mod oracle_task { + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct ChainlinkConfigs { + #[prost(string, optional, tag = "1")] + pub provider: ::core::option::Option<::prost::alloc::string::String>, + } + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct PythConfigs { + #[prost(string, optional, tag = "1")] + pub hermes_url: ::core::option::Option<::prost::alloc::string::String>, + } + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum AggregatorAddress { + /// / Mainnet address of a Switchboard feed. Switchboard is decentralized and allows anyone to build their own feed. + #[prost(string, tag = "1")] + SwitchboardAddress(::prost::alloc::string::String), + /// / Mainnet address for a Pyth feed. A full list can be found here: + #[prost(string, tag = "2")] + PythAddress(::prost::alloc::string::String), + /// / Mainnet address for a Chainlink feed. A full list can be found here: + #[prost(string, tag = "3")] + ChainlinkAddress(::prost::alloc::string::String), + } + } + /// / Load a parse an Anchor based solana account. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct AnchorFetchTask { + /// / Owning program of the account to parse. + #[prost(string, optional, tag = "1")] + pub program_id: ::core::option::Option<::prost::alloc::string::String>, + /// / The account to parse. + #[prost(string, optional, tag = "2")] + pub account_address: ::core::option::Option<::prost::alloc::string::String>, + } + /// / Fetch the JSON representation of an SPL Stake Pool account. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct SplStakePoolTask { + /// / The pubkey of the SPL Stake Pool. + #[prost(string, optional, tag = "1")] + pub pubkey: ::core::option::Option<::prost::alloc::string::String>, + } + /// / Fetch the JSON representation of an SPL token mint. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct SplTokenParseTask { + #[prost(oneof = "spl_token_parse_task::AccountAddress", tags = "1, 2")] + pub account_address: ::core::option::Option, + } + /// Nested message and enum types in `SplTokenParseTask`. + pub mod spl_token_parse_task { + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum AccountAddress { + /// / The publicKey of a token account to fetch the mintInfo for. + #[prost(string, tag = "1")] + TokenAccountAddress(::prost::alloc::string::String), + /// / The publicKey of the token mint address. + #[prost(string, tag = "2")] + MintAddress(::prost::alloc::string::String), + } + } + /// / Fetch the swap price from UniSwap. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct UniswapExchangeRateTask { + /// / The input token address. + #[prost(string, optional, tag = "1")] + pub in_token_address: ::core::option::Option<::prost::alloc::string::String>, + /// / The output token address. + #[prost(string, optional, tag = "2")] + pub out_token_address: ::core::option::Option<::prost::alloc::string::String>, + /// / The amount of tokens to swap. + #[prost(double, optional, tag = "3")] + pub in_token_amount: ::core::option::Option, + /// / The allowable slippage in percent for the swap. + #[prost(double, optional, tag = "4")] + pub slippage: ::core::option::Option, + /// / The RPC provider to use for the swap. + #[prost(string, optional, tag = "5")] + pub provider: ::core::option::Option<::prost::alloc::string::String>, + /// / The version of the Uniswap exchange to use. + #[prost( + enumeration = "uniswap_exchange_rate_task::Version", + optional, + tag = "6" + )] + pub version: ::core::option::Option, + #[prost(string, optional, tag = "7")] + pub router_address: ::core::option::Option<::prost::alloc::string::String>, + #[prost(string, optional, tag = "8")] + pub factory_address: ::core::option::Option<::prost::alloc::string::String>, + #[prost(string, optional, tag = "9")] + pub quoter_address: ::core::option::Option<::prost::alloc::string::String>, + } + /// Nested message and enum types in `UniswapExchangeRateTask`. + pub mod uniswap_exchange_rate_task { + #[derive( + Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration, + )] + #[repr(i32)] + pub enum Version { + V2Deprecated = 0, + V3Deprecated = 1, + V2 = 2, + V3 = 3, + } + impl Version { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + Version::V2Deprecated => "VERSION_V2_DEPRECATED", + Version::V3Deprecated => "VERSION_V3_DEPRECATED", + Version::V2 => "VERSION_V2", + Version::V3 => "VERSION_V3", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "VERSION_V2_DEPRECATED" => Some(Self::V2Deprecated), + "VERSION_V3_DEPRECATED" => Some(Self::V3Deprecated), + "VERSION_V2" => Some(Self::V2), + "VERSION_V3" => Some(Self::V3), + _ => None, + } + } + } + } + /// / Fetch the swap price from SushiSwap. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct SushiswapExchangeRateTask { + /// / The input token address. + #[prost(string, optional, tag = "1")] + pub in_token_address: ::core::option::Option<::prost::alloc::string::String>, + /// / The output token address. + #[prost(string, optional, tag = "2")] + pub out_token_address: ::core::option::Option<::prost::alloc::string::String>, + /// / The amount of tokens to swap. + #[prost(double, optional, tag = "3")] + pub in_token_amount: ::core::option::Option, + /// / The allowable slippage in percent for the swap. + #[prost(double, optional, tag = "4")] + pub slippage: ::core::option::Option, + /// / The RPC provider to use for the swap. + #[prost(string, optional, tag = "5")] + pub provider: ::core::option::Option<::prost::alloc::string::String>, + } + /// / Fetch the swap price from PancakeSwap. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct PancakeswapExchangeRateTask { + /// / The input token address. + #[prost(string, optional, tag = "1")] + pub in_token_address: ::core::option::Option<::prost::alloc::string::String>, + /// / The output token address. + #[prost(string, optional, tag = "2")] + pub out_token_address: ::core::option::Option<::prost::alloc::string::String>, + /// / The amount of tokens to swap. + #[prost(double, optional, tag = "3")] + pub in_token_amount: ::core::option::Option, + /// / The allowable slippage in percent for the swap. + #[prost(double, optional, tag = "4")] + pub slippage: ::core::option::Option, + /// / The RPC provider to use for the swap. + #[prost(string, optional, tag = "5")] + pub provider: ::core::option::Option<::prost::alloc::string::String>, + } + /// + /// Execute a job and store the result in a variable to reference later. + /// + /// _**Input**_: None + /// + /// _**Returns**_: The input + /// + /// _**Example**_: CacheTask storing ${ONE} = 1 + /// + /// ```json + /// { "cacheTask": { "cacheItems": \[ { "variableName": "ONE", "job": { "tasks": [ { "valueTask": { "value": 1 } } \] } } ] } } + /// ``` + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct CacheTask { + /// / A list of cached variables to reference in the job with `${VARIABLE_NAME}`. + #[prost(message, repeated, tag = "1")] + pub cache_items: ::prost::alloc::vec::Vec, + } + /// Nested message and enum types in `CacheTask`. + pub mod cache_task { + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct CacheItem { + /// / The name of the variable to store in cache to reference later with `${VARIABLE_NAME}`. + #[prost(string, optional, tag = "1")] + pub variable_name: ::core::option::Option<::prost::alloc::string::String>, + /// / The OracleJob to execute to yield the value to store in cache. + #[prost(message, optional, tag = "2")] + pub job: ::core::option::Option, + } + } + /// / Return the difference between an oracle's clock and the current timestamp at `SYSVAR_CLOCK_PUBKEY`. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct SysclockOffsetTask {} + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct MarinadeStateTask {} + /// / Fetch the account data in a stringified buffer format. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct SolanaAccountDataFetchTask { + /// / The on-chain account to fetch the account data from. + #[prost(string, optional, tag = "1")] + pub pubkey: ::core::option::Option<::prost::alloc::string::String>, + #[prost( + enumeration = "solana_account_data_fetch_task::Network", + optional, + tag = "2" + )] + pub network: ::core::option::Option, + } + /// Nested message and enum types in `SolanaAccountDataFetchTask`. + pub mod solana_account_data_fetch_task { + #[derive( + Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration, + )] + #[repr(i32)] + pub enum Network { + Mainnet = 0, + Testnet = 1, + Devnet = 2, + } + impl Network { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + Network::Mainnet => "NETWORK_MAINNET", + Network::Testnet => "NETWORK_TESTNET", + Network::Devnet => "NETWORK_DEVNET", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "NETWORK_MAINNET" => Some(Self::Mainnet), + "NETWORK_TESTNET" => Some(Self::Testnet), + "NETWORK_DEVNET" => Some(Self::Devnet), + _ => None, + } + } + } + } + /// + /// Return a timestamp from a crontab instruction. + /// + /// _**Input**_: None + /// + /// _**Returns**_: A timestamp + /// + /// _**Example**_: Return the unix timestamp for the on-chain SYSCLOCK + /// + /// ```json + /// {"cronParseTask":{"cronPattern":"* * * * * *","clockOffset":0,"clock":"SYSCLOCK"}} + /// ``` + /// + /// _**Example**_: Return the unix timestamp for next friday at 5pm UTC + /// + /// ```json + /// {"cronParseTask":{"cronPattern":"0 17 * * 5","clockOffset":0,"clock":0}} + /// ``` + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct CronParseTask { + /// / The cron pattern to parse. + #[prost(string, optional, tag = "1")] + pub cron_pattern: ::core::option::Option<::prost::alloc::string::String>, + /// / The timestamp offset to calculate the next run. + #[prost(int32, optional, tag = "2")] + pub clock_offset: ::core::option::Option, + /// / Use the TaskRunner's clock or the on-chain SYSCLOCK. + #[prost(enumeration = "cron_parse_task::ClockType", optional, tag = "3")] + pub clock: ::core::option::Option, + } + /// Nested message and enum types in `CronParseTask`. + pub mod cron_parse_task { + #[derive( + Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration, + )] + #[repr(i32)] + pub enum ClockType { + /// / Use the TaskRunners system clock for the current time. + Oracle = 0, + /// / Use the on-chain SYSCLOCK for the current time. + Sysclock = 1, + } + impl ClockType { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + ClockType::Oracle => "ORACLE", + ClockType::Sysclock => "SYSCLOCK", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "ORACLE" => Some(Self::Oracle), + "SYSCLOCK" => Some(Self::Sysclock), + _ => None, + } + } + } + } + /// / Return the deserialized value from a stringified buffer. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct BufferLayoutParseTask { + /// / The buffer offset to start deserializing from. + #[prost(uint32, optional, tag = "1")] + pub offset: ::core::option::Option, + /// / The endianness of the stored value. + #[prost(enumeration = "buffer_layout_parse_task::Endian", optional, tag = "2")] + pub endian: ::core::option::Option, + /// / The type of value to deserialize. + #[prost( + enumeration = "buffer_layout_parse_task::BufferParseType", + optional, + tag = "3" + )] + pub r#type: ::core::option::Option, + } + /// Nested message and enum types in `BufferLayoutParseTask`. + pub mod buffer_layout_parse_task { + #[derive( + Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration, + )] + #[repr(i32)] + pub enum Endian { + /// Use little endian byte order. + LittleEndian = 0, + /// Use big endian byte order. + BigEndian = 1, + } + impl Endian { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + Endian::LittleEndian => "LITTLE_ENDIAN", + Endian::BigEndian => "BIG_ENDIAN", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "LITTLE_ENDIAN" => Some(Self::LittleEndian), + "BIG_ENDIAN" => Some(Self::BigEndian), + _ => None, + } + } + } + #[derive( + Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration, + )] + #[repr(i32)] + pub enum BufferParseType { + /// / A public key. + Pubkey = 1, + /// / A boolean. + Bool = 2, + /// / An 8-bit unsigned value. + U8 = 3, + /// / An 8-bit signed value. + I8 = 4, + /// / A 16-bit unsigned value. + U16 = 5, + /// / A 16-bit signed value. + I16 = 6, + /// / A 32-bit unsigned value. + U32 = 7, + /// / A 32-bit signed value. + I32 = 8, + /// / A 32-bit IEEE floating point value. + F32 = 9, + /// / A 64-bit unsigned value. + U64 = 10, + /// / A 64-bit signed value. + I64 = 11, + /// / A 64-bit IEEE floating point value. + F64 = 12, + /// / A 128-bit unsigned value. + U128 = 13, + /// / A 128-bit signed value. + I128 = 14, + } + impl BufferParseType { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + BufferParseType::Pubkey => "pubkey", + BufferParseType::Bool => "bool", + BufferParseType::U8 => "u8", + BufferParseType::I8 => "i8", + BufferParseType::U16 => "u16", + BufferParseType::I16 => "i16", + BufferParseType::U32 => "u32", + BufferParseType::I32 => "i32", + BufferParseType::F32 => "f32", + BufferParseType::U64 => "u64", + BufferParseType::I64 => "i64", + BufferParseType::F64 => "f64", + BufferParseType::U128 => "u128", + BufferParseType::I128 => "i128", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "pubkey" => Some(Self::Pubkey), + "bool" => Some(Self::Bool), + "u8" => Some(Self::U8), + "i8" => Some(Self::I8), + "u16" => Some(Self::U16), + "i16" => Some(Self::I16), + "u32" => Some(Self::U32), + "i32" => Some(Self::I32), + "f32" => Some(Self::F32), + "u64" => Some(Self::U64), + "i64" => Some(Self::I64), + "f64" => Some(Self::F64), + "u128" => Some(Self::U128), + "i128" => Some(Self::I128), + _ => None, + } + } + } + } + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct HistoryFunctionTask { + #[prost(enumeration = "history_function_task::Method", optional, tag = "1")] + pub method: ::core::option::Option, + #[prost(string, optional, tag = "2")] + pub aggregator_address: ::core::option::Option<::prost::alloc::string::String>, + #[prost(uint32, optional, tag = "3")] + pub period: ::core::option::Option, + } + /// Nested message and enum types in `HistoryFunctionTask`. + pub mod history_function_task { + #[derive( + Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration, + )] + #[repr(i32)] + pub enum Method { + Min = 0, + Max = 1, + } + impl Method { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + Method::Min => "METHOD_MIN", + Method::Max => "METHOD_MAX", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "METHOD_MIN" => Some(Self::Min), + "METHOD_MAX" => Some(Self::Max), + _ => None, + } + } + } + } + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct VwapTask { + #[prost(string, optional, tag = "1")] + pub price_aggregator_address: ::core::option::Option<::prost::alloc::string::String>, + #[prost(string, optional, tag = "2")] + pub volume_aggregator_address: ::core::option::Option<::prost::alloc::string::String>, + #[prost(uint32, optional, tag = "3")] + pub period: ::core::option::Option, + } + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct EwmaTask { + #[prost(string, optional, tag = "1")] + pub aggregator_address: ::core::option::Option<::prost::alloc::string::String>, + #[prost(int32, optional, tag = "2")] + pub period: ::core::option::Option, + #[prost(double, optional, tag = "3")] + pub lambda: ::core::option::Option, + } + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct ComparisonTask { + /// / The type of operator to use on the left (lhs) and right (rhs) operand. + #[prost(enumeration = "comparison_task::Operation", optional, tag = "1")] + pub op: ::core::option::Option, + /// / The OracleJob to execute if the condition evaluates to true. + #[prost(message, optional, tag = "6")] + pub on_true: ::core::option::Option, + /// / The result to use if the condition evaluates to true. Can be set to a `${CACHE_KEY}`. + #[prost(string, optional, tag = "7")] + pub on_true_value: ::core::option::Option<::prost::alloc::string::String>, + /// / The OracleJob to execute if the condition evaluates to false. + #[prost(message, optional, tag = "8")] + pub on_false: ::core::option::Option, + /// / The result to use if the condition evaluates to false. Can be set to a `${CACHE_KEY}`. + #[prost(string, optional, tag = "9")] + pub on_false_value: ::core::option::Option<::prost::alloc::string::String>, + /// / The OracleJob to execute if the condition fails to evaluate. + #[prost(message, optional, tag = "10")] + pub on_failure: ::core::option::Option, + /// / The result to use if the condition fails to evaluate. Can be set to a `${CACHE_KEY}`. + #[prost(string, optional, tag = "11")] + pub on_failure_value: ::core::option::Option<::prost::alloc::string::String>, + #[prost(oneof = "comparison_task::Lhs", tags = "2, 3")] + pub lhs: ::core::option::Option, + #[prost(oneof = "comparison_task::Rhs", tags = "4, 5")] + pub rhs: ::core::option::Option, + } + /// Nested message and enum types in `ComparisonTask`. + pub mod comparison_task { + #[derive( + Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration, + )] + #[repr(i32)] + pub enum Operation { + /// / Use the equals to '==' operator. + Eq = 0, + /// / Use the greater than '>' operator. + Gt = 1, + /// / Use the less than '<' operator. + Lt = 2, + } + impl Operation { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + Operation::Eq => "OPERATION_EQ", + Operation::Gt => "OPERATION_GT", + Operation::Lt => "OPERATION_LT", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "OPERATION_EQ" => Some(Self::Eq), + "OPERATION_GT" => Some(Self::Gt), + "OPERATION_LT" => Some(Self::Lt), + _ => None, + } + } + } + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Lhs { + /// / OracleJob where the executed result is equal to the left hand side operand. + #[prost(message, tag = "2")] + Lhs(super::super::OracleJob), + /// / String or `${CACHE_KEY}` representing the left hand side operand. + #[prost(string, tag = "3")] + LhsValue(::prost::alloc::string::String), + } + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Rhs { + /// / OracleJob where the executed result is equal to the right hand side operand. + #[prost(message, tag = "4")] + Rhs(super::super::OracleJob), + /// / String or `${CACHE_KEY}` representing the right hand side operand. + #[prost(string, tag = "5")] + RhsValue(::prost::alloc::string::String), + } + } + /// + /// Round the current running result to a set number of decimal places. + /// + /// _**Input**_: The current running numerical result. + /// + /// _**Returns**_: The running result rounded to a set number of decimal places. + /// + /// _**Example**_: Round down the running resul to 8 decimal places + /// + /// ```json + /// { "roundTask": { "method": "METHOD_ROUND_DOWN", "decimals": 8 } } + /// ``` + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct RoundTask { + /// / The rounding method to use. + #[prost(enumeration = "round_task::Method", optional, tag = "1")] + pub method: ::core::option::Option, + /// / The number of decimals to round to. + #[prost(int32, optional, tag = "2")] + pub decimals: ::core::option::Option, + } + /// Nested message and enum types in `RoundTask`. + pub mod round_task { + #[derive( + Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration, + )] + #[repr(i32)] + pub enum Method { + /// / Round the result down. + RoundUp = 0, + /// / Round the result up. + RoundDown = 1, + } + impl Method { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + Method::RoundUp => "METHOD_ROUND_UP", + Method::RoundDown => "METHOD_ROUND_DOWN", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "METHOD_ROUND_UP" => Some(Self::RoundUp), + "METHOD_ROUND_DOWN" => Some(Self::RoundDown), + _ => None, + } + } + } + } + /// + /// Bound the running result to an upper/lower bound. This is typically the last task in an OracleJob. + /// + /// _**Input**_: The current running numerical result. + /// + /// _**Returns**_: The running result bounded to an upper or lower bound if it exceeds a given threshold. + /// + /// _**Example**_: Bound the running result to a value between 0.90 and 1.10 + /// + /// ```json + /// { "boundTask": { "lowerBoundValue": "0.90","onExceedsLowerBoundValue": "0.90","upperBoundValue": "1.10","onExceedsUpperBoundValue": "1.10" } } + /// ``` + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct BoundTask { + /// / The OracleJob to execute for the lower bound value. + #[prost(message, optional, tag = "1")] + pub lower_bound: ::core::option::Option, + /// / The value to use for the lower bound. Can be set to a `${CACHE_KEY}`. + #[prost(string, optional, tag = "2")] + pub lower_bound_value: ::core::option::Option<::prost::alloc::string::String>, + /// / The OracleJob to execute for the upper bound value. + #[prost(message, optional, tag = "3")] + pub upper_bound: ::core::option::Option, + /// / The value to use for the upper bound. Can be set to a `${CACHE_KEY}`. + #[prost(string, optional, tag = "4")] + pub upper_bound_value: ::core::option::Option<::prost::alloc::string::String>, + /// / The OracleJob to execute if the upper bound is exceeded. + #[prost(message, optional, tag = "5")] + pub on_exceeds_upper_bound: ::core::option::Option, + /// / The value to use if the upper bound is exceeded. Can be set to a `${CACHE_KEY}`. + #[prost(string, optional, tag = "6")] + pub on_exceeds_upper_bound_value: ::core::option::Option<::prost::alloc::string::String>, + /// / The OracleJob to execute if the lower bound is exceeded. + #[prost(message, optional, tag = "7")] + pub on_exceeds_lower_bound: ::core::option::Option, + /// / The value to use if the lower bound is exceeded. Can be set to a `${CACHE_KEY}`. + #[prost(string, optional, tag = "8")] + pub on_exceeds_lower_bound_value: ::core::option::Option<::prost::alloc::string::String>, + } + /// + /// Securely request secrets from a Switchboard SecretsServer that are owned by a specific authority. Any secrets that are returned for the current feed will then be unwrapped into variables to be accessed later. + /// + /// _**Input**_: None + /// + /// _**Returns**_: The input + /// + /// _**Example**_: SecretsTask + /// + /// ```json + /// { "secretsTask": { "authority": "Accb21tUCWocJea6Uk3DgrNZawgmKegDVeHw8cGMDPi5" } } + /// ``` + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct SecretsTask { + /// / The authority of the secrets that are to be requested. + #[prost(string, optional, tag = "1")] + pub authority: ::core::option::Option<::prost::alloc::string::String>, + /// / The url of the server to request secrets from. The default is + #[prost(string, optional, tag = "2")] + pub url: ::core::option::Option<::prost::alloc::string::String>, + } + /// / Grab the price of an Sanctum LST relative to SOL. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct SanctumLstPriceTask { + /// / The address of the LST mint. + /// / + /// / e.g. INF - 5oVNBeEEQvYi1cX3ir8Dx5n1P7pdxydbGF2X4TxVusJm + #[prost(string, optional, tag = "1")] + pub lst_mint: ::core::option::Option<::prost::alloc::string::String>, + } + /// / OndoUsdyTask represents a task that computes the price of USDY relative to USD using a + /// / specified strategy. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct OndoUsdyTask { + /// / The strategy used to determine the price of USDY. + #[prost(enumeration = "ondo_usdy_task::Strategy", optional, tag = "1")] + pub strategy: ::core::option::Option, + } + /// Nested message and enum types in `OndoUsdyTask`. + pub mod ondo_usdy_task { + /// / Strategy specifies the method used to determine the price of USDY. + /// / + /// / - STRATEGY_FAIR_VALUE: Computes the price based on a fair value model. + /// / - STRATEGY_MARKET: Fetches the price directly from the market. + #[derive( + Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration, + )] + #[repr(i32)] + pub enum Strategy { + FairValue = 0, + Market = 1, + } + impl Strategy { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + Strategy::FairValue => "STRATEGY_FAIR_VALUE", + Strategy::Market => "STRATEGY_MARKET", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "STRATEGY_FAIR_VALUE" => Some(Self::FairValue), + "STRATEGY_MARKET" => Some(Self::Market), + _ => None, + } + } + } + } + /// / Grab the swap price from a Meteora pool. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct MeteoraSwapTask { + /// / The address of the pool. + #[prost(string, optional, tag = "1")] + pub pool: ::core::option::Option<::prost::alloc::string::String>, + /// / The pool type. + #[prost(enumeration = "meteora_swap_task::Type", optional, tag = "2")] + pub r#type: ::core::option::Option, + } + /// Nested message and enum types in `MeteoraSwapTask`. + pub mod meteora_swap_task { + #[derive( + Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration, + )] + #[repr(i32)] + pub enum Type { + Dlmm = 0, + Standard = 1, + } + impl Type { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + Type::Dlmm => "TYPE_DLMM", + Type::Standard => "TYPE_STANDARD", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "TYPE_DLMM" => Some(Self::Dlmm), + "TYPE_STANDARD" => Some(Self::Standard), + _ => None, + } + } + } + } + /// / Represents a singular operation performed by an oracle to yield an eventual numerical result. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct Task { + #[prost( + oneof = "task::Task", + tags = "1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50" + )] + pub task: ::core::option::Option, + } + /// Nested message and enum types in `Task`. + pub mod task { + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Task { + #[prost(message, tag = "1")] + HttpTask(super::HttpTask), + #[prost(message, tag = "2")] + JsonParseTask(super::JsonParseTask), + #[prost(message, tag = "4")] + MedianTask(super::MedianTask), + #[prost(message, tag = "5")] + MeanTask(super::MeanTask), + #[prost(message, tag = "6")] + WebsocketTask(super::WebsocketTask), + #[prost(message, tag = "7")] + DivideTask(super::DivideTask), + #[prost(message, tag = "8")] + MultiplyTask(super::MultiplyTask), + #[prost(message, tag = "9")] + LpTokenPriceTask(super::LpTokenPriceTask), + #[prost(message, tag = "10")] + LpExchangeRateTask(super::LpExchangeRateTask), + #[prost(message, tag = "11")] + ConditionalTask(super::ConditionalTask), + #[prost(message, tag = "12")] + ValueTask(super::ValueTask), + #[prost(message, tag = "13")] + MaxTask(super::MaxTask), + #[prost(message, tag = "14")] + RegexExtractTask(super::RegexExtractTask), + #[prost(message, tag = "15")] + XstepPriceTask(super::XStepPriceTask), + #[prost(message, tag = "16")] + AddTask(super::AddTask), + #[prost(message, tag = "17")] + SubtractTask(super::SubtractTask), + #[prost(message, tag = "18")] + TwapTask(super::TwapTask), + #[prost(message, tag = "19")] + SerumSwapTask(super::SerumSwapTask), + #[prost(message, tag = "20")] + PowTask(super::PowTask), + #[prost(message, tag = "21")] + LendingRateTask(super::LendingRateTask), + #[prost(message, tag = "22")] + MangoPerpMarketTask(super::MangoPerpMarketTask), + #[prost(message, tag = "23")] + JupiterSwapTask(super::JupiterSwapTask), + #[prost(message, tag = "24")] + PerpMarketTask(super::PerpMarketTask), + #[prost(message, tag = "25")] + OracleTask(super::OracleTask), + #[prost(message, tag = "26")] + AnchorFetchTask(super::AnchorFetchTask), + #[prost(message, tag = "29")] + SplStakePoolTask(super::SplStakePoolTask), + #[prost(message, tag = "30")] + SplTokenParseTask(super::SplTokenParseTask), + #[prost(message, tag = "31")] + UniswapExchangeRateTask(super::UniswapExchangeRateTask), + #[prost(message, tag = "32")] + SushiswapExchangeRateTask(super::SushiswapExchangeRateTask), + #[prost(message, tag = "33")] + PancakeswapExchangeRateTask(super::PancakeswapExchangeRateTask), + #[prost(message, tag = "34")] + CacheTask(super::CacheTask), + #[prost(message, tag = "35")] + SysclockOffsetTask(super::SysclockOffsetTask), + #[prost(message, tag = "36")] + MarinadeStateTask(super::MarinadeStateTask), + #[prost(message, tag = "37")] + SolanaAccountDataFetchTask(super::SolanaAccountDataFetchTask), + #[prost(message, tag = "38")] + BufferLayoutParseTask(super::BufferLayoutParseTask), + #[prost(message, tag = "39")] + CronParseTask(super::CronParseTask), + #[prost(message, tag = "40")] + MinTask(super::MinTask), + #[prost(message, tag = "41")] + HistoryFunctionTask(super::HistoryFunctionTask), + #[prost(message, tag = "42")] + VwapTask(super::VwapTask), + #[prost(message, tag = "43")] + EwmaTask(super::EwmaTask), + #[prost(message, tag = "44")] + ComparisonTask(super::ComparisonTask), + #[prost(message, tag = "45")] + RoundTask(super::RoundTask), + #[prost(message, tag = "46")] + BoundTask(super::BoundTask), + #[prost(message, tag = "47")] + SecretsTask(super::SecretsTask), + #[prost(message, tag = "48")] + SanctumLstPriceTask(super::SanctumLstPriceTask), + #[prost(message, tag = "49")] + OndoUsdyTask(super::OndoUsdyTask), + #[prost(message, tag = "50")] + MeteoraSwapTask(super::MeteoraSwapTask), + } + } +} +/// Encoded file descriptor set for the `oracle_job` package +pub const FILE_DESCRIPTOR_SET: &[u8] = &[ + 0x0a, 0xbf, 0xfb, 0x03, 0x0a, 0x11, 0x6a, 0x6f, 0x62, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0a, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, + 0x6a, 0x6f, 0x62, 0x22, 0xe3, 0x69, 0x0a, 0x09, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, + 0x62, 0x12, 0x30, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, + 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x05, 0x74, 0x61, + 0x73, 0x6b, 0x73, 0x1a, 0xa0, 0x02, 0x0a, 0x08, 0x48, 0x74, 0x74, 0x70, 0x54, 0x61, 0x73, 0x6b, + 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, + 0x72, 0x6c, 0x12, 0x3d, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, + 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x54, 0x61, + 0x73, 0x6b, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, + 0x64, 0x12, 0x3f, 0x0a, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, + 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x54, 0x61, + 0x73, 0x6b, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x1a, 0x30, 0x0a, 0x06, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3c, 0x0a, 0x06, 0x4d, 0x65, 0x74, 0x68, + 0x6f, 0x64, 0x12, 0x11, 0x0a, 0x0d, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x55, 0x4e, 0x4b, + 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, + 0x47, 0x45, 0x54, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, + 0x50, 0x4f, 0x53, 0x54, 0x10, 0x02, 0x1a, 0xd9, 0x01, 0x0a, 0x0d, 0x4a, 0x73, 0x6f, 0x6e, 0x50, + 0x61, 0x72, 0x73, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x64, 0x0a, 0x12, + 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x65, 0x74, 0x68, + 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x35, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, + 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, + 0x4a, 0x73, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x73, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x2e, 0x41, 0x67, + 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, + 0x11, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x68, + 0x6f, 0x64, 0x22, 0x4e, 0x0a, 0x11, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, + 0x00, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x49, 0x4e, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x41, + 0x58, 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x53, 0x55, 0x4d, 0x10, 0x03, 0x12, 0x08, 0x0a, 0x04, + 0x4d, 0x45, 0x41, 0x4e, 0x10, 0x04, 0x12, 0x0a, 0x0a, 0x06, 0x4d, 0x45, 0x44, 0x49, 0x41, 0x4e, + 0x10, 0x05, 0x1a, 0xcd, 0x01, 0x0a, 0x0a, 0x4d, 0x65, 0x64, 0x69, 0x61, 0x6e, 0x54, 0x61, 0x73, + 0x6b, 0x12, 0x30, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, + 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x05, 0x74, 0x61, + 0x73, 0x6b, 0x73, 0x12, 0x29, 0x0a, 0x04, 0x6a, 0x6f, 0x62, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, + 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x04, 0x6a, 0x6f, 0x62, 0x73, 0x12, 0x36, + 0x0a, 0x17, 0x6d, 0x69, 0x6e, 0x5f, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, + 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x15, 0x6d, 0x69, 0x6e, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x52, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x61, + 0x6e, 0x67, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0f, 0x6d, 0x61, 0x78, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x63, 0x65, + 0x6e, 0x74, 0x1a, 0x67, 0x0a, 0x08, 0x4d, 0x65, 0x61, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x30, + 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, + 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, + 0x12, 0x29, 0x0a, 0x04, 0x6a, 0x6f, 0x62, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, + 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, + 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x04, 0x6a, 0x6f, 0x62, 0x73, 0x1a, 0x66, 0x0a, 0x07, 0x4d, + 0x61, 0x78, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x30, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, + 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x54, 0x61, 0x73, + 0x6b, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x29, 0x0a, 0x04, 0x6a, 0x6f, 0x62, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, + 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x04, 0x6a, + 0x6f, 0x62, 0x73, 0x1a, 0x66, 0x0a, 0x07, 0x4d, 0x69, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x30, + 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, + 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, + 0x12, 0x29, 0x0a, 0x04, 0x6a, 0x6f, 0x62, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, + 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, + 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x04, 0x6a, 0x6f, 0x62, 0x73, 0x1a, 0x99, 0x01, 0x0a, 0x09, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x16, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x12, 0x2d, 0x0a, 0x11, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x5f, + 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x10, + 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x75, 0x62, 0x6b, 0x65, 0x79, + 0x12, 0x12, 0x0a, 0x03, 0x62, 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, + 0x03, 0x62, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x03, 0x68, 0x65, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x00, 0x52, 0x03, 0x68, 0x65, 0x78, 0x12, 0x14, 0x0a, 0x04, 0x75, 0x74, 0x66, 0x38, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x75, 0x74, 0x66, 0x38, 0x42, 0x07, + 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x1a, 0x8e, 0x01, 0x0a, 0x0d, 0x57, 0x65, 0x62, 0x73, + 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x22, 0x0a, 0x0c, 0x73, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x2f, 0x0a, 0x14, 0x6d, 0x61, 0x78, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x61, 0x67, 0x65, 0x5f, + 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x6d, + 0x61, 0x78, 0x44, 0x61, 0x74, 0x61, 0x41, 0x67, 0x65, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, + 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x1a, 0x82, 0x01, 0x0a, 0x0f, 0x43, 0x6f, 0x6e, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x34, 0x0a, 0x07, + 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, + 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x07, 0x61, 0x74, 0x74, 0x65, 0x6d, + 0x70, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, + 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x54, 0x61, + 0x73, 0x6b, 0x52, 0x09, 0x6f, 0x6e, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x1a, 0xa3, 0x01, + 0x0a, 0x0a, 0x44, 0x69, 0x76, 0x69, 0x64, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x18, 0x0a, 0x06, + 0x73, 0x63, 0x61, 0x6c, 0x61, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x06, + 0x73, 0x63, 0x61, 0x6c, 0x61, 0x72, 0x12, 0x2d, 0x0a, 0x11, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, + 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x00, 0x52, 0x10, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x50, + 0x75, 0x62, 0x6b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x03, 0x6a, 0x6f, 0x62, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, + 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x48, 0x00, 0x52, 0x03, 0x6a, 0x6f, 0x62, + 0x12, 0x12, 0x0a, 0x03, 0x62, 0x69, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, + 0x03, 0x62, 0x69, 0x67, 0x42, 0x0d, 0x0a, 0x0b, 0x44, 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x6e, 0x61, + 0x74, 0x6f, 0x72, 0x1a, 0xa2, 0x01, 0x0a, 0x0c, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, + 0x54, 0x61, 0x73, 0x6b, 0x12, 0x18, 0x0a, 0x06, 0x73, 0x63, 0x61, 0x6c, 0x61, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x06, 0x73, 0x63, 0x61, 0x6c, 0x61, 0x72, 0x12, 0x2d, + 0x0a, 0x11, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x70, 0x75, 0x62, + 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x10, 0x61, 0x67, 0x67, + 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x12, 0x29, 0x0a, + 0x03, 0x6a, 0x6f, 0x62, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x72, 0x61, + 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, + 0x62, 0x48, 0x00, 0x52, 0x03, 0x6a, 0x6f, 0x62, 0x12, 0x12, 0x0a, 0x03, 0x62, 0x69, 0x67, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x03, 0x62, 0x69, 0x67, 0x42, 0x0a, 0x0a, 0x08, + 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x1a, 0x9d, 0x01, 0x0a, 0x07, 0x41, 0x64, 0x64, + 0x54, 0x61, 0x73, 0x6b, 0x12, 0x18, 0x0a, 0x06, 0x73, 0x63, 0x61, 0x6c, 0x61, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x06, 0x73, 0x63, 0x61, 0x6c, 0x61, 0x72, 0x12, 0x2d, + 0x0a, 0x11, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x70, 0x75, 0x62, + 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x10, 0x61, 0x67, 0x67, + 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x12, 0x29, 0x0a, + 0x03, 0x6a, 0x6f, 0x62, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x72, 0x61, + 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, + 0x62, 0x48, 0x00, 0x52, 0x03, 0x6a, 0x6f, 0x62, 0x12, 0x12, 0x0a, 0x03, 0x62, 0x69, 0x67, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x03, 0x62, 0x69, 0x67, 0x42, 0x0a, 0x0a, 0x08, + 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xa5, 0x01, 0x0a, 0x0c, 0x53, 0x75, 0x62, + 0x74, 0x72, 0x61, 0x63, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x18, 0x0a, 0x06, 0x73, 0x63, 0x61, + 0x6c, 0x61, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x06, 0x73, 0x63, 0x61, + 0x6c, 0x61, 0x72, 0x12, 0x2d, 0x0a, 0x11, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, + 0x72, 0x5f, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, + 0x52, 0x10, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x75, 0x62, 0x6b, + 0x65, 0x79, 0x12, 0x29, 0x0a, 0x03, 0x6a, 0x6f, 0x62, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x15, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, + 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x48, 0x00, 0x52, 0x03, 0x6a, 0x6f, 0x62, 0x12, 0x12, 0x0a, + 0x03, 0x62, 0x69, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x03, 0x62, 0x69, + 0x67, 0x42, 0x0d, 0x0a, 0x0b, 0x53, 0x75, 0x62, 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x1a, 0x82, 0x03, 0x0a, 0x10, 0x4c, 0x70, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x72, 0x69, 0x63, + 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x36, 0x0a, 0x16, 0x6d, 0x65, 0x72, 0x63, 0x75, 0x72, 0x69, + 0x61, 0x6c, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x14, 0x6d, 0x65, 0x72, 0x63, 0x75, 0x72, 0x69, + 0x61, 0x6c, 0x50, 0x6f, 0x6f, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2e, 0x0a, + 0x12, 0x73, 0x61, 0x62, 0x65, 0x72, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x10, 0x73, 0x61, 0x62, + 0x65, 0x72, 0x50, 0x6f, 0x6f, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2c, 0x0a, + 0x11, 0x6f, 0x72, 0x63, 0x61, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0f, 0x6f, 0x72, 0x63, 0x61, + 0x50, 0x6f, 0x6f, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x32, 0x0a, 0x14, 0x72, + 0x61, 0x79, 0x64, 0x69, 0x75, 0x6d, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x12, 0x72, 0x61, 0x79, + 0x64, 0x69, 0x75, 0x6d, 0x50, 0x6f, 0x6f, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, + 0x30, 0x0a, 0x14, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x66, 0x65, 0x65, 0x64, 0x5f, 0x61, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x12, 0x70, + 0x72, 0x69, 0x63, 0x65, 0x46, 0x65, 0x65, 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, + 0x73, 0x12, 0x3d, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x66, 0x65, 0x65, 0x64, 0x5f, + 0x6a, 0x6f, 0x62, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x72, 0x61, + 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, + 0x62, 0x52, 0x0d, 0x70, 0x72, 0x69, 0x63, 0x65, 0x46, 0x65, 0x65, 0x64, 0x4a, 0x6f, 0x62, 0x73, + 0x12, 0x24, 0x0a, 0x0e, 0x75, 0x73, 0x65, 0x5f, 0x66, 0x61, 0x69, 0x72, 0x5f, 0x70, 0x72, 0x69, + 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x75, 0x73, 0x65, 0x46, 0x61, 0x69, + 0x72, 0x50, 0x72, 0x69, 0x63, 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x50, 0x6f, 0x6f, 0x6c, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, 0xbd, 0x03, 0x0a, 0x12, 0x4c, 0x70, 0x45, 0x78, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x52, 0x61, 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x28, 0x0a, 0x10, + 0x69, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x6f, 0x75, 0x74, 0x5f, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0f, 0x6f, 0x75, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x12, 0x36, 0x0a, 0x16, 0x6d, 0x65, 0x72, 0x63, 0x75, 0x72, 0x69, 0x61, 0x6c, 0x5f, + 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x00, 0x52, 0x14, 0x6d, 0x65, 0x72, 0x63, 0x75, 0x72, 0x69, 0x61, 0x6c, 0x50, + 0x6f, 0x6f, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x73, 0x61, + 0x62, 0x65, 0x72, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x10, 0x73, 0x61, 0x62, 0x65, 0x72, 0x50, + 0x6f, 0x6f, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x44, 0x0a, 0x1c, 0x6f, 0x72, + 0x63, 0x61, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x6d, 0x69, + 0x6e, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x02, 0x18, 0x01, 0x48, 0x00, 0x52, 0x18, 0x6f, 0x72, 0x63, 0x61, 0x50, 0x6f, 0x6f, 0x6c, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x4d, 0x69, 0x6e, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x12, 0x32, 0x0a, 0x14, 0x72, 0x61, 0x79, 0x64, 0x69, 0x75, 0x6d, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, + 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, + 0x52, 0x12, 0x72, 0x61, 0x79, 0x64, 0x69, 0x75, 0x6d, 0x50, 0x6f, 0x6f, 0x6c, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x6f, 0x72, 0x63, 0x61, 0x5f, 0x70, 0x6f, 0x6f, + 0x6c, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x00, 0x52, 0x0f, 0x6f, 0x72, 0x63, 0x61, 0x50, 0x6f, 0x6f, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x12, 0x32, 0x0a, 0x14, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x00, 0x52, 0x12, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, 0x0d, 0x0a, 0x0b, 0x50, 0x6f, 0x6f, 0x6c, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x4f, 0x0a, 0x10, 0x52, 0x65, 0x67, 0x65, 0x78, 0x45, 0x78, + 0x74, 0x72, 0x61, 0x63, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x74, + 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x74, 0x74, + 0x65, 0x72, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x67, 0x72, 0x6f, 0x75, 0x70, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x1a, 0x95, 0x01, 0x0a, 0x0e, 0x58, 0x53, 0x74, 0x65, 0x70, + 0x50, 0x72, 0x69, 0x63, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x3d, 0x0a, 0x08, 0x73, 0x74, 0x65, + 0x70, 0x5f, 0x6a, 0x6f, 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x72, + 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, + 0x6f, 0x62, 0x2e, 0x4d, 0x65, 0x64, 0x69, 0x61, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, + 0x07, 0x73, 0x74, 0x65, 0x70, 0x4a, 0x6f, 0x62, 0x12, 0x36, 0x0a, 0x16, 0x73, 0x74, 0x65, 0x70, + 0x5f, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x70, 0x75, 0x62, 0x6b, + 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x14, 0x73, 0x74, 0x65, 0x70, + 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x75, 0x62, 0x6b, 0x65, 0x79, + 0x42, 0x0c, 0x0a, 0x0a, 0x53, 0x74, 0x65, 0x70, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x1a, 0xc3, + 0x02, 0x0a, 0x08, 0x54, 0x77, 0x61, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x2b, 0x0a, 0x11, 0x61, + 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, + 0x6f, 0x72, 0x50, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x65, 0x72, 0x69, + 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, + 0x12, 0x3b, 0x0a, 0x1a, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x62, 0x79, 0x5f, 0x70, 0x72, + 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x42, 0x79, 0x50, 0x72, + 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1f, 0x0a, + 0x0b, 0x6d, 0x69, 0x6e, 0x5f, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x0a, 0x6d, 0x69, 0x6e, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x12, 0x32, + 0x0a, 0x15, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x75, 0x6e, 0x69, 0x78, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x65, + 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x69, 0x78, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x12, 0x60, 0x0a, 0x1a, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x75, 0x6e, 0x69, + 0x78, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x5f, 0x74, 0x61, 0x73, 0x6b, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, + 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x43, 0x72, + 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x73, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x17, 0x65, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x69, 0x78, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x54, 0x61, 0x73, 0x6b, 0x1a, 0x3d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x75, 0x6d, 0x53, 0x77, 0x61, + 0x70, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x2c, 0x0a, 0x12, 0x73, 0x65, 0x72, 0x75, 0x6d, 0x5f, 0x70, + 0x6f, 0x6f, 0x6c, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x10, 0x73, 0x65, 0x72, 0x75, 0x6d, 0x50, 0x6f, 0x6f, 0x6c, 0x41, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x1a, 0x72, 0x0a, 0x07, 0x50, 0x6f, 0x77, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x18, + 0x0a, 0x06, 0x73, 0x63, 0x61, 0x6c, 0x61, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, + 0x52, 0x06, 0x73, 0x63, 0x61, 0x6c, 0x61, 0x72, 0x12, 0x2d, 0x0a, 0x11, 0x61, 0x67, 0x67, 0x72, + 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x10, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, + 0x72, 0x50, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x03, 0x62, 0x69, 0x67, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x03, 0x62, 0x69, 0x67, 0x42, 0x0a, 0x0a, 0x08, 0x45, + 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x1a, 0xc7, 0x01, 0x0a, 0x0f, 0x4c, 0x65, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 0x52, 0x61, 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x1a, 0x0a, 0x08, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, + 0x5f, 0x6d, 0x69, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x73, 0x73, + 0x65, 0x74, 0x4d, 0x69, 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, + 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x4c, 0x65, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x52, 0x61, 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x2e, 0x46, 0x69, 0x65, + 0x6c, 0x64, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x22, 0x36, 0x0a, 0x05, 0x46, 0x69, 0x65, + 0x6c, 0x64, 0x12, 0x16, 0x0a, 0x12, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x44, 0x45, 0x50, 0x4f, + 0x53, 0x49, 0x54, 0x5f, 0x52, 0x41, 0x54, 0x45, 0x10, 0x00, 0x12, 0x15, 0x0a, 0x11, 0x46, 0x49, + 0x45, 0x4c, 0x44, 0x5f, 0x42, 0x4f, 0x52, 0x52, 0x4f, 0x57, 0x5f, 0x52, 0x41, 0x54, 0x45, 0x10, + 0x01, 0x1a, 0x45, 0x0a, 0x13, 0x4d, 0x61, 0x6e, 0x67, 0x6f, 0x50, 0x65, 0x72, 0x70, 0x4d, 0x61, + 0x72, 0x6b, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x2e, 0x0a, 0x13, 0x70, 0x65, 0x72, 0x70, + 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x70, 0x65, 0x72, 0x70, 0x4d, 0x61, 0x72, 0x6b, 0x65, + 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x96, 0x04, 0x0a, 0x0f, 0x4a, 0x75, 0x70, + 0x69, 0x74, 0x65, 0x72, 0x53, 0x77, 0x61, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x28, 0x0a, 0x10, + 0x69, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x6f, 0x75, 0x74, 0x5f, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0f, 0x6f, 0x75, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x12, 0x51, 0x0a, 0x0a, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x6c, 0x69, 0x73, 0x74, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, + 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x4a, 0x75, + 0x70, 0x69, 0x74, 0x65, 0x72, 0x53, 0x77, 0x61, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x2e, 0x46, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x00, 0x52, 0x09, 0x61, 0x6c, 0x6c, 0x6f, + 0x77, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x4f, 0x0a, 0x09, 0x64, 0x65, 0x6e, 0x79, 0x5f, 0x6c, 0x69, + 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, + 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, + 0x4a, 0x75, 0x70, 0x69, 0x74, 0x65, 0x72, 0x53, 0x77, 0x61, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x2e, + 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x00, 0x52, 0x08, 0x64, 0x65, + 0x6e, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0b, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x61, + 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x48, 0x01, 0x52, 0x0a, 0x62, + 0x61, 0x73, 0x65, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0c, 0x71, 0x75, 0x6f, + 0x74, 0x65, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x48, + 0x01, 0x52, 0x0b, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2e, + 0x0a, 0x12, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x10, 0x62, 0x61, + 0x73, 0x65, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x30, + 0x0a, 0x13, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x11, 0x71, + 0x75, 0x6f, 0x74, 0x65, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x6c, 0x69, 0x70, 0x70, 0x61, 0x67, 0x65, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x01, 0x52, 0x08, 0x73, 0x6c, 0x69, 0x70, 0x70, 0x61, 0x67, 0x65, 0x1a, 0x24, 0x0a, 0x0a, + 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x61, + 0x62, 0x65, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, + 0x6c, 0x73, 0x42, 0x0f, 0x0a, 0x0d, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x46, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x73, 0x42, 0x0c, 0x0a, 0x0a, 0x53, 0x77, 0x61, 0x70, 0x41, 0x6d, 0x6f, 0x75, 0x6e, + 0x74, 0x1a, 0xe9, 0x01, 0x0a, 0x0e, 0x50, 0x65, 0x72, 0x70, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x12, 0x32, 0x0a, 0x14, 0x6d, 0x61, 0x6e, 0x67, 0x6f, 0x5f, 0x6d, 0x61, + 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x00, 0x52, 0x12, 0x6d, 0x61, 0x6e, 0x67, 0x6f, 0x4d, 0x61, 0x72, 0x6b, 0x65, + 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x32, 0x0a, 0x14, 0x64, 0x72, 0x69, 0x66, + 0x74, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x12, 0x64, 0x72, 0x69, 0x66, 0x74, 0x4d, + 0x61, 0x72, 0x6b, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x30, 0x0a, 0x13, + 0x7a, 0x65, 0x74, 0x61, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x11, 0x7a, 0x65, 0x74, + 0x61, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2c, + 0x0a, 0x11, 0x7a, 0x6f, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0f, 0x7a, 0x6f, 0x4d, + 0x61, 0x72, 0x6b, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, 0x0f, 0x0a, 0x0d, + 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x80, 0x04, + 0x0a, 0x0a, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x31, 0x0a, 0x13, + 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x12, 0x73, 0x77, 0x69, + 0x74, 0x63, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, + 0x23, 0x0a, 0x0c, 0x70, 0x79, 0x74, 0x68, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x70, 0x79, 0x74, 0x68, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x12, 0x2d, 0x0a, 0x11, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x6c, 0x69, 0x6e, + 0x6b, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x00, 0x52, 0x10, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x41, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x12, 0x47, 0x0a, 0x20, 0x70, 0x79, 0x74, 0x68, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, + 0x77, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x1d, 0x70, + 0x79, 0x74, 0x68, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x64, + 0x65, 0x6e, 0x63, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x5e, 0x0a, 0x11, + 0x63, 0x68, 0x61, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, + 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x4f, + 0x72, 0x61, 0x63, 0x6c, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x6c, + 0x69, 0x6e, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x52, 0x10, 0x63, 0x68, 0x61, 0x69, + 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0x4f, 0x0a, 0x0c, + 0x70, 0x79, 0x74, 0x68, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, + 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, + 0x54, 0x61, 0x73, 0x6b, 0x2e, 0x50, 0x79, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, + 0x52, 0x0b, 0x70, 0x79, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x1a, 0x2e, 0x0a, + 0x10, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x1a, 0x2c, 0x0a, + 0x0b, 0x50, 0x79, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0x1d, 0x0a, 0x0a, + 0x68, 0x65, 0x72, 0x6d, 0x65, 0x73, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x68, 0x65, 0x72, 0x6d, 0x65, 0x73, 0x55, 0x72, 0x6c, 0x42, 0x13, 0x0a, 0x11, 0x41, + 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x1a, 0x59, 0x0a, 0x0f, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x46, 0x65, 0x74, 0x63, 0x68, 0x54, + 0x61, 0x73, 0x6b, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, + 0x49, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x61, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x61, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x2a, 0x0a, 0x10, 0x53, + 0x70, 0x6c, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x54, 0x61, 0x73, 0x6b, 0x12, + 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x1a, 0x80, 0x01, 0x0a, 0x11, 0x53, 0x70, 0x6c, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x61, 0x72, 0x73, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x34, 0x0a, + 0x15, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x13, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x12, 0x23, 0x0a, 0x0c, 0x6d, 0x69, 0x6e, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x6d, 0x69, 0x6e, + 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, 0x10, 0x0a, 0x0e, 0x41, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, 0xf8, 0x03, 0x0a, 0x17, 0x55, + 0x6e, 0x69, 0x73, 0x77, 0x61, 0x70, 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x61, + 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x28, 0x0a, 0x10, 0x69, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0e, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x12, 0x2a, 0x0a, 0x11, 0x6f, 0x75, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x61, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6f, 0x75, 0x74, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x26, 0x0a, 0x0f, + 0x69, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x41, 0x6d, + 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x6c, 0x69, 0x70, 0x70, 0x61, 0x67, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x08, 0x73, 0x6c, 0x69, 0x70, 0x70, 0x61, 0x67, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x4f, 0x0a, 0x07, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x35, 0x2e, + 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, + 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x55, 0x6e, 0x69, 0x73, 0x77, 0x61, 0x70, 0x45, 0x78, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x52, 0x61, 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x2e, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x0a, + 0x0e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x5f, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x66, + 0x61, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x25, 0x0a, + 0x0e, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x72, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x22, 0x5f, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x19, 0x0a, 0x15, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x32, 0x5f, 0x44, 0x45, + 0x50, 0x52, 0x45, 0x43, 0x41, 0x54, 0x45, 0x44, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x56, 0x45, + 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x33, 0x5f, 0x44, 0x45, 0x50, 0x52, 0x45, 0x43, 0x41, + 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, + 0x5f, 0x56, 0x32, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, + 0x5f, 0x56, 0x33, 0x10, 0x03, 0x1a, 0xd1, 0x01, 0x0a, 0x19, 0x53, 0x75, 0x73, 0x68, 0x69, 0x73, + 0x77, 0x61, 0x70, 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x61, 0x74, 0x65, 0x54, + 0x61, 0x73, 0x6b, 0x12, 0x28, 0x0a, 0x10, 0x69, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x69, + 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2a, 0x0a, + 0x11, 0x6f, 0x75, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6f, 0x75, 0x74, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x69, 0x6e, 0x5f, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x01, 0x52, 0x0d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x41, 0x6d, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x6c, 0x69, 0x70, 0x70, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x08, 0x73, 0x6c, 0x69, 0x70, 0x70, 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, + 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x1a, 0xd3, 0x01, 0x0a, 0x1b, 0x50, 0x61, + 0x6e, 0x63, 0x61, 0x6b, 0x65, 0x73, 0x77, 0x61, 0x70, 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x52, 0x61, 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x28, 0x0a, 0x10, 0x69, 0x6e, 0x5f, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0e, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x6f, 0x75, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, + 0x6f, 0x75, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, + 0x26, 0x0a, 0x0f, 0x69, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x61, 0x6d, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x6c, 0x69, 0x70, 0x70, + 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x08, 0x73, 0x6c, 0x69, 0x70, 0x70, + 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x1a, + 0xb2, 0x01, 0x0a, 0x09, 0x43, 0x61, 0x63, 0x68, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x4a, 0x0a, + 0x0b, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, + 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x54, + 0x61, 0x73, 0x6b, 0x2e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x0a, 0x63, + 0x61, 0x63, 0x68, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x1a, 0x59, 0x0a, 0x09, 0x43, 0x61, 0x63, + 0x68, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x23, 0x0a, 0x0d, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x76, + 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x27, 0x0a, 0x03, 0x6a, + 0x6f, 0x62, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, + 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x52, + 0x03, 0x6a, 0x6f, 0x62, 0x1a, 0x14, 0x0a, 0x12, 0x53, 0x79, 0x73, 0x63, 0x6c, 0x6f, 0x63, 0x6b, + 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x1a, 0x13, 0x0a, 0x11, 0x4d, 0x61, + 0x72, 0x69, 0x6e, 0x61, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x1a, + 0xd1, 0x01, 0x0a, 0x1a, 0x53, 0x6f, 0x6c, 0x61, 0x6e, 0x61, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x44, 0x61, 0x74, 0x61, 0x46, 0x65, 0x74, 0x63, 0x68, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x16, + 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x12, 0x52, 0x0a, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x38, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, + 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x53, + 0x6f, 0x6c, 0x61, 0x6e, 0x61, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, + 0x46, 0x65, 0x74, 0x63, 0x68, 0x54, 0x61, 0x73, 0x6b, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x52, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x22, 0x47, 0x0a, 0x07, 0x4e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x13, 0x0a, 0x0f, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, + 0x5f, 0x4d, 0x41, 0x49, 0x4e, 0x4e, 0x45, 0x54, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x4e, 0x45, + 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x4e, 0x45, 0x54, 0x10, 0x01, 0x12, + 0x12, 0x0a, 0x0e, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x44, 0x45, 0x56, 0x4e, 0x45, + 0x54, 0x10, 0x02, 0x1a, 0xc1, 0x01, 0x0a, 0x0d, 0x43, 0x72, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x73, + 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x70, 0x61, + 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x72, 0x6f, + 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6c, 0x6f, 0x63, + 0x6b, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, + 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x43, 0x0a, 0x05, 0x63, + 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x6f, 0x72, 0x61, + 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, + 0x62, 0x2e, 0x43, 0x72, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x73, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x2e, + 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x63, 0x6c, 0x6f, 0x63, 0x6b, + 0x22, 0x25, 0x0a, 0x09, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, + 0x06, 0x4f, 0x52, 0x41, 0x43, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x59, 0x53, + 0x43, 0x4c, 0x4f, 0x43, 0x4b, 0x10, 0x01, 0x1a, 0x8f, 0x03, 0x0a, 0x15, 0x42, 0x75, 0x66, 0x66, + 0x65, 0x72, 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x50, 0x61, 0x72, 0x73, 0x65, 0x54, 0x61, 0x73, + 0x6b, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x4a, 0x0a, 0x06, 0x65, 0x6e, 0x64, + 0x69, 0x61, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x32, 0x2e, 0x6f, 0x72, 0x61, 0x63, + 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, + 0x2e, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x50, 0x61, 0x72, + 0x73, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x2e, 0x45, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x52, 0x06, 0x65, + 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x12, 0x4f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x3b, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, + 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x42, 0x75, 0x66, 0x66, 0x65, + 0x72, 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x50, 0x61, 0x72, 0x73, 0x65, 0x54, 0x61, 0x73, 0x6b, + 0x2e, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x50, 0x61, 0x72, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, + 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x2b, 0x0a, 0x06, 0x45, 0x6e, 0x64, 0x69, 0x61, 0x6e, + 0x12, 0x11, 0x0a, 0x0d, 0x4c, 0x49, 0x54, 0x54, 0x4c, 0x45, 0x5f, 0x45, 0x4e, 0x44, 0x49, 0x41, + 0x4e, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x42, 0x49, 0x47, 0x5f, 0x45, 0x4e, 0x44, 0x49, 0x41, + 0x4e, 0x10, 0x01, 0x22, 0x93, 0x01, 0x0a, 0x0f, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x50, 0x61, + 0x72, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6b, 0x65, + 0x79, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x02, 0x12, 0x06, 0x0a, + 0x02, 0x75, 0x38, 0x10, 0x03, 0x12, 0x06, 0x0a, 0x02, 0x69, 0x38, 0x10, 0x04, 0x12, 0x07, 0x0a, + 0x03, 0x75, 0x31, 0x36, 0x10, 0x05, 0x12, 0x07, 0x0a, 0x03, 0x69, 0x31, 0x36, 0x10, 0x06, 0x12, + 0x07, 0x0a, 0x03, 0x75, 0x33, 0x32, 0x10, 0x07, 0x12, 0x07, 0x0a, 0x03, 0x69, 0x33, 0x32, 0x10, + 0x08, 0x12, 0x07, 0x0a, 0x03, 0x66, 0x33, 0x32, 0x10, 0x09, 0x12, 0x07, 0x0a, 0x03, 0x75, 0x36, + 0x34, 0x10, 0x0a, 0x12, 0x07, 0x0a, 0x03, 0x69, 0x36, 0x34, 0x10, 0x0b, 0x12, 0x07, 0x0a, 0x03, + 0x66, 0x36, 0x34, 0x10, 0x0c, 0x12, 0x08, 0x0a, 0x04, 0x75, 0x31, 0x32, 0x38, 0x10, 0x0d, 0x12, + 0x08, 0x0a, 0x04, 0x69, 0x31, 0x32, 0x38, 0x10, 0x0e, 0x1a, 0xd0, 0x01, 0x0a, 0x13, 0x48, 0x69, + 0x73, 0x74, 0x6f, 0x72, 0x79, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x73, + 0x6b, 0x12, 0x48, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x30, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, + 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, + 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x2e, 0x4d, 0x65, 0x74, + 0x68, 0x6f, 0x64, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x2d, 0x0a, 0x12, 0x61, + 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, + 0x74, 0x6f, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x65, + 0x72, 0x69, 0x6f, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x70, 0x65, 0x72, 0x69, + 0x6f, 0x64, 0x22, 0x28, 0x0a, 0x06, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x0e, 0x0a, 0x0a, + 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x4d, 0x49, 0x4e, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, + 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x4d, 0x41, 0x58, 0x10, 0x01, 0x1a, 0x98, 0x01, 0x0a, + 0x08, 0x56, 0x77, 0x61, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x38, 0x0a, 0x18, 0x70, 0x72, 0x69, + 0x63, 0x65, 0x5f, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x70, 0x72, 0x69, + 0x63, 0x65, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x41, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x12, 0x3a, 0x0a, 0x19, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x61, 0x67, + 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x41, 0x67, + 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, + 0x16, 0x0a, 0x06, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x06, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x1a, 0x69, 0x0a, 0x08, 0x45, 0x77, 0x6d, 0x61, 0x54, + 0x61, 0x73, 0x6b, 0x12, 0x2d, 0x0a, 0x12, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, + 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x11, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x06, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x61, + 0x6d, 0x62, 0x64, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x06, 0x6c, 0x61, 0x6d, 0x62, + 0x64, 0x61, 0x1a, 0xc1, 0x04, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, + 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x3e, 0x0a, 0x02, 0x6f, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x2e, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, + 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, + 0x73, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x02, 0x6f, 0x70, 0x12, 0x29, 0x0a, 0x03, 0x6c, 0x68, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, + 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x48, 0x00, 0x52, 0x03, 0x6c, 0x68, 0x73, + 0x12, 0x1d, 0x0a, 0x09, 0x6c, 0x68, 0x73, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x6c, 0x68, 0x73, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, + 0x29, 0x0a, 0x03, 0x72, 0x68, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, + 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, + 0x4a, 0x6f, 0x62, 0x48, 0x01, 0x52, 0x03, 0x72, 0x68, 0x73, 0x12, 0x1d, 0x0a, 0x09, 0x72, 0x68, + 0x73, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, + 0x08, 0x72, 0x68, 0x73, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x2e, 0x0a, 0x07, 0x6f, 0x6e, 0x5f, + 0x74, 0x72, 0x75, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x72, 0x61, + 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, + 0x62, 0x52, 0x06, 0x6f, 0x6e, 0x54, 0x72, 0x75, 0x65, 0x12, 0x22, 0x0a, 0x0d, 0x6f, 0x6e, 0x5f, + 0x74, 0x72, 0x75, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x6f, 0x6e, 0x54, 0x72, 0x75, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x30, 0x0a, + 0x08, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x15, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, + 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x07, 0x6f, 0x6e, 0x46, 0x61, 0x6c, 0x73, 0x65, 0x12, + 0x24, 0x0a, 0x0e, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6f, 0x6e, 0x46, 0x61, 0x6c, 0x73, 0x65, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x34, 0x0a, 0x0a, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x69, 0x6c, + 0x75, 0x72, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x72, 0x61, 0x63, + 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, + 0x52, 0x09, 0x6f, 0x6e, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x6f, + 0x6e, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6f, 0x6e, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x41, 0x0a, 0x09, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x0c, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, + 0x45, 0x51, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x47, 0x54, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, + 0x49, 0x4f, 0x4e, 0x5f, 0x4c, 0x54, 0x10, 0x02, 0x42, 0x05, 0x0a, 0x03, 0x4c, 0x48, 0x53, 0x42, + 0x05, 0x0a, 0x03, 0x52, 0x48, 0x53, 0x1a, 0x9d, 0x01, 0x0a, 0x09, 0x52, 0x6f, 0x75, 0x6e, 0x64, + 0x54, 0x61, 0x73, 0x6b, 0x12, 0x3e, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, + 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x52, 0x6f, 0x75, 0x6e, + 0x64, 0x54, 0x61, 0x73, 0x6b, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x06, 0x6d, 0x65, + 0x74, 0x68, 0x6f, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x73, + 0x22, 0x34, 0x0a, 0x06, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x13, 0x0a, 0x0f, 0x4d, 0x45, + 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x52, 0x4f, 0x55, 0x4e, 0x44, 0x5f, 0x55, 0x50, 0x10, 0x00, 0x12, + 0x15, 0x0a, 0x11, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x52, 0x4f, 0x55, 0x4e, 0x44, 0x5f, + 0x44, 0x4f, 0x57, 0x4e, 0x10, 0x01, 0x1a, 0xeb, 0x03, 0x0a, 0x09, 0x42, 0x6f, 0x75, 0x6e, 0x64, + 0x54, 0x61, 0x73, 0x6b, 0x12, 0x36, 0x0a, 0x0b, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x62, 0x6f, + 0x75, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x72, 0x61, 0x63, + 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, + 0x52, 0x0a, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x2a, 0x0a, 0x11, + 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x42, 0x6f, + 0x75, 0x6e, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x36, 0x0a, 0x0b, 0x75, 0x70, 0x70, 0x65, + 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, + 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, + 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x0a, 0x75, 0x70, 0x70, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, + 0x12, 0x2a, 0x0a, 0x11, 0x75, 0x70, 0x70, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x5f, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x75, 0x70, 0x70, + 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x4a, 0x0a, 0x16, + 0x6f, 0x6e, 0x5f, 0x65, 0x78, 0x63, 0x65, 0x65, 0x64, 0x73, 0x5f, 0x75, 0x70, 0x70, 0x65, 0x72, + 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, + 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, + 0x4a, 0x6f, 0x62, 0x52, 0x13, 0x6f, 0x6e, 0x45, 0x78, 0x63, 0x65, 0x65, 0x64, 0x73, 0x55, 0x70, + 0x70, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x3e, 0x0a, 0x1c, 0x6f, 0x6e, 0x5f, 0x65, + 0x78, 0x63, 0x65, 0x65, 0x64, 0x73, 0x5f, 0x75, 0x70, 0x70, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, + 0x6e, 0x64, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x18, + 0x6f, 0x6e, 0x45, 0x78, 0x63, 0x65, 0x65, 0x64, 0x73, 0x55, 0x70, 0x70, 0x65, 0x72, 0x42, 0x6f, + 0x75, 0x6e, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x4a, 0x0a, 0x16, 0x6f, 0x6e, 0x5f, 0x65, + 0x78, 0x63, 0x65, 0x65, 0x64, 0x73, 0x5f, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, + 0x6e, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, + 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x52, + 0x13, 0x6f, 0x6e, 0x45, 0x78, 0x63, 0x65, 0x65, 0x64, 0x73, 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x42, + 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x3e, 0x0a, 0x1c, 0x6f, 0x6e, 0x5f, 0x65, 0x78, 0x63, 0x65, 0x65, + 0x64, 0x73, 0x5f, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x18, 0x6f, 0x6e, 0x45, 0x78, + 0x63, 0x65, 0x65, 0x64, 0x73, 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x1a, 0x3d, 0x0a, 0x0b, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x54, + 0x61, 0x73, 0x6b, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x75, 0x72, 0x6c, 0x1a, 0x30, 0x0a, 0x13, 0x53, 0x61, 0x6e, 0x63, 0x74, 0x75, 0x6d, 0x4c, 0x73, + 0x74, 0x50, 0x72, 0x69, 0x63, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x0a, 0x08, 0x6c, 0x73, + 0x74, 0x5f, 0x6d, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6c, 0x73, + 0x74, 0x4d, 0x69, 0x6e, 0x74, 0x1a, 0x91, 0x01, 0x0a, 0x0c, 0x4f, 0x6e, 0x64, 0x6f, 0x55, 0x73, + 0x64, 0x79, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x47, 0x0a, 0x08, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, + 0x67, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, + 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, + 0x4f, 0x6e, 0x64, 0x6f, 0x55, 0x73, 0x64, 0x79, 0x54, 0x61, 0x73, 0x6b, 0x2e, 0x53, 0x74, 0x72, + 0x61, 0x74, 0x65, 0x67, 0x79, 0x52, 0x08, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x22, + 0x38, 0x0a, 0x08, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x17, 0x0a, 0x13, 0x53, + 0x54, 0x52, 0x41, 0x54, 0x45, 0x47, 0x59, 0x5f, 0x46, 0x41, 0x49, 0x52, 0x5f, 0x56, 0x41, 0x4c, + 0x55, 0x45, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x54, 0x52, 0x41, 0x54, 0x45, 0x47, 0x59, + 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x10, 0x01, 0x1a, 0x8f, 0x01, 0x0a, 0x0f, 0x4d, 0x65, + 0x74, 0x65, 0x6f, 0x72, 0x61, 0x53, 0x77, 0x61, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x12, 0x0a, + 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x6f, 0x6f, + 0x6c, 0x12, 0x3e, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x2a, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, + 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x4d, 0x65, 0x74, 0x65, 0x6f, 0x72, 0x61, 0x53, 0x77, + 0x61, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x28, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x44, 0x4c, 0x4d, 0x4d, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x53, 0x54, 0x41, 0x4e, 0x44, 0x41, 0x52, 0x44, 0x10, 0x01, 0x1a, 0x9b, 0x1e, 0x0a, 0x04, + 0x54, 0x61, 0x73, 0x6b, 0x12, 0x3d, 0x0a, 0x09, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x74, 0x61, 0x73, + 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, + 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x48, + 0x74, 0x74, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x08, 0x68, 0x74, 0x74, 0x70, 0x54, + 0x61, 0x73, 0x6b, 0x12, 0x4d, 0x0a, 0x0f, 0x6a, 0x73, 0x6f, 0x6e, 0x5f, 0x70, 0x61, 0x72, 0x73, + 0x65, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, + 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, + 0x4a, 0x6f, 0x62, 0x2e, 0x4a, 0x73, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x73, 0x65, 0x54, 0x61, 0x73, + 0x6b, 0x48, 0x00, 0x52, 0x0d, 0x6a, 0x73, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x73, 0x65, 0x54, 0x61, + 0x73, 0x6b, 0x12, 0x43, 0x0a, 0x0b, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x6e, 0x5f, 0x74, 0x61, 0x73, + 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, + 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x4d, + 0x65, 0x64, 0x69, 0x61, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x0a, 0x6d, 0x65, 0x64, + 0x69, 0x61, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x3d, 0x0a, 0x09, 0x6d, 0x65, 0x61, 0x6e, 0x5f, + 0x74, 0x61, 0x73, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6f, 0x72, 0x61, + 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, + 0x62, 0x2e, 0x4d, 0x65, 0x61, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x08, 0x6d, 0x65, + 0x61, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x4c, 0x0a, 0x0e, 0x77, 0x65, 0x62, 0x73, 0x6f, 0x63, + 0x6b, 0x65, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, + 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, + 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x54, + 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x0d, 0x77, 0x65, 0x62, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x12, 0x43, 0x0a, 0x0b, 0x64, 0x69, 0x76, 0x69, 0x64, 0x65, 0x5f, 0x74, + 0x61, 0x73, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x72, 0x61, 0x63, + 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, + 0x2e, 0x44, 0x69, 0x76, 0x69, 0x64, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x0a, 0x64, + 0x69, 0x76, 0x69, 0x64, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x49, 0x0a, 0x0d, 0x6d, 0x75, 0x6c, + 0x74, 0x69, 0x70, 0x6c, 0x79, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x22, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, + 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, + 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x0c, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, + 0x54, 0x61, 0x73, 0x6b, 0x12, 0x57, 0x0a, 0x13, 0x6c, 0x70, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x26, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, + 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x4c, 0x70, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x50, 0x72, 0x69, 0x63, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x10, 0x6c, 0x70, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x5d, 0x0a, + 0x15, 0x6c, 0x70, 0x5f, 0x65, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x72, 0x61, 0x74, + 0x65, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, + 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, + 0x4a, 0x6f, 0x62, 0x2e, 0x4c, 0x70, 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x61, + 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x12, 0x6c, 0x70, 0x45, 0x78, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x52, 0x61, 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x52, 0x0a, 0x10, + 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x74, 0x61, 0x73, 0x6b, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, + 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x43, 0x6f, + 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, + 0x0f, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x54, 0x61, 0x73, 0x6b, + 0x12, 0x40, 0x0a, 0x0a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, + 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x09, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x61, + 0x73, 0x6b, 0x12, 0x3a, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x0d, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, + 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x4d, 0x61, 0x78, 0x54, + 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x56, + 0x0a, 0x12, 0x72, 0x65, 0x67, 0x65, 0x78, 0x5f, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x5f, + 0x74, 0x61, 0x73, 0x6b, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x6f, 0x72, 0x61, + 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, + 0x62, 0x2e, 0x52, 0x65, 0x67, 0x65, 0x78, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x54, 0x61, + 0x73, 0x6b, 0x48, 0x00, 0x52, 0x10, 0x72, 0x65, 0x67, 0x65, 0x78, 0x45, 0x78, 0x74, 0x72, 0x61, + 0x63, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x50, 0x0a, 0x10, 0x78, 0x73, 0x74, 0x65, 0x70, 0x5f, + 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x24, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, + 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x58, 0x53, 0x74, 0x65, 0x70, 0x50, 0x72, 0x69, + 0x63, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x0e, 0x78, 0x73, 0x74, 0x65, 0x70, 0x50, + 0x72, 0x69, 0x63, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x3a, 0x0a, 0x08, 0x61, 0x64, 0x64, 0x5f, + 0x74, 0x61, 0x73, 0x6b, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x72, 0x61, + 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, + 0x62, 0x2e, 0x41, 0x64, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x07, 0x61, 0x64, 0x64, + 0x54, 0x61, 0x73, 0x6b, 0x12, 0x49, 0x0a, 0x0d, 0x73, 0x75, 0x62, 0x74, 0x72, 0x61, 0x63, 0x74, + 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6f, 0x72, + 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, + 0x6f, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x74, 0x72, 0x61, 0x63, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x48, + 0x00, 0x52, 0x0c, 0x73, 0x75, 0x62, 0x74, 0x72, 0x61, 0x63, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, + 0x3d, 0x0a, 0x09, 0x74, 0x77, 0x61, 0x70, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x12, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, + 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x54, 0x77, 0x61, 0x70, 0x54, 0x61, + 0x73, 0x6b, 0x48, 0x00, 0x52, 0x08, 0x74, 0x77, 0x61, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x4d, + 0x0a, 0x0f, 0x73, 0x65, 0x72, 0x75, 0x6d, 0x5f, 0x73, 0x77, 0x61, 0x70, 0x5f, 0x74, 0x61, 0x73, + 0x6b, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, + 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x53, + 0x65, 0x72, 0x75, 0x6d, 0x53, 0x77, 0x61, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x0d, + 0x73, 0x65, 0x72, 0x75, 0x6d, 0x53, 0x77, 0x61, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x3a, 0x0a, + 0x08, 0x70, 0x6f, 0x77, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1d, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, + 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x50, 0x6f, 0x77, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, + 0x52, 0x07, 0x70, 0x6f, 0x77, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x53, 0x0a, 0x11, 0x6c, 0x65, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x15, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, + 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x4c, 0x65, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 0x52, 0x61, 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x0f, 0x6c, + 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x61, 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x60, + 0x0a, 0x16, 0x6d, 0x61, 0x6e, 0x67, 0x6f, 0x5f, 0x70, 0x65, 0x72, 0x70, 0x5f, 0x6d, 0x61, 0x72, + 0x6b, 0x65, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, + 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, + 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x4d, 0x61, 0x6e, 0x67, 0x6f, 0x50, 0x65, 0x72, 0x70, 0x4d, + 0x61, 0x72, 0x6b, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x13, 0x6d, 0x61, 0x6e, + 0x67, 0x6f, 0x50, 0x65, 0x72, 0x70, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x12, 0x53, 0x0a, 0x11, 0x6a, 0x75, 0x70, 0x69, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x77, 0x61, 0x70, + 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6f, 0x72, + 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, + 0x6f, 0x62, 0x2e, 0x4a, 0x75, 0x70, 0x69, 0x74, 0x65, 0x72, 0x53, 0x77, 0x61, 0x70, 0x54, 0x61, + 0x73, 0x6b, 0x48, 0x00, 0x52, 0x0f, 0x6a, 0x75, 0x70, 0x69, 0x74, 0x65, 0x72, 0x53, 0x77, 0x61, + 0x70, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x50, 0x0a, 0x10, 0x70, 0x65, 0x72, 0x70, 0x5f, 0x6d, 0x61, + 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x24, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, + 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x50, 0x65, 0x72, 0x70, 0x4d, 0x61, 0x72, 0x6b, 0x65, + 0x74, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x0e, 0x70, 0x65, 0x72, 0x70, 0x4d, 0x61, 0x72, + 0x6b, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x43, 0x0a, 0x0b, 0x6f, 0x72, 0x61, 0x63, 0x6c, + 0x65, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, + 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, + 0x4a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, + 0x52, 0x0a, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x53, 0x0a, 0x11, + 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x5f, 0x66, 0x65, 0x74, 0x63, 0x68, 0x5f, 0x74, 0x61, 0x73, + 0x6b, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, + 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x41, + 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x46, 0x65, 0x74, 0x63, 0x68, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, + 0x52, 0x0f, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x46, 0x65, 0x74, 0x63, 0x68, 0x54, 0x61, 0x73, + 0x6b, 0x12, 0x57, 0x0a, 0x13, 0x73, 0x70, 0x6c, 0x5f, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x5f, 0x70, + 0x6f, 0x6f, 0x6c, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, + 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, + 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x53, 0x70, 0x6c, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x50, 0x6f, + 0x6f, 0x6c, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x10, 0x73, 0x70, 0x6c, 0x53, 0x74, 0x61, + 0x6b, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x5a, 0x0a, 0x14, 0x73, 0x70, + 0x6c, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x74, 0x61, + 0x73, 0x6b, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, + 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, + 0x53, 0x70, 0x6c, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x61, 0x72, 0x73, 0x65, 0x54, 0x61, 0x73, + 0x6b, 0x48, 0x00, 0x52, 0x11, 0x73, 0x70, 0x6c, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x61, 0x72, + 0x73, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x6c, 0x0a, 0x1a, 0x75, 0x6e, 0x69, 0x73, 0x77, 0x61, + 0x70, 0x5f, 0x65, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, + 0x74, 0x61, 0x73, 0x6b, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x6f, 0x72, 0x61, + 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, + 0x62, 0x2e, 0x55, 0x6e, 0x69, 0x73, 0x77, 0x61, 0x70, 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x52, 0x61, 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x17, 0x75, 0x6e, 0x69, + 0x73, 0x77, 0x61, 0x70, 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x61, 0x74, 0x65, + 0x54, 0x61, 0x73, 0x6b, 0x12, 0x72, 0x0a, 0x1c, 0x73, 0x75, 0x73, 0x68, 0x69, 0x73, 0x77, 0x61, + 0x70, 0x5f, 0x65, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, + 0x74, 0x61, 0x73, 0x6b, 0x18, 0x20, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, 0x72, 0x61, + 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, + 0x62, 0x2e, 0x53, 0x75, 0x73, 0x68, 0x69, 0x73, 0x77, 0x61, 0x70, 0x45, 0x78, 0x63, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x52, 0x61, 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x19, 0x73, + 0x75, 0x73, 0x68, 0x69, 0x73, 0x77, 0x61, 0x70, 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x52, 0x61, 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x78, 0x0a, 0x1e, 0x70, 0x61, 0x6e, 0x63, + 0x61, 0x6b, 0x65, 0x73, 0x77, 0x61, 0x70, 0x5f, 0x65, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x21, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x31, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, + 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x50, 0x61, 0x6e, 0x63, 0x61, 0x6b, 0x65, 0x73, + 0x77, 0x61, 0x70, 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x61, 0x74, 0x65, 0x54, + 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x1b, 0x70, 0x61, 0x6e, 0x63, 0x61, 0x6b, 0x65, 0x73, 0x77, + 0x61, 0x70, 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x61, 0x74, 0x65, 0x54, 0x61, + 0x73, 0x6b, 0x12, 0x40, 0x0a, 0x0a, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x74, 0x61, 0x73, 0x6b, + 0x18, 0x22, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, + 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x43, 0x61, + 0x63, 0x68, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x09, 0x63, 0x61, 0x63, 0x68, 0x65, + 0x54, 0x61, 0x73, 0x6b, 0x12, 0x5c, 0x0a, 0x14, 0x73, 0x79, 0x73, 0x63, 0x6c, 0x6f, 0x63, 0x6b, + 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x23, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, + 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x53, 0x79, 0x73, 0x63, 0x6c, 0x6f, + 0x63, 0x6b, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x12, + 0x73, 0x79, 0x73, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x54, 0x61, + 0x73, 0x6b, 0x12, 0x59, 0x0a, 0x13, 0x6d, 0x61, 0x72, 0x69, 0x6e, 0x61, 0x64, 0x65, 0x5f, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x24, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x27, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, + 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x4d, 0x61, 0x72, 0x69, 0x6e, 0x61, 0x64, 0x65, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x11, 0x6d, 0x61, 0x72, 0x69, + 0x6e, 0x61, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x76, 0x0a, + 0x1e, 0x73, 0x6f, 0x6c, 0x61, 0x6e, 0x61, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, + 0x64, 0x61, 0x74, 0x61, 0x5f, 0x66, 0x65, 0x74, 0x63, 0x68, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, + 0x25, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, + 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x53, 0x6f, 0x6c, + 0x61, 0x6e, 0x61, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, 0x46, 0x65, + 0x74, 0x63, 0x68, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x1a, 0x73, 0x6f, 0x6c, 0x61, 0x6e, + 0x61, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, 0x46, 0x65, 0x74, 0x63, + 0x68, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x66, 0x0a, 0x18, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, + 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x74, 0x61, 0x73, + 0x6b, 0x18, 0x26, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, + 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x42, + 0x75, 0x66, 0x66, 0x65, 0x72, 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x50, 0x61, 0x72, 0x73, 0x65, + 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x15, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x4c, 0x61, + 0x79, 0x6f, 0x75, 0x74, 0x50, 0x61, 0x72, 0x73, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x4d, 0x0a, + 0x0f, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x74, 0x61, 0x73, 0x6b, + 0x18, 0x27, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, + 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x43, 0x72, + 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x73, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x0d, 0x63, + 0x72, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x73, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x3a, 0x0a, 0x08, + 0x6d, 0x69, 0x6e, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x28, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, + 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x4d, 0x69, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, + 0x07, 0x6d, 0x69, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x5f, 0x0a, 0x15, 0x68, 0x69, 0x73, 0x74, + 0x6f, 0x72, 0x79, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x61, 0x73, + 0x6b, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, + 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x48, + 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, + 0x73, 0x6b, 0x48, 0x00, 0x52, 0x13, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x46, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x3d, 0x0a, 0x09, 0x76, 0x77, 0x61, + 0x70, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6f, + 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, + 0x4a, 0x6f, 0x62, 0x2e, 0x56, 0x77, 0x61, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x08, + 0x76, 0x77, 0x61, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x3d, 0x0a, 0x09, 0x65, 0x77, 0x6d, 0x61, + 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x2b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6f, 0x72, + 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, + 0x6f, 0x62, 0x2e, 0x45, 0x77, 0x6d, 0x61, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x08, 0x65, + 0x77, 0x6d, 0x61, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x4f, 0x0a, 0x0f, 0x63, 0x6f, 0x6d, 0x70, 0x61, + 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x2c, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x24, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, + 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, + 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, + 0x69, 0x73, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x40, 0x0a, 0x0a, 0x72, 0x6f, 0x75, 0x6e, + 0x64, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x2d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, + 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, + 0x4a, 0x6f, 0x62, 0x2e, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, + 0x09, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x40, 0x0a, 0x0a, 0x62, 0x6f, + 0x75, 0x6e, 0x64, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x2e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, + 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, + 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x48, + 0x00, 0x52, 0x09, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x46, 0x0a, 0x0c, + 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x2f, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, + 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, + 0x73, 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, + 0x54, 0x61, 0x73, 0x6b, 0x12, 0x60, 0x0a, 0x16, 0x73, 0x61, 0x6e, 0x63, 0x74, 0x75, 0x6d, 0x5f, + 0x6c, 0x73, 0x74, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x30, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, + 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x53, 0x61, 0x6e, 0x63, + 0x74, 0x75, 0x6d, 0x4c, 0x73, 0x74, 0x50, 0x72, 0x69, 0x63, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x48, + 0x00, 0x52, 0x13, 0x73, 0x61, 0x6e, 0x63, 0x74, 0x75, 0x6d, 0x4c, 0x73, 0x74, 0x50, 0x72, 0x69, + 0x63, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x4a, 0x0a, 0x0e, 0x6f, 0x6e, 0x64, 0x6f, 0x5f, 0x75, + 0x73, 0x64, 0x79, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x31, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, + 0x2e, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, + 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x4f, 0x6e, 0x64, 0x6f, 0x55, 0x73, 0x64, 0x79, 0x54, 0x61, + 0x73, 0x6b, 0x48, 0x00, 0x52, 0x0c, 0x6f, 0x6e, 0x64, 0x6f, 0x55, 0x73, 0x64, 0x79, 0x54, 0x61, + 0x73, 0x6b, 0x12, 0x53, 0x0a, 0x11, 0x6d, 0x65, 0x74, 0x65, 0x6f, 0x72, 0x61, 0x5f, 0x73, 0x77, + 0x61, 0x70, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x32, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, + 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, + 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x4d, 0x65, 0x74, 0x65, 0x6f, 0x72, 0x61, 0x53, 0x77, 0x61, 0x70, + 0x54, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x0f, 0x6d, 0x65, 0x74, 0x65, 0x6f, 0x72, 0x61, 0x53, + 0x77, 0x61, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x42, 0x06, 0x0a, 0x04, 0x54, 0x61, 0x73, 0x6b, 0x4a, + 0x04, 0x08, 0x1b, 0x10, 0x1c, 0x4a, 0x04, 0x08, 0x1c, 0x10, 0x1d, 0x52, 0x12, 0x64, 0x65, 0x66, + 0x69, 0x5f, 0x6b, 0x69, 0x6e, 0x67, 0x64, 0x6f, 0x6d, 0x73, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x52, + 0x08, 0x74, 0x70, 0x73, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x4a, 0xb6, 0x91, 0x03, 0x0a, 0x07, 0x12, + 0x05, 0x00, 0x00, 0x9b, 0x09, 0x01, 0x0a, 0x08, 0x0a, 0x01, 0x0c, 0x12, 0x03, 0x00, 0x00, 0x12, + 0x0a, 0x08, 0x0a, 0x01, 0x02, 0x12, 0x03, 0x02, 0x00, 0x13, 0x0a, 0x52, 0x0a, 0x02, 0x04, 0x00, + 0x12, 0x05, 0x05, 0x00, 0x9b, 0x09, 0x01, 0x1a, 0x45, 0x2f, 0x20, 0x52, 0x65, 0x70, 0x72, 0x65, + 0x73, 0x6e, 0x74, 0x73, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x61, 0x73, 0x6b, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x70, 0x65, 0x72, 0x66, 0x6f, + 0x72, 0x6d, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x61, 0x20, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, + 0x62, 0x6f, 0x61, 0x72, 0x64, 0x20, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x2e, 0x0a, 0x0a, 0x0a, + 0x0a, 0x03, 0x04, 0x00, 0x01, 0x12, 0x03, 0x05, 0x08, 0x11, 0x0a, 0xeb, 0x04, 0x0a, 0x04, 0x04, + 0x00, 0x03, 0x00, 0x12, 0x04, 0x1b, 0x02, 0x38, 0x03, 0x1a, 0xdc, 0x04, 0x0a, 0x54, 0x68, 0x65, + 0x20, 0x61, 0x64, 0x61, 0x70, 0x74, 0x65, 0x72, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x72, 0x65, + 0x70, 0x6f, 0x72, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x65, 0x78, 0x74, 0x20, 0x62, 0x6f, + 0x64, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, + 0x75, 0x6c, 0x20, 0x48, 0x54, 0x54, 0x50, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, + 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x0a, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, + 0x20, 0x75, 0x72, 0x6c, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x61, 0x6e, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, + 0x63, 0x6f, 0x64, 0x65, 0x20, 0x69, 0x73, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x0a, + 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, + 0x20, 0x34, 0x30, 0x30, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2a, + 0x2a, 0x5f, 0x3a, 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x52, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x73, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, + 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x74, 0x74, 0x70, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, + 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x42, 0x61, 0x73, 0x69, 0x63, 0x20, 0x48, 0x74, 0x74, 0x70, 0x54, + 0x61, 0x73, 0x6b, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x22, 0x68, + 0x74, 0x74, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x75, 0x72, 0x6c, 0x22, + 0x3a, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x6d, 0x79, 0x77, 0x65, 0x62, + 0x73, 0x69, 0x74, 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x70, 0x61, 0x74, 0x68, 0x22, 0x7d, 0x20, + 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, + 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x48, 0x74, 0x74, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x20, 0x65, + 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x68, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x73, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x20, 0x22, + 0x68, 0x74, 0x74, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x20, 0x22, 0x75, 0x72, + 0x6c, 0x22, 0x3a, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x6d, 0x79, 0x77, + 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x70, 0x61, 0x74, 0x68, 0x22, + 0x2c, 0x20, 0x22, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x22, 0x3a, 0x20, 0x22, 0x4d, 0x45, 0x54, + 0x48, 0x4f, 0x44, 0x5f, 0x50, 0x4f, 0x53, 0x54, 0x22, 0x2c, 0x20, 0x22, 0x68, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x20, 0x7b, 0x20, 0x22, 0x6b, 0x65, 0x79, 0x22, 0x3a, + 0x20, 0x22, 0x4d, 0x59, 0x5f, 0x48, 0x45, 0x41, 0x44, 0x45, 0x52, 0x5f, 0x4b, 0x45, 0x59, 0x22, + 0x2c, 0x20, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x4d, 0x59, 0x5f, 0x48, + 0x45, 0x41, 0x44, 0x45, 0x52, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x22, 0x20, 0x7d, 0x20, 0x5d, + 0x2c, 0x20, 0x22, 0x62, 0x6f, 0x64, 0x79, 0x22, 0x3a, 0x20, 0x22, 0x7b, 0x5c, 0x22, 0x4d, 0x59, + 0x5f, 0x42, 0x4f, 0x44, 0x59, 0x5f, 0x4b, 0x45, 0x59, 0x5c, 0x22, 0x3a, 0x5c, 0x22, 0x4d, 0x59, + 0x5f, 0x42, 0x4f, 0x44, 0x59, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5c, 0x22, 0x7d, 0x22, 0x20, + 0x7d, 0x20, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x0c, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x00, + 0x01, 0x12, 0x03, 0x1b, 0x0a, 0x12, 0x0a, 0x5c, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, + 0x12, 0x04, 0x1d, 0x04, 0x24, 0x05, 0x1a, 0x4c, 0x2f, 0x20, 0x41, 0x6e, 0x20, 0x65, 0x6e, 0x75, + 0x6d, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, + 0x6e, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x73, 0x20, + 0x6f, 0x66, 0x20, 0x48, 0x54, 0x54, 0x50, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, + 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x6d, 0x61, + 0x6b, 0x65, 0x2e, 0x0a, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x01, 0x12, + 0x03, 0x1d, 0x09, 0x0f, 0x0a, 0x40, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x02, 0x00, + 0x12, 0x03, 0x1f, 0x06, 0x18, 0x1a, 0x2f, 0x2f, 0x20, 0x55, 0x6e, 0x73, 0x65, 0x74, 0x20, 0x48, + 0x54, 0x54, 0x50, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x4d, 0x45, 0x54, 0x48, 0x4f, + 0x44, 0x5f, 0x47, 0x45, 0x54, 0x0a, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, + 0x02, 0x00, 0x01, 0x12, 0x03, 0x1f, 0x06, 0x13, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x00, + 0x04, 0x00, 0x02, 0x00, 0x02, 0x12, 0x03, 0x1f, 0x16, 0x17, 0x0a, 0x32, 0x0a, 0x08, 0x04, 0x00, + 0x03, 0x00, 0x04, 0x00, 0x02, 0x01, 0x12, 0x03, 0x21, 0x06, 0x15, 0x1a, 0x21, 0x2f, 0x20, 0x50, + 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x61, 0x6e, 0x20, 0x48, 0x54, 0x54, 0x50, 0x20, 0x27, + 0x47, 0x45, 0x54, 0x27, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x0a, 0x0a, 0x10, + 0x0a, 0x09, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x02, 0x01, 0x01, 0x12, 0x03, 0x21, 0x06, 0x10, + 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x02, 0x01, 0x02, 0x12, 0x03, 0x21, + 0x13, 0x14, 0x0a, 0x33, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x02, 0x02, 0x12, 0x03, + 0x23, 0x06, 0x16, 0x1a, 0x22, 0x2f, 0x20, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x61, + 0x6e, 0x20, 0x48, 0x54, 0x54, 0x50, 0x20, 0x27, 0x50, 0x4f, 0x53, 0x54, 0x27, 0x20, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x0a, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x00, 0x04, + 0x00, 0x02, 0x02, 0x01, 0x12, 0x03, 0x23, 0x06, 0x11, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x00, 0x03, + 0x00, 0x04, 0x00, 0x02, 0x02, 0x02, 0x12, 0x03, 0x23, 0x14, 0x15, 0x0a, 0x50, 0x0a, 0x06, 0x04, + 0x00, 0x03, 0x00, 0x03, 0x00, 0x12, 0x04, 0x27, 0x04, 0x2c, 0x05, 0x1a, 0x40, 0x2f, 0x20, 0x41, + 0x6e, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x72, 0x65, + 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x61, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x64, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6e, 0x20, 0x48, + 0x54, 0x54, 0x50, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x0a, 0x0a, 0x0e, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x00, 0x03, 0x00, 0x01, 0x12, 0x03, 0x27, 0x0c, 0x12, 0x0a, 0x4a, 0x0a, + 0x08, 0x04, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x12, 0x03, 0x29, 0x06, 0x1e, 0x1a, 0x39, + 0x2f, 0x20, 0x41, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x20, 0x6b, 0x65, 0x79, 0x20, 0x73, + 0x75, 0x63, 0x68, 0x20, 0x61, 0x73, 0x20, 0x60, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x60, 0x20, 0x6f, 0x72, 0x20, 0x60, 0x43, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x2d, 0x54, 0x79, 0x70, 0x65, 0x60, 0x0a, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x00, 0x03, + 0x00, 0x03, 0x00, 0x02, 0x00, 0x04, 0x12, 0x03, 0x29, 0x06, 0x0e, 0x0a, 0x10, 0x0a, 0x09, 0x04, + 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x05, 0x12, 0x03, 0x29, 0x0f, 0x15, 0x0a, 0x10, 0x0a, + 0x09, 0x04, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x01, 0x12, 0x03, 0x29, 0x16, 0x19, 0x0a, + 0x10, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x12, 0x03, 0x29, 0x1c, + 0x1d, 0x0a, 0x61, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x01, 0x12, 0x03, 0x2b, + 0x06, 0x20, 0x1a, 0x50, 0x2f, 0x20, 0x41, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x68, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x20, 0x6b, 0x65, 0x79, 0x20, 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x60, 0x42, 0x61, 0x73, + 0x69, 0x63, 0x20, 0x4d, 0x59, 0x41, 0x55, 0x54, 0x48, 0x4b, 0x45, 0x59, 0x60, 0x20, 0x6f, 0x72, + 0x20, 0x60, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, + 0x6f, 0x6e, 0x60, 0x0a, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x01, + 0x04, 0x12, 0x03, 0x2b, 0x06, 0x0e, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x00, 0x03, 0x00, + 0x02, 0x01, 0x05, 0x12, 0x03, 0x2b, 0x0f, 0x15, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x00, + 0x03, 0x00, 0x02, 0x01, 0x01, 0x12, 0x03, 0x2b, 0x16, 0x1b, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x00, + 0x03, 0x00, 0x03, 0x00, 0x02, 0x01, 0x03, 0x12, 0x03, 0x2b, 0x1e, 0x1f, 0x0a, 0x4d, 0x0a, 0x06, + 0x04, 0x00, 0x03, 0x00, 0x02, 0x00, 0x12, 0x03, 0x2e, 0x04, 0x1c, 0x1a, 0x3e, 0x2f, 0x20, 0x41, + 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x69, + 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x55, 0x52, 0x4c, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x69, + 0x72, 0x65, 0x63, 0x74, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x48, 0x54, 0x54, 0x50, 0x20, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x74, 0x6f, 0x2e, 0x0a, 0x0a, 0x0e, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x00, 0x02, 0x00, 0x04, 0x12, 0x03, 0x2e, 0x04, 0x0c, 0x0a, 0x0e, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x00, 0x02, 0x00, 0x05, 0x12, 0x03, 0x2e, 0x0d, 0x13, 0x0a, 0x0e, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x00, 0x02, 0x00, 0x01, 0x12, 0x03, 0x2e, 0x14, 0x17, 0x0a, 0x0e, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x12, 0x03, 0x2e, 0x1a, 0x1b, 0x0a, 0x33, 0x0a, 0x06, 0x04, + 0x00, 0x03, 0x00, 0x02, 0x01, 0x12, 0x03, 0x31, 0x04, 0x1f, 0x1a, 0x24, 0x2f, 0x20, 0x54, 0x68, + 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x48, 0x54, 0x54, 0x50, 0x20, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x2e, 0x0a, + 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x00, 0x02, 0x01, 0x04, 0x12, 0x03, 0x31, 0x04, 0x0c, + 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x00, 0x02, 0x01, 0x06, 0x12, 0x03, 0x31, 0x0d, 0x13, + 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x00, 0x02, 0x01, 0x01, 0x12, 0x03, 0x31, 0x14, 0x1a, + 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x00, 0x02, 0x01, 0x03, 0x12, 0x03, 0x31, 0x1d, 0x1e, + 0x0a, 0x3c, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x00, 0x02, 0x02, 0x12, 0x03, 0x34, 0x04, 0x20, 0x1a, + 0x2d, 0x2f, 0x20, 0x41, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x68, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x64, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x20, 0x48, 0x74, 0x74, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x2e, 0x0a, 0x0a, 0x0e, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x00, 0x02, 0x02, 0x04, 0x12, 0x03, 0x34, 0x04, 0x0c, 0x0a, 0x0e, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x00, 0x02, 0x02, 0x06, 0x12, 0x03, 0x34, 0x0d, 0x13, 0x0a, 0x0e, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x00, 0x02, 0x02, 0x01, 0x12, 0x03, 0x34, 0x14, 0x1b, 0x0a, 0x0e, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x00, 0x02, 0x02, 0x03, 0x12, 0x03, 0x34, 0x1e, 0x1f, 0x0a, 0x46, + 0x0a, 0x06, 0x04, 0x00, 0x03, 0x00, 0x02, 0x03, 0x12, 0x03, 0x37, 0x04, 0x1d, 0x1a, 0x37, 0x2f, + 0x20, 0x41, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x62, + 0x6f, 0x64, 0x79, 0x20, 0x28, 0x69, 0x66, 0x20, 0x61, 0x6e, 0x79, 0x29, 0x20, 0x74, 0x6f, 0x20, + 0x61, 0x64, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x48, 0x74, 0x74, 0x70, + 0x54, 0x61, 0x73, 0x6b, 0x2e, 0x0a, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x00, 0x02, 0x03, + 0x04, 0x12, 0x03, 0x37, 0x04, 0x0c, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x00, 0x02, 0x03, + 0x05, 0x12, 0x03, 0x37, 0x0d, 0x13, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x00, 0x02, 0x03, + 0x01, 0x12, 0x03, 0x37, 0x14, 0x18, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x00, 0x02, 0x03, + 0x03, 0x12, 0x03, 0x37, 0x1b, 0x1c, 0x0a, 0x95, 0x03, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x01, 0x12, + 0x04, 0x48, 0x02, 0x5d, 0x03, 0x1a, 0x86, 0x03, 0x0a, 0x54, 0x68, 0x65, 0x20, 0x61, 0x64, 0x61, + 0x70, 0x74, 0x65, 0x72, 0x20, 0x77, 0x61, 0x6c, 0x6b, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, + 0x61, 0x74, 0x68, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x61, 0x74, 0x20, 0x74, 0x68, 0x61, + 0x74, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x0a, 0x4a, 0x53, 0x4f, 0x4e, 0x20, 0x64, 0x61, 0x74, 0x61, + 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x48, 0x74, 0x74, 0x70, 0x47, 0x65, + 0x74, 0x20, 0x6f, 0x72, 0x20, 0x48, 0x74, 0x74, 0x70, 0x50, 0x6f, 0x73, 0x74, 0x20, 0x61, 0x64, + 0x61, 0x70, 0x74, 0x65, 0x72, 0x73, 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6d, 0x75, 0x73, 0x74, + 0x20, 0x75, 0x73, 0x65, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x61, 0x64, 0x61, 0x70, 0x74, 0x65, + 0x72, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x49, 0x6e, 0x70, + 0x75, 0x74, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x72, 0x65, + 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, + 0x61, 0x20, 0x4a, 0x53, 0x4f, 0x4e, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x0a, 0x0a, + 0x5f, 0x2a, 0x2a, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x41, + 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, + 0x5f, 0x3a, 0x20, 0x50, 0x61, 0x72, 0x73, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, + 0x69, 0x63, 0x65, 0x20, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x61, + 0x20, 0x4a, 0x53, 0x4f, 0x4e, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x0a, 0x0a, 0x60, 0x60, + 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x22, 0x6a, 0x73, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x73, + 0x65, 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x3a, 0x20, 0x22, 0x24, 0x2e, + 0x70, 0x72, 0x69, 0x63, 0x65, 0x22, 0x7d, 0x20, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x0c, + 0x0a, 0x05, 0x04, 0x00, 0x03, 0x01, 0x01, 0x12, 0x03, 0x48, 0x0a, 0x17, 0x0a, 0x79, 0x0a, 0x06, + 0x04, 0x00, 0x03, 0x01, 0x02, 0x00, 0x12, 0x03, 0x4b, 0x04, 0x1d, 0x1a, 0x6a, 0x2f, 0x20, 0x4a, + 0x53, 0x4f, 0x4e, 0x50, 0x61, 0x74, 0x68, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x74, 0x65, + 0x64, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6c, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x74, + 0x2e, 0x6c, 0x79, 0x2f, 0x75, 0x4c, 0x74, 0x77, 0x0a, 0x2f, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, + 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6e, 0x70, 0x6d, 0x6a, 0x73, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x70, 0x61, 0x74, + 0x68, 0x2d, 0x70, 0x6c, 0x75, 0x73, 0x0a, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x01, 0x02, + 0x00, 0x04, 0x12, 0x03, 0x4b, 0x04, 0x0c, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x01, 0x02, + 0x00, 0x05, 0x12, 0x03, 0x4b, 0x0d, 0x13, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x01, 0x02, + 0x00, 0x01, 0x12, 0x03, 0x4b, 0x14, 0x18, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x01, 0x02, + 0x00, 0x03, 0x12, 0x03, 0x4b, 0x1b, 0x1c, 0x0a, 0x48, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x01, 0x04, + 0x00, 0x12, 0x04, 0x4e, 0x04, 0x5a, 0x05, 0x1a, 0x38, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x6d, + 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x6f, 0x6d, 0x62, 0x69, 0x6e, + 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6e, 0x75, + 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x2e, + 0x0a, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x01, 0x04, 0x00, 0x01, 0x12, 0x03, 0x4e, 0x09, + 0x1a, 0x0a, 0x0f, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x01, 0x04, 0x00, 0x02, 0x00, 0x12, 0x03, 0x4f, + 0x06, 0x0f, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x01, 0x04, 0x00, 0x02, 0x00, 0x01, 0x12, + 0x03, 0x4f, 0x06, 0x0a, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x01, 0x04, 0x00, 0x02, 0x00, + 0x02, 0x12, 0x03, 0x4f, 0x0d, 0x0e, 0x0a, 0x3a, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x01, 0x04, 0x00, + 0x02, 0x01, 0x12, 0x03, 0x51, 0x06, 0x0e, 0x1a, 0x29, 0x2f, 0x20, 0x47, 0x72, 0x61, 0x62, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, + 0x2e, 0x0a, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x01, 0x04, 0x00, 0x02, 0x01, 0x01, 0x12, + 0x03, 0x51, 0x06, 0x09, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x01, 0x04, 0x00, 0x02, 0x01, + 0x02, 0x12, 0x03, 0x51, 0x0c, 0x0d, 0x0a, 0x3a, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x01, 0x04, 0x00, + 0x02, 0x02, 0x12, 0x03, 0x53, 0x06, 0x0e, 0x1a, 0x29, 0x2f, 0x20, 0x47, 0x72, 0x61, 0x62, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, + 0x2e, 0x0a, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x01, 0x04, 0x00, 0x02, 0x02, 0x01, 0x12, + 0x03, 0x53, 0x06, 0x09, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x01, 0x04, 0x00, 0x02, 0x02, + 0x02, 0x12, 0x03, 0x53, 0x0c, 0x0d, 0x0a, 0x2e, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x01, 0x04, 0x00, + 0x02, 0x03, 0x12, 0x03, 0x55, 0x06, 0x0e, 0x1a, 0x1d, 0x2f, 0x20, 0x53, 0x75, 0x6d, 0x20, 0x75, + 0x70, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x73, 0x2e, 0x0a, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x01, 0x04, 0x00, + 0x02, 0x03, 0x01, 0x12, 0x03, 0x55, 0x06, 0x09, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x01, + 0x04, 0x00, 0x02, 0x03, 0x02, 0x12, 0x03, 0x55, 0x0c, 0x0d, 0x0a, 0x2f, 0x0a, 0x08, 0x04, 0x00, + 0x03, 0x01, 0x04, 0x00, 0x02, 0x04, 0x12, 0x03, 0x57, 0x06, 0x0f, 0x1a, 0x1e, 0x2f, 0x20, 0x41, + 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x2e, 0x0a, 0x0a, 0x10, 0x0a, 0x09, 0x04, + 0x00, 0x03, 0x01, 0x04, 0x00, 0x02, 0x04, 0x01, 0x12, 0x03, 0x57, 0x06, 0x0a, 0x0a, 0x10, 0x0a, + 0x09, 0x04, 0x00, 0x03, 0x01, 0x04, 0x00, 0x02, 0x04, 0x02, 0x12, 0x03, 0x57, 0x0d, 0x0e, 0x0a, + 0x33, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x01, 0x04, 0x00, 0x02, 0x05, 0x12, 0x03, 0x59, 0x06, 0x11, + 0x1a, 0x22, 0x2f, 0x20, 0x47, 0x72, 0x61, 0x62, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x65, 0x64, + 0x69, 0x61, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x73, 0x2e, 0x0a, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x01, 0x04, 0x00, 0x02, 0x05, + 0x01, 0x12, 0x03, 0x59, 0x06, 0x0c, 0x0a, 0x10, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x01, 0x04, 0x00, + 0x02, 0x05, 0x02, 0x12, 0x03, 0x59, 0x0f, 0x10, 0x0a, 0x8c, 0x01, 0x0a, 0x06, 0x04, 0x00, 0x03, + 0x01, 0x02, 0x01, 0x12, 0x03, 0x5c, 0x04, 0x36, 0x1a, 0x7d, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, + 0x74, 0x65, 0x63, 0x68, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, + 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x61, + 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x73, 0x20, 0x69, 0x66, 0x20, 0x77, 0x61, 0x6c, 0x6b, 0x69, 0x6e, 0x67, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x70, 0x61, + 0x74, 0x68, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, + 0x70, 0x6c, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x73, 0x2e, 0x0a, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x01, 0x02, + 0x01, 0x04, 0x12, 0x03, 0x5c, 0x04, 0x0c, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x01, 0x02, + 0x01, 0x06, 0x12, 0x03, 0x5c, 0x0d, 0x1e, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x01, 0x02, + 0x01, 0x01, 0x12, 0x03, 0x5c, 0x1f, 0x31, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x01, 0x02, + 0x01, 0x03, 0x12, 0x03, 0x5c, 0x34, 0x35, 0x0a, 0x84, 0x07, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x02, + 0x12, 0x04, 0x72, 0x02, 0x7b, 0x03, 0x1a, 0xf5, 0x06, 0x0a, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x28, 0x6d, 0x69, + 0x64, 0x64, 0x6c, 0x65, 0x29, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, + 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x64, 0x20, 0x73, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, + 0x75, 0x62, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x20, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x74, + 0x61, 0x73, 0x6b, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x61, 0x20, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x49, + 0x6e, 0x70, 0x75, 0x74, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x0a, 0x0a, 0x5f, + 0x2a, 0x2a, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x41, 0x20, + 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, + 0x3a, 0x20, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x65, + 0x64, 0x69, 0x61, 0x6e, 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x33, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x73, + 0x2e, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x22, 0x6d, 0x65, 0x64, + 0x69, 0x61, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x74, 0x61, 0x73, 0x6b, + 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x61, 0x73, 0x6b, + 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x20, 0x31, 0x30, 0x7d, + 0x7d, 0x2c, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, + 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x20, 0x32, 0x30, 0x7d, 0x7d, 0x2c, 0x7b, + 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x20, 0x33, 0x30, 0x7d, 0x7d, 0x5d, 0x7d, 0x7d, 0x0a, 0x60, + 0x60, 0x60, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, + 0x5f, 0x3a, 0x20, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, + 0x65, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, + 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x33, 0x20, 0x6a, 0x6f, 0x62, 0x73, + 0x2e, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x22, 0x6d, 0x65, 0x64, + 0x69, 0x61, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x6a, 0x6f, 0x62, 0x73, + 0x22, 0x3a, 0x20, 0x5b, 0x7b, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x7b, + 0x22, 0x68, 0x74, 0x74, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x75, 0x72, + 0x6c, 0x22, 0x3a, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, + 0x2e, 0x62, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x76, 0x33, 0x2f, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x69, 0x63, 0x65, + 0x3f, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x3d, 0x53, 0x4f, 0x4c, 0x55, 0x53, 0x44, 0x54, 0x22, + 0x7d, 0x7d, 0x2c, 0x7b, 0x22, 0x6a, 0x73, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x73, 0x65, 0x54, 0x61, + 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x3a, 0x20, 0x22, 0x24, + 0x2e, 0x70, 0x72, 0x69, 0x63, 0x65, 0x22, 0x7d, 0x7d, 0x5d, 0x7d, 0x2c, 0x7b, 0x22, 0x74, 0x61, + 0x73, 0x6b, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x7b, 0x22, 0x68, 0x74, 0x74, 0x70, 0x54, 0x61, 0x73, + 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x75, 0x72, 0x6c, 0x22, 0x3a, 0x20, 0x22, 0x68, 0x74, 0x74, + 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x62, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x65, + 0x2e, 0x75, 0x73, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x33, 0x2f, 0x74, 0x69, 0x63, 0x6b, 0x65, + 0x72, 0x2f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x3f, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x3d, 0x53, + 0x4f, 0x4c, 0x55, 0x53, 0x44, 0x22, 0x7d, 0x7d, 0x2c, 0x7b, 0x22, 0x6a, 0x73, 0x6f, 0x6e, 0x50, + 0x61, 0x72, 0x73, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x70, 0x61, 0x74, + 0x68, 0x22, 0x3a, 0x20, 0x22, 0x24, 0x2e, 0x70, 0x72, 0x69, 0x63, 0x65, 0x22, 0x7d, 0x7d, 0x5d, + 0x7d, 0x2c, 0x7b, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x7b, 0x22, 0x68, + 0x74, 0x74, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x75, 0x72, 0x6c, 0x22, + 0x3a, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x61, 0x70, 0x69, 0x2d, 0x70, + 0x75, 0x62, 0x2e, 0x62, 0x69, 0x74, 0x66, 0x69, 0x6e, 0x65, 0x78, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x76, 0x32, 0x2f, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x72, 0x73, 0x3f, 0x73, 0x79, 0x6d, 0x62, 0x6f, + 0x6c, 0x73, 0x3d, 0x74, 0x53, 0x4f, 0x4c, 0x55, 0x53, 0x44, 0x22, 0x7d, 0x7d, 0x2c, 0x7b, 0x22, + 0x6a, 0x73, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x73, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, + 0x7b, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x3a, 0x20, 0x22, 0x24, 0x5b, 0x30, 0x5d, 0x5b, 0x37, + 0x5d, 0x22, 0x7d, 0x7d, 0x5d, 0x7d, 0x5d, 0x7d, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x0c, + 0x0a, 0x05, 0x04, 0x00, 0x03, 0x02, 0x01, 0x12, 0x03, 0x72, 0x0a, 0x14, 0x0a, 0x54, 0x0a, 0x06, + 0x04, 0x00, 0x03, 0x02, 0x02, 0x00, 0x12, 0x03, 0x74, 0x04, 0x1c, 0x1a, 0x45, 0x2f, 0x20, 0x41, + 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, + 0x73, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, + 0x6f, 0x66, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, + 0x2e, 0x0a, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x02, 0x02, 0x00, 0x04, 0x12, 0x03, 0x74, + 0x04, 0x0c, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x02, 0x02, 0x00, 0x06, 0x12, 0x03, 0x74, + 0x0d, 0x11, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x02, 0x02, 0x00, 0x01, 0x12, 0x03, 0x74, + 0x12, 0x17, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x02, 0x02, 0x00, 0x03, 0x12, 0x03, 0x74, + 0x1a, 0x1b, 0x0a, 0x53, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x02, 0x02, 0x01, 0x12, 0x03, 0x76, 0x04, + 0x20, 0x1a, 0x44, 0x2f, 0x20, 0x41, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x73, + 0x75, 0x62, 0x6a, 0x6f, 0x62, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, + 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x20, 0x61, 0x20, + 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2e, 0x0a, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x02, 0x02, + 0x01, 0x04, 0x12, 0x03, 0x76, 0x04, 0x0c, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x02, 0x02, + 0x01, 0x06, 0x12, 0x03, 0x76, 0x0d, 0x16, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x02, 0x02, + 0x01, 0x01, 0x12, 0x03, 0x76, 0x17, 0x1b, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x02, 0x02, + 0x01, 0x03, 0x12, 0x03, 0x76, 0x1e, 0x1f, 0x0a, 0x59, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x02, 0x02, + 0x02, 0x12, 0x03, 0x78, 0x04, 0x2f, 0x1a, 0x4a, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x6d, 0x69, + 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x61, 0x20, + 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x61, + 0x6e, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x79, 0x69, 0x65, 0x6c, 0x64, 0x65, 0x64, + 0x2e, 0x0a, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x02, 0x02, 0x02, 0x04, 0x12, 0x03, 0x78, + 0x04, 0x0c, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x02, 0x02, 0x02, 0x05, 0x12, 0x03, 0x78, + 0x0d, 0x12, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x02, 0x02, 0x02, 0x01, 0x12, 0x03, 0x78, + 0x13, 0x2a, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x02, 0x02, 0x02, 0x03, 0x12, 0x03, 0x78, + 0x2d, 0x2e, 0x0a, 0x75, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x02, 0x02, 0x03, 0x12, 0x03, 0x7a, 0x04, + 0x2a, 0x1a, 0x66, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, + 0x20, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x62, 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d, + 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x62, 0x65, + 0x66, 0x6f, 0x72, 0x65, 0x20, 0x61, 0x20, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, + 0x6c, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, + 0x79, 0x69, 0x65, 0x6c, 0x64, 0x65, 0x64, 0x2e, 0x0a, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x02, 0x02, 0x03, 0x04, 0x12, 0x03, 0x7a, 0x04, 0x0c, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x02, 0x02, 0x03, 0x05, 0x12, 0x03, 0x7a, 0x0d, 0x13, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x02, 0x02, 0x03, 0x01, 0x12, 0x03, 0x7a, 0x14, 0x25, 0x0a, 0x0e, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x02, 0x02, 0x03, 0x03, 0x12, 0x03, 0x7a, 0x28, 0x29, 0x0a, 0x85, 0x07, 0x0a, 0x04, 0x04, 0x00, + 0x03, 0x03, 0x12, 0x06, 0x90, 0x01, 0x02, 0x95, 0x01, 0x03, 0x1a, 0xf4, 0x06, 0x0a, 0x52, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x65, 0x61, 0x6e, 0x20, 0x28, + 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x29, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6c, 0x6c, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x64, 0x20, 0x73, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x73, 0x75, 0x62, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x20, 0x4e, 0x65, 0x73, 0x74, 0x65, + 0x64, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x6a, 0x6f, 0x62, 0x73, 0x20, + 0x6d, 0x75, 0x73, 0x74, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x20, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2a, + 0x2a, 0x5f, 0x3a, 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x52, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x73, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x41, 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, + 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, + 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x52, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x65, 0x61, 0x6e, 0x20, 0x6e, 0x75, + 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x6f, + 0x66, 0x20, 0x33, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2e, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, + 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x22, 0x6d, 0x65, 0x61, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, + 0x20, 0x7b, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x7b, 0x22, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x22, 0x3a, 0x20, 0x31, 0x30, 0x7d, 0x7d, 0x2c, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, + 0x20, 0x32, 0x30, 0x7d, 0x7d, 0x2c, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x61, 0x73, + 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x20, 0x33, 0x30, + 0x7d, 0x7d, 0x5d, 0x7d, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, + 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x65, 0x61, 0x6e, 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, + 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x33, + 0x20, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, + 0x7b, 0x22, 0x6d, 0x65, 0x61, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x6a, + 0x6f, 0x62, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x7b, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x3a, + 0x20, 0x5b, 0x7b, 0x22, 0x68, 0x74, 0x74, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, + 0x22, 0x75, 0x72, 0x6c, 0x22, 0x3a, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, + 0x77, 0x77, 0x77, 0x2e, 0x62, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x76, 0x33, 0x2f, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x72, 0x2f, 0x70, 0x72, + 0x69, 0x63, 0x65, 0x3f, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x3d, 0x53, 0x4f, 0x4c, 0x55, 0x53, + 0x44, 0x54, 0x22, 0x7d, 0x7d, 0x2c, 0x7b, 0x22, 0x6a, 0x73, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x73, + 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x3a, + 0x20, 0x22, 0x24, 0x2e, 0x70, 0x72, 0x69, 0x63, 0x65, 0x22, 0x7d, 0x7d, 0x5d, 0x7d, 0x2c, 0x7b, + 0x22, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x7b, 0x22, 0x68, 0x74, 0x74, 0x70, + 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x75, 0x72, 0x6c, 0x22, 0x3a, 0x20, 0x22, + 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x62, 0x69, 0x6e, 0x61, + 0x6e, 0x63, 0x65, 0x2e, 0x75, 0x73, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x33, 0x2f, 0x74, 0x69, + 0x63, 0x6b, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x3f, 0x73, 0x79, 0x6d, 0x62, 0x6f, + 0x6c, 0x3d, 0x53, 0x4f, 0x4c, 0x55, 0x53, 0x44, 0x22, 0x7d, 0x7d, 0x2c, 0x7b, 0x22, 0x6a, 0x73, + 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x73, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, + 0x70, 0x61, 0x74, 0x68, 0x22, 0x3a, 0x20, 0x22, 0x24, 0x2e, 0x70, 0x72, 0x69, 0x63, 0x65, 0x22, + 0x7d, 0x7d, 0x5d, 0x7d, 0x2c, 0x7b, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x3a, 0x20, 0x5b, + 0x7b, 0x22, 0x68, 0x74, 0x74, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x75, + 0x72, 0x6c, 0x22, 0x3a, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x61, 0x70, + 0x69, 0x2d, 0x70, 0x75, 0x62, 0x2e, 0x62, 0x69, 0x74, 0x66, 0x69, 0x6e, 0x65, 0x78, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x76, 0x32, 0x2f, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x72, 0x73, 0x3f, 0x73, 0x79, + 0x6d, 0x62, 0x6f, 0x6c, 0x73, 0x3d, 0x74, 0x53, 0x4f, 0x4c, 0x55, 0x53, 0x44, 0x22, 0x7d, 0x7d, + 0x2c, 0x7b, 0x22, 0x6a, 0x73, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x73, 0x65, 0x54, 0x61, 0x73, 0x6b, + 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x3a, 0x20, 0x22, 0x24, 0x5b, 0x30, + 0x5d, 0x5b, 0x37, 0x5d, 0x22, 0x7d, 0x7d, 0x5d, 0x7d, 0x5d, 0x7d, 0x7d, 0x0a, 0x60, 0x60, 0x60, + 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x03, 0x01, 0x12, 0x04, 0x90, 0x01, 0x0a, 0x12, + 0x0a, 0x55, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x03, 0x02, 0x00, 0x12, 0x04, 0x92, 0x01, 0x04, 0x1c, + 0x1a, 0x45, 0x2f, 0x20, 0x41, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x75, + 0x62, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, + 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x20, 0x61, 0x20, + 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x03, 0x02, + 0x00, 0x04, 0x12, 0x04, 0x92, 0x01, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x03, + 0x02, 0x00, 0x06, 0x12, 0x04, 0x92, 0x01, 0x0d, 0x11, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x03, 0x02, 0x00, 0x01, 0x12, 0x04, 0x92, 0x01, 0x12, 0x17, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x03, 0x02, 0x00, 0x03, 0x12, 0x04, 0x92, 0x01, 0x1a, 0x1b, 0x0a, 0x54, 0x0a, 0x06, 0x04, + 0x00, 0x03, 0x03, 0x02, 0x01, 0x12, 0x04, 0x94, 0x01, 0x04, 0x20, 0x1a, 0x44, 0x2f, 0x20, 0x41, + 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x75, 0x62, 0x6a, 0x6f, 0x62, 0x73, + 0x20, 0x74, 0x6f, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, + 0x66, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2e, + 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x03, 0x02, 0x01, 0x04, 0x12, 0x04, 0x94, 0x01, + 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x03, 0x02, 0x01, 0x06, 0x12, 0x04, 0x94, + 0x01, 0x0d, 0x16, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x03, 0x02, 0x01, 0x01, 0x12, 0x04, + 0x94, 0x01, 0x17, 0x1b, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x03, 0x02, 0x01, 0x03, 0x12, + 0x04, 0x94, 0x01, 0x1e, 0x1f, 0x0a, 0x8c, 0x07, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x04, 0x12, 0x06, + 0xaa, 0x01, 0x02, 0xaf, 0x01, 0x03, 0x1a, 0xfb, 0x06, 0x0a, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, + 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x20, + 0x73, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x75, 0x62, + 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x20, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x74, 0x61, 0x73, + 0x6b, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x6a, 0x6f, 0x62, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x20, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x2e, + 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x4e, + 0x6f, 0x6e, 0x65, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x2a, + 0x2a, 0x5f, 0x3a, 0x20, 0x41, 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, + 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, + 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6e, 0x75, 0x6d, 0x65, + 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x66, 0x72, 0x6f, + 0x6d, 0x20, 0x33, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2e, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, + 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x22, 0x6d, 0x61, 0x78, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, + 0x7b, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x7b, 0x22, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x22, 0x3a, 0x20, 0x31, 0x30, 0x7d, 0x7d, 0x2c, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, + 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x20, + 0x32, 0x30, 0x7d, 0x7d, 0x2c, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x61, 0x73, 0x6b, + 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x20, 0x33, 0x30, 0x7d, + 0x7d, 0x5d, 0x7d, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, + 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6e, 0x75, 0x6d, + 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x66, 0x72, + 0x6f, 0x6d, 0x20, 0x33, 0x20, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, + 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x22, 0x6d, 0x61, 0x78, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, + 0x7b, 0x22, 0x6a, 0x6f, 0x62, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x7b, 0x22, 0x74, 0x61, 0x73, 0x6b, + 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x7b, 0x22, 0x68, 0x74, 0x74, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x22, + 0x3a, 0x20, 0x7b, 0x22, 0x75, 0x72, 0x6c, 0x22, 0x3a, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x73, + 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x62, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x33, 0x2f, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x72, + 0x2f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x3f, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x3d, 0x53, 0x4f, + 0x4c, 0x55, 0x53, 0x44, 0x54, 0x22, 0x7d, 0x7d, 0x2c, 0x7b, 0x22, 0x6a, 0x73, 0x6f, 0x6e, 0x50, + 0x61, 0x72, 0x73, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x70, 0x61, 0x74, + 0x68, 0x22, 0x3a, 0x20, 0x22, 0x24, 0x2e, 0x70, 0x72, 0x69, 0x63, 0x65, 0x22, 0x7d, 0x7d, 0x5d, + 0x7d, 0x2c, 0x7b, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x7b, 0x22, 0x68, + 0x74, 0x74, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x75, 0x72, 0x6c, 0x22, + 0x3a, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x62, + 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x75, 0x73, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x33, + 0x2f, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x3f, 0x73, 0x79, + 0x6d, 0x62, 0x6f, 0x6c, 0x3d, 0x53, 0x4f, 0x4c, 0x55, 0x53, 0x44, 0x22, 0x7d, 0x7d, 0x2c, 0x7b, + 0x22, 0x6a, 0x73, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x73, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, + 0x20, 0x7b, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x3a, 0x20, 0x22, 0x24, 0x2e, 0x70, 0x72, 0x69, + 0x63, 0x65, 0x22, 0x7d, 0x7d, 0x5d, 0x7d, 0x2c, 0x7b, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, + 0x3a, 0x20, 0x5b, 0x7b, 0x22, 0x68, 0x74, 0x74, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, + 0x7b, 0x22, 0x75, 0x72, 0x6c, 0x22, 0x3a, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, + 0x2f, 0x61, 0x70, 0x69, 0x2d, 0x70, 0x75, 0x62, 0x2e, 0x62, 0x69, 0x74, 0x66, 0x69, 0x6e, 0x65, + 0x78, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x76, 0x32, 0x2f, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x72, 0x73, + 0x3f, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x73, 0x3d, 0x74, 0x53, 0x4f, 0x4c, 0x55, 0x53, 0x44, + 0x22, 0x7d, 0x7d, 0x2c, 0x7b, 0x22, 0x6a, 0x73, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x73, 0x65, 0x54, + 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x3a, 0x20, 0x22, + 0x24, 0x5b, 0x30, 0x5d, 0x5b, 0x37, 0x5d, 0x22, 0x7d, 0x7d, 0x5d, 0x7d, 0x5d, 0x7d, 0x7d, 0x0a, + 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x04, 0x01, 0x12, 0x04, 0xaa, + 0x01, 0x0a, 0x11, 0x0a, 0x55, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x04, 0x02, 0x00, 0x12, 0x04, 0xac, + 0x01, 0x04, 0x1c, 0x1a, 0x45, 0x2f, 0x20, 0x41, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, + 0x20, 0x73, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x72, 0x6f, + 0x63, 0x65, 0x73, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, + 0x20, 0x61, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x04, 0x02, 0x00, 0x04, 0x12, 0x04, 0xac, 0x01, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x04, 0x02, 0x00, 0x06, 0x12, 0x04, 0xac, 0x01, 0x0d, 0x11, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x04, 0x02, 0x00, 0x01, 0x12, 0x04, 0xac, 0x01, 0x12, 0x17, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x04, 0x02, 0x00, 0x03, 0x12, 0x04, 0xac, 0x01, 0x1a, 0x1b, 0x0a, 0x54, + 0x0a, 0x06, 0x04, 0x00, 0x03, 0x04, 0x02, 0x01, 0x12, 0x04, 0xae, 0x01, 0x04, 0x20, 0x1a, 0x44, + 0x2f, 0x20, 0x41, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x75, 0x62, 0x6a, + 0x6f, 0x62, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x73, + 0x74, 0x20, 0x6f, 0x66, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x73, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x04, 0x02, 0x01, 0x04, 0x12, + 0x04, 0xae, 0x01, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x04, 0x02, 0x01, 0x06, + 0x12, 0x04, 0xae, 0x01, 0x0d, 0x16, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x04, 0x02, 0x01, + 0x01, 0x12, 0x04, 0xae, 0x01, 0x17, 0x1b, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x04, 0x02, + 0x01, 0x03, 0x12, 0x04, 0xae, 0x01, 0x1e, 0x1f, 0x0a, 0x8c, 0x07, 0x0a, 0x04, 0x04, 0x00, 0x03, + 0x05, 0x12, 0x06, 0xc4, 0x01, 0x02, 0xc9, 0x01, 0x03, 0x1a, 0xfb, 0x06, 0x0a, 0x52, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, + 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x64, 0x20, 0x73, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x73, 0x75, 0x62, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x20, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, + 0x74, 0x61, 0x73, 0x6b, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x6a, 0x6f, 0x62, 0x73, 0x20, 0x6d, 0x75, + 0x73, 0x74, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x20, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2a, 0x2a, 0x5f, + 0x3a, 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x52, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x73, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x41, 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, + 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, + 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x52, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6e, + 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, + 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x33, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2e, 0x0a, 0x0a, 0x60, + 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x22, 0x6d, 0x69, 0x6e, 0x54, 0x61, 0x73, 0x6b, + 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x7b, 0x22, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x20, 0x31, 0x30, 0x7d, 0x7d, 0x2c, 0x7b, 0x22, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x22, 0x3a, 0x20, 0x32, 0x30, 0x7d, 0x7d, 0x2c, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, + 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x20, + 0x33, 0x30, 0x7d, 0x7d, 0x5d, 0x7d, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, + 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x52, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x20, + 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x33, 0x20, 0x6a, 0x6f, 0x62, 0x73, 0x2e, 0x0a, 0x0a, 0x60, + 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x22, 0x6d, 0x69, 0x6e, 0x54, 0x61, 0x73, 0x6b, + 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x6a, 0x6f, 0x62, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x7b, 0x22, 0x74, + 0x61, 0x73, 0x6b, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x7b, 0x22, 0x68, 0x74, 0x74, 0x70, 0x54, 0x61, + 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x75, 0x72, 0x6c, 0x22, 0x3a, 0x20, 0x22, 0x68, 0x74, + 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x62, 0x69, 0x6e, 0x61, 0x6e, 0x63, + 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x33, 0x2f, 0x74, 0x69, 0x63, + 0x6b, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x3f, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, + 0x3d, 0x53, 0x4f, 0x4c, 0x55, 0x53, 0x44, 0x54, 0x22, 0x7d, 0x7d, 0x2c, 0x7b, 0x22, 0x6a, 0x73, + 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x73, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, + 0x70, 0x61, 0x74, 0x68, 0x22, 0x3a, 0x20, 0x22, 0x24, 0x2e, 0x70, 0x72, 0x69, 0x63, 0x65, 0x22, + 0x7d, 0x7d, 0x5d, 0x7d, 0x2c, 0x7b, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x3a, 0x20, 0x5b, + 0x7b, 0x22, 0x68, 0x74, 0x74, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x75, + 0x72, 0x6c, 0x22, 0x3a, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, + 0x77, 0x2e, 0x62, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x75, 0x73, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x76, 0x33, 0x2f, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x69, 0x63, 0x65, + 0x3f, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x3d, 0x53, 0x4f, 0x4c, 0x55, 0x53, 0x44, 0x22, 0x7d, + 0x7d, 0x2c, 0x7b, 0x22, 0x6a, 0x73, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x73, 0x65, 0x54, 0x61, 0x73, + 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x3a, 0x20, 0x22, 0x24, 0x2e, + 0x70, 0x72, 0x69, 0x63, 0x65, 0x22, 0x7d, 0x7d, 0x5d, 0x7d, 0x2c, 0x7b, 0x22, 0x74, 0x61, 0x73, + 0x6b, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x7b, 0x22, 0x68, 0x74, 0x74, 0x70, 0x54, 0x61, 0x73, 0x6b, + 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x75, 0x72, 0x6c, 0x22, 0x3a, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, + 0x73, 0x3a, 0x2f, 0x2f, 0x61, 0x70, 0x69, 0x2d, 0x70, 0x75, 0x62, 0x2e, 0x62, 0x69, 0x74, 0x66, + 0x69, 0x6e, 0x65, 0x78, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x76, 0x32, 0x2f, 0x74, 0x69, 0x63, 0x6b, + 0x65, 0x72, 0x73, 0x3f, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x73, 0x3d, 0x74, 0x53, 0x4f, 0x4c, + 0x55, 0x53, 0x44, 0x22, 0x7d, 0x7d, 0x2c, 0x7b, 0x22, 0x6a, 0x73, 0x6f, 0x6e, 0x50, 0x61, 0x72, + 0x73, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, + 0x3a, 0x20, 0x22, 0x24, 0x5b, 0x30, 0x5d, 0x5b, 0x37, 0x5d, 0x22, 0x7d, 0x7d, 0x5d, 0x7d, 0x5d, + 0x7d, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x05, 0x01, + 0x12, 0x04, 0xc4, 0x01, 0x0a, 0x11, 0x0a, 0x55, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x05, 0x02, 0x00, + 0x12, 0x04, 0xc6, 0x01, 0x04, 0x1c, 0x1a, 0x45, 0x2f, 0x20, 0x41, 0x20, 0x6c, 0x69, 0x73, 0x74, + 0x20, 0x6f, 0x66, 0x20, 0x73, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x20, 0x74, 0x6f, 0x20, + 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x72, 0x6f, 0x64, + 0x75, 0x63, 0x65, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x72, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x05, 0x02, 0x00, 0x04, 0x12, 0x04, 0xc6, 0x01, 0x04, 0x0c, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x05, 0x02, 0x00, 0x06, 0x12, 0x04, 0xc6, 0x01, 0x0d, 0x11, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x05, 0x02, 0x00, 0x01, 0x12, 0x04, 0xc6, 0x01, 0x12, 0x17, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x05, 0x02, 0x00, 0x03, 0x12, 0x04, 0xc6, 0x01, 0x1a, + 0x1b, 0x0a, 0x54, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x05, 0x02, 0x01, 0x12, 0x04, 0xc8, 0x01, 0x04, + 0x20, 0x1a, 0x44, 0x2f, 0x20, 0x41, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x73, + 0x75, 0x62, 0x6a, 0x6f, 0x62, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, + 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x20, 0x61, 0x20, + 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x05, 0x02, + 0x01, 0x04, 0x12, 0x04, 0xc8, 0x01, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x05, + 0x02, 0x01, 0x06, 0x12, 0x04, 0xc8, 0x01, 0x0d, 0x16, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x05, 0x02, 0x01, 0x01, 0x12, 0x04, 0xc8, 0x01, 0x17, 0x1b, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x05, 0x02, 0x01, 0x03, 0x12, 0x04, 0xc8, 0x01, 0x1e, 0x1f, 0x0a, 0xc7, 0x03, 0x0a, 0x04, + 0x04, 0x00, 0x03, 0x06, 0x12, 0x06, 0xe4, 0x01, 0x02, 0xf1, 0x01, 0x03, 0x1a, 0xb6, 0x03, 0x0a, + 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, + 0x69, 0x65, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x49, + 0x6e, 0x70, 0x75, 0x74, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x0a, 0x0a, 0x5f, + 0x2a, 0x2a, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x41, 0x20, + 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, + 0x3a, 0x20, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x20, 0x31, 0x30, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, + 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x20, 0x31, 0x30, 0x7d, 0x20, 0x7d, 0x0a, 0x60, 0x60, + 0x60, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, + 0x3a, 0x20, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, + 0x6f, 0x72, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x22, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x61, 0x67, 0x67, 0x72, + 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x22, 0x3a, 0x20, 0x22, + 0x47, 0x76, 0x44, 0x4d, 0x78, 0x50, 0x7a, 0x4e, 0x31, 0x73, 0x43, 0x6a, 0x37, 0x4c, 0x32, 0x36, + 0x59, 0x44, 0x4b, 0x32, 0x48, 0x6e, 0x4d, 0x52, 0x58, 0x45, 0x51, 0x6d, 0x51, 0x32, 0x61, 0x65, + 0x6d, 0x6f, 0x76, 0x38, 0x59, 0x42, 0x74, 0x50, 0x53, 0x37, 0x76, 0x52, 0x22, 0x7d, 0x20, 0x7d, + 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, + 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x20, 0x69, 0x6e, + 0x20, 0x61, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x20, 0x76, 0x61, 0x72, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, + 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x22, 0x62, + 0x69, 0x67, 0x22, 0x3a, 0x20, 0x22, 0x24, 0x7b, 0x4f, 0x4e, 0x45, 0x7d, 0x22, 0x7d, 0x20, 0x7d, + 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x06, 0x01, 0x12, 0x04, + 0xe4, 0x01, 0x0a, 0x13, 0x0a, 0x10, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x06, 0x08, 0x00, 0x12, 0x06, + 0xe5, 0x01, 0x04, 0xf0, 0x01, 0x05, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x06, 0x08, 0x00, + 0x01, 0x12, 0x04, 0xe5, 0x01, 0x0a, 0x0f, 0x0a, 0x42, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x06, 0x02, + 0x00, 0x12, 0x04, 0xe7, 0x01, 0x06, 0x17, 0x1a, 0x32, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, + 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x06, 0x02, 0x00, 0x05, 0x12, 0x04, 0xe7, 0x01, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x06, 0x02, 0x00, 0x01, 0x12, 0x04, 0xe7, 0x01, 0x0d, 0x12, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x06, 0x02, 0x00, 0x03, 0x12, 0x04, 0xe7, 0x01, 0x15, 0x16, 0x0a, 0x41, + 0x0a, 0x06, 0x04, 0x00, 0x03, 0x06, 0x02, 0x01, 0x12, 0x04, 0xe9, 0x01, 0x06, 0x23, 0x1a, 0x31, + 0x2f, 0x20, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x61, + 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x75, + 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6f, 0x66, 0x2e, + 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x06, 0x02, 0x01, 0x05, 0x12, 0x04, 0xe9, 0x01, + 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x06, 0x02, 0x01, 0x01, 0x12, 0x04, 0xe9, + 0x01, 0x0d, 0x1e, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x06, 0x02, 0x01, 0x03, 0x12, 0x04, + 0xe9, 0x01, 0x21, 0x22, 0x0a, 0x4d, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x06, 0x02, 0x02, 0x12, 0x04, + 0xeb, 0x01, 0x06, 0x15, 0x1a, 0x3d, 0x2f, 0x20, 0x41, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x62, 0x69, 0x67, 0x2e, 0x6a, 0x73, 0x2e, 0x20, 0x60, 0x41, + 0x63, 0x63, 0x65, 0x70, 0x74, 0x73, 0x20, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x20, + 0x65, 0x78, 0x70, 0x61, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, + 0x2e, 0x60, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x06, 0x02, 0x02, 0x05, 0x12, 0x04, + 0xeb, 0x01, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x06, 0x02, 0x02, 0x01, 0x12, + 0x04, 0xeb, 0x01, 0x0d, 0x10, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x06, 0x02, 0x02, 0x03, + 0x12, 0x04, 0xeb, 0x01, 0x13, 0x14, 0x0a, 0x44, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x06, 0x02, 0x03, + 0x12, 0x04, 0xed, 0x01, 0x06, 0x15, 0x1a, 0x34, 0x2f, 0x20, 0x41, 0x20, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x68, 0x65, 0x78, 0x20, 0x6e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x28, 0x30, 0x78, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x69, 0x73, + 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x29, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x06, 0x02, 0x03, 0x05, 0x12, 0x04, 0xed, 0x01, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x06, 0x02, 0x03, 0x01, 0x12, 0x04, 0xed, 0x01, 0x0d, 0x10, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x06, 0x02, 0x03, 0x03, 0x12, 0x04, 0xed, 0x01, 0x13, 0x14, 0x0a, + 0x20, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x06, 0x02, 0x04, 0x12, 0x04, 0xef, 0x01, 0x06, 0x16, 0x1a, + 0x10, 0x20, 0x41, 0x20, 0x75, 0x74, 0x66, 0x38, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, + 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x06, 0x02, 0x04, 0x05, 0x12, 0x04, 0xef, 0x01, + 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x06, 0x02, 0x04, 0x01, 0x12, 0x04, 0xef, + 0x01, 0x0d, 0x11, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x06, 0x02, 0x04, 0x03, 0x12, 0x04, + 0xef, 0x01, 0x14, 0x15, 0x0a, 0x9f, 0x04, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x07, 0x12, 0x06, 0x80, + 0x02, 0x02, 0x8a, 0x02, 0x03, 0x1a, 0x8e, 0x04, 0x0a, 0x4f, 0x70, 0x65, 0x6e, 0x73, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x77, + 0x65, 0x62, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6c, 0x69, 0x67, + 0x68, 0x74, 0x20, 0x73, 0x70, 0x65, 0x65, 0x64, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x72, 0x65, + 0x74, 0x72, 0x69, 0x65, 0x76, 0x61, 0x6c, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x49, 0x6e, 0x70, + 0x75, 0x74, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, + 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x53, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x20, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, 0x65, 0x62, 0x73, 0x6f, 0x63, 0x6b, + 0x65, 0x74, 0x20, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, + 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x4f, 0x70, 0x65, 0x6e, 0x73, 0x20, 0x61, + 0x20, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x20, 0x77, 0x65, 0x62, 0x73, 0x6f, 0x63, + 0x6b, 0x65, 0x74, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x20, 0x22, + 0x77, 0x65, 0x62, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, + 0x7b, 0x20, 0x22, 0x75, 0x72, 0x6c, 0x22, 0x3a, 0x20, 0x22, 0x77, 0x73, 0x73, 0x3a, 0x2f, 0x2f, + 0x77, 0x73, 0x2d, 0x66, 0x65, 0x65, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x2e, 0x63, 0x6f, 0x69, 0x6e, + 0x62, 0x61, 0x73, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x22, 0x2c, 0x20, 0x22, 0x73, 0x75, 0x62, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x7b, 0x5c, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x5c, 0x22, 0x3a, 0x5c, 0x22, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, + 0x65, 0x5c, 0x22, 0x2c, 0x5c, 0x22, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x69, 0x64, + 0x73, 0x5c, 0x22, 0x3a, 0x5b, 0x5c, 0x22, 0x42, 0x54, 0x43, 0x2d, 0x55, 0x53, 0x44, 0x5c, 0x22, + 0x5d, 0x2c, 0x5c, 0x22, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x5c, 0x22, 0x3a, 0x5b, + 0x5c, 0x22, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x72, 0x5c, 0x22, 0x2c, 0x7b, 0x5c, 0x22, 0x6e, 0x61, + 0x6d, 0x65, 0x5c, 0x22, 0x3a, 0x5c, 0x22, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x72, 0x5c, 0x22, 0x2c, + 0x5c, 0x22, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x5c, 0x22, 0x3a, + 0x5b, 0x5c, 0x22, 0x42, 0x54, 0x43, 0x2d, 0x55, 0x53, 0x44, 0x5c, 0x22, 0x5d, 0x7d, 0x5d, 0x7d, + 0x22, 0x2c, 0x20, 0x22, 0x6d, 0x61, 0x78, 0x44, 0x61, 0x74, 0x61, 0x41, 0x67, 0x65, 0x53, 0x65, + 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x22, 0x3a, 0x20, 0x31, 0x35, 0x2c, 0x20, 0x22, 0x66, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x22, 0x3a, 0x20, 0x22, 0x24, 0x5b, 0x3f, 0x28, 0x40, 0x2e, 0x74, 0x79, 0x70, + 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x27, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x72, 0x27, 0x20, 0x26, 0x26, + 0x20, 0x40, 0x2e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x20, 0x3d, 0x3d, + 0x20, 0x27, 0x42, 0x54, 0x43, 0x2d, 0x55, 0x53, 0x44, 0x27, 0x29, 0x5d, 0x22, 0x20, 0x7d, 0x20, + 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x07, 0x01, 0x12, + 0x04, 0x80, 0x02, 0x0a, 0x17, 0x0a, 0x25, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x07, 0x02, 0x00, 0x12, + 0x04, 0x82, 0x02, 0x04, 0x1c, 0x1a, 0x15, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x77, 0x65, 0x62, + 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x75, 0x72, 0x6c, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x07, 0x02, 0x00, 0x04, 0x12, 0x04, 0x82, 0x02, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x07, 0x02, 0x00, 0x05, 0x12, 0x04, 0x82, 0x02, 0x0d, 0x13, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x07, 0x02, 0x00, 0x01, 0x12, 0x04, 0x82, 0x02, 0x14, 0x17, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x07, 0x02, 0x00, 0x03, 0x12, 0x04, 0x82, 0x02, 0x1a, 0x1b, + 0x0a, 0x49, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x07, 0x02, 0x01, 0x12, 0x04, 0x84, 0x02, 0x04, 0x25, + 0x1a, 0x39, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x77, 0x65, 0x62, 0x73, 0x6f, 0x63, 0x6b, 0x65, + 0x74, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x6e, 0x6f, 0x74, + 0x69, 0x66, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x73, 0x75, 0x62, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x07, 0x02, 0x01, 0x04, 0x12, 0x04, 0x84, 0x02, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x07, 0x02, 0x01, 0x05, 0x12, 0x04, 0x84, 0x02, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x07, 0x02, 0x01, 0x01, 0x12, 0x04, 0x84, 0x02, 0x14, 0x20, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x07, 0x02, 0x01, 0x03, 0x12, 0x04, 0x84, 0x02, 0x23, 0x24, 0x0a, + 0x5a, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x07, 0x02, 0x02, 0x12, 0x04, 0x86, 0x02, 0x04, 0x2c, 0x1a, + 0x4a, 0x2f, 0x20, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x61, 0x6d, 0x6f, 0x75, 0x6e, + 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x64, 0x20, 0x62, 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x68, 0x6f, 0x72, 0x73, 0x65, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x74, + 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x07, 0x02, 0x02, 0x04, 0x12, 0x04, 0x86, 0x02, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x07, 0x02, 0x02, 0x05, 0x12, 0x04, 0x86, 0x02, 0x0d, 0x12, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x07, 0x02, 0x02, 0x01, 0x12, 0x04, 0x86, 0x02, 0x13, 0x27, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x07, 0x02, 0x02, 0x03, 0x12, 0x04, 0x86, 0x02, 0x2a, 0x2b, 0x0a, + 0x76, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x07, 0x02, 0x03, 0x12, 0x04, 0x89, 0x02, 0x04, 0x1f, 0x1a, + 0x66, 0x2f, 0x20, 0x49, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x20, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x20, 0x4a, 0x53, 0x4f, 0x4e, 0x50, 0x61, 0x74, 0x68, 0x20, 0x66, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x2e, 0x0a, 0x2f, 0x20, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x3a, 0x20, + 0x22, 0x24, 0x5b, 0x3f, 0x28, 0x40, 0x2e, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x20, 0x3d, + 0x3d, 0x20, 0x27, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x72, 0x27, 0x20, 0x26, 0x26, 0x20, 0x40, 0x2e, + 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x27, 0x42, 0x54, 0x43, 0x2f, 0x55, + 0x53, 0x44, 0x27, 0x29, 0x5d, 0x22, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x07, 0x02, + 0x03, 0x04, 0x12, 0x04, 0x89, 0x02, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x07, + 0x02, 0x03, 0x05, 0x12, 0x04, 0x89, 0x02, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x07, 0x02, 0x03, 0x01, 0x12, 0x04, 0x89, 0x02, 0x14, 0x1a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x07, 0x02, 0x03, 0x03, 0x12, 0x04, 0x89, 0x02, 0x1d, 0x1e, 0x0a, 0xae, 0x06, 0x0a, 0x04, + 0x04, 0x00, 0x03, 0x08, 0x12, 0x06, 0x99, 0x02, 0x02, 0x9f, 0x02, 0x03, 0x1a, 0x9d, 0x06, 0x0a, + 0x54, 0x68, 0x69, 0x73, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x72, + 0x75, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x60, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x60, + 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, 0x73, + 0x20, 0x69, 0x6e, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x66, 0x66, 0x6f, 0x72, 0x74, 0x20, 0x74, 0x6f, + 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x60, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x60, 0x2e, + 0x20, 0x66, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, + 0x65, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, + 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2c, 0x20, 0x60, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x69, 0x6c, + 0x75, 0x72, 0x65, 0x60, 0x20, 0x73, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x20, 0x77, 0x69, + 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x72, 0x75, 0x6e, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, + 0x64, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2a, 0x2a, 0x5f, 0x3a, + 0x20, 0x54, 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x72, 0x75, 0x6e, + 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x66, 0x72, 0x6f, + 0x6d, 0x20, 0x61, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x52, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x73, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x41, 0x20, 0x6e, 0x75, 0x6d, 0x65, + 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2c, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x20, 0x72, 0x75, 0x6e, 0x20, 0x60, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, + 0x72, 0x65, 0x60, 0x20, 0x73, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2e, 0x0a, 0x0a, 0x5f, + 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x52, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, + 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x54, + 0x61, 0x73, 0x6b, 0x27, 0x73, 0x20, 0x73, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2c, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x20, 0x60, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, + 0x60, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, + 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x66, + 0x72, 0x6f, 0x6d, 0x20, 0x69, 0x74, 0x73, 0x20, 0x73, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, 0x73, + 0x2e, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x22, 0x63, 0x6f, 0x6e, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, + 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x74, 0x61, 0x73, 0x6b, + 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x6a, 0x75, 0x70, 0x69, 0x74, 0x65, 0x72, 0x53, 0x77, 0x61, + 0x70, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x3a, 0x22, 0x45, 0x50, 0x6a, 0x46, 0x57, 0x64, + 0x64, 0x35, 0x41, 0x75, 0x66, 0x71, 0x53, 0x53, 0x71, 0x65, 0x4d, 0x32, 0x71, 0x4e, 0x31, 0x78, + 0x7a, 0x79, 0x62, 0x61, 0x70, 0x43, 0x38, 0x47, 0x34, 0x77, 0x45, 0x47, 0x47, 0x6b, 0x5a, 0x77, + 0x79, 0x54, 0x44, 0x74, 0x31, 0x76, 0x22, 0x2c, 0x22, 0x6f, 0x75, 0x74, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x3a, 0x22, 0x44, 0x55, 0x41, 0x4c, 0x61, + 0x34, 0x46, 0x43, 0x32, 0x79, 0x52, 0x45, 0x77, 0x5a, 0x35, 0x39, 0x50, 0x48, 0x65, 0x75, 0x31, + 0x75, 0x6e, 0x34, 0x77, 0x69, 0x73, 0x33, 0x36, 0x76, 0x48, 0x52, 0x76, 0x35, 0x68, 0x57, 0x56, + 0x42, 0x6d, 0x7a, 0x79, 0x6b, 0x43, 0x4a, 0x22, 0x7d, 0x7d, 0x5d, 0x7d, 0x5d, 0x2c, 0x22, 0x6f, + 0x6e, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x6c, 0x70, 0x45, + 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x61, 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, + 0x3a, 0x7b, 0x22, 0x6f, 0x72, 0x63, 0x61, 0x50, 0x6f, 0x6f, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x22, 0x3a, 0x22, 0x37, 0x79, 0x4a, 0x34, 0x67, 0x4d, 0x52, 0x4a, 0x68, 0x45, 0x6f, + 0x43, 0x52, 0x34, 0x38, 0x61, 0x50, 0x45, 0x33, 0x45, 0x41, 0x57, 0x52, 0x6d, 0x43, 0x6f, 0x79, + 0x67, 0x61, 0x6b, 0x69, 0x6b, 0x38, 0x31, 0x5a, 0x53, 0x31, 0x73, 0x61, 0x6a, 0x61, 0x54, 0x6e, + 0x45, 0x22, 0x7d, 0x7d, 0x5d, 0x7d, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, + 0x04, 0x00, 0x03, 0x08, 0x01, 0x12, 0x04, 0x99, 0x02, 0x0a, 0x19, 0x0a, 0x63, 0x0a, 0x06, 0x04, + 0x00, 0x03, 0x08, 0x02, 0x00, 0x12, 0x04, 0x9b, 0x02, 0x04, 0x1e, 0x1a, 0x53, 0x2f, 0x20, 0x41, + 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, + 0x73, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x20, 0x69, 0x6e, 0x20, + 0x61, 0x6e, 0x20, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x72, + 0x6f, 0x64, 0x75, 0x63, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x6e, 0x75, + 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x0a, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x08, 0x02, 0x00, 0x04, 0x12, 0x04, 0x9b, 0x02, 0x04, + 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x08, 0x02, 0x00, 0x06, 0x12, 0x04, 0x9b, 0x02, + 0x0d, 0x11, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x08, 0x02, 0x00, 0x01, 0x12, 0x04, 0x9b, + 0x02, 0x12, 0x19, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x08, 0x02, 0x00, 0x03, 0x12, 0x04, + 0x9b, 0x02, 0x1c, 0x1d, 0x0a, 0x7a, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x08, 0x02, 0x01, 0x12, 0x04, + 0x9e, 0x02, 0x04, 0x21, 0x1a, 0x6a, 0x2f, 0x20, 0x41, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, + 0x66, 0x20, 0x73, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, + 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x72, 0x75, 0x6e, 0x20, 0x69, 0x66, 0x20, 0x60, + 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x60, 0x20, 0x73, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, + 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x75, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, + 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x63, 0x63, 0x65, 0x70, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x0a, 0x2f, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x0a, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x08, 0x02, 0x01, 0x04, 0x12, 0x04, 0x9e, 0x02, 0x04, + 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x08, 0x02, 0x01, 0x06, 0x12, 0x04, 0x9e, 0x02, + 0x0d, 0x11, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x08, 0x02, 0x01, 0x01, 0x12, 0x04, 0x9e, + 0x02, 0x12, 0x1c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x08, 0x02, 0x01, 0x03, 0x12, 0x04, + 0x9e, 0x02, 0x1f, 0x20, 0x0a, 0xab, 0x07, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x09, 0x12, 0x06, 0xba, + 0x02, 0x02, 0xc5, 0x02, 0x03, 0x1a, 0x9a, 0x07, 0x0a, 0x54, 0x68, 0x69, 0x73, 0x20, 0x74, 0x61, + 0x73, 0x6b, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x64, 0x69, 0x76, 0x69, 0x64, 0x65, 0x20, 0x61, + 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, + 0x20, 0x62, 0x79, 0x20, 0x61, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x61, 0x72, 0x20, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x61, 0x20, 0x6a, 0x6f, 0x62, 0x20, 0x6f, 0x66, + 0x20, 0x73, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2c, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x67, + 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x62, + 0x69, 0x67, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2a, 0x2a, 0x5f, + 0x3a, 0x20, 0x54, 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x72, 0x75, + 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, + 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x66, 0x72, + 0x6f, 0x6d, 0x20, 0x61, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x61, 0x72, 0x20, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x2c, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, + 0x2c, 0x20, 0x61, 0x20, 0x6a, 0x6f, 0x62, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x75, 0x62, 0x74, 0x61, + 0x73, 0x6b, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x62, 0x69, 0x67, 0x2e, 0x0a, 0x0a, 0x5f, + 0x2a, 0x2a, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x41, 0x20, + 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, + 0x3a, 0x20, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, + 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x62, + 0x79, 0x20, 0x64, 0x69, 0x76, 0x69, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x62, 0x79, 0x20, 0x61, 0x20, + 0x6a, 0x6f, 0x62, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2e, + 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x22, 0x74, 0x61, 0x73, 0x6b, + 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, + 0x3a, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x31, 0x30, 0x30, 0x7d, 0x7d, 0x2c, + 0x7b, 0x22, 0x64, 0x69, 0x76, 0x69, 0x64, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, + 0x6a, 0x6f, 0x62, 0x22, 0x3a, 0x7b, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x3a, 0x5b, 0x7b, + 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x31, 0x30, 0x7d, 0x7d, 0x5d, 0x7d, 0x7d, 0x7d, 0x5d, 0x7d, 0x0a, + 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, + 0x2a, 0x5f, 0x3a, 0x20, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x20, 0x62, 0x79, 0x20, 0x64, 0x69, 0x76, 0x69, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x62, 0x79, 0x20, + 0x61, 0x6e, 0x20, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x0a, 0x0a, + 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, + 0x3a, 0x5b, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x7b, + 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x31, 0x30, 0x30, 0x7d, 0x7d, 0x2c, 0x7b, 0x22, + 0x64, 0x69, 0x76, 0x69, 0x64, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x67, + 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x22, 0x3a, + 0x22, 0x47, 0x76, 0x44, 0x4d, 0x78, 0x50, 0x7a, 0x4e, 0x31, 0x73, 0x43, 0x6a, 0x37, 0x4c, 0x32, + 0x36, 0x59, 0x44, 0x4b, 0x32, 0x48, 0x6e, 0x4d, 0x52, 0x58, 0x45, 0x51, 0x6d, 0x51, 0x32, 0x61, + 0x65, 0x6d, 0x6f, 0x76, 0x38, 0x59, 0x42, 0x74, 0x50, 0x53, 0x37, 0x76, 0x52, 0x22, 0x7d, 0x7d, + 0x5d, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, + 0x6c, 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x20, 0x62, 0x79, 0x20, 0x64, 0x69, 0x76, 0x69, 0x64, 0x69, 0x6e, 0x67, 0x20, + 0x62, 0x79, 0x20, 0x61, 0x20, 0x62, 0x69, 0x67, 0x2e, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, + 0x6f, 0x6e, 0x0a, 0x7b, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x63, + 0x61, 0x63, 0x68, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x63, 0x61, 0x63, 0x68, + 0x65, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x76, 0x61, 0x72, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x22, 0x54, 0x45, 0x4e, 0x22, 0x2c, 0x22, + 0x6a, 0x6f, 0x62, 0x22, 0x3a, 0x7b, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x3a, 0x5b, 0x7b, + 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x31, 0x30, 0x7d, 0x7d, 0x5d, 0x7d, 0x7d, 0x5d, 0x7d, 0x7d, 0x2c, + 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x31, 0x30, 0x30, 0x7d, 0x7d, 0x2c, 0x7b, 0x22, 0x64, 0x69, + 0x76, 0x69, 0x64, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x62, 0x69, 0x67, 0x22, + 0x3a, 0x22, 0x24, 0x7b, 0x54, 0x45, 0x4e, 0x7d, 0x22, 0x7d, 0x7d, 0x5d, 0x7d, 0x0a, 0x60, 0x60, + 0x60, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x09, 0x01, 0x12, 0x04, 0xba, 0x02, 0x0a, + 0x14, 0x0a, 0x10, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x09, 0x08, 0x00, 0x12, 0x06, 0xbb, 0x02, 0x04, + 0xc4, 0x02, 0x05, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x09, 0x08, 0x00, 0x01, 0x12, 0x04, + 0xbb, 0x02, 0x0a, 0x15, 0x0a, 0x45, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x09, 0x02, 0x00, 0x12, 0x04, + 0xbd, 0x02, 0x06, 0x18, 0x1a, 0x35, 0x2f, 0x20, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, + 0x73, 0x20, 0x61, 0x20, 0x62, 0x61, 0x73, 0x69, 0x63, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x61, 0x72, + 0x20, 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x74, 0x6f, 0x20, + 0x64, 0x69, 0x76, 0x69, 0x64, 0x65, 0x20, 0x62, 0x79, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x09, 0x02, 0x00, 0x05, 0x12, 0x04, 0xbd, 0x02, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x09, 0x02, 0x00, 0x01, 0x12, 0x04, 0xbd, 0x02, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x09, 0x02, 0x00, 0x03, 0x12, 0x04, 0xbd, 0x02, 0x16, 0x17, 0x0a, 0x43, + 0x0a, 0x06, 0x04, 0x00, 0x03, 0x09, 0x02, 0x01, 0x12, 0x04, 0xbf, 0x02, 0x06, 0x23, 0x1a, 0x33, + 0x2f, 0x20, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x6f, 0x74, + 0x68, 0x65, 0x72, 0x20, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x72, + 0x65, 0x73, 0x75, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x69, 0x76, 0x69, 0x64, 0x65, 0x20, 0x62, + 0x79, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x09, 0x02, 0x01, 0x05, 0x12, 0x04, + 0xbf, 0x02, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x09, 0x02, 0x01, 0x01, 0x12, + 0x04, 0xbf, 0x02, 0x0d, 0x1e, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x09, 0x02, 0x01, 0x03, + 0x12, 0x04, 0xbf, 0x02, 0x21, 0x22, 0x0a, 0x65, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x09, 0x02, 0x02, + 0x12, 0x04, 0xc1, 0x02, 0x06, 0x18, 0x1a, 0x55, 0x2f, 0x20, 0x41, 0x20, 0x6a, 0x6f, 0x62, 0x20, + 0x77, 0x68, 0x6f, 0x73, 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x69, 0x73, 0x20, + 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, + 0x64, 0x69, 0x76, 0x69, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x75, 0x72, 0x20, 0x6e, 0x75, 0x6d, + 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x62, 0x79, 0x20, + 0x74, 0x68, 0x61, 0x74, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x09, 0x02, 0x02, 0x06, 0x12, 0x04, 0xc1, 0x02, 0x06, 0x0f, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x09, 0x02, 0x02, 0x01, 0x12, 0x04, 0xc1, 0x02, 0x10, 0x13, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x09, 0x02, 0x02, 0x03, 0x12, 0x04, 0xc1, 0x02, 0x16, 0x17, + 0x0a, 0x4d, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x09, 0x02, 0x03, 0x12, 0x04, 0xc3, 0x02, 0x06, 0x15, + 0x1a, 0x3d, 0x2f, 0x20, 0x41, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x69, 0x65, + 0x64, 0x20, 0x62, 0x69, 0x67, 0x2e, 0x6a, 0x73, 0x2e, 0x20, 0x60, 0x41, 0x63, 0x63, 0x65, 0x70, + 0x74, 0x73, 0x20, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x65, 0x78, 0x70, 0x61, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x2e, 0x60, 0x0a, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x09, 0x02, 0x03, 0x05, 0x12, 0x04, 0xc3, 0x02, 0x06, 0x0c, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x09, 0x02, 0x03, 0x01, 0x12, 0x04, 0xc3, 0x02, 0x0d, + 0x10, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x09, 0x02, 0x03, 0x03, 0x12, 0x04, 0xc3, 0x02, + 0x13, 0x14, 0x0a, 0xbc, 0x07, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x0a, 0x12, 0x06, 0xe0, 0x02, 0x02, + 0xeb, 0x02, 0x03, 0x1a, 0xab, 0x07, 0x0a, 0x54, 0x68, 0x69, 0x73, 0x20, 0x74, 0x61, 0x73, 0x6b, + 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x20, 0x61, + 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, + 0x20, 0x62, 0x79, 0x20, 0x61, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x61, 0x72, 0x20, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x61, 0x20, 0x6a, 0x6f, 0x62, 0x20, 0x6f, 0x66, + 0x20, 0x73, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2c, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x67, + 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x62, + 0x69, 0x67, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2a, 0x2a, 0x5f, + 0x3a, 0x20, 0x54, 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x72, 0x75, + 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, + 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x66, 0x72, + 0x6f, 0x6d, 0x20, 0x61, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x61, 0x72, 0x20, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x2c, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, + 0x2c, 0x20, 0x61, 0x20, 0x6a, 0x6f, 0x62, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x75, 0x62, 0x74, 0x61, + 0x73, 0x6b, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x62, 0x69, 0x67, 0x2e, 0x0a, 0x0a, 0x5f, + 0x2a, 0x2a, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x41, 0x20, + 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, + 0x3a, 0x20, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, + 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x62, + 0x79, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x62, 0x79, + 0x20, 0x61, 0x20, 0x6a, 0x6f, 0x62, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x75, 0x62, 0x74, 0x61, 0x73, + 0x6b, 0x73, 0x2e, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x22, 0x74, + 0x61, 0x73, 0x6b, 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x61, + 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x31, 0x30, 0x30, + 0x7d, 0x7d, 0x2c, 0x7b, 0x22, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x54, 0x61, 0x73, + 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x6a, 0x6f, 0x62, 0x22, 0x3a, 0x7b, 0x22, 0x74, 0x61, 0x73, 0x6b, + 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, + 0x3a, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x31, 0x30, 0x7d, 0x7d, 0x5d, 0x7d, + 0x7d, 0x7d, 0x5d, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, + 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x62, 0x79, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, + 0x79, 0x69, 0x6e, 0x67, 0x20, 0x62, 0x79, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x67, 0x67, 0x72, 0x65, + 0x67, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, + 0x7b, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, + 0x31, 0x30, 0x30, 0x7d, 0x7d, 0x2c, 0x7b, 0x22, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, + 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, + 0x6f, 0x72, 0x50, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x22, 0x3a, 0x22, 0x47, 0x76, 0x44, 0x4d, 0x78, + 0x50, 0x7a, 0x4e, 0x31, 0x73, 0x43, 0x6a, 0x37, 0x4c, 0x32, 0x36, 0x59, 0x44, 0x4b, 0x32, 0x48, + 0x6e, 0x4d, 0x52, 0x58, 0x45, 0x51, 0x6d, 0x51, 0x32, 0x61, 0x65, 0x6d, 0x6f, 0x76, 0x38, 0x59, + 0x42, 0x74, 0x50, 0x53, 0x37, 0x76, 0x52, 0x22, 0x7d, 0x7d, 0x5d, 0x7d, 0x0a, 0x60, 0x60, 0x60, + 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, 0x3a, + 0x20, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, + 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x62, 0x79, + 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x62, 0x79, 0x20, + 0x61, 0x20, 0x62, 0x69, 0x67, 0x2e, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, + 0x7b, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x63, 0x61, 0x63, 0x68, + 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x63, 0x61, 0x63, 0x68, 0x65, 0x49, 0x74, + 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x22, 0x54, 0x45, 0x4e, 0x22, 0x2c, 0x22, 0x6a, 0x6f, 0x62, + 0x22, 0x3a, 0x7b, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x22, 0x3a, 0x31, 0x30, 0x7d, 0x7d, 0x5d, 0x7d, 0x7d, 0x5d, 0x7d, 0x7d, 0x2c, 0x7b, 0x22, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x22, 0x3a, 0x31, 0x30, 0x30, 0x7d, 0x7d, 0x2c, 0x7b, 0x22, 0x6d, 0x75, 0x6c, 0x74, 0x69, + 0x70, 0x6c, 0x79, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x62, 0x69, 0x67, 0x22, 0x3a, + 0x22, 0x24, 0x7b, 0x54, 0x45, 0x4e, 0x7d, 0x22, 0x7d, 0x7d, 0x5d, 0x7d, 0x0a, 0x60, 0x60, 0x60, + 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x0a, 0x01, 0x12, 0x04, 0xe0, 0x02, 0x0a, 0x16, + 0x0a, 0x10, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x0a, 0x08, 0x00, 0x12, 0x06, 0xe1, 0x02, 0x04, 0xea, + 0x02, 0x05, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0a, 0x08, 0x00, 0x01, 0x12, 0x04, 0xe1, + 0x02, 0x0a, 0x12, 0x0a, 0x35, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x0a, 0x02, 0x00, 0x12, 0x04, 0xe3, + 0x02, 0x06, 0x18, 0x1a, 0x25, 0x2f, 0x20, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x73, + 0x20, 0x61, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x61, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x6d, 0x75, 0x6c, + 0x74, 0x69, 0x70, 0x6c, 0x79, 0x20, 0x62, 0x79, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x0a, 0x02, 0x00, 0x05, 0x12, 0x04, 0xe3, 0x02, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x0a, 0x02, 0x00, 0x01, 0x12, 0x04, 0xe3, 0x02, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x0a, 0x02, 0x00, 0x03, 0x12, 0x04, 0xe3, 0x02, 0x16, 0x17, 0x0a, 0x3a, 0x0a, + 0x06, 0x04, 0x00, 0x03, 0x0a, 0x02, 0x01, 0x12, 0x04, 0xe5, 0x02, 0x06, 0x23, 0x1a, 0x2a, 0x2f, + 0x20, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x67, + 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x6d, 0x75, 0x6c, 0x74, + 0x69, 0x70, 0x6c, 0x79, 0x20, 0x62, 0x79, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x0a, 0x02, 0x01, 0x05, 0x12, 0x04, 0xe5, 0x02, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x0a, 0x02, 0x01, 0x01, 0x12, 0x04, 0xe5, 0x02, 0x0d, 0x1e, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x0a, 0x02, 0x01, 0x03, 0x12, 0x04, 0xe5, 0x02, 0x21, 0x22, 0x0a, 0x68, 0x0a, 0x06, + 0x04, 0x00, 0x03, 0x0a, 0x02, 0x02, 0x12, 0x04, 0xe7, 0x02, 0x06, 0x18, 0x1a, 0x58, 0x2f, 0x20, + 0x41, 0x20, 0x6a, 0x6f, 0x62, 0x20, 0x77, 0x68, 0x6f, 0x73, 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x20, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64, 0x20, 0x62, + 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x69, 0x6e, + 0x67, 0x20, 0x6f, 0x75, 0x72, 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, + 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x72, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0a, 0x02, 0x02, + 0x06, 0x12, 0x04, 0xe7, 0x02, 0x06, 0x0f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0a, 0x02, + 0x02, 0x01, 0x12, 0x04, 0xe7, 0x02, 0x10, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0a, + 0x02, 0x02, 0x03, 0x12, 0x04, 0xe7, 0x02, 0x16, 0x17, 0x0a, 0x4d, 0x0a, 0x06, 0x04, 0x00, 0x03, + 0x0a, 0x02, 0x03, 0x12, 0x04, 0xe9, 0x02, 0x06, 0x15, 0x1a, 0x3d, 0x2f, 0x20, 0x41, 0x20, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x62, 0x69, 0x67, 0x2e, 0x6a, + 0x73, 0x2e, 0x20, 0x60, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x73, 0x20, 0x76, 0x61, 0x72, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x20, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x73, + 0x79, 0x6e, 0x74, 0x61, 0x78, 0x2e, 0x60, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0a, + 0x02, 0x03, 0x05, 0x12, 0x04, 0xe9, 0x02, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x0a, 0x02, 0x03, 0x01, 0x12, 0x04, 0xe9, 0x02, 0x0d, 0x10, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x0a, 0x02, 0x03, 0x03, 0x12, 0x04, 0xe9, 0x02, 0x13, 0x14, 0x0a, 0xa3, 0x07, 0x0a, 0x04, + 0x04, 0x00, 0x03, 0x0b, 0x12, 0x06, 0x86, 0x03, 0x02, 0x91, 0x03, 0x03, 0x1a, 0x92, 0x07, 0x0a, + 0x54, 0x68, 0x69, 0x73, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x61, + 0x64, 0x64, 0x20, 0x61, 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x69, + 0x6e, 0x70, 0x75, 0x74, 0x20, 0x62, 0x79, 0x20, 0x61, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x61, 0x72, + 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x61, 0x20, 0x6a, 0x6f, + 0x62, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2c, 0x20, 0x61, + 0x6e, 0x20, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x2c, 0x20, 0x6f, 0x72, + 0x20, 0x61, 0x20, 0x62, 0x69, 0x67, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x49, 0x6e, 0x70, 0x75, + 0x74, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x54, 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x74, 0x20, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, + 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, + 0x74, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x61, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x61, 0x72, 0x20, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, + 0x61, 0x74, 0x6f, 0x72, 0x2c, 0x20, 0x61, 0x20, 0x6a, 0x6f, 0x62, 0x20, 0x6f, 0x66, 0x20, 0x73, + 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x62, 0x69, 0x67, + 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x2a, 0x2a, 0x5f, + 0x3a, 0x20, 0x41, 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, + 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x20, 0x62, 0x79, 0x20, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x62, 0x79, 0x20, + 0x61, 0x20, 0x6a, 0x6f, 0x62, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, + 0x73, 0x2e, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x22, 0x74, 0x61, + 0x73, 0x6b, 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x61, 0x73, + 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x31, 0x30, 0x30, 0x7d, + 0x7d, 0x2c, 0x7b, 0x22, 0x61, 0x64, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x6a, + 0x6f, 0x62, 0x22, 0x3a, 0x7b, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x22, 0x3a, 0x31, 0x30, 0x7d, 0x7d, 0x5d, 0x7d, 0x7d, 0x7d, 0x5d, 0x7d, 0x0a, 0x60, + 0x60, 0x60, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, + 0x5f, 0x3a, 0x20, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, + 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, + 0x62, 0x79, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x62, + 0x79, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x2e, + 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x22, 0x74, 0x61, 0x73, 0x6b, + 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, + 0x3a, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x31, 0x30, 0x30, 0x7d, 0x7d, 0x2c, + 0x7b, 0x22, 0x61, 0x64, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x67, 0x67, + 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x22, 0x3a, 0x22, + 0x47, 0x76, 0x44, 0x4d, 0x78, 0x50, 0x7a, 0x4e, 0x31, 0x73, 0x43, 0x6a, 0x37, 0x4c, 0x32, 0x36, + 0x59, 0x44, 0x4b, 0x32, 0x48, 0x6e, 0x4d, 0x52, 0x58, 0x45, 0x51, 0x6d, 0x51, 0x32, 0x61, 0x65, + 0x6d, 0x6f, 0x76, 0x38, 0x59, 0x42, 0x74, 0x50, 0x53, 0x37, 0x76, 0x52, 0x22, 0x7d, 0x7d, 0x5d, + 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, + 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x20, 0x62, 0x79, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x69, 0x6e, + 0x67, 0x20, 0x62, 0x79, 0x20, 0x61, 0x20, 0x62, 0x69, 0x67, 0x2e, 0x0a, 0x0a, 0x60, 0x60, 0x60, + 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x3a, 0x5b, 0x7b, + 0x22, 0x63, 0x61, 0x63, 0x68, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x63, 0x61, + 0x63, 0x68, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x76, 0x61, 0x72, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x22, 0x54, 0x45, 0x4e, 0x22, + 0x2c, 0x22, 0x6a, 0x6f, 0x62, 0x22, 0x3a, 0x7b, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x3a, + 0x5b, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x31, 0x30, 0x7d, 0x7d, 0x5d, 0x7d, 0x7d, 0x5d, 0x7d, + 0x7d, 0x2c, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x7b, + 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x31, 0x30, 0x30, 0x7d, 0x7d, 0x2c, 0x7b, 0x22, + 0x61, 0x64, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x62, 0x69, 0x67, 0x22, 0x3a, + 0x22, 0x24, 0x7b, 0x54, 0x45, 0x4e, 0x7d, 0x22, 0x7d, 0x7d, 0x5d, 0x7d, 0x0a, 0x60, 0x60, 0x60, + 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x0b, 0x01, 0x12, 0x04, 0x86, 0x03, 0x0a, 0x11, + 0x0a, 0x10, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x0b, 0x08, 0x00, 0x12, 0x06, 0x87, 0x03, 0x04, 0x90, + 0x03, 0x05, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0b, 0x08, 0x00, 0x01, 0x12, 0x04, 0x87, + 0x03, 0x0a, 0x12, 0x0a, 0x30, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x0b, 0x02, 0x00, 0x12, 0x04, 0x89, + 0x03, 0x06, 0x18, 0x1a, 0x20, 0x2f, 0x20, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x73, + 0x20, 0x61, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x61, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x64, 0x64, + 0x20, 0x62, 0x79, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0b, 0x02, 0x00, 0x05, + 0x12, 0x04, 0x89, 0x03, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0b, 0x02, 0x00, + 0x01, 0x12, 0x04, 0x89, 0x03, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0b, 0x02, + 0x00, 0x03, 0x12, 0x04, 0x89, 0x03, 0x16, 0x17, 0x0a, 0x35, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x0b, + 0x02, 0x01, 0x12, 0x04, 0x8b, 0x03, 0x06, 0x23, 0x1a, 0x25, 0x2f, 0x20, 0x53, 0x70, 0x65, 0x63, + 0x69, 0x66, 0x69, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, + 0x74, 0x6f, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x64, 0x64, 0x20, 0x62, 0x79, 0x2e, 0x0a, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0b, 0x02, 0x01, 0x05, 0x12, 0x04, 0x8b, 0x03, 0x06, 0x0c, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0b, 0x02, 0x01, 0x01, 0x12, 0x04, 0x8b, 0x03, 0x0d, + 0x1e, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0b, 0x02, 0x01, 0x03, 0x12, 0x04, 0x8b, 0x03, + 0x21, 0x22, 0x0a, 0x63, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x0b, 0x02, 0x02, 0x12, 0x04, 0x8d, 0x03, + 0x06, 0x18, 0x1a, 0x53, 0x2f, 0x20, 0x41, 0x20, 0x6a, 0x6f, 0x62, 0x20, 0x77, 0x68, 0x6f, 0x73, + 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x75, 0x74, 0x65, 0x64, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x61, 0x64, 0x64, 0x69, + 0x6e, 0x67, 0x20, 0x6f, 0x75, 0x72, 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, + 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0b, 0x02, + 0x02, 0x06, 0x12, 0x04, 0x8d, 0x03, 0x06, 0x0f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0b, + 0x02, 0x02, 0x01, 0x12, 0x04, 0x8d, 0x03, 0x10, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x0b, 0x02, 0x02, 0x03, 0x12, 0x04, 0x8d, 0x03, 0x16, 0x17, 0x0a, 0x4d, 0x0a, 0x06, 0x04, 0x00, + 0x03, 0x0b, 0x02, 0x03, 0x12, 0x04, 0x8f, 0x03, 0x06, 0x15, 0x1a, 0x3d, 0x2f, 0x20, 0x41, 0x20, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x62, 0x69, 0x67, 0x2e, + 0x6a, 0x73, 0x2e, 0x20, 0x60, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x73, 0x20, 0x76, 0x61, 0x72, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x20, + 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x2e, 0x60, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x0b, 0x02, 0x03, 0x05, 0x12, 0x04, 0x8f, 0x03, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x0b, 0x02, 0x03, 0x01, 0x12, 0x04, 0x8f, 0x03, 0x0d, 0x10, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x0b, 0x02, 0x03, 0x03, 0x12, 0x04, 0x8f, 0x03, 0x13, 0x14, 0x0a, 0xbc, 0x07, 0x0a, + 0x04, 0x04, 0x00, 0x03, 0x0c, 0x12, 0x06, 0xac, 0x03, 0x02, 0xb7, 0x03, 0x03, 0x1a, 0xab, 0x07, + 0x0a, 0x54, 0x68, 0x69, 0x73, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, + 0x73, 0x75, 0x62, 0x74, 0x72, 0x61, 0x63, 0x74, 0x20, 0x61, 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, + 0x69, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x62, 0x79, 0x20, 0x61, 0x20, + 0x73, 0x63, 0x61, 0x6c, 0x61, 0x72, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x66, 0x72, 0x6f, + 0x6d, 0x20, 0x61, 0x20, 0x6a, 0x6f, 0x62, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x75, 0x62, 0x74, 0x61, + 0x73, 0x6b, 0x73, 0x2c, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, + 0x6f, 0x72, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x62, 0x69, 0x67, 0x2e, 0x0a, 0x0a, 0x5f, + 0x2a, 0x2a, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x54, 0x68, 0x65, 0x20, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, + 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x61, 0x20, 0x73, + 0x63, 0x61, 0x6c, 0x61, 0x72, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x20, 0x61, 0x6e, 0x20, + 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x2c, 0x20, 0x61, 0x20, 0x6a, 0x6f, + 0x62, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x20, 0x6f, 0x72, + 0x20, 0x61, 0x20, 0x62, 0x69, 0x67, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x52, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x73, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x41, 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, + 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, + 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x52, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, + 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x62, 0x79, 0x20, 0x73, 0x75, 0x62, 0x74, + 0x72, 0x61, 0x63, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x62, 0x79, 0x20, 0x61, 0x20, 0x6a, 0x6f, 0x62, + 0x20, 0x6f, 0x66, 0x20, 0x73, 0x75, 0x62, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2e, 0x0a, 0x0a, 0x60, + 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x3a, + 0x5b, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x31, 0x30, 0x30, 0x7d, 0x7d, 0x2c, 0x7b, 0x22, 0x73, + 0x75, 0x62, 0x74, 0x72, 0x61, 0x63, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x6a, + 0x6f, 0x62, 0x22, 0x3a, 0x7b, 0x22, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x22, 0x3a, 0x31, 0x30, 0x7d, 0x7d, 0x5d, 0x7d, 0x7d, 0x7d, 0x5d, 0x7d, 0x0a, 0x60, + 0x60, 0x60, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, + 0x5f, 0x3a, 0x20, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, + 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, + 0x62, 0x79, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x62, + 0x79, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x2e, + 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x22, 0x74, 0x61, 0x73, 0x6b, + 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, + 0x3a, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x31, 0x30, 0x30, 0x7d, 0x7d, 0x2c, + 0x7b, 0x22, 0x73, 0x75, 0x62, 0x74, 0x72, 0x61, 0x63, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, + 0x7b, 0x22, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x75, 0x62, 0x6b, + 0x65, 0x79, 0x22, 0x3a, 0x22, 0x47, 0x76, 0x44, 0x4d, 0x78, 0x50, 0x7a, 0x4e, 0x31, 0x73, 0x43, + 0x6a, 0x37, 0x4c, 0x32, 0x36, 0x59, 0x44, 0x4b, 0x32, 0x48, 0x6e, 0x4d, 0x52, 0x58, 0x45, 0x51, + 0x6d, 0x51, 0x32, 0x61, 0x65, 0x6d, 0x6f, 0x76, 0x38, 0x59, 0x42, 0x74, 0x50, 0x53, 0x37, 0x76, + 0x52, 0x22, 0x7d, 0x7d, 0x5d, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, + 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x52, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, + 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x62, 0x79, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, + 0x70, 0x6c, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x62, 0x79, 0x20, 0x61, 0x20, 0x62, 0x69, 0x67, 0x2e, + 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x22, 0x74, 0x61, 0x73, 0x6b, + 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x63, 0x61, 0x63, 0x68, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, + 0x3a, 0x7b, 0x22, 0x63, 0x61, 0x63, 0x68, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x5b, + 0x7b, 0x22, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3a, + 0x22, 0x54, 0x45, 0x4e, 0x22, 0x2c, 0x22, 0x6a, 0x6f, 0x62, 0x22, 0x3a, 0x7b, 0x22, 0x74, 0x61, + 0x73, 0x6b, 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x61, 0x73, + 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x31, 0x30, 0x7d, 0x7d, + 0x5d, 0x7d, 0x7d, 0x5d, 0x7d, 0x7d, 0x2c, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x61, + 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x31, 0x30, 0x30, + 0x7d, 0x7d, 0x2c, 0x7b, 0x22, 0x73, 0x75, 0x62, 0x74, 0x72, 0x61, 0x63, 0x74, 0x54, 0x61, 0x73, + 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x62, 0x69, 0x67, 0x22, 0x3a, 0x22, 0x24, 0x7b, 0x54, 0x45, 0x4e, + 0x7d, 0x22, 0x7d, 0x7d, 0x5d, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, + 0x00, 0x03, 0x0c, 0x01, 0x12, 0x04, 0xac, 0x03, 0x0a, 0x16, 0x0a, 0x10, 0x0a, 0x06, 0x04, 0x00, + 0x03, 0x0c, 0x08, 0x00, 0x12, 0x06, 0xad, 0x03, 0x04, 0xb6, 0x03, 0x05, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x0c, 0x08, 0x00, 0x01, 0x12, 0x04, 0xad, 0x03, 0x0a, 0x15, 0x0a, 0x35, 0x0a, + 0x06, 0x04, 0x00, 0x03, 0x0c, 0x02, 0x00, 0x12, 0x04, 0xaf, 0x03, 0x06, 0x18, 0x1a, 0x25, 0x2f, + 0x20, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x73, 0x20, 0x61, 0x20, 0x73, 0x63, 0x61, + 0x6c, 0x61, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x75, 0x62, 0x74, 0x72, 0x61, 0x63, 0x74, 0x20, + 0x62, 0x79, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0c, 0x02, 0x00, 0x05, 0x12, + 0x04, 0xaf, 0x03, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0c, 0x02, 0x00, 0x01, + 0x12, 0x04, 0xaf, 0x03, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0c, 0x02, 0x00, + 0x03, 0x12, 0x04, 0xaf, 0x03, 0x16, 0x17, 0x0a, 0x3a, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x0c, 0x02, + 0x01, 0x12, 0x04, 0xb1, 0x03, 0x06, 0x23, 0x1a, 0x2a, 0x2f, 0x20, 0x53, 0x70, 0x65, 0x63, 0x69, + 0x66, 0x69, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, + 0x6f, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x75, 0x62, 0x74, 0x72, 0x61, 0x63, 0x74, 0x20, 0x62, + 0x79, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0c, 0x02, 0x01, 0x05, 0x12, 0x04, + 0xb1, 0x03, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0c, 0x02, 0x01, 0x01, 0x12, + 0x04, 0xb1, 0x03, 0x0d, 0x1e, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0c, 0x02, 0x01, 0x03, + 0x12, 0x04, 0xb1, 0x03, 0x21, 0x22, 0x0a, 0x68, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x0c, 0x02, 0x02, + 0x12, 0x04, 0xb3, 0x03, 0x06, 0x18, 0x1a, 0x58, 0x2f, 0x20, 0x41, 0x20, 0x6a, 0x6f, 0x62, 0x20, + 0x77, 0x68, 0x6f, 0x73, 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x69, 0x73, 0x20, + 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, + 0x73, 0x75, 0x62, 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x75, 0x72, 0x20, + 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, + 0x62, 0x79, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x0a, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0c, 0x02, 0x02, 0x06, 0x12, 0x04, 0xb3, 0x03, 0x06, + 0x0f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0c, 0x02, 0x02, 0x01, 0x12, 0x04, 0xb3, 0x03, + 0x10, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0c, 0x02, 0x02, 0x03, 0x12, 0x04, 0xb3, + 0x03, 0x16, 0x17, 0x0a, 0x4d, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x0c, 0x02, 0x03, 0x12, 0x04, 0xb5, + 0x03, 0x06, 0x15, 0x1a, 0x3d, 0x2f, 0x20, 0x41, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, + 0x66, 0x69, 0x65, 0x64, 0x20, 0x62, 0x69, 0x67, 0x2e, 0x6a, 0x73, 0x2e, 0x20, 0x60, 0x41, 0x63, + 0x63, 0x65, 0x70, 0x74, 0x73, 0x20, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x65, + 0x78, 0x70, 0x61, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x2e, + 0x60, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0c, 0x02, 0x03, 0x05, 0x12, 0x04, 0xb5, + 0x03, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0c, 0x02, 0x03, 0x01, 0x12, 0x04, + 0xb5, 0x03, 0x0d, 0x10, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0c, 0x02, 0x03, 0x03, 0x12, + 0x04, 0xb5, 0x03, 0x13, 0x14, 0x0a, 0x8c, 0x09, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x0d, 0x12, 0x06, + 0xd7, 0x03, 0x02, 0xe8, 0x03, 0x03, 0x1a, 0xfb, 0x08, 0x0a, 0x46, 0x65, 0x74, 0x63, 0x68, 0x20, + 0x4c, 0x50, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, 0x69, + 0x6e, 0x66, 0x6f, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x61, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x20, 0x65, + 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x2e, 0x0a, 0x0a, 0x53, 0x65, 0x65, 0x20, 0x6f, + 0x75, 0x72, 0x20, 0x62, 0x6c, 0x6f, 0x67, 0x20, 0x70, 0x6f, 0x73, 0x74, 0x20, 0x6f, 0x6e, 0x20, + 0x5b, 0x46, 0x61, 0x69, 0x72, 0x20, 0x4c, 0x50, 0x20, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x4f, + 0x72, 0x61, 0x63, 0x6c, 0x65, 0x73, 0x5d, 0x28, 0x2f, 0x62, 0x6c, 0x6f, 0x67, 0x2f, 0x32, 0x30, + 0x32, 0x32, 0x2f, 0x30, 0x31, 0x2f, 0x32, 0x30, 0x2f, 0x46, 0x61, 0x69, 0x72, 0x2d, 0x4c, 0x50, + 0x2d, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x2d, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x73, 0x29, 0x0a, + 0x0a, 0x2a, 0x4e, 0x4f, 0x54, 0x45, 0x2a, 0x2a, 0x3a, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, + 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x77, 0x61, 0x70, 0x20, 0x70, + 0x72, 0x69, 0x63, 0x65, 0x20, 0x62, 0x75, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x69, + 0x63, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x6c, + 0x79, 0x69, 0x6e, 0x67, 0x20, 0x4c, 0x50, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2e, 0x0a, 0x0a, + 0x5f, 0x2a, 0x2a, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x4e, 0x6f, 0x6e, + 0x65, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x2a, 0x2a, 0x5f, + 0x3a, 0x20, 0x54, 0x68, 0x65, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, + 0x6e, 0x20, 0x4c, 0x50, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, + 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x41, 0x4d, 0x4d, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, + 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, 0x3a, + 0x20, 0x46, 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4f, 0x72, 0x63, 0x61, 0x20, + 0x4c, 0x50, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x4f, 0x4c, 0x2f, 0x55, 0x53, 0x44, 0x43, 0x20, 0x70, + 0x6f, 0x6f, 0x6c, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x20, 0x22, + 0x6c, 0x70, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x54, 0x61, 0x73, 0x6b, + 0x22, 0x3a, 0x20, 0x7b, 0x20, 0x22, 0x6f, 0x72, 0x63, 0x61, 0x50, 0x6f, 0x6f, 0x6c, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x50, 0x44, 0x46, 0x52, 0x4d, 0x33, + 0x48, 0x4d, 0x72, 0x38, 0x43, 0x41, 0x47, 0x58, 0x77, 0x4b, 0x48, 0x69, 0x75, 0x32, 0x66, 0x35, + 0x65, 0x50, 0x53, 0x70, 0x61, 0x69, 0x45, 0x4a, 0x68, 0x61, 0x55, 0x52, 0x77, 0x68, 0x73, 0x52, + 0x72, 0x55, 0x55, 0x74, 0x39, 0x22, 0x20, 0x7d, 0x20, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, + 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x46, + 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x61, 0x69, 0x72, 0x20, 0x70, 0x72, + 0x69, 0x63, 0x65, 0x20, 0x4f, 0x72, 0x63, 0x61, 0x20, 0x4c, 0x50, 0x20, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, + 0x4f, 0x4c, 0x2f, 0x55, 0x53, 0x44, 0x43, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x0a, 0x0a, 0x60, 0x60, + 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x20, 0x22, 0x6c, 0x70, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x50, 0x72, 0x69, 0x63, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x20, 0x22, 0x6f, + 0x72, 0x63, 0x61, 0x50, 0x6f, 0x6f, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x3a, + 0x20, 0x22, 0x41, 0x50, 0x44, 0x46, 0x52, 0x4d, 0x33, 0x48, 0x4d, 0x72, 0x38, 0x43, 0x41, 0x47, + 0x58, 0x77, 0x4b, 0x48, 0x69, 0x75, 0x32, 0x66, 0x35, 0x65, 0x50, 0x53, 0x70, 0x61, 0x69, 0x45, + 0x4a, 0x68, 0x61, 0x55, 0x52, 0x77, 0x68, 0x73, 0x52, 0x72, 0x55, 0x55, 0x74, 0x39, 0x22, 0x2c, + 0x20, 0x22, 0x75, 0x73, 0x65, 0x46, 0x61, 0x69, 0x72, 0x50, 0x72, 0x69, 0x63, 0x65, 0x22, 0x3a, + 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x22, 0x70, 0x72, 0x69, 0x63, 0x65, 0x46, 0x65, 0x65, + 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x20, 0x22, + 0x47, 0x76, 0x44, 0x4d, 0x78, 0x50, 0x7a, 0x4e, 0x31, 0x73, 0x43, 0x6a, 0x37, 0x4c, 0x32, 0x36, + 0x59, 0x44, 0x4b, 0x32, 0x48, 0x6e, 0x4d, 0x52, 0x58, 0x45, 0x51, 0x6d, 0x51, 0x32, 0x61, 0x65, + 0x6d, 0x6f, 0x76, 0x38, 0x59, 0x42, 0x74, 0x50, 0x53, 0x37, 0x76, 0x52, 0x22, 0x2c, 0x20, 0x22, + 0x42, 0x6a, 0x55, 0x67, 0x6a, 0x36, 0x59, 0x43, 0x6e, 0x46, 0x42, 0x5a, 0x34, 0x39, 0x77, 0x46, + 0x35, 0x34, 0x64, 0x64, 0x42, 0x56, 0x41, 0x39, 0x71, 0x75, 0x38, 0x54, 0x65, 0x71, 0x6b, 0x46, + 0x74, 0x6b, 0x62, 0x71, 0x6d, 0x5a, 0x63, 0x65, 0x65, 0x38, 0x75, 0x57, 0x22, 0x20, 0x5d, 0x20, + 0x7d, 0x20, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, + 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x46, 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x66, 0x61, 0x69, 0x72, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, 0x52, 0x61, 0x79, + 0x64, 0x69, 0x75, 0x6d, 0x20, 0x4c, 0x50, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x70, 0x72, + 0x69, 0x63, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x4f, 0x4c, 0x2f, 0x55, + 0x53, 0x44, 0x43, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, + 0x6e, 0x0a, 0x7b, 0x20, 0x22, 0x6c, 0x70, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x72, 0x69, 0x63, + 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x20, 0x22, 0x72, 0x61, 0x79, 0x64, 0x69, + 0x75, 0x6d, 0x50, 0x6f, 0x6f, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x3a, 0x20, + 0x22, 0x35, 0x38, 0x6f, 0x51, 0x43, 0x68, 0x78, 0x34, 0x79, 0x57, 0x6d, 0x76, 0x4b, 0x64, 0x77, + 0x4c, 0x4c, 0x5a, 0x7a, 0x42, 0x69, 0x34, 0x43, 0x68, 0x6f, 0x43, 0x63, 0x32, 0x66, 0x71, 0x43, + 0x55, 0x57, 0x42, 0x6b, 0x77, 0x4d, 0x69, 0x68, 0x4c, 0x59, 0x51, 0x6f, 0x32, 0x22, 0x2c, 0x20, + 0x22, 0x75, 0x73, 0x65, 0x46, 0x61, 0x69, 0x72, 0x50, 0x72, 0x69, 0x63, 0x65, 0x22, 0x3a, 0x20, + 0x74, 0x72, 0x75, 0x65, 0x2c, 0x22, 0x70, 0x72, 0x69, 0x63, 0x65, 0x46, 0x65, 0x65, 0x64, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x22, 0x47, 0x76, 0x44, + 0x4d, 0x78, 0x50, 0x7a, 0x4e, 0x31, 0x73, 0x43, 0x6a, 0x37, 0x4c, 0x32, 0x36, 0x59, 0x44, 0x4b, + 0x32, 0x48, 0x6e, 0x4d, 0x52, 0x58, 0x45, 0x51, 0x6d, 0x51, 0x32, 0x61, 0x65, 0x6d, 0x6f, 0x76, + 0x38, 0x59, 0x42, 0x74, 0x50, 0x53, 0x37, 0x76, 0x52, 0x22, 0x2c, 0x22, 0x42, 0x6a, 0x55, 0x67, + 0x6a, 0x36, 0x59, 0x43, 0x6e, 0x46, 0x42, 0x5a, 0x34, 0x39, 0x77, 0x46, 0x35, 0x34, 0x64, 0x64, + 0x42, 0x56, 0x41, 0x39, 0x71, 0x75, 0x38, 0x54, 0x65, 0x71, 0x6b, 0x46, 0x74, 0x6b, 0x62, 0x71, + 0x6d, 0x5a, 0x63, 0x65, 0x65, 0x38, 0x75, 0x57, 0x22, 0x20, 0x5d, 0x20, 0x7d, 0x20, 0x7d, 0x0a, + 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x0d, 0x01, 0x12, 0x04, 0xd7, + 0x03, 0x0a, 0x1a, 0x0a, 0x10, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x0d, 0x08, 0x00, 0x12, 0x06, 0xd8, + 0x03, 0x04, 0xe1, 0x03, 0x05, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0d, 0x08, 0x00, 0x01, + 0x12, 0x04, 0xd8, 0x03, 0x0a, 0x15, 0x0a, 0x8c, 0x01, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x0d, 0x02, + 0x00, 0x12, 0x04, 0xda, 0x03, 0x06, 0x28, 0x1a, 0x7c, 0x2f, 0x20, 0x4d, 0x65, 0x72, 0x63, 0x75, + 0x72, 0x69, 0x61, 0x6c, 0x20, 0x66, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x70, 0x6f, 0x6f, + 0x6c, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x20, 0x41, 0x20, 0x66, 0x75, 0x6c, + 0x6c, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x66, 0x6f, + 0x75, 0x6e, 0x64, 0x20, 0x68, 0x65, 0x72, 0x65, 0x3a, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, + 0x2f, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x65, 0x72, + 0x63, 0x75, 0x72, 0x69, 0x61, 0x6c, 0x2d, 0x66, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2f, 0x73, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x73, 0x77, 0x61, 0x70, 0x2d, 0x6e, 0x2d, 0x70, 0x6f, 0x6f, + 0x6c, 0x2d, 0x6a, 0x73, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0d, 0x02, 0x00, 0x05, + 0x12, 0x04, 0xda, 0x03, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0d, 0x02, 0x00, + 0x01, 0x12, 0x04, 0xda, 0x03, 0x0d, 0x23, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0d, 0x02, + 0x00, 0x03, 0x12, 0x04, 0xda, 0x03, 0x26, 0x27, 0x0a, 0x75, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x0d, + 0x02, 0x01, 0x12, 0x04, 0xdc, 0x03, 0x06, 0x24, 0x1a, 0x65, 0x2f, 0x20, 0x53, 0x61, 0x62, 0x65, + 0x72, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x20, + 0x41, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x63, 0x61, 0x6e, 0x20, + 0x62, 0x65, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x68, 0x65, 0x72, 0x65, 0x3a, 0x20, 0x68, + 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x73, 0x61, 0x62, 0x65, 0x72, 0x2d, 0x68, 0x71, 0x2f, 0x73, 0x61, 0x62, 0x65, 0x72, + 0x2d, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x2d, 0x64, 0x69, 0x73, 0x74, 0x0a, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0d, 0x02, 0x01, 0x05, 0x12, 0x04, 0xdc, 0x03, 0x06, 0x0c, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0d, 0x02, 0x01, 0x01, 0x12, 0x04, 0xdc, 0x03, 0x0d, + 0x1f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0d, 0x02, 0x01, 0x03, 0x12, 0x04, 0xdc, 0x03, + 0x22, 0x23, 0x0a, 0x5e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x0d, 0x02, 0x02, 0x12, 0x04, 0xde, 0x03, + 0x06, 0x23, 0x1a, 0x4e, 0x2f, 0x20, 0x4f, 0x72, 0x63, 0x61, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x20, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x20, 0x41, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x20, + 0x6c, 0x69, 0x73, 0x74, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x66, 0x6f, 0x75, 0x6e, + 0x64, 0x20, 0x68, 0x65, 0x72, 0x65, 0x3a, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, + 0x77, 0x77, 0x77, 0x2e, 0x6f, 0x72, 0x63, 0x61, 0x2e, 0x73, 0x6f, 0x2f, 0x70, 0x6f, 0x6f, 0x6c, + 0x73, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0d, 0x02, 0x02, 0x05, 0x12, 0x04, 0xde, + 0x03, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0d, 0x02, 0x02, 0x01, 0x12, 0x04, + 0xde, 0x03, 0x0d, 0x1e, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0d, 0x02, 0x02, 0x03, 0x12, + 0x04, 0xde, 0x03, 0x21, 0x22, 0x0a, 0x6c, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x0d, 0x02, 0x03, 0x12, + 0x04, 0xe0, 0x03, 0x06, 0x26, 0x1a, 0x5c, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x52, 0x61, 0x79, + 0x64, 0x69, 0x75, 0x6d, 0x20, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x20, 0x70, + 0x6f, 0x6f, 0x6c, 0x20, 0x61, 0x6d, 0x6d, 0x49, 0x64, 0x2e, 0x20, 0x41, 0x20, 0x66, 0x75, 0x6c, + 0x6c, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x66, 0x6f, + 0x75, 0x6e, 0x64, 0x20, 0x68, 0x65, 0x72, 0x65, 0x3a, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, + 0x2f, 0x2f, 0x72, 0x61, 0x79, 0x64, 0x69, 0x75, 0x6d, 0x2e, 0x69, 0x6f, 0x2f, 0x70, 0x6f, 0x6f, + 0x6c, 0x73, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0d, 0x02, 0x03, 0x05, 0x12, 0x04, + 0xe0, 0x03, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0d, 0x02, 0x03, 0x01, 0x12, + 0x04, 0xe0, 0x03, 0x0d, 0x21, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0d, 0x02, 0x03, 0x03, + 0x12, 0x04, 0xe0, 0x03, 0x24, 0x25, 0x0a, 0xc3, 0x01, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x0d, 0x02, + 0x04, 0x12, 0x04, 0xe3, 0x03, 0x04, 0x2d, 0x1a, 0xb2, 0x01, 0x2f, 0x20, 0x41, 0x20, 0x6c, 0x69, + 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x62, 0x6f, 0x61, 0x72, + 0x64, 0x20, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x61, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x61, + 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x61, 0x69, 0x72, + 0x20, 0x4c, 0x50, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x2e, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, + 0x65, 0x6e, 0x73, 0x75, 0x72, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x69, 0x63, + 0x65, 0x20, 0x69, 0x73, 0x20, 0x62, 0x61, 0x73, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x20, 0x72, 0x6f, 0x75, 0x6e, 0x64, + 0x20, 0x74, 0x6f, 0x20, 0x6d, 0x69, 0x74, 0x69, 0x67, 0x61, 0x74, 0x65, 0x20, 0x66, 0x6c, 0x61, + 0x73, 0x68, 0x20, 0x6c, 0x6f, 0x61, 0x6e, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, 0x6d, 0x61, + 0x6e, 0x69, 0x70, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x0d, 0x02, 0x04, 0x04, 0x12, 0x04, 0xe3, 0x03, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x0d, 0x02, 0x04, 0x05, 0x12, 0x04, 0xe3, 0x03, 0x0d, 0x13, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0d, 0x02, 0x04, 0x01, 0x12, 0x04, 0xe3, 0x03, 0x14, 0x28, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0d, 0x02, 0x04, 0x03, 0x12, 0x04, 0xe3, 0x03, 0x2b, 0x2c, + 0x0a, 0x7b, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x0d, 0x02, 0x05, 0x12, 0x04, 0xe5, 0x03, 0x04, 0x2b, + 0x1a, 0x6b, 0x2f, 0x20, 0x41, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x4f, 0x72, + 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x65, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, + 0x79, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, + 0x66, 0x65, 0x65, 0x64, 0x20, 0x6a, 0x6f, 0x62, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x73, 0x65, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x61, 0x69, 0x72, 0x20, 0x70, 0x72, + 0x69, 0x63, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x75, 0x6c, 0x61, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x0d, 0x02, 0x05, 0x04, 0x12, 0x04, 0xe5, 0x03, 0x04, 0x0c, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0d, 0x02, 0x05, 0x06, 0x12, 0x04, 0xe5, 0x03, 0x0d, 0x16, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0d, 0x02, 0x05, 0x01, 0x12, 0x04, 0xe5, 0x03, 0x17, 0x26, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0d, 0x02, 0x05, 0x03, 0x12, 0x04, 0xe5, 0x03, 0x29, + 0x2a, 0x0a, 0x80, 0x02, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x0d, 0x02, 0x06, 0x12, 0x04, 0xe7, 0x03, + 0x04, 0x25, 0x1a, 0xef, 0x01, 0x2f, 0x20, 0x49, 0x66, 0x20, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x66, 0x65, 0x65, 0x64, + 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x64, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x20, + 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x63, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x66, 0x61, 0x69, 0x72, 0x20, 0x4c, 0x50, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, + 0x20, 0x62, 0x61, 0x73, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, + 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x20, 0x72, 0x65, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x73, 0x2e, 0x20, 0x53, 0x65, 0x65, 0x20, 0x6f, 0x75, 0x72, 0x20, 0x62, + 0x6c, 0x6f, 0x67, 0x20, 0x70, 0x6f, 0x73, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6d, 0x6f, 0x72, + 0x65, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x68, + 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x62, 0x6f, 0x61, + 0x72, 0x64, 0x78, 0x79, 0x7a, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x66, 0x61, 0x69, 0x72, 0x2d, 0x6c, 0x70, 0x2d, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2d, 0x6f, + 0x72, 0x61, 0x63, 0x6c, 0x65, 0x73, 0x2d, 0x39, 0x34, 0x61, 0x34, 0x35, 0x37, 0x63, 0x35, 0x30, + 0x32, 0x33, 0x39, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0d, 0x02, 0x06, 0x04, 0x12, + 0x04, 0xe7, 0x03, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0d, 0x02, 0x06, 0x05, + 0x12, 0x04, 0xe7, 0x03, 0x0d, 0x11, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0d, 0x02, 0x06, + 0x01, 0x12, 0x04, 0xe7, 0x03, 0x12, 0x20, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0d, 0x02, + 0x06, 0x03, 0x12, 0x04, 0xe7, 0x03, 0x23, 0x24, 0x0a, 0xfa, 0x03, 0x0a, 0x04, 0x04, 0x00, 0x03, + 0x0e, 0x12, 0x06, 0xfd, 0x03, 0x02, 0x91, 0x04, 0x03, 0x1a, 0xe9, 0x03, 0x0a, 0x46, 0x65, 0x74, + 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x73, + 0x77, 0x61, 0x70, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, + 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x20, + 0x70, 0x6f, 0x6f, 0x6c, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2a, 0x2a, + 0x5f, 0x3a, 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x52, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x73, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x54, 0x68, 0x65, 0x20, 0x73, 0x77, 0x61, 0x70, + 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x67, 0x69, 0x76, + 0x65, 0x6e, 0x20, 0x41, 0x4d, 0x4d, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, + 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x46, 0x65, 0x74, + 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, + 0x72, 0x61, 0x74, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4f, 0x72, + 0x63, 0x61, 0x20, 0x53, 0x4f, 0x4c, 0x2f, 0x55, 0x53, 0x44, 0x43, 0x20, 0x70, 0x6f, 0x6f, 0x6c, + 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x20, 0x22, 0x6c, 0x70, 0x45, + 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x61, 0x74, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, + 0x3a, 0x20, 0x7b, 0x20, 0x22, 0x6f, 0x72, 0x63, 0x61, 0x50, 0x6f, 0x6f, 0x6c, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x50, 0x44, 0x46, 0x52, 0x4d, 0x33, 0x48, + 0x4d, 0x72, 0x38, 0x43, 0x41, 0x47, 0x58, 0x77, 0x4b, 0x48, 0x69, 0x75, 0x32, 0x66, 0x35, 0x65, + 0x50, 0x53, 0x70, 0x61, 0x69, 0x45, 0x4a, 0x68, 0x61, 0x55, 0x52, 0x77, 0x68, 0x73, 0x52, 0x72, + 0x55, 0x55, 0x74, 0x39, 0x22, 0x20, 0x7d, 0x20, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x5f, + 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x46, 0x65, + 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x20, 0x72, 0x61, 0x74, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x52, + 0x61, 0x79, 0x64, 0x69, 0x75, 0x6d, 0x20, 0x53, 0x4f, 0x4c, 0x2f, 0x55, 0x53, 0x44, 0x43, 0x20, + 0x70, 0x6f, 0x6f, 0x6c, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x20, + 0x22, 0x6c, 0x70, 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x61, 0x74, 0x65, 0x54, + 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x20, 0x22, 0x72, 0x61, 0x79, 0x64, 0x69, 0x75, 0x6d, + 0x50, 0x6f, 0x6f, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x3a, 0x20, 0x22, 0x35, + 0x38, 0x6f, 0x51, 0x43, 0x68, 0x78, 0x34, 0x79, 0x57, 0x6d, 0x76, 0x4b, 0x64, 0x77, 0x4c, 0x4c, + 0x5a, 0x7a, 0x42, 0x69, 0x34, 0x43, 0x68, 0x6f, 0x43, 0x63, 0x32, 0x66, 0x71, 0x43, 0x55, 0x57, + 0x42, 0x6b, 0x77, 0x4d, 0x69, 0x68, 0x4c, 0x59, 0x51, 0x6f, 0x32, 0x22, 0x20, 0x7d, 0x20, 0x7d, + 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x0e, 0x01, 0x12, 0x04, + 0xfd, 0x03, 0x0a, 0x1c, 0x0a, 0x5f, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x0e, 0x02, 0x00, 0x12, 0x04, + 0xff, 0x03, 0x04, 0x29, 0x1a, 0x4f, 0x2f, 0x20, 0x55, 0x73, 0x65, 0x64, 0x20, 0x61, 0x6c, 0x6f, + 0x6e, 0x67, 0x73, 0x69, 0x64, 0x65, 0x20, 0x6d, 0x65, 0x72, 0x63, 0x75, 0x72, 0x69, 0x61, 0x6c, + 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x74, 0x6f, + 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x70, + 0x75, 0x74, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x73, + 0x77, 0x61, 0x70, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0e, 0x02, 0x00, 0x04, + 0x12, 0x04, 0xff, 0x03, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0e, 0x02, 0x00, + 0x05, 0x12, 0x04, 0xff, 0x03, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0e, 0x02, + 0x00, 0x01, 0x12, 0x04, 0xff, 0x03, 0x14, 0x24, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0e, + 0x02, 0x00, 0x03, 0x12, 0x04, 0xff, 0x03, 0x27, 0x28, 0x0a, 0x60, 0x0a, 0x06, 0x04, 0x00, 0x03, + 0x0e, 0x02, 0x01, 0x12, 0x04, 0x81, 0x04, 0x04, 0x2a, 0x1a, 0x50, 0x2f, 0x20, 0x55, 0x73, 0x65, + 0x64, 0x20, 0x61, 0x6c, 0x6f, 0x6e, 0x67, 0x73, 0x69, 0x64, 0x65, 0x20, 0x6d, 0x65, 0x72, 0x63, + 0x75, 0x72, 0x69, 0x61, 0x6c, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x79, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x61, 0x20, 0x73, 0x77, 0x61, 0x70, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x0e, 0x02, 0x01, 0x04, 0x12, 0x04, 0x81, 0x04, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x0e, 0x02, 0x01, 0x05, 0x12, 0x04, 0x81, 0x04, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x0e, 0x02, 0x01, 0x01, 0x12, 0x04, 0x81, 0x04, 0x14, 0x25, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0e, 0x02, 0x01, 0x03, 0x12, 0x04, 0x81, 0x04, 0x28, 0x29, 0x0a, + 0x10, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x0e, 0x08, 0x00, 0x12, 0x06, 0x82, 0x04, 0x04, 0x90, 0x04, + 0x05, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0e, 0x08, 0x00, 0x01, 0x12, 0x04, 0x82, 0x04, + 0x0a, 0x15, 0x0a, 0x8c, 0x01, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x0e, 0x02, 0x02, 0x12, 0x04, 0x84, + 0x04, 0x06, 0x28, 0x1a, 0x7c, 0x2f, 0x20, 0x4d, 0x65, 0x72, 0x63, 0x75, 0x72, 0x69, 0x61, 0x6c, + 0x20, 0x66, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x20, 0x61, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x20, 0x41, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x20, 0x6c, 0x69, + 0x73, 0x74, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, + 0x68, 0x65, 0x72, 0x65, 0x3a, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x65, 0x72, 0x63, 0x75, 0x72, 0x69, + 0x61, 0x6c, 0x2d, 0x66, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x2d, 0x73, 0x77, 0x61, 0x70, 0x2d, 0x6e, 0x2d, 0x70, 0x6f, 0x6f, 0x6c, 0x2d, 0x6a, 0x73, + 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0e, 0x02, 0x02, 0x05, 0x12, 0x04, 0x84, 0x04, + 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0e, 0x02, 0x02, 0x01, 0x12, 0x04, 0x84, + 0x04, 0x0d, 0x23, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0e, 0x02, 0x02, 0x03, 0x12, 0x04, + 0x84, 0x04, 0x26, 0x27, 0x0a, 0x75, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x0e, 0x02, 0x03, 0x12, 0x04, + 0x86, 0x04, 0x06, 0x24, 0x1a, 0x65, 0x2f, 0x20, 0x53, 0x61, 0x62, 0x65, 0x72, 0x20, 0x70, 0x6f, + 0x6f, 0x6c, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x20, 0x41, 0x20, 0x66, 0x75, + 0x6c, 0x6c, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x66, + 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x68, 0x65, 0x72, 0x65, 0x3a, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, + 0x3a, 0x2f, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x73, 0x61, + 0x62, 0x65, 0x72, 0x2d, 0x68, 0x71, 0x2f, 0x73, 0x61, 0x62, 0x65, 0x72, 0x2d, 0x72, 0x65, 0x67, + 0x69, 0x73, 0x74, 0x72, 0x79, 0x2d, 0x64, 0x69, 0x73, 0x74, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x0e, 0x02, 0x03, 0x05, 0x12, 0x04, 0x86, 0x04, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x0e, 0x02, 0x03, 0x01, 0x12, 0x04, 0x86, 0x04, 0x0d, 0x1f, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x0e, 0x02, 0x03, 0x03, 0x12, 0x04, 0x86, 0x04, 0x22, 0x23, 0x0a, 0x36, + 0x0a, 0x06, 0x04, 0x00, 0x03, 0x0e, 0x02, 0x04, 0x12, 0x04, 0x88, 0x04, 0x06, 0x40, 0x1a, 0x26, + 0x2f, 0x20, 0x2a, 0x2a, 0x40, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x2a, + 0x2a, 0x20, 0x55, 0x73, 0x65, 0x20, 0x6f, 0x72, 0x63, 0x61, 0x50, 0x6f, 0x6f, 0x6c, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0e, 0x02, 0x04, + 0x05, 0x12, 0x04, 0x88, 0x04, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0e, 0x02, + 0x04, 0x01, 0x12, 0x04, 0x88, 0x04, 0x0d, 0x29, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0e, + 0x02, 0x04, 0x03, 0x12, 0x04, 0x88, 0x04, 0x2c, 0x2d, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x0e, 0x02, 0x04, 0x08, 0x12, 0x04, 0x88, 0x04, 0x2e, 0x3f, 0x0a, 0x10, 0x0a, 0x08, 0x04, 0x00, + 0x03, 0x0e, 0x02, 0x04, 0x08, 0x03, 0x12, 0x04, 0x88, 0x04, 0x2f, 0x3e, 0x0a, 0x6c, 0x0a, 0x06, + 0x04, 0x00, 0x03, 0x0e, 0x02, 0x05, 0x12, 0x04, 0x8a, 0x04, 0x06, 0x26, 0x1a, 0x5c, 0x2f, 0x20, + 0x54, 0x68, 0x65, 0x20, 0x52, 0x61, 0x79, 0x64, 0x69, 0x75, 0x6d, 0x20, 0x6c, 0x69, 0x71, 0x75, + 0x69, 0x64, 0x69, 0x74, 0x79, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x20, 0x61, 0x6d, 0x6d, 0x49, 0x64, + 0x2e, 0x20, 0x41, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x63, 0x61, + 0x6e, 0x20, 0x62, 0x65, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x68, 0x65, 0x72, 0x65, 0x3a, + 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x72, 0x61, 0x79, 0x64, 0x69, 0x75, 0x6d, + 0x2e, 0x69, 0x6f, 0x2f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x0e, 0x02, 0x05, 0x05, 0x12, 0x04, 0x8a, 0x04, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x0e, 0x02, 0x05, 0x01, 0x12, 0x04, 0x8a, 0x04, 0x0d, 0x21, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x0e, 0x02, 0x05, 0x03, 0x12, 0x04, 0x8a, 0x04, 0x24, 0x25, 0x0a, 0x8d, 0x01, + 0x0a, 0x06, 0x04, 0x00, 0x03, 0x0e, 0x02, 0x06, 0x12, 0x04, 0x8d, 0x04, 0x06, 0x23, 0x1a, 0x7d, + 0x2f, 0x20, 0x50, 0x6f, 0x6f, 0x6c, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x61, 0x6e, 0x20, 0x4f, 0x72, 0x63, 0x61, 0x20, 0x4c, 0x50, 0x20, 0x70, 0x6f, + 0x6f, 0x6c, 0x20, 0x6f, 0x72, 0x20, 0x77, 0x68, 0x69, 0x72, 0x6c, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, + 0x0a, 0x2f, 0x20, 0x41, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, + 0x66, 0x20, 0x4f, 0x72, 0x63, 0x61, 0x20, 0x4c, 0x50, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x20, + 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x68, 0x65, 0x72, + 0x65, 0x3a, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6f, + 0x72, 0x63, 0x61, 0x2e, 0x73, 0x6f, 0x2f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x0a, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x0e, 0x02, 0x06, 0x05, 0x12, 0x04, 0x8d, 0x04, 0x06, 0x0c, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0e, 0x02, 0x06, 0x01, 0x12, 0x04, 0x8d, 0x04, 0x0d, 0x1e, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0e, 0x02, 0x06, 0x03, 0x12, 0x04, 0x8d, 0x04, 0x21, 0x22, + 0x0a, 0x6f, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x0e, 0x02, 0x07, 0x12, 0x04, 0x8f, 0x04, 0x06, 0x26, + 0x1a, 0x5f, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x50, 0x6f, 0x72, 0x74, 0x20, 0x72, 0x65, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x20, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x2e, 0x20, 0x41, 0x20, 0x66, + 0x75, 0x6c, 0x6c, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, + 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x68, 0x65, 0x72, 0x65, 0x3a, 0x20, 0x68, 0x74, 0x74, 0x70, + 0x73, 0x3a, 0x2f, 0x2f, 0x61, 0x70, 0x69, 0x2d, 0x76, 0x31, 0x2e, 0x70, 0x6f, 0x72, 0x74, 0x2e, + 0x66, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2f, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x73, + 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0e, 0x02, 0x07, 0x05, 0x12, 0x04, 0x8f, 0x04, + 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0e, 0x02, 0x07, 0x01, 0x12, 0x04, 0x8f, + 0x04, 0x0d, 0x21, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0e, 0x02, 0x07, 0x03, 0x12, 0x04, + 0x8f, 0x04, 0x24, 0x25, 0x0a, 0x60, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x0f, 0x12, 0x06, 0x95, 0x04, + 0x02, 0x9a, 0x04, 0x03, 0x1a, 0x50, 0x2f, 0x20, 0x46, 0x69, 0x6e, 0x64, 0x20, 0x61, 0x20, 0x70, + 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x77, 0x69, 0x74, 0x68, 0x69, 0x6e, 0x20, 0x61, 0x20, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x70, 0x72, 0x65, 0x76, + 0x69, 0x6f, 0x75, 0x73, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x65, 0x78, + 0x74, 0x72, 0x61, 0x63, 0x74, 0x20, 0x61, 0x20, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x2e, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x0f, 0x01, 0x12, + 0x04, 0x95, 0x04, 0x0a, 0x1a, 0x0a, 0x29, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x0f, 0x02, 0x00, 0x12, + 0x04, 0x97, 0x04, 0x04, 0x20, 0x1a, 0x19, 0x2f, 0x20, 0x52, 0x65, 0x67, 0x65, 0x78, 0x20, 0x70, + 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x66, 0x69, 0x6e, 0x64, 0x2e, 0x0a, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0f, 0x02, 0x00, 0x04, 0x12, 0x04, 0x97, 0x04, 0x04, + 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0f, 0x02, 0x00, 0x05, 0x12, 0x04, 0x97, 0x04, + 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0f, 0x02, 0x00, 0x01, 0x12, 0x04, 0x97, + 0x04, 0x14, 0x1b, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0f, 0x02, 0x00, 0x03, 0x12, 0x04, + 0x97, 0x04, 0x1e, 0x1f, 0x0a, 0x2b, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x0f, 0x02, 0x01, 0x12, 0x04, + 0x99, 0x04, 0x04, 0x24, 0x1a, 0x1b, 0x2f, 0x20, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x2e, + 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0f, 0x02, 0x01, 0x04, 0x12, 0x04, 0x99, 0x04, + 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0f, 0x02, 0x01, 0x05, 0x12, 0x04, 0x99, + 0x04, 0x0d, 0x12, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0f, 0x02, 0x01, 0x01, 0x12, 0x04, + 0x99, 0x04, 0x13, 0x1f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x0f, 0x02, 0x01, 0x03, 0x12, + 0x04, 0x99, 0x04, 0x22, 0x23, 0x0a, 0x0e, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x10, 0x12, 0x06, 0x9c, + 0x04, 0x02, 0xa3, 0x04, 0x03, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x10, 0x01, 0x12, 0x04, + 0x9c, 0x04, 0x0a, 0x18, 0x0a, 0x10, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x10, 0x08, 0x00, 0x12, 0x06, + 0x9d, 0x04, 0x04, 0xa2, 0x04, 0x05, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x10, 0x08, 0x00, + 0x01, 0x12, 0x04, 0x9d, 0x04, 0x0a, 0x14, 0x0a, 0x59, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x10, 0x02, + 0x00, 0x12, 0x04, 0x9f, 0x04, 0x06, 0x1e, 0x1a, 0x49, 0x2f, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x61, + 0x6e, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, + 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6a, 0x6f, 0x62, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x53, 0x54, 0x45, 0x50, 0x2f, 0x55, 0x53, 0x44, 0x20, 0x70, 0x72, 0x69, 0x63, + 0x65, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x10, 0x02, 0x00, 0x06, 0x12, 0x04, 0x9f, + 0x04, 0x06, 0x10, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x10, 0x02, 0x00, 0x01, 0x12, 0x04, + 0x9f, 0x04, 0x11, 0x19, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x10, 0x02, 0x00, 0x03, 0x12, + 0x04, 0x9f, 0x04, 0x1c, 0x1d, 0x0a, 0x3a, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x10, 0x02, 0x01, 0x12, + 0x04, 0xa1, 0x04, 0x06, 0x28, 0x1a, 0x2a, 0x2f, 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, + 0x67, 0x20, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x70, 0x75, 0x62, + 0x6b, 0x65, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x53, 0x54, 0x45, 0x50, 0x2f, 0x55, 0x53, 0x44, + 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x10, 0x02, 0x01, 0x05, 0x12, 0x04, 0xa1, 0x04, + 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x10, 0x02, 0x01, 0x01, 0x12, 0x04, 0xa1, + 0x04, 0x0d, 0x23, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x10, 0x02, 0x01, 0x03, 0x12, 0x04, + 0xa1, 0x04, 0x26, 0x27, 0x0a, 0x9b, 0x05, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x11, 0x12, 0x06, 0xb2, + 0x04, 0x02, 0xbf, 0x04, 0x03, 0x1a, 0x8a, 0x05, 0x0a, 0x54, 0x61, 0x6b, 0x65, 0x73, 0x20, 0x61, + 0x20, 0x74, 0x77, 0x61, 0x70, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x20, 0x61, 0x20, 0x73, 0x65, 0x74, + 0x20, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x63, 0x65, + 0x72, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, + 0x2e, 0x20, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x20, 0x68, 0x61, + 0x76, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x68, + 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x61, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x4e, 0x20, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, + 0x64, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x54, + 0x77, 0x61, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x69, 0x74, 0x65, + 0x72, 0x61, 0x74, 0x65, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x67, 0x67, + 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x20, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, + 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x61, 0x6c, 0x63, + 0x75, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x77, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x20, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x20, 0x77, + 0x69, 0x74, 0x68, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x74, 0x69, + 0x6d, 0x65, 0x20, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x49, + 0x6e, 0x70, 0x75, 0x74, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x0a, 0x0a, 0x5f, + 0x2a, 0x2a, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x54, 0x68, + 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x20, + 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x67, + 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x20, 0x61, 0x20, + 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x70, 0x65, 0x72, 0x69, 0x6f, + 0x64, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, + 0x5f, 0x3a, 0x20, 0x54, 0x68, 0x65, 0x20, 0x31, 0x68, 0x72, 0x20, 0x54, 0x77, 0x61, 0x70, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x4f, 0x4c, 0x2f, 0x55, 0x53, 0x44, 0x20, 0x41, + 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x2c, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, 0x36, 0x30, + 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x2e, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, + 0x6f, 0x6e, 0x0a, 0x7b, 0x20, 0x22, 0x74, 0x77, 0x61, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, + 0x20, 0x7b, 0x20, 0x22, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x75, + 0x62, 0x6b, 0x65, 0x79, 0x22, 0x3a, 0x20, 0x22, 0x47, 0x76, 0x44, 0x4d, 0x78, 0x50, 0x7a, 0x4e, + 0x31, 0x73, 0x43, 0x6a, 0x37, 0x4c, 0x32, 0x36, 0x59, 0x44, 0x4b, 0x32, 0x48, 0x6e, 0x4d, 0x52, + 0x58, 0x45, 0x51, 0x6d, 0x51, 0x32, 0x61, 0x65, 0x6d, 0x6f, 0x76, 0x38, 0x59, 0x42, 0x74, 0x50, + 0x53, 0x37, 0x76, 0x52, 0x22, 0x2c, 0x20, 0x22, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x22, 0x3a, + 0x20, 0x33, 0x36, 0x30, 0x30, 0x2c, 0x20, 0x22, 0x6d, 0x69, 0x6e, 0x53, 0x61, 0x6d, 0x70, 0x6c, + 0x65, 0x73, 0x22, 0x3a, 0x20, 0x36, 0x30, 0x2c, 0x20, 0x22, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x42, 0x79, 0x50, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, + 0x65, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x20, 0x7d, 0x20, 0x7d, 0x0a, 0x60, 0x60, + 0x60, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x11, 0x01, 0x12, 0x04, 0xb2, 0x04, 0x0a, + 0x12, 0x0a, 0x36, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x11, 0x02, 0x00, 0x12, 0x04, 0xb4, 0x04, 0x04, + 0x2a, 0x1a, 0x26, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, + 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x54, 0x57, 0x41, 0x50, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x11, 0x02, 0x00, 0x04, 0x12, 0x04, 0xb4, 0x04, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x11, 0x02, 0x00, 0x05, 0x12, 0x04, 0xb4, 0x04, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x11, 0x02, 0x00, 0x01, 0x12, 0x04, 0xb4, 0x04, 0x14, 0x25, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x11, 0x02, 0x00, 0x03, 0x12, 0x04, 0xb4, 0x04, 0x28, 0x29, 0x0a, 0x42, 0x0a, + 0x06, 0x04, 0x00, 0x03, 0x11, 0x02, 0x01, 0x12, 0x04, 0xb6, 0x04, 0x04, 0x1e, 0x1a, 0x32, 0x2f, + 0x20, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x2c, 0x20, 0x69, 0x6e, 0x20, 0x73, 0x65, 0x63, 0x6f, + 0x6e, 0x64, 0x73, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x77, 0x61, 0x70, 0x20, 0x73, 0x68, + 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x66, 0x6f, 0x72, + 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x11, 0x02, 0x01, 0x04, 0x12, 0x04, 0xb6, 0x04, + 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x11, 0x02, 0x01, 0x05, 0x12, 0x04, 0xb6, + 0x04, 0x0d, 0x12, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x11, 0x02, 0x01, 0x01, 0x12, 0x04, + 0xb6, 0x04, 0x13, 0x19, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x11, 0x02, 0x01, 0x03, 0x12, + 0x04, 0xb6, 0x04, 0x1c, 0x1d, 0x0a, 0x3b, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x11, 0x02, 0x02, 0x12, + 0x04, 0xb8, 0x04, 0x04, 0x31, 0x1a, 0x2b, 0x2f, 0x20, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, + 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x69, 0x72, + 0x20, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x69, 0x6d, + 0x65, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x11, 0x02, 0x02, 0x04, 0x12, 0x04, 0xb8, + 0x04, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x11, 0x02, 0x02, 0x05, 0x12, 0x04, + 0xb8, 0x04, 0x0d, 0x11, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x11, 0x02, 0x02, 0x01, 0x12, + 0x04, 0xb8, 0x04, 0x12, 0x2c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x11, 0x02, 0x02, 0x03, + 0x12, 0x04, 0xb8, 0x04, 0x2f, 0x30, 0x0a, 0x57, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x11, 0x02, 0x03, + 0x12, 0x04, 0xba, 0x04, 0x04, 0x24, 0x1a, 0x47, 0x2f, 0x20, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x75, + 0x6d, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x61, 0x6d, 0x70, + 0x6c, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x69, 0x73, 0x74, 0x6f, + 0x72, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x20, + 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x0a, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x11, 0x02, 0x03, 0x04, 0x12, 0x04, 0xba, 0x04, 0x04, 0x0c, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x11, 0x02, 0x03, 0x05, 0x12, 0x04, 0xba, 0x04, 0x0d, + 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x11, 0x02, 0x03, 0x01, 0x12, 0x04, 0xba, 0x04, + 0x14, 0x1f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x11, 0x02, 0x03, 0x03, 0x12, 0x04, 0xba, + 0x04, 0x22, 0x23, 0x0a, 0x40, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x11, 0x02, 0x04, 0x12, 0x04, 0xbc, + 0x04, 0x04, 0x2d, 0x1a, 0x30, 0x2f, 0x20, 0x45, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x75, 0x6e, + 0x69, 0x78, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x74, 0x6f, 0x20, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x75, + 0x70, 0x20, 0x74, 0x6f, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x11, 0x02, 0x04, 0x04, + 0x12, 0x04, 0xbc, 0x04, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x11, 0x02, 0x04, + 0x05, 0x12, 0x04, 0xbc, 0x04, 0x0d, 0x12, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x11, 0x02, + 0x04, 0x01, 0x12, 0x04, 0xbc, 0x04, 0x13, 0x28, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x11, + 0x02, 0x04, 0x03, 0x12, 0x04, 0xbc, 0x04, 0x2b, 0x2c, 0x0a, 0x44, 0x0a, 0x06, 0x04, 0x00, 0x03, + 0x11, 0x02, 0x05, 0x12, 0x04, 0xbe, 0x04, 0x04, 0x3a, 0x1a, 0x34, 0x2f, 0x20, 0x45, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x20, 0x74, 0x6f, + 0x20, 0x67, 0x65, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, + 0x75, 0x6e, 0x69, 0x78, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x0a, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x11, 0x02, 0x05, 0x04, 0x12, 0x04, 0xbe, 0x04, 0x04, 0x0c, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x11, 0x02, 0x05, 0x06, 0x12, 0x04, 0xbe, 0x04, 0x0d, + 0x1a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x11, 0x02, 0x05, 0x01, 0x12, 0x04, 0xbe, 0x04, + 0x1b, 0x35, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x11, 0x02, 0x05, 0x03, 0x12, 0x04, 0xbe, + 0x04, 0x38, 0x39, 0x0a, 0x43, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x12, 0x12, 0x06, 0xc2, 0x04, 0x02, + 0xc5, 0x04, 0x03, 0x1a, 0x33, 0x2f, 0x20, 0x46, 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x20, 0x73, 0x77, 0x61, 0x70, 0x20, 0x70, 0x72, 0x69, + 0x63, 0x65, 0x20, 0x6f, 0x6e, 0x20, 0x53, 0x65, 0x72, 0x75, 0x6d, 0x27, 0x73, 0x20, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x62, 0x6f, 0x6f, 0x6b, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x12, + 0x01, 0x12, 0x04, 0xc2, 0x04, 0x0a, 0x17, 0x0a, 0x39, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x12, 0x02, + 0x00, 0x12, 0x04, 0xc4, 0x04, 0x04, 0x2b, 0x1a, 0x29, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x73, + 0x65, 0x72, 0x75, 0x6d, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x66, 0x65, 0x74, + 0x63, 0x68, 0x20, 0x73, 0x77, 0x61, 0x70, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, 0x66, 0x6f, + 0x72, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x12, 0x02, 0x00, 0x04, 0x12, 0x04, 0xc4, + 0x04, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x12, 0x02, 0x00, 0x05, 0x12, 0x04, + 0xc4, 0x04, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x12, 0x02, 0x00, 0x01, 0x12, + 0x04, 0xc4, 0x04, 0x14, 0x26, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x12, 0x02, 0x00, 0x03, + 0x12, 0x04, 0xc4, 0x04, 0x29, 0x2a, 0x0a, 0xb5, 0x02, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x13, 0x12, + 0x06, 0xd4, 0x04, 0x02, 0xdd, 0x04, 0x03, 0x1a, 0xa4, 0x02, 0x0a, 0x52, 0x6f, 0x75, 0x6e, 0x64, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x72, 0x75, 0x6e, + 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x61, + 0x6e, 0x20, 0x65, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x20, 0x70, 0x6f, + 0x77, 0x65, 0x72, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2a, 0x2a, + 0x5f, 0x3a, 0x20, 0x54, 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x72, + 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, + 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x52, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x73, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x54, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x70, + 0x75, 0x74, 0x20, 0x72, 0x61, 0x69, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6e, 0x20, + 0x65, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x20, 0x70, 0x6f, 0x77, 0x65, + 0x72, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, + 0x5f, 0x3a, 0x20, 0x52, 0x61, 0x69, 0x73, 0x65, 0x20, 0x32, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x33, 0x2c, 0x20, 0x32, 0x5e, + 0x33, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x22, 0x74, 0x61, 0x73, + 0x6b, 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x61, 0x73, 0x6b, + 0x22, 0x3a, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x32, 0x7d, 0x7d, 0x2c, 0x7b, + 0x22, 0x70, 0x6f, 0x77, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x73, 0x63, 0x61, 0x6c, + 0x61, 0x72, 0x22, 0x3a, 0x33, 0x7d, 0x7d, 0x5d, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x0d, + 0x0a, 0x05, 0x04, 0x00, 0x03, 0x13, 0x01, 0x12, 0x04, 0xd4, 0x04, 0x0a, 0x11, 0x0a, 0x10, 0x0a, + 0x06, 0x04, 0x00, 0x03, 0x13, 0x08, 0x00, 0x12, 0x06, 0xd5, 0x04, 0x04, 0xdc, 0x04, 0x05, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x13, 0x08, 0x00, 0x01, 0x12, 0x04, 0xd5, 0x04, 0x0a, 0x12, + 0x0a, 0x43, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x13, 0x02, 0x00, 0x12, 0x04, 0xd7, 0x04, 0x06, 0x18, + 0x1a, 0x33, 0x2f, 0x20, 0x54, 0x61, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, 0x6f, 0x72, + 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x65, 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x13, 0x02, 0x00, 0x05, + 0x12, 0x04, 0xd7, 0x04, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x13, 0x02, 0x00, + 0x01, 0x12, 0x04, 0xd7, 0x04, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x13, 0x02, + 0x00, 0x03, 0x12, 0x04, 0xd7, 0x04, 0x16, 0x17, 0x0a, 0x53, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x13, + 0x02, 0x01, 0x12, 0x04, 0xd9, 0x04, 0x06, 0x23, 0x1a, 0x43, 0x2f, 0x20, 0x54, 0x61, 0x6b, 0x65, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, + 0x61, 0x74, 0x6f, 0x72, 0x73, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x13, 0x02, 0x01, 0x05, 0x12, 0x04, 0xd9, 0x04, 0x06, 0x0c, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x13, 0x02, 0x01, 0x01, 0x12, 0x04, 0xd9, 0x04, 0x0d, 0x1e, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x13, 0x02, 0x01, 0x03, 0x12, 0x04, 0xd9, 0x04, 0x21, 0x22, + 0x0a, 0x4d, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x13, 0x02, 0x02, 0x12, 0x04, 0xdb, 0x04, 0x06, 0x15, + 0x1a, 0x3d, 0x2f, 0x20, 0x41, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x69, 0x65, + 0x64, 0x20, 0x62, 0x69, 0x67, 0x2e, 0x6a, 0x73, 0x2e, 0x20, 0x60, 0x41, 0x63, 0x63, 0x65, 0x70, + 0x74, 0x73, 0x20, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x65, 0x78, 0x70, 0x61, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x2e, 0x60, 0x0a, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x13, 0x02, 0x02, 0x05, 0x12, 0x04, 0xdb, 0x04, 0x06, 0x0c, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x13, 0x02, 0x02, 0x01, 0x12, 0x04, 0xdb, 0x04, 0x0d, + 0x10, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x13, 0x02, 0x02, 0x03, 0x12, 0x04, 0xdb, 0x04, + 0x13, 0x14, 0x0a, 0x47, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x14, 0x12, 0x06, 0xe0, 0x04, 0x02, 0xec, + 0x04, 0x03, 0x1a, 0x37, 0x2f, 0x20, 0x46, 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6c, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x72, 0x61, 0x74, 0x65, 0x73, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x76, 0x61, 0x72, 0x69, 0x6f, 0x75, 0x73, 0x20, 0x53, 0x6f, 0x6c, 0x61, 0x6e, 0x61, + 0x20, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x73, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, + 0x00, 0x03, 0x14, 0x01, 0x12, 0x04, 0xe0, 0x04, 0x0a, 0x19, 0x0a, 0x50, 0x0a, 0x06, 0x04, 0x00, + 0x03, 0x14, 0x02, 0x00, 0x12, 0x04, 0xe2, 0x04, 0x04, 0x21, 0x1a, 0x40, 0x2f, 0x20, 0x30, 0x31, + 0x2c, 0x20, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6e, 0x63, + 0x69, 0x75, 0x6d, 0x2c, 0x20, 0x6a, 0x65, 0x74, 0x2c, 0x20, 0x6c, 0x61, 0x72, 0x69, 0x78, 0x2c, + 0x20, 0x6d, 0x61, 0x6e, 0x67, 0x6f, 0x2c, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x2c, 0x20, 0x73, 0x6f, + 0x6c, 0x65, 0x6e, 0x64, 0x2c, 0x20, 0x74, 0x75, 0x6c, 0x69, 0x70, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x14, 0x02, 0x00, 0x04, 0x12, 0x04, 0xe2, 0x04, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x14, 0x02, 0x00, 0x05, 0x12, 0x04, 0xe2, 0x04, 0x0d, 0x13, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x14, 0x02, 0x00, 0x01, 0x12, 0x04, 0xe2, 0x04, 0x14, 0x1c, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x14, 0x02, 0x00, 0x03, 0x12, 0x04, 0xe2, 0x04, 0x1f, 0x20, + 0x0a, 0x48, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x14, 0x02, 0x01, 0x12, 0x04, 0xe4, 0x04, 0x04, 0x23, + 0x1a, 0x38, 0x2f, 0x20, 0x41, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x6d, 0x69, 0x6e, 0x74, + 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x68, 0x6f, 0x73, 0x65, 0x6e, + 0x20, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x14, 0x02, 0x01, 0x04, 0x12, 0x04, 0xe4, 0x04, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x14, 0x02, 0x01, 0x05, 0x12, 0x04, 0xe4, 0x04, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x14, 0x02, 0x01, 0x01, 0x12, 0x04, 0xe4, 0x04, 0x14, 0x1e, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x14, 0x02, 0x01, 0x03, 0x12, 0x04, 0xe4, 0x04, 0x21, 0x22, 0x0a, 0x10, + 0x0a, 0x06, 0x04, 0x00, 0x03, 0x14, 0x04, 0x00, 0x12, 0x06, 0xe5, 0x04, 0x04, 0xea, 0x04, 0x05, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x14, 0x04, 0x00, 0x01, 0x12, 0x04, 0xe5, 0x04, 0x09, + 0x0e, 0x0a, 0x29, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x14, 0x04, 0x00, 0x02, 0x00, 0x12, 0x04, 0xe7, + 0x04, 0x06, 0x1d, 0x1a, 0x17, 0x2f, 0x20, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x20, 0x6c, + 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x72, 0x61, 0x74, 0x65, 0x0a, 0x0a, 0x11, 0x0a, 0x09, + 0x04, 0x00, 0x03, 0x14, 0x04, 0x00, 0x02, 0x00, 0x01, 0x12, 0x04, 0xe7, 0x04, 0x06, 0x18, 0x0a, + 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x14, 0x04, 0x00, 0x02, 0x00, 0x02, 0x12, 0x04, 0xe7, 0x04, + 0x1b, 0x1c, 0x0a, 0x28, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x14, 0x04, 0x00, 0x02, 0x01, 0x12, 0x04, + 0xe9, 0x04, 0x06, 0x1c, 0x1a, 0x16, 0x2f, 0x20, 0x62, 0x6f, 0x72, 0x72, 0x6f, 0x77, 0x20, 0x6c, + 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x72, 0x61, 0x74, 0x65, 0x0a, 0x0a, 0x11, 0x0a, 0x09, + 0x04, 0x00, 0x03, 0x14, 0x04, 0x00, 0x02, 0x01, 0x01, 0x12, 0x04, 0xe9, 0x04, 0x06, 0x17, 0x0a, + 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x14, 0x04, 0x00, 0x02, 0x01, 0x02, 0x12, 0x04, 0xe9, 0x04, + 0x1a, 0x1b, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x14, 0x02, 0x02, 0x12, 0x04, 0xeb, 0x04, + 0x04, 0x1d, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x14, 0x02, 0x02, 0x04, 0x12, 0x04, 0xeb, + 0x04, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x14, 0x02, 0x02, 0x06, 0x12, 0x04, + 0xeb, 0x04, 0x0d, 0x12, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x14, 0x02, 0x02, 0x01, 0x12, + 0x04, 0xeb, 0x04, 0x13, 0x18, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x14, 0x02, 0x02, 0x03, + 0x12, 0x04, 0xeb, 0x04, 0x1b, 0x1c, 0x0a, 0x47, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x15, 0x12, 0x06, + 0xef, 0x04, 0x02, 0xf2, 0x04, 0x03, 0x1a, 0x37, 0x2f, 0x20, 0x46, 0x65, 0x74, 0x63, 0x68, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x70, 0x72, 0x69, 0x63, + 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x4d, 0x61, 0x6e, 0x67, 0x6f, 0x20, 0x70, 0x65, + 0x72, 0x70, 0x65, 0x74, 0x75, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x0a, 0x0a, + 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x15, 0x01, 0x12, 0x04, 0xef, 0x04, 0x0a, 0x1d, 0x0a, 0xb0, + 0x01, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x15, 0x02, 0x00, 0x12, 0x04, 0xf1, 0x04, 0x04, 0x2c, 0x1a, + 0x9f, 0x01, 0x2f, 0x20, 0x4d, 0x61, 0x69, 0x6e, 0x6e, 0x65, 0x74, 0x20, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x6d, 0x61, 0x6e, 0x67, 0x6f, 0x20, + 0x70, 0x65, 0x72, 0x70, 0x65, 0x74, 0x75, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, + 0x2e, 0x20, 0x41, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x63, 0x61, + 0x6e, 0x20, 0x62, 0x65, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x68, 0x65, 0x72, 0x65, 0x3a, + 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x2d, 0x66, + 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6d, 0x61, 0x6e, 0x67, 0x6f, 0x2d, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2d, 0x76, 0x33, 0x2f, 0x62, 0x6c, 0x6f, 0x62, 0x2f, 0x6d, + 0x61, 0x69, 0x6e, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x69, 0x64, 0x73, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, + 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x15, 0x02, 0x00, 0x04, 0x12, 0x04, 0xf1, 0x04, + 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x15, 0x02, 0x00, 0x05, 0x12, 0x04, 0xf1, + 0x04, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x15, 0x02, 0x00, 0x01, 0x12, 0x04, + 0xf1, 0x04, 0x14, 0x27, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x15, 0x02, 0x00, 0x03, 0x12, + 0x04, 0xf1, 0x04, 0x2a, 0x2b, 0x0a, 0xbc, 0x05, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x16, 0x12, 0x06, + 0x87, 0x05, 0x02, 0xa6, 0x05, 0x03, 0x1a, 0xab, 0x05, 0x0a, 0x46, 0x65, 0x74, 0x63, 0x68, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x20, 0x70, 0x72, + 0x69, 0x63, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x73, 0x77, 0x61, 0x70, 0x20, 0x6f, + 0x6e, 0x20, 0x4a, 0x75, 0x70, 0x69, 0x74, 0x65, 0x72, 0x53, 0x77, 0x61, 0x70, 0x2e, 0x0a, 0x0a, + 0x5f, 0x2a, 0x2a, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x4e, 0x6f, 0x6e, + 0x65, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x2a, 0x2a, 0x5f, + 0x3a, 0x20, 0x54, 0x68, 0x65, 0x20, 0x73, 0x77, 0x61, 0x70, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, + 0x20, 0x6f, 0x6e, 0x20, 0x4a, 0x75, 0x70, 0x69, 0x74, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x61, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x6d, + 0x69, 0x6e, 0x74, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, + 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x46, 0x65, 0x74, + 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4a, 0x75, 0x70, 0x69, 0x74, 0x65, 0x72, 0x53, 0x77, + 0x61, 0x70, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x63, + 0x68, 0x61, 0x6e, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x31, 0x20, 0x53, 0x4f, 0x4c, 0x20, 0x69, 0x6e, + 0x74, 0x6f, 0x20, 0x55, 0x53, 0x44, 0x43, 0x2e, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, + 0x6e, 0x0a, 0x7b, 0x20, 0x22, 0x6a, 0x75, 0x70, 0x69, 0x74, 0x65, 0x72, 0x53, 0x77, 0x61, 0x70, + 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x20, 0x22, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x6f, 0x31, 0x31, + 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, + 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, + 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x32, 0x22, 0x2c, 0x20, 0x22, 0x6f, 0x75, 0x74, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x50, + 0x6a, 0x46, 0x57, 0x64, 0x64, 0x35, 0x41, 0x75, 0x66, 0x71, 0x53, 0x53, 0x71, 0x65, 0x4d, 0x32, + 0x71, 0x4e, 0x31, 0x78, 0x7a, 0x79, 0x62, 0x61, 0x70, 0x43, 0x38, 0x47, 0x34, 0x77, 0x45, 0x47, + 0x47, 0x6b, 0x5a, 0x77, 0x79, 0x54, 0x44, 0x74, 0x31, 0x76, 0x22, 0x20, 0x7d, 0x20, 0x7d, 0x0a, + 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, + 0x2a, 0x5f, 0x3a, 0x20, 0x46, 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4a, 0x75, + 0x70, 0x69, 0x74, 0x65, 0x72, 0x53, 0x77, 0x61, 0x70, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x31, + 0x30, 0x30, 0x30, 0x20, 0x53, 0x4f, 0x4c, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x55, 0x53, 0x44, + 0x43, 0x2e, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x20, 0x22, 0x6a, + 0x75, 0x70, 0x69, 0x74, 0x65, 0x72, 0x53, 0x77, 0x61, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, + 0x20, 0x7b, 0x20, 0x22, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x6f, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, + 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, + 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, + 0x32, 0x22, 0x2c, 0x20, 0x22, 0x6f, 0x75, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x50, 0x6a, 0x46, 0x57, 0x64, 0x64, 0x35, + 0x41, 0x75, 0x66, 0x71, 0x53, 0x53, 0x71, 0x65, 0x4d, 0x32, 0x71, 0x4e, 0x31, 0x78, 0x7a, 0x79, + 0x62, 0x61, 0x70, 0x43, 0x38, 0x47, 0x34, 0x77, 0x45, 0x47, 0x47, 0x6b, 0x5a, 0x77, 0x79, 0x54, + 0x44, 0x74, 0x31, 0x76, 0x22, 0x2c, 0x20, 0x22, 0x62, 0x61, 0x73, 0x65, 0x41, 0x6d, 0x6f, 0x75, + 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x31, 0x30, 0x30, 0x30, 0x22, 0x20, 0x7d, 0x20, 0x7d, 0x0a, + 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x16, 0x01, 0x12, 0x04, 0x87, + 0x05, 0x0a, 0x19, 0x0a, 0x2b, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x16, 0x02, 0x00, 0x12, 0x04, 0x89, + 0x05, 0x04, 0x29, 0x1a, 0x1b, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, + 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x0a, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x16, 0x02, 0x00, 0x04, 0x12, 0x04, 0x89, 0x05, 0x04, + 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x16, 0x02, 0x00, 0x05, 0x12, 0x04, 0x89, 0x05, + 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x16, 0x02, 0x00, 0x01, 0x12, 0x04, 0x89, + 0x05, 0x14, 0x24, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x16, 0x02, 0x00, 0x03, 0x12, 0x04, + 0x89, 0x05, 0x27, 0x28, 0x0a, 0x2c, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x16, 0x02, 0x01, 0x12, 0x04, + 0x8b, 0x05, 0x04, 0x2a, 0x1a, 0x1c, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x6f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x16, 0x02, 0x01, 0x04, 0x12, 0x04, 0x8b, + 0x05, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x16, 0x02, 0x01, 0x05, 0x12, 0x04, + 0x8b, 0x05, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x16, 0x02, 0x01, 0x01, 0x12, + 0x04, 0x8b, 0x05, 0x14, 0x25, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x16, 0x02, 0x01, 0x03, + 0x12, 0x04, 0x8b, 0x05, 0x28, 0x29, 0x0a, 0x10, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x16, 0x03, 0x00, + 0x12, 0x06, 0x8d, 0x05, 0x04, 0x90, 0x05, 0x05, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x16, + 0x03, 0x00, 0x01, 0x12, 0x04, 0x8d, 0x05, 0x0c, 0x16, 0x0a, 0x5b, 0x0a, 0x08, 0x04, 0x00, 0x03, + 0x16, 0x03, 0x00, 0x02, 0x00, 0x12, 0x04, 0x8f, 0x05, 0x06, 0x21, 0x1a, 0x49, 0x2f, 0x20, 0x41, + 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x4a, 0x75, 0x70, 0x69, 0x74, 0x65, 0x72, + 0x20, 0x41, 0x4d, 0x4d, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x61, + 0x6c, 0x6c, 0x6f, 0x77, 0x20, 0x6f, 0x72, 0x20, 0x64, 0x65, 0x6e, 0x79, 0x20, 0x28, 0x65, 0x2e, + 0x67, 0x2e, 0x20, 0x27, 0x52, 0x61, 0x79, 0x64, 0x69, 0x75, 0x6d, 0x27, 0x2c, 0x20, 0x27, 0x4f, + 0x72, 0x63, 0x61, 0x27, 0x29, 0x0a, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x16, 0x03, 0x00, + 0x02, 0x00, 0x04, 0x12, 0x04, 0x8f, 0x05, 0x06, 0x0e, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, + 0x16, 0x03, 0x00, 0x02, 0x00, 0x05, 0x12, 0x04, 0x8f, 0x05, 0x0f, 0x15, 0x0a, 0x11, 0x0a, 0x09, + 0x04, 0x00, 0x03, 0x16, 0x03, 0x00, 0x02, 0x00, 0x01, 0x12, 0x04, 0x8f, 0x05, 0x16, 0x1c, 0x0a, + 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x16, 0x03, 0x00, 0x02, 0x00, 0x03, 0x12, 0x04, 0x8f, 0x05, + 0x1f, 0x20, 0x0a, 0x10, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x16, 0x08, 0x00, 0x12, 0x06, 0x92, 0x05, + 0x04, 0x97, 0x05, 0x05, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x16, 0x08, 0x00, 0x01, 0x12, + 0x04, 0x92, 0x05, 0x0a, 0x17, 0x0a, 0x32, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x16, 0x02, 0x02, 0x12, + 0x04, 0x94, 0x05, 0x06, 0x20, 0x1a, 0x22, 0x2f, 0x20, 0x41, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, + 0x6f, 0x66, 0x20, 0x41, 0x4d, 0x4d, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x20, 0x74, + 0x6f, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x16, 0x02, 0x02, 0x06, 0x12, 0x04, 0x94, 0x05, 0x06, 0x10, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x16, 0x02, 0x02, 0x01, 0x12, 0x04, 0x94, 0x05, 0x11, 0x1b, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x16, 0x02, 0x02, 0x03, 0x12, 0x04, 0x94, 0x05, 0x1e, 0x1f, 0x0a, 0x31, 0x0a, 0x06, + 0x04, 0x00, 0x03, 0x16, 0x02, 0x03, 0x12, 0x04, 0x96, 0x05, 0x06, 0x1f, 0x1a, 0x21, 0x2f, 0x20, + 0x41, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x41, 0x4d, 0x4d, 0x20, 0x6d, 0x61, + 0x72, 0x6b, 0x65, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x65, 0x6e, 0x79, 0x2e, 0x0a, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x16, 0x02, 0x03, 0x06, 0x12, 0x04, 0x96, 0x05, 0x06, 0x10, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x16, 0x02, 0x03, 0x01, 0x12, 0x04, 0x96, 0x05, 0x11, + 0x1a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x16, 0x02, 0x03, 0x03, 0x12, 0x04, 0x96, 0x05, + 0x1d, 0x1e, 0x0a, 0x10, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x16, 0x08, 0x01, 0x12, 0x06, 0x99, 0x05, + 0x04, 0xa2, 0x05, 0x05, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x16, 0x08, 0x01, 0x01, 0x12, + 0x04, 0x99, 0x05, 0x0a, 0x14, 0x0a, 0x43, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x16, 0x02, 0x04, 0x12, + 0x04, 0x9b, 0x05, 0x06, 0x1d, 0x1a, 0x33, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x61, 0x6d, 0x6f, + 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x60, 0x69, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x60, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, + 0x20, 0x74, 0x6f, 0x20, 0x73, 0x77, 0x61, 0x70, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x16, 0x02, 0x04, 0x05, 0x12, 0x04, 0x9b, 0x05, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x16, 0x02, 0x04, 0x01, 0x12, 0x04, 0x9b, 0x05, 0x0d, 0x18, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x16, 0x02, 0x04, 0x03, 0x12, 0x04, 0x9b, 0x05, 0x1b, 0x1c, 0x0a, 0x44, 0x0a, + 0x06, 0x04, 0x00, 0x03, 0x16, 0x02, 0x05, 0x12, 0x04, 0x9d, 0x05, 0x06, 0x1e, 0x1a, 0x34, 0x2f, + 0x20, 0x54, 0x68, 0x65, 0x20, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x60, + 0x6f, 0x75, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x60, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x77, 0x61, + 0x70, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x16, 0x02, 0x05, 0x05, 0x12, 0x04, + 0x9d, 0x05, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x16, 0x02, 0x05, 0x01, 0x12, + 0x04, 0x9d, 0x05, 0x0d, 0x19, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x16, 0x02, 0x05, 0x03, + 0x12, 0x04, 0x9d, 0x05, 0x1c, 0x1d, 0x0a, 0x43, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x16, 0x02, 0x06, + 0x12, 0x04, 0x9f, 0x05, 0x06, 0x24, 0x1a, 0x33, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x61, 0x6d, + 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x60, 0x69, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x60, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x73, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x77, 0x61, 0x70, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x16, 0x02, 0x06, 0x05, 0x12, 0x04, 0x9f, 0x05, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x16, 0x02, 0x06, 0x01, 0x12, 0x04, 0x9f, 0x05, 0x0d, 0x1f, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x16, 0x02, 0x06, 0x03, 0x12, 0x04, 0x9f, 0x05, 0x22, 0x23, 0x0a, 0x44, + 0x0a, 0x06, 0x04, 0x00, 0x03, 0x16, 0x02, 0x07, 0x12, 0x04, 0xa1, 0x05, 0x06, 0x25, 0x1a, 0x34, + 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, + 0x60, 0x6f, 0x75, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x60, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x77, + 0x61, 0x70, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x16, 0x02, 0x07, 0x05, 0x12, + 0x04, 0xa1, 0x05, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x16, 0x02, 0x07, 0x01, + 0x12, 0x04, 0xa1, 0x05, 0x0d, 0x20, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x16, 0x02, 0x07, + 0x03, 0x12, 0x04, 0xa1, 0x05, 0x23, 0x24, 0x0a, 0x61, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x16, 0x02, + 0x08, 0x12, 0x04, 0xa5, 0x05, 0x04, 0x21, 0x1a, 0x51, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x61, + 0x6c, 0x6c, 0x6f, 0x77, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x73, 0x6c, 0x69, 0x70, 0x70, 0x61, 0x67, + 0x65, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x77, 0x61, 0x70, 0x20, 0x69, 0x6e, + 0x20, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x28, 0x65, + 0x2e, 0x67, 0x2e, 0x20, 0x30, 0x2e, 0x35, 0x20, 0x69, 0x73, 0x20, 0x30, 0x2e, 0x35, 0x25, 0x20, + 0x73, 0x6c, 0x69, 0x70, 0x70, 0x61, 0x67, 0x65, 0x29, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x16, 0x02, 0x08, 0x04, 0x12, 0x04, 0xa5, 0x05, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x16, 0x02, 0x08, 0x05, 0x12, 0x04, 0xa5, 0x05, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x16, 0x02, 0x08, 0x01, 0x12, 0x04, 0xa5, 0x05, 0x14, 0x1c, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x16, 0x02, 0x08, 0x03, 0x12, 0x04, 0xa5, 0x05, 0x1f, 0x20, 0x0a, 0x41, + 0x0a, 0x04, 0x04, 0x00, 0x03, 0x17, 0x12, 0x06, 0xa9, 0x05, 0x02, 0xb4, 0x05, 0x03, 0x1a, 0x31, + 0x2f, 0x20, 0x46, 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x70, + 0x65, 0x72, 0x70, 0x65, 0x74, 0x75, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x2e, + 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x17, 0x01, 0x12, 0x04, 0xa9, 0x05, 0x0a, 0x18, + 0x0a, 0x10, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x17, 0x08, 0x00, 0x12, 0x06, 0xaa, 0x05, 0x04, 0xb3, + 0x05, 0x05, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x17, 0x08, 0x00, 0x01, 0x12, 0x04, 0xaa, + 0x05, 0x0a, 0x17, 0x0a, 0xaf, 0x01, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x17, 0x02, 0x00, 0x12, 0x04, + 0xac, 0x05, 0x06, 0x26, 0x1a, 0x9e, 0x01, 0x2f, 0x20, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x20, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x6d, 0x61, + 0x6e, 0x67, 0x6f, 0x20, 0x70, 0x65, 0x72, 0x70, 0x65, 0x74, 0x75, 0x61, 0x6c, 0x20, 0x6d, 0x61, + 0x72, 0x6b, 0x65, 0x74, 0x2e, 0x20, 0x41, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x20, 0x6c, 0x69, 0x73, + 0x74, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x68, + 0x65, 0x72, 0x65, 0x3a, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x77, 0x6f, 0x72, + 0x6b, 0x73, 0x2d, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6d, 0x61, + 0x6e, 0x67, 0x6f, 0x2d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2d, 0x76, 0x33, 0x2f, 0x62, 0x6c, + 0x6f, 0x62, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x69, 0x64, 0x73, 0x2e, + 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x17, 0x02, 0x00, 0x05, + 0x12, 0x04, 0xac, 0x05, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x17, 0x02, 0x00, + 0x01, 0x12, 0x04, 0xac, 0x05, 0x0d, 0x21, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x17, 0x02, + 0x00, 0x03, 0x12, 0x04, 0xac, 0x05, 0x24, 0x25, 0x0a, 0xb2, 0x01, 0x0a, 0x06, 0x04, 0x00, 0x03, + 0x17, 0x02, 0x01, 0x12, 0x04, 0xae, 0x05, 0x06, 0x26, 0x1a, 0xa1, 0x01, 0x2f, 0x20, 0x4d, 0x61, + 0x72, 0x6b, 0x65, 0x74, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x61, 0x20, 0x64, 0x72, 0x69, 0x66, 0x74, 0x20, 0x70, 0x65, 0x72, 0x70, 0x65, 0x74, 0x75, + 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x2e, 0x20, 0x41, 0x20, 0x66, 0x75, 0x6c, + 0x6c, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x66, 0x6f, + 0x75, 0x6e, 0x64, 0x20, 0x68, 0x65, 0x72, 0x65, 0x3a, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, + 0x2f, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x64, 0x72, 0x69, + 0x66, 0x74, 0x2d, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, + 0x2d, 0x76, 0x31, 0x2f, 0x62, 0x6c, 0x6f, 0x62, 0x2f, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x2f, + 0x73, 0x64, 0x6b, 0x2f, 0x73, 0x72, 0x63, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, + 0x73, 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x2e, 0x74, 0x73, 0x0a, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x17, 0x02, 0x01, 0x05, 0x12, 0x04, 0xae, 0x05, 0x06, 0x0c, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x17, 0x02, 0x01, 0x01, 0x12, 0x04, 0xae, 0x05, 0x0d, 0x21, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x17, 0x02, 0x01, 0x03, 0x12, 0x04, 0xae, 0x05, 0x24, 0x25, + 0x0a, 0x3e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x17, 0x02, 0x02, 0x12, 0x04, 0xb0, 0x05, 0x06, 0x25, + 0x1a, 0x2e, 0x2f, 0x20, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x7a, 0x65, 0x74, 0x61, 0x20, 0x70, 0x65, + 0x72, 0x70, 0x65, 0x74, 0x75, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x2e, 0x0a, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x17, 0x02, 0x02, 0x05, 0x12, 0x04, 0xb0, 0x05, 0x06, + 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x17, 0x02, 0x02, 0x01, 0x12, 0x04, 0xb0, 0x05, + 0x0d, 0x20, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x17, 0x02, 0x02, 0x03, 0x12, 0x04, 0xb0, + 0x05, 0x23, 0x24, 0x0a, 0x45, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x17, 0x02, 0x03, 0x12, 0x04, 0xb2, + 0x05, 0x06, 0x23, 0x1a, 0x35, 0x2f, 0x20, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x20, 0x61, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x30, 0x31, 0x20, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x20, 0x70, 0x65, 0x72, 0x70, 0x65, 0x74, 0x75, 0x61, + 0x6c, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x17, 0x02, 0x03, 0x05, 0x12, 0x04, 0xb2, 0x05, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x17, 0x02, 0x03, 0x01, 0x12, 0x04, 0xb2, 0x05, 0x0d, 0x1e, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x17, 0x02, 0x03, 0x03, 0x12, 0x04, 0xb2, 0x05, 0x21, 0x22, 0x0a, 0xdb, 0x04, + 0x0a, 0x04, 0x04, 0x00, 0x03, 0x18, 0x12, 0x06, 0xcf, 0x05, 0x02, 0xe7, 0x05, 0x03, 0x1a, 0xca, + 0x04, 0x0a, 0x46, 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x53, + 0x6f, 0x6c, 0x61, 0x6e, 0x61, 0x20, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x20, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x49, 0x6e, 0x70, 0x75, 0x74, + 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x52, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x73, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x54, 0x68, 0x65, 0x20, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, + 0x6e, 0x20, 0x6f, 0x6e, 0x2d, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x20, 0x6f, 0x72, 0x61, 0x63, 0x6c, + 0x65, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, + 0x5f, 0x3a, 0x20, 0x54, 0x68, 0x65, 0x20, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x62, 0x6f, 0x61, + 0x72, 0x64, 0x20, 0x53, 0x4f, 0x4c, 0x2f, 0x55, 0x53, 0x44, 0x20, 0x6f, 0x72, 0x61, 0x63, 0x6c, + 0x65, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x2e, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, + 0x6e, 0x0a, 0x7b, 0x20, 0x22, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, + 0x3a, 0x20, 0x7b, 0x20, 0x22, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, + 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x3a, 0x20, 0x22, 0x47, 0x76, 0x44, 0x4d, 0x78, + 0x50, 0x7a, 0x4e, 0x31, 0x73, 0x43, 0x6a, 0x37, 0x4c, 0x32, 0x36, 0x59, 0x44, 0x4b, 0x32, 0x48, + 0x6e, 0x4d, 0x52, 0x58, 0x45, 0x51, 0x6d, 0x51, 0x32, 0x61, 0x65, 0x6d, 0x6f, 0x76, 0x38, 0x59, + 0x42, 0x74, 0x50, 0x53, 0x37, 0x76, 0x52, 0x22, 0x20, 0x7d, 0x20, 0x7d, 0x0a, 0x60, 0x60, 0x60, + 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, 0x3a, + 0x20, 0x54, 0x68, 0x65, 0x20, 0x50, 0x79, 0x74, 0x68, 0x20, 0x53, 0x4f, 0x4c, 0x2f, 0x55, 0x53, + 0x44, 0x20, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x2e, 0x0a, + 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x20, 0x22, 0x6f, 0x72, 0x61, 0x63, + 0x6c, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x20, 0x22, 0x70, 0x79, 0x74, 0x68, + 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x3a, 0x20, 0x22, 0x48, 0x36, 0x41, 0x52, 0x48, + 0x66, 0x36, 0x59, 0x58, 0x68, 0x47, 0x59, 0x65, 0x51, 0x66, 0x55, 0x7a, 0x51, 0x4e, 0x47, 0x6b, + 0x36, 0x72, 0x44, 0x4e, 0x6e, 0x4c, 0x42, 0x51, 0x4b, 0x72, 0x65, 0x6e, 0x4e, 0x37, 0x31, 0x32, + 0x4b, 0x34, 0x41, 0x51, 0x4a, 0x45, 0x47, 0x22, 0x20, 0x7d, 0x20, 0x7d, 0x0a, 0x60, 0x60, 0x60, + 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, 0x3a, + 0x20, 0x54, 0x68, 0x65, 0x20, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x53, + 0x4f, 0x4c, 0x2f, 0x55, 0x53, 0x44, 0x20, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x20, 0x70, 0x72, + 0x69, 0x63, 0x65, 0x2e, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x20, + 0x22, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x20, + 0x22, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x22, 0x3a, 0x20, 0x22, 0x43, 0x63, 0x50, 0x56, 0x53, 0x39, 0x62, 0x71, 0x79, 0x58, 0x62, + 0x44, 0x39, 0x63, 0x4c, 0x6e, 0x54, 0x62, 0x68, 0x68, 0x48, 0x61, 0x7a, 0x4c, 0x73, 0x72, 0x75, + 0x61, 0x38, 0x51, 0x4d, 0x46, 0x55, 0x48, 0x54, 0x75, 0x74, 0x50, 0x74, 0x6a, 0x79, 0x44, 0x7a, + 0x71, 0x22, 0x20, 0x7d, 0x20, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, + 0x00, 0x03, 0x18, 0x01, 0x12, 0x04, 0xcf, 0x05, 0x0a, 0x14, 0x0a, 0x10, 0x0a, 0x06, 0x04, 0x00, + 0x03, 0x18, 0x03, 0x00, 0x12, 0x06, 0xd0, 0x05, 0x04, 0xd2, 0x05, 0x05, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x18, 0x03, 0x00, 0x01, 0x12, 0x04, 0xd0, 0x05, 0x0c, 0x1c, 0x0a, 0x10, 0x0a, + 0x08, 0x04, 0x00, 0x03, 0x18, 0x03, 0x00, 0x02, 0x00, 0x12, 0x04, 0xd1, 0x05, 0x06, 0x23, 0x0a, + 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x18, 0x03, 0x00, 0x02, 0x00, 0x04, 0x12, 0x04, 0xd1, 0x05, + 0x06, 0x0e, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x18, 0x03, 0x00, 0x02, 0x00, 0x05, 0x12, + 0x04, 0xd1, 0x05, 0x0f, 0x15, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x18, 0x03, 0x00, 0x02, + 0x00, 0x01, 0x12, 0x04, 0xd1, 0x05, 0x16, 0x1e, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x18, + 0x03, 0x00, 0x02, 0x00, 0x03, 0x12, 0x04, 0xd1, 0x05, 0x21, 0x22, 0x0a, 0x10, 0x0a, 0x06, 0x04, + 0x00, 0x03, 0x18, 0x03, 0x01, 0x12, 0x06, 0xd3, 0x05, 0x04, 0xd5, 0x05, 0x05, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x18, 0x03, 0x01, 0x01, 0x12, 0x04, 0xd3, 0x05, 0x0c, 0x17, 0x0a, 0x10, + 0x0a, 0x08, 0x04, 0x00, 0x03, 0x18, 0x03, 0x01, 0x02, 0x00, 0x12, 0x04, 0xd4, 0x05, 0x06, 0x25, + 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x18, 0x03, 0x01, 0x02, 0x00, 0x04, 0x12, 0x04, 0xd4, + 0x05, 0x06, 0x0e, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x18, 0x03, 0x01, 0x02, 0x00, 0x05, + 0x12, 0x04, 0xd4, 0x05, 0x0f, 0x15, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x18, 0x03, 0x01, + 0x02, 0x00, 0x01, 0x12, 0x04, 0xd4, 0x05, 0x16, 0x20, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, + 0x18, 0x03, 0x01, 0x02, 0x00, 0x03, 0x12, 0x04, 0xd4, 0x05, 0x23, 0x24, 0x0a, 0x10, 0x0a, 0x06, + 0x04, 0x00, 0x03, 0x18, 0x08, 0x00, 0x12, 0x06, 0xd6, 0x05, 0x04, 0xdd, 0x05, 0x05, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x18, 0x08, 0x00, 0x01, 0x12, 0x04, 0xd6, 0x05, 0x0a, 0x1b, 0x0a, + 0x81, 0x01, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x18, 0x02, 0x00, 0x12, 0x04, 0xd8, 0x05, 0x06, 0x25, + 0x1a, 0x71, 0x2f, 0x20, 0x4d, 0x61, 0x69, 0x6e, 0x6e, 0x65, 0x74, 0x20, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x62, + 0x6f, 0x61, 0x72, 0x64, 0x20, 0x66, 0x65, 0x65, 0x64, 0x2e, 0x20, 0x53, 0x77, 0x69, 0x74, 0x63, + 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x20, 0x69, 0x73, 0x20, 0x64, 0x65, 0x63, 0x65, 0x6e, 0x74, + 0x72, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x6c, 0x6c, 0x6f, + 0x77, 0x73, 0x20, 0x61, 0x6e, 0x79, 0x6f, 0x6e, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x75, 0x69, + 0x6c, 0x64, 0x20, 0x74, 0x68, 0x65, 0x69, 0x72, 0x20, 0x6f, 0x77, 0x6e, 0x20, 0x66, 0x65, 0x65, + 0x64, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x18, 0x02, 0x00, 0x05, 0x12, 0x04, + 0xd8, 0x05, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x18, 0x02, 0x00, 0x01, 0x12, + 0x04, 0xd8, 0x05, 0x0d, 0x20, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x18, 0x02, 0x00, 0x03, + 0x12, 0x04, 0xd8, 0x05, 0x23, 0x24, 0x0a, 0x74, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x18, 0x02, 0x01, + 0x12, 0x04, 0xda, 0x05, 0x06, 0x1e, 0x1a, 0x64, 0x2f, 0x20, 0x4d, 0x61, 0x69, 0x6e, 0x6e, 0x65, + 0x74, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, + 0x50, 0x79, 0x74, 0x68, 0x20, 0x66, 0x65, 0x65, 0x64, 0x2e, 0x20, 0x41, 0x20, 0x66, 0x75, 0x6c, + 0x6c, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x66, 0x6f, + 0x75, 0x6e, 0x64, 0x20, 0x68, 0x65, 0x72, 0x65, 0x3a, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, + 0x2f, 0x2f, 0x70, 0x79, 0x74, 0x68, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x70, + 0x72, 0x69, 0x63, 0x65, 0x2d, 0x66, 0x65, 0x65, 0x64, 0x73, 0x2f, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x18, 0x02, 0x01, 0x05, 0x12, 0x04, 0xda, 0x05, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x18, 0x02, 0x01, 0x01, 0x12, 0x04, 0xda, 0x05, 0x0d, 0x19, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x18, 0x02, 0x01, 0x03, 0x12, 0x04, 0xda, 0x05, 0x1c, 0x1d, 0x0a, + 0x8d, 0x01, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x18, 0x02, 0x02, 0x12, 0x04, 0xdc, 0x05, 0x06, 0x23, + 0x1a, 0x7d, 0x2f, 0x20, 0x4d, 0x61, 0x69, 0x6e, 0x6e, 0x65, 0x74, 0x20, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x6c, + 0x69, 0x6e, 0x6b, 0x20, 0x66, 0x65, 0x65, 0x64, 0x2e, 0x20, 0x41, 0x20, 0x66, 0x75, 0x6c, 0x6c, + 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x66, 0x6f, 0x75, + 0x6e, 0x64, 0x20, 0x68, 0x65, 0x72, 0x65, 0x3a, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, + 0x2f, 0x64, 0x6f, 0x63, 0x73, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, + 0x2f, 0x64, 0x6f, 0x63, 0x73, 0x2f, 0x73, 0x6f, 0x6c, 0x61, 0x6e, 0x61, 0x2f, 0x64, 0x61, 0x74, + 0x61, 0x2d, 0x66, 0x65, 0x65, 0x64, 0x73, 0x2d, 0x73, 0x6f, 0x6c, 0x61, 0x6e, 0x61, 0x0a, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x18, 0x02, 0x02, 0x05, 0x12, 0x04, 0xdc, 0x05, 0x06, 0x0c, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x18, 0x02, 0x02, 0x01, 0x12, 0x04, 0xdc, 0x05, 0x0d, + 0x1e, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x18, 0x02, 0x02, 0x03, 0x12, 0x04, 0xdc, 0x05, + 0x21, 0x22, 0x0a, 0xbf, 0x02, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x18, 0x02, 0x03, 0x12, 0x04, 0xe3, + 0x05, 0x04, 0x39, 0x1a, 0xae, 0x02, 0x2f, 0x20, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x28, 0x61, + 0x73, 0x20, 0x61, 0x20, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x29, 0x20, + 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x20, 0x62, + 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x20, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x20, 0x69, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, + 0x0a, 0x2f, 0x20, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x61, 0x72, 0x65, + 0x20, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x69, + 0x73, 0x20, 0x74, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x20, 0x61, 0x72, 0x65, 0x20, 0x72, + 0x65, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, 0x2e, 0x0a, 0x2f, 0x0a, 0x2f, 0x20, 0x54, 0x68, 0x65, + 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x76, 0x61, 0x6c, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x20, 0x61, 0x73, 0x20, 0x61, 0x20, 0x72, 0x61, 0x77, + 0x20, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x2e, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x20, + 0x74, 0x6f, 0x0a, 0x2f, 0x20, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x20, 0x31, + 0x30, 0x25, 0x2c, 0x20, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x20, 0x61, 0x73, 0x20, 0x31, 0x30, 0x2c, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x30, + 0x2e, 0x31, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x18, 0x02, 0x03, 0x04, 0x12, + 0x04, 0xe3, 0x05, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x18, 0x02, 0x03, 0x05, + 0x12, 0x04, 0xe3, 0x05, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x18, 0x02, 0x03, + 0x01, 0x12, 0x04, 0xe3, 0x05, 0x14, 0x34, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x18, 0x02, + 0x03, 0x03, 0x12, 0x04, 0xe3, 0x05, 0x37, 0x38, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x18, + 0x02, 0x04, 0x12, 0x04, 0xe4, 0x05, 0x04, 0x34, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x18, + 0x02, 0x04, 0x04, 0x12, 0x04, 0xe4, 0x05, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x18, 0x02, 0x04, 0x06, 0x12, 0x04, 0xe4, 0x05, 0x0d, 0x1d, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x18, 0x02, 0x04, 0x01, 0x12, 0x04, 0xe4, 0x05, 0x1e, 0x2f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x18, 0x02, 0x04, 0x03, 0x12, 0x04, 0xe4, 0x05, 0x32, 0x33, 0x0a, 0x0e, 0x0a, 0x06, + 0x04, 0x00, 0x03, 0x18, 0x02, 0x05, 0x12, 0x04, 0xe5, 0x05, 0x04, 0x2a, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x18, 0x02, 0x05, 0x04, 0x12, 0x04, 0xe5, 0x05, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x18, 0x02, 0x05, 0x06, 0x12, 0x04, 0xe5, 0x05, 0x0d, 0x18, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x18, 0x02, 0x05, 0x01, 0x12, 0x04, 0xe5, 0x05, 0x19, 0x25, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x18, 0x02, 0x05, 0x03, 0x12, 0x04, 0xe5, 0x05, 0x28, 0x29, + 0x0a, 0x3f, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x19, 0x12, 0x06, 0xea, 0x05, 0x02, 0xef, 0x05, 0x03, + 0x1a, 0x2f, 0x2f, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x20, 0x61, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, + 0x20, 0x61, 0x6e, 0x20, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x20, 0x62, 0x61, 0x73, 0x65, 0x64, + 0x20, 0x73, 0x6f, 0x6c, 0x61, 0x6e, 0x61, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, + 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x19, 0x01, 0x12, 0x04, 0xea, 0x05, 0x0a, 0x19, + 0x0a, 0x3a, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x19, 0x02, 0x00, 0x12, 0x04, 0xec, 0x05, 0x04, 0x23, + 0x1a, 0x2a, 0x2f, 0x20, 0x4f, 0x77, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, + 0x61, 0x6d, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x19, 0x02, 0x00, 0x04, 0x12, 0x04, 0xec, 0x05, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x19, 0x02, 0x00, 0x05, 0x12, 0x04, 0xec, 0x05, 0x0d, 0x13, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x19, 0x02, 0x00, 0x01, 0x12, 0x04, 0xec, 0x05, 0x14, 0x1e, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x19, 0x02, 0x00, 0x03, 0x12, 0x04, 0xec, 0x05, 0x21, 0x22, + 0x0a, 0x28, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x19, 0x02, 0x01, 0x12, 0x04, 0xee, 0x05, 0x04, 0x28, + 0x1a, 0x18, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, + 0x74, 0x6f, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x19, 0x02, 0x01, 0x04, 0x12, 0x04, 0xee, 0x05, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x19, 0x02, 0x01, 0x05, 0x12, 0x04, 0xee, 0x05, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x19, 0x02, 0x01, 0x01, 0x12, 0x04, 0xee, 0x05, 0x14, 0x23, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x19, 0x02, 0x01, 0x03, 0x12, 0x04, 0xee, 0x05, 0x26, 0x27, 0x0a, 0x4e, + 0x0a, 0x04, 0x04, 0x00, 0x03, 0x1a, 0x12, 0x06, 0xf3, 0x05, 0x02, 0xf6, 0x05, 0x03, 0x1a, 0x3e, + 0x2f, 0x20, 0x46, 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4a, 0x53, 0x4f, 0x4e, + 0x20, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x53, 0x50, 0x4c, 0x20, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x20, + 0x50, 0x6f, 0x6f, 0x6c, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x0a, 0x0a, 0x0d, + 0x0a, 0x05, 0x04, 0x00, 0x03, 0x1a, 0x01, 0x12, 0x04, 0xf3, 0x05, 0x0a, 0x1a, 0x0a, 0x34, 0x0a, + 0x06, 0x04, 0x00, 0x03, 0x1a, 0x02, 0x00, 0x12, 0x04, 0xf5, 0x05, 0x04, 0x1f, 0x1a, 0x24, 0x2f, + 0x20, 0x54, 0x68, 0x65, 0x20, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x53, 0x50, 0x4c, 0x20, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x20, 0x50, 0x6f, 0x6f, + 0x6c, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1a, 0x02, 0x00, 0x04, 0x12, 0x04, + 0xf5, 0x05, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1a, 0x02, 0x00, 0x05, 0x12, + 0x04, 0xf5, 0x05, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1a, 0x02, 0x00, 0x01, + 0x12, 0x04, 0xf5, 0x05, 0x14, 0x1a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1a, 0x02, 0x00, + 0x03, 0x12, 0x04, 0xf5, 0x05, 0x1d, 0x1e, 0x0a, 0x46, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x1b, 0x12, + 0x06, 0xf9, 0x05, 0x02, 0x80, 0x06, 0x03, 0x1a, 0x36, 0x2f, 0x20, 0x46, 0x65, 0x74, 0x63, 0x68, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x4a, 0x53, 0x4f, 0x4e, 0x20, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, + 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x53, + 0x50, 0x4c, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x6d, 0x69, 0x6e, 0x74, 0x2e, 0x0a, 0x0a, + 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x1b, 0x01, 0x12, 0x04, 0xf9, 0x05, 0x0a, 0x1b, 0x0a, 0x10, + 0x0a, 0x06, 0x04, 0x00, 0x03, 0x1b, 0x08, 0x00, 0x12, 0x06, 0xfa, 0x05, 0x04, 0xff, 0x05, 0x05, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1b, 0x08, 0x00, 0x01, 0x12, 0x04, 0xfa, 0x05, 0x0a, + 0x18, 0x0a, 0x4e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x1b, 0x02, 0x00, 0x12, 0x04, 0xfc, 0x05, 0x06, + 0x27, 0x1a, 0x3e, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, + 0x65, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x61, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x6d, 0x69, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x20, 0x66, 0x6f, 0x72, 0x2e, + 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1b, 0x02, 0x00, 0x05, 0x12, 0x04, 0xfc, 0x05, + 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1b, 0x02, 0x00, 0x01, 0x12, 0x04, 0xfc, + 0x05, 0x0d, 0x22, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1b, 0x02, 0x00, 0x03, 0x12, 0x04, + 0xfc, 0x05, 0x25, 0x26, 0x0a, 0x3b, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x1b, 0x02, 0x01, 0x12, 0x04, + 0xfe, 0x05, 0x06, 0x1e, 0x1a, 0x2b, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x70, 0x75, 0x62, 0x6c, + 0x69, 0x63, 0x4b, 0x65, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x20, 0x6d, 0x69, 0x6e, 0x74, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, + 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1b, 0x02, 0x01, 0x05, 0x12, 0x04, 0xfe, 0x05, + 0x06, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1b, 0x02, 0x01, 0x01, 0x12, 0x04, 0xfe, + 0x05, 0x0d, 0x19, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1b, 0x02, 0x01, 0x03, 0x12, 0x04, + 0xfe, 0x05, 0x1c, 0x1d, 0x0a, 0x35, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x1c, 0x12, 0x06, 0x83, 0x06, + 0x02, 0x99, 0x06, 0x03, 0x1a, 0x25, 0x2f, 0x20, 0x46, 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x73, 0x77, 0x61, 0x70, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, 0x66, 0x72, 0x6f, + 0x6d, 0x20, 0x55, 0x6e, 0x69, 0x53, 0x77, 0x61, 0x70, 0x2e, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, + 0x00, 0x03, 0x1c, 0x01, 0x12, 0x04, 0x83, 0x06, 0x0a, 0x21, 0x0a, 0x10, 0x0a, 0x06, 0x04, 0x00, + 0x03, 0x1c, 0x04, 0x00, 0x12, 0x06, 0x84, 0x06, 0x04, 0x89, 0x06, 0x05, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x1c, 0x04, 0x00, 0x01, 0x12, 0x04, 0x84, 0x06, 0x09, 0x10, 0x0a, 0x10, 0x0a, + 0x08, 0x04, 0x00, 0x03, 0x1c, 0x04, 0x00, 0x02, 0x00, 0x12, 0x04, 0x85, 0x06, 0x06, 0x20, 0x0a, + 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x1c, 0x04, 0x00, 0x02, 0x00, 0x01, 0x12, 0x04, 0x85, 0x06, + 0x06, 0x1b, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x1c, 0x04, 0x00, 0x02, 0x00, 0x02, 0x12, + 0x04, 0x85, 0x06, 0x1e, 0x1f, 0x0a, 0x10, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x1c, 0x04, 0x00, 0x02, + 0x01, 0x12, 0x04, 0x86, 0x06, 0x06, 0x20, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x1c, 0x04, + 0x00, 0x02, 0x01, 0x01, 0x12, 0x04, 0x86, 0x06, 0x06, 0x1b, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, + 0x03, 0x1c, 0x04, 0x00, 0x02, 0x01, 0x02, 0x12, 0x04, 0x86, 0x06, 0x1e, 0x1f, 0x0a, 0x10, 0x0a, + 0x08, 0x04, 0x00, 0x03, 0x1c, 0x04, 0x00, 0x02, 0x02, 0x12, 0x04, 0x87, 0x06, 0x06, 0x15, 0x0a, + 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x1c, 0x04, 0x00, 0x02, 0x02, 0x01, 0x12, 0x04, 0x87, 0x06, + 0x06, 0x10, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x1c, 0x04, 0x00, 0x02, 0x02, 0x02, 0x12, + 0x04, 0x87, 0x06, 0x13, 0x14, 0x0a, 0x10, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x1c, 0x04, 0x00, 0x02, + 0x03, 0x12, 0x04, 0x88, 0x06, 0x06, 0x15, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x1c, 0x04, + 0x00, 0x02, 0x03, 0x01, 0x12, 0x04, 0x88, 0x06, 0x06, 0x10, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, + 0x03, 0x1c, 0x04, 0x00, 0x02, 0x03, 0x02, 0x12, 0x04, 0x88, 0x06, 0x13, 0x14, 0x0a, 0x2b, 0x0a, + 0x06, 0x04, 0x00, 0x03, 0x1c, 0x02, 0x00, 0x12, 0x04, 0x8b, 0x06, 0x04, 0x29, 0x1a, 0x1b, 0x2f, + 0x20, 0x54, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x1c, 0x02, 0x00, 0x04, 0x12, 0x04, 0x8b, 0x06, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x1c, 0x02, 0x00, 0x05, 0x12, 0x04, 0x8b, 0x06, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x1c, 0x02, 0x00, 0x01, 0x12, 0x04, 0x8b, 0x06, 0x14, 0x24, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x1c, 0x02, 0x00, 0x03, 0x12, 0x04, 0x8b, 0x06, 0x27, 0x28, 0x0a, 0x2c, + 0x0a, 0x06, 0x04, 0x00, 0x03, 0x1c, 0x02, 0x01, 0x12, 0x04, 0x8d, 0x06, 0x04, 0x2a, 0x1a, 0x1c, + 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x1c, 0x02, 0x01, 0x04, 0x12, 0x04, 0x8d, 0x06, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x1c, 0x02, 0x01, 0x05, 0x12, 0x04, 0x8d, 0x06, 0x0d, 0x13, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1c, 0x02, 0x01, 0x01, 0x12, 0x04, 0x8d, 0x06, 0x14, 0x25, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1c, 0x02, 0x01, 0x03, 0x12, 0x04, 0x8d, 0x06, 0x28, 0x29, + 0x0a, 0x30, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x1c, 0x02, 0x02, 0x12, 0x04, 0x8f, 0x06, 0x04, 0x28, + 0x1a, 0x20, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x77, 0x61, 0x70, + 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1c, 0x02, 0x02, 0x04, 0x12, 0x04, 0x8f, + 0x06, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1c, 0x02, 0x02, 0x05, 0x12, 0x04, + 0x8f, 0x06, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1c, 0x02, 0x02, 0x01, 0x12, + 0x04, 0x8f, 0x06, 0x14, 0x23, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1c, 0x02, 0x02, 0x03, + 0x12, 0x04, 0x8f, 0x06, 0x26, 0x27, 0x0a, 0x42, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x1c, 0x02, 0x03, + 0x12, 0x04, 0x91, 0x06, 0x04, 0x21, 0x1a, 0x32, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x61, 0x6c, + 0x6c, 0x6f, 0x77, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x73, 0x6c, 0x69, 0x70, 0x70, 0x61, 0x67, 0x65, + 0x20, 0x69, 0x6e, 0x20, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x73, 0x77, 0x61, 0x70, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x1c, 0x02, 0x03, 0x04, 0x12, 0x04, 0x91, 0x06, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x1c, 0x02, 0x03, 0x05, 0x12, 0x04, 0x91, 0x06, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x1c, 0x02, 0x03, 0x01, 0x12, 0x04, 0x91, 0x06, 0x14, 0x1c, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x1c, 0x02, 0x03, 0x03, 0x12, 0x04, 0x91, 0x06, 0x1f, 0x20, 0x0a, 0x38, + 0x0a, 0x06, 0x04, 0x00, 0x03, 0x1c, 0x02, 0x04, 0x12, 0x04, 0x93, 0x06, 0x04, 0x21, 0x1a, 0x28, + 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x52, 0x50, 0x43, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x73, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x73, 0x77, 0x61, 0x70, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1c, + 0x02, 0x04, 0x04, 0x12, 0x04, 0x93, 0x06, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x1c, 0x02, 0x04, 0x05, 0x12, 0x04, 0x93, 0x06, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x1c, 0x02, 0x04, 0x01, 0x12, 0x04, 0x93, 0x06, 0x14, 0x1c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x1c, 0x02, 0x04, 0x03, 0x12, 0x04, 0x93, 0x06, 0x1f, 0x20, 0x0a, 0x3e, 0x0a, 0x06, + 0x04, 0x00, 0x03, 0x1c, 0x02, 0x05, 0x12, 0x04, 0x95, 0x06, 0x04, 0x21, 0x1a, 0x2e, 0x2f, 0x20, + 0x54, 0x68, 0x65, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x55, 0x6e, 0x69, 0x73, 0x77, 0x61, 0x70, 0x20, 0x65, 0x78, 0x63, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x73, 0x65, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x1c, 0x02, 0x05, 0x04, 0x12, 0x04, 0x95, 0x06, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x1c, 0x02, 0x05, 0x06, 0x12, 0x04, 0x95, 0x06, 0x0d, 0x14, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1c, 0x02, 0x05, 0x01, 0x12, 0x04, 0x95, 0x06, 0x15, 0x1c, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1c, 0x02, 0x05, 0x03, 0x12, 0x04, 0x95, 0x06, 0x1f, 0x20, + 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x1c, 0x02, 0x06, 0x12, 0x04, 0x96, 0x06, 0x04, 0x27, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1c, 0x02, 0x06, 0x04, 0x12, 0x04, 0x96, 0x06, 0x04, + 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1c, 0x02, 0x06, 0x05, 0x12, 0x04, 0x96, 0x06, + 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1c, 0x02, 0x06, 0x01, 0x12, 0x04, 0x96, + 0x06, 0x14, 0x22, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1c, 0x02, 0x06, 0x03, 0x12, 0x04, + 0x96, 0x06, 0x25, 0x26, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x1c, 0x02, 0x07, 0x12, 0x04, + 0x97, 0x06, 0x04, 0x28, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1c, 0x02, 0x07, 0x04, 0x12, + 0x04, 0x97, 0x06, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1c, 0x02, 0x07, 0x05, + 0x12, 0x04, 0x97, 0x06, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1c, 0x02, 0x07, + 0x01, 0x12, 0x04, 0x97, 0x06, 0x14, 0x23, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1c, 0x02, + 0x07, 0x03, 0x12, 0x04, 0x97, 0x06, 0x26, 0x27, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x1c, + 0x02, 0x08, 0x12, 0x04, 0x98, 0x06, 0x04, 0x27, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1c, + 0x02, 0x08, 0x04, 0x12, 0x04, 0x98, 0x06, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x1c, 0x02, 0x08, 0x05, 0x12, 0x04, 0x98, 0x06, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x1c, 0x02, 0x08, 0x01, 0x12, 0x04, 0x98, 0x06, 0x14, 0x22, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x1c, 0x02, 0x08, 0x03, 0x12, 0x04, 0x98, 0x06, 0x25, 0x26, 0x0a, 0x37, 0x0a, 0x04, + 0x04, 0x00, 0x03, 0x1d, 0x12, 0x06, 0x9c, 0x06, 0x02, 0xa7, 0x06, 0x03, 0x1a, 0x27, 0x2f, 0x20, + 0x46, 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x77, 0x61, 0x70, 0x20, 0x70, + 0x72, 0x69, 0x63, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x53, 0x75, 0x73, 0x68, 0x69, 0x53, + 0x77, 0x61, 0x70, 0x2e, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x1d, 0x01, 0x12, 0x04, + 0x9c, 0x06, 0x0a, 0x23, 0x0a, 0x2b, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x1d, 0x02, 0x00, 0x12, 0x04, + 0x9e, 0x06, 0x04, 0x29, 0x1a, 0x1b, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x70, 0x75, + 0x74, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, + 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1d, 0x02, 0x00, 0x04, 0x12, 0x04, 0x9e, 0x06, + 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1d, 0x02, 0x00, 0x05, 0x12, 0x04, 0x9e, + 0x06, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1d, 0x02, 0x00, 0x01, 0x12, 0x04, + 0x9e, 0x06, 0x14, 0x24, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1d, 0x02, 0x00, 0x03, 0x12, + 0x04, 0x9e, 0x06, 0x27, 0x28, 0x0a, 0x2c, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x1d, 0x02, 0x01, 0x12, + 0x04, 0xa0, 0x06, 0x04, 0x2a, 0x1a, 0x1c, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x6f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1d, 0x02, 0x01, 0x04, 0x12, 0x04, + 0xa0, 0x06, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1d, 0x02, 0x01, 0x05, 0x12, + 0x04, 0xa0, 0x06, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1d, 0x02, 0x01, 0x01, + 0x12, 0x04, 0xa0, 0x06, 0x14, 0x25, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1d, 0x02, 0x01, + 0x03, 0x12, 0x04, 0xa0, 0x06, 0x28, 0x29, 0x0a, 0x30, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x1d, 0x02, + 0x02, 0x12, 0x04, 0xa2, 0x06, 0x04, 0x28, 0x1a, 0x20, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x61, + 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x20, + 0x74, 0x6f, 0x20, 0x73, 0x77, 0x61, 0x70, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x1d, 0x02, 0x02, 0x04, 0x12, 0x04, 0xa2, 0x06, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x1d, 0x02, 0x02, 0x05, 0x12, 0x04, 0xa2, 0x06, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x1d, 0x02, 0x02, 0x01, 0x12, 0x04, 0xa2, 0x06, 0x14, 0x23, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x1d, 0x02, 0x02, 0x03, 0x12, 0x04, 0xa2, 0x06, 0x26, 0x27, 0x0a, 0x42, 0x0a, + 0x06, 0x04, 0x00, 0x03, 0x1d, 0x02, 0x03, 0x12, 0x04, 0xa4, 0x06, 0x04, 0x21, 0x1a, 0x32, 0x2f, + 0x20, 0x54, 0x68, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x73, + 0x6c, 0x69, 0x70, 0x70, 0x61, 0x67, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x65, 0x72, 0x63, 0x65, + 0x6e, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x77, 0x61, 0x70, 0x2e, + 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1d, 0x02, 0x03, 0x04, 0x12, 0x04, 0xa4, 0x06, + 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1d, 0x02, 0x03, 0x05, 0x12, 0x04, 0xa4, + 0x06, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1d, 0x02, 0x03, 0x01, 0x12, 0x04, + 0xa4, 0x06, 0x14, 0x1c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1d, 0x02, 0x03, 0x03, 0x12, + 0x04, 0xa4, 0x06, 0x1f, 0x20, 0x0a, 0x38, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x1d, 0x02, 0x04, 0x12, + 0x04, 0xa6, 0x06, 0x04, 0x21, 0x1a, 0x28, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x52, 0x50, 0x43, + 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x73, 0x65, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x77, 0x61, 0x70, 0x2e, 0x0a, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1d, 0x02, 0x04, 0x04, 0x12, 0x04, 0xa6, 0x06, 0x04, 0x0c, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1d, 0x02, 0x04, 0x05, 0x12, 0x04, 0xa6, 0x06, 0x0d, + 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1d, 0x02, 0x04, 0x01, 0x12, 0x04, 0xa6, 0x06, + 0x14, 0x1c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1d, 0x02, 0x04, 0x03, 0x12, 0x04, 0xa6, + 0x06, 0x1f, 0x20, 0x0a, 0x39, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x1e, 0x12, 0x06, 0xaa, 0x06, 0x02, + 0xb5, 0x06, 0x03, 0x1a, 0x29, 0x2f, 0x20, 0x46, 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x73, 0x77, 0x61, 0x70, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, + 0x20, 0x50, 0x61, 0x6e, 0x63, 0x61, 0x6b, 0x65, 0x53, 0x77, 0x61, 0x70, 0x2e, 0x0a, 0x0a, 0x0d, + 0x0a, 0x05, 0x04, 0x00, 0x03, 0x1e, 0x01, 0x12, 0x04, 0xaa, 0x06, 0x0a, 0x25, 0x0a, 0x2b, 0x0a, + 0x06, 0x04, 0x00, 0x03, 0x1e, 0x02, 0x00, 0x12, 0x04, 0xac, 0x06, 0x04, 0x29, 0x1a, 0x1b, 0x2f, + 0x20, 0x54, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x1e, 0x02, 0x00, 0x04, 0x12, 0x04, 0xac, 0x06, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x1e, 0x02, 0x00, 0x05, 0x12, 0x04, 0xac, 0x06, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x1e, 0x02, 0x00, 0x01, 0x12, 0x04, 0xac, 0x06, 0x14, 0x24, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x1e, 0x02, 0x00, 0x03, 0x12, 0x04, 0xac, 0x06, 0x27, 0x28, 0x0a, 0x2c, + 0x0a, 0x06, 0x04, 0x00, 0x03, 0x1e, 0x02, 0x01, 0x12, 0x04, 0xae, 0x06, 0x04, 0x2a, 0x1a, 0x1c, + 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x1e, 0x02, 0x01, 0x04, 0x12, 0x04, 0xae, 0x06, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x1e, 0x02, 0x01, 0x05, 0x12, 0x04, 0xae, 0x06, 0x0d, 0x13, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1e, 0x02, 0x01, 0x01, 0x12, 0x04, 0xae, 0x06, 0x14, 0x25, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1e, 0x02, 0x01, 0x03, 0x12, 0x04, 0xae, 0x06, 0x28, 0x29, + 0x0a, 0x30, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x1e, 0x02, 0x02, 0x12, 0x04, 0xb0, 0x06, 0x04, 0x28, + 0x1a, 0x20, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x77, 0x61, 0x70, + 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1e, 0x02, 0x02, 0x04, 0x12, 0x04, 0xb0, + 0x06, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1e, 0x02, 0x02, 0x05, 0x12, 0x04, + 0xb0, 0x06, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1e, 0x02, 0x02, 0x01, 0x12, + 0x04, 0xb0, 0x06, 0x14, 0x23, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1e, 0x02, 0x02, 0x03, + 0x12, 0x04, 0xb0, 0x06, 0x26, 0x27, 0x0a, 0x42, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x1e, 0x02, 0x03, + 0x12, 0x04, 0xb2, 0x06, 0x04, 0x21, 0x1a, 0x32, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x61, 0x6c, + 0x6c, 0x6f, 0x77, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x73, 0x6c, 0x69, 0x70, 0x70, 0x61, 0x67, 0x65, + 0x20, 0x69, 0x6e, 0x20, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x73, 0x77, 0x61, 0x70, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x1e, 0x02, 0x03, 0x04, 0x12, 0x04, 0xb2, 0x06, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x1e, 0x02, 0x03, 0x05, 0x12, 0x04, 0xb2, 0x06, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x1e, 0x02, 0x03, 0x01, 0x12, 0x04, 0xb2, 0x06, 0x14, 0x1c, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x1e, 0x02, 0x03, 0x03, 0x12, 0x04, 0xb2, 0x06, 0x1f, 0x20, 0x0a, 0x38, + 0x0a, 0x06, 0x04, 0x00, 0x03, 0x1e, 0x02, 0x04, 0x12, 0x04, 0xb4, 0x06, 0x04, 0x21, 0x1a, 0x28, + 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x52, 0x50, 0x43, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x73, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x73, 0x77, 0x61, 0x70, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1e, + 0x02, 0x04, 0x04, 0x12, 0x04, 0xb4, 0x06, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x1e, 0x02, 0x04, 0x05, 0x12, 0x04, 0xb4, 0x06, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x1e, 0x02, 0x04, 0x01, 0x12, 0x04, 0xb4, 0x06, 0x14, 0x1c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x1e, 0x02, 0x04, 0x03, 0x12, 0x04, 0xb4, 0x06, 0x1f, 0x20, 0x0a, 0xb8, 0x02, 0x0a, + 0x04, 0x04, 0x00, 0x03, 0x1f, 0x12, 0x06, 0xc5, 0x06, 0x02, 0xce, 0x06, 0x03, 0x1a, 0xa7, 0x02, + 0x0a, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x20, 0x61, 0x20, 0x6a, 0x6f, 0x62, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x6c, + 0x61, 0x74, 0x65, 0x72, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2a, + 0x2a, 0x5f, 0x3a, 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x52, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x73, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x54, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x70, + 0x75, 0x74, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, + 0x5f, 0x3a, 0x20, 0x43, 0x61, 0x63, 0x68, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x20, 0x73, 0x74, 0x6f, + 0x72, 0x69, 0x6e, 0x67, 0x20, 0x24, 0x7b, 0x4f, 0x4e, 0x45, 0x7d, 0x20, 0x3d, 0x20, 0x31, 0x0a, + 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x20, 0x22, 0x63, 0x61, 0x63, 0x68, + 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x20, 0x22, 0x63, 0x61, 0x63, 0x68, 0x65, + 0x49, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x20, 0x7b, 0x20, 0x22, 0x76, 0x61, 0x72, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x4f, 0x4e, 0x45, + 0x22, 0x2c, 0x20, 0x22, 0x6a, 0x6f, 0x62, 0x22, 0x3a, 0x20, 0x7b, 0x20, 0x22, 0x74, 0x61, 0x73, + 0x6b, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x20, 0x7b, 0x20, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, + 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x20, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, + 0x20, 0x31, 0x20, 0x7d, 0x20, 0x7d, 0x20, 0x5d, 0x20, 0x7d, 0x20, 0x7d, 0x20, 0x5d, 0x20, 0x7d, + 0x20, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x1f, 0x01, + 0x12, 0x04, 0xc5, 0x06, 0x0a, 0x13, 0x0a, 0x10, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x1f, 0x03, 0x00, + 0x12, 0x06, 0xc6, 0x06, 0x04, 0xcb, 0x06, 0x05, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1f, + 0x03, 0x00, 0x01, 0x12, 0x04, 0xc6, 0x06, 0x0c, 0x15, 0x0a, 0x6b, 0x0a, 0x08, 0x04, 0x00, 0x03, + 0x1f, 0x03, 0x00, 0x02, 0x00, 0x12, 0x04, 0xc8, 0x06, 0x06, 0x28, 0x1a, 0x59, 0x2f, 0x20, 0x54, + 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, + 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, + 0x20, 0x69, 0x6e, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x6c, 0x61, 0x74, 0x65, 0x72, 0x20, 0x77, 0x69, 0x74, + 0x68, 0x20, 0x60, 0x24, 0x7b, 0x56, 0x41, 0x52, 0x49, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x4e, 0x41, + 0x4d, 0x45, 0x7d, 0x60, 0x2e, 0x0a, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x1f, 0x03, 0x00, + 0x02, 0x00, 0x04, 0x12, 0x04, 0xc8, 0x06, 0x06, 0x0e, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, + 0x1f, 0x03, 0x00, 0x02, 0x00, 0x05, 0x12, 0x04, 0xc8, 0x06, 0x0f, 0x15, 0x0a, 0x11, 0x0a, 0x09, + 0x04, 0x00, 0x03, 0x1f, 0x03, 0x00, 0x02, 0x00, 0x01, 0x12, 0x04, 0xc8, 0x06, 0x16, 0x23, 0x0a, + 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x1f, 0x03, 0x00, 0x02, 0x00, 0x03, 0x12, 0x04, 0xc8, 0x06, + 0x26, 0x27, 0x0a, 0x53, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x1f, 0x03, 0x00, 0x02, 0x01, 0x12, 0x04, + 0xca, 0x06, 0x06, 0x21, 0x1a, 0x41, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x4f, 0x72, 0x61, 0x63, + 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x20, 0x74, 0x6f, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, + 0x20, 0x74, 0x6f, 0x20, 0x79, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x69, 0x6e, 0x20, + 0x63, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x0a, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x1f, 0x03, + 0x00, 0x02, 0x01, 0x04, 0x12, 0x04, 0xca, 0x06, 0x06, 0x0e, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, + 0x03, 0x1f, 0x03, 0x00, 0x02, 0x01, 0x06, 0x12, 0x04, 0xca, 0x06, 0x0f, 0x18, 0x0a, 0x11, 0x0a, + 0x09, 0x04, 0x00, 0x03, 0x1f, 0x03, 0x00, 0x02, 0x01, 0x01, 0x12, 0x04, 0xca, 0x06, 0x19, 0x1c, + 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x1f, 0x03, 0x00, 0x02, 0x01, 0x03, 0x12, 0x04, 0xca, + 0x06, 0x1f, 0x20, 0x0a, 0x5e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x1f, 0x02, 0x00, 0x12, 0x04, 0xcd, + 0x06, 0x04, 0x27, 0x1a, 0x4e, 0x2f, 0x20, 0x41, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, + 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x64, 0x20, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x73, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x69, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6a, 0x6f, 0x62, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x60, + 0x24, 0x7b, 0x56, 0x41, 0x52, 0x49, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x7d, + 0x60, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1f, 0x02, 0x00, 0x04, 0x12, 0x04, + 0xcd, 0x06, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1f, 0x02, 0x00, 0x06, 0x12, + 0x04, 0xcd, 0x06, 0x0d, 0x16, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1f, 0x02, 0x00, 0x01, + 0x12, 0x04, 0xcd, 0x06, 0x17, 0x22, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x1f, 0x02, 0x00, + 0x03, 0x12, 0x04, 0xcd, 0x06, 0x25, 0x26, 0x0a, 0x74, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x20, 0x12, + 0x04, 0xd1, 0x06, 0x02, 0x1f, 0x1a, 0x66, 0x2f, 0x20, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x62, + 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x20, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, + 0x27, 0x73, 0x20, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x20, 0x61, 0x74, 0x20, 0x60, 0x53, 0x59, 0x53, 0x56, 0x41, 0x52, 0x5f, 0x43, 0x4c, + 0x4f, 0x43, 0x4b, 0x5f, 0x50, 0x55, 0x42, 0x4b, 0x45, 0x59, 0x60, 0x2e, 0x0a, 0x0a, 0x0d, 0x0a, + 0x05, 0x04, 0x00, 0x03, 0x20, 0x01, 0x12, 0x04, 0xd1, 0x06, 0x0a, 0x1c, 0x0a, 0x0c, 0x0a, 0x04, + 0x04, 0x00, 0x03, 0x21, 0x12, 0x04, 0xd3, 0x06, 0x02, 0x1e, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, + 0x03, 0x21, 0x01, 0x12, 0x04, 0xd3, 0x06, 0x0a, 0x1b, 0x0a, 0x49, 0x0a, 0x04, 0x04, 0x00, 0x03, + 0x22, 0x12, 0x06, 0xd6, 0x06, 0x02, 0xdf, 0x06, 0x03, 0x1a, 0x39, 0x2f, 0x20, 0x46, 0x65, 0x74, + 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x64, + 0x61, 0x74, 0x61, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, + 0x66, 0x69, 0x65, 0x64, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x2e, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x22, 0x01, 0x12, 0x04, 0xd6, + 0x06, 0x0a, 0x24, 0x0a, 0x10, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x22, 0x04, 0x00, 0x12, 0x06, 0xd7, + 0x06, 0x04, 0xdb, 0x06, 0x05, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x22, 0x04, 0x00, 0x01, + 0x12, 0x04, 0xd7, 0x06, 0x09, 0x10, 0x0a, 0x10, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x22, 0x04, 0x00, + 0x02, 0x00, 0x12, 0x04, 0xd8, 0x06, 0x06, 0x1a, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x22, + 0x04, 0x00, 0x02, 0x00, 0x01, 0x12, 0x04, 0xd8, 0x06, 0x06, 0x15, 0x0a, 0x11, 0x0a, 0x09, 0x04, + 0x00, 0x03, 0x22, 0x04, 0x00, 0x02, 0x00, 0x02, 0x12, 0x04, 0xd8, 0x06, 0x18, 0x19, 0x0a, 0x10, + 0x0a, 0x08, 0x04, 0x00, 0x03, 0x22, 0x04, 0x00, 0x02, 0x01, 0x12, 0x04, 0xd9, 0x06, 0x06, 0x1a, + 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x22, 0x04, 0x00, 0x02, 0x01, 0x01, 0x12, 0x04, 0xd9, + 0x06, 0x06, 0x15, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x22, 0x04, 0x00, 0x02, 0x01, 0x02, + 0x12, 0x04, 0xd9, 0x06, 0x18, 0x19, 0x0a, 0x10, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x22, 0x04, 0x00, + 0x02, 0x02, 0x12, 0x04, 0xda, 0x06, 0x06, 0x19, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x22, + 0x04, 0x00, 0x02, 0x02, 0x01, 0x12, 0x04, 0xda, 0x06, 0x06, 0x14, 0x0a, 0x11, 0x0a, 0x09, 0x04, + 0x00, 0x03, 0x22, 0x04, 0x00, 0x02, 0x02, 0x02, 0x12, 0x04, 0xda, 0x06, 0x17, 0x18, 0x0a, 0x47, + 0x0a, 0x06, 0x04, 0x00, 0x03, 0x22, 0x02, 0x00, 0x12, 0x04, 0xdd, 0x06, 0x04, 0x1f, 0x1a, 0x37, + 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x6f, 0x6e, 0x2d, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x20, 0x61, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x64, 0x61, 0x74, 0x61, + 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x22, 0x02, + 0x00, 0x04, 0x12, 0x04, 0xdd, 0x06, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x22, + 0x02, 0x00, 0x05, 0x12, 0x04, 0xdd, 0x06, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x22, 0x02, 0x00, 0x01, 0x12, 0x04, 0xdd, 0x06, 0x14, 0x1a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x22, 0x02, 0x00, 0x03, 0x12, 0x04, 0xdd, 0x06, 0x1d, 0x1e, 0x0a, 0x0e, 0x0a, 0x06, 0x04, + 0x00, 0x03, 0x22, 0x02, 0x01, 0x12, 0x04, 0xde, 0x06, 0x04, 0x21, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x22, 0x02, 0x01, 0x04, 0x12, 0x04, 0xde, 0x06, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x22, 0x02, 0x01, 0x06, 0x12, 0x04, 0xde, 0x06, 0x0d, 0x14, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x22, 0x02, 0x01, 0x01, 0x12, 0x04, 0xde, 0x06, 0x15, 0x1c, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x22, 0x02, 0x01, 0x03, 0x12, 0x04, 0xde, 0x06, 0x1f, 0x20, 0x0a, + 0xaf, 0x03, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x23, 0x12, 0x06, 0xf4, 0x06, 0x02, 0x81, 0x07, 0x03, + 0x1a, 0x9e, 0x03, 0x0a, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x20, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x61, 0x20, 0x63, 0x72, + 0x6f, 0x6e, 0x74, 0x61, 0x62, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2a, 0x2a, 0x5f, 0x3a, + 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x73, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x41, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, + 0x3a, 0x20, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x6e, 0x69, + 0x78, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x6f, 0x6e, 0x2d, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x20, 0x53, 0x59, 0x53, + 0x43, 0x4c, 0x4f, 0x43, 0x4b, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, + 0x22, 0x63, 0x72, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x73, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, + 0x7b, 0x22, 0x63, 0x72, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x22, 0x3a, 0x22, + 0x2a, 0x20, 0x2a, 0x20, 0x2a, 0x20, 0x2a, 0x20, 0x2a, 0x20, 0x2a, 0x22, 0x2c, 0x22, 0x63, 0x6c, + 0x6f, 0x63, 0x6b, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, 0x3a, 0x30, 0x2c, 0x22, 0x63, 0x6c, + 0x6f, 0x63, 0x6b, 0x22, 0x3a, 0x22, 0x53, 0x59, 0x53, 0x43, 0x4c, 0x4f, 0x43, 0x4b, 0x22, 0x7d, + 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, + 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x75, 0x6e, 0x69, 0x78, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x20, 0x66, 0x72, 0x69, 0x64, 0x61, 0x79, 0x20, + 0x61, 0x74, 0x20, 0x35, 0x70, 0x6d, 0x20, 0x55, 0x54, 0x43, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, + 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x22, 0x63, 0x72, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x73, 0x65, 0x54, + 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x7b, 0x22, 0x63, 0x72, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, + 0x72, 0x6e, 0x22, 0x3a, 0x22, 0x30, 0x20, 0x31, 0x37, 0x20, 0x2a, 0x20, 0x2a, 0x20, 0x35, 0x22, + 0x2c, 0x22, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, 0x3a, 0x30, + 0x2c, 0x22, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x3a, 0x30, 0x7d, 0x7d, 0x0a, 0x60, 0x60, 0x60, + 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x23, 0x01, 0x12, 0x04, 0xf4, 0x06, 0x0a, 0x17, + 0x0a, 0x2d, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x23, 0x02, 0x00, 0x12, 0x04, 0xf6, 0x06, 0x04, 0x25, + 0x1a, 0x1d, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x63, 0x72, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x74, + 0x74, 0x65, 0x72, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x2e, 0x0a, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x23, 0x02, 0x00, 0x04, 0x12, 0x04, 0xf6, 0x06, 0x04, 0x0c, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x23, 0x02, 0x00, 0x05, 0x12, 0x04, 0xf6, 0x06, 0x0d, + 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x23, 0x02, 0x00, 0x01, 0x12, 0x04, 0xf6, 0x06, + 0x14, 0x20, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x23, 0x02, 0x00, 0x03, 0x12, 0x04, 0xf6, + 0x06, 0x23, 0x24, 0x0a, 0x42, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x23, 0x02, 0x01, 0x12, 0x04, 0xf8, + 0x06, 0x04, 0x24, 0x1a, 0x32, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x63, + 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x65, 0x78, + 0x74, 0x20, 0x72, 0x75, 0x6e, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x23, 0x02, + 0x01, 0x04, 0x12, 0x04, 0xf8, 0x06, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x23, + 0x02, 0x01, 0x05, 0x12, 0x04, 0xf8, 0x06, 0x0d, 0x12, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x23, 0x02, 0x01, 0x01, 0x12, 0x04, 0xf8, 0x06, 0x13, 0x1f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x23, 0x02, 0x01, 0x03, 0x12, 0x04, 0xf8, 0x06, 0x22, 0x23, 0x0a, 0x10, 0x0a, 0x06, 0x04, + 0x00, 0x03, 0x23, 0x04, 0x00, 0x12, 0x06, 0xf9, 0x06, 0x04, 0xfe, 0x06, 0x05, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x23, 0x04, 0x00, 0x01, 0x12, 0x04, 0xf9, 0x06, 0x09, 0x12, 0x0a, 0x4b, + 0x0a, 0x08, 0x04, 0x00, 0x03, 0x23, 0x04, 0x00, 0x02, 0x00, 0x12, 0x04, 0xfb, 0x06, 0x06, 0x11, + 0x1a, 0x39, 0x2f, 0x20, 0x55, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x54, 0x61, 0x73, 0x6b, + 0x52, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x73, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x20, 0x63, + 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x0a, 0x0a, 0x11, 0x0a, 0x09, 0x04, + 0x00, 0x03, 0x23, 0x04, 0x00, 0x02, 0x00, 0x01, 0x12, 0x04, 0xfb, 0x06, 0x06, 0x0c, 0x0a, 0x11, + 0x0a, 0x09, 0x04, 0x00, 0x03, 0x23, 0x04, 0x00, 0x02, 0x00, 0x02, 0x12, 0x04, 0xfb, 0x06, 0x0f, + 0x10, 0x0a, 0x44, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x23, 0x04, 0x00, 0x02, 0x01, 0x12, 0x04, 0xfd, + 0x06, 0x06, 0x13, 0x1a, 0x32, 0x2f, 0x20, 0x55, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, + 0x6e, 0x2d, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x20, 0x53, 0x59, 0x53, 0x43, 0x4c, 0x4f, 0x43, 0x4b, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x20, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x0a, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x23, 0x04, + 0x00, 0x02, 0x01, 0x01, 0x12, 0x04, 0xfd, 0x06, 0x06, 0x0e, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, + 0x03, 0x23, 0x04, 0x00, 0x02, 0x01, 0x02, 0x12, 0x04, 0xfd, 0x06, 0x11, 0x12, 0x0a, 0x47, 0x0a, + 0x06, 0x04, 0x00, 0x03, 0x23, 0x02, 0x02, 0x12, 0x04, 0x80, 0x07, 0x04, 0x21, 0x1a, 0x37, 0x2f, + 0x20, 0x55, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x75, 0x6e, + 0x6e, 0x65, 0x72, 0x27, 0x73, 0x20, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6f, 0x72, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x6f, 0x6e, 0x2d, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x20, 0x53, 0x59, 0x53, 0x43, + 0x4c, 0x4f, 0x43, 0x4b, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x23, 0x02, 0x02, + 0x04, 0x12, 0x04, 0x80, 0x07, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x23, 0x02, + 0x02, 0x06, 0x12, 0x04, 0x80, 0x07, 0x0d, 0x16, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x23, + 0x02, 0x02, 0x01, 0x12, 0x04, 0x80, 0x07, 0x17, 0x1c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x23, 0x02, 0x02, 0x03, 0x12, 0x04, 0x80, 0x07, 0x1f, 0x20, 0x0a, 0x4b, 0x0a, 0x04, 0x04, 0x00, + 0x03, 0x24, 0x12, 0x06, 0x84, 0x07, 0x02, 0xaf, 0x07, 0x03, 0x1a, 0x3b, 0x2f, 0x20, 0x52, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x73, 0x65, 0x72, 0x69, 0x61, + 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, + 0x20, 0x61, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x62, + 0x75, 0x66, 0x66, 0x65, 0x72, 0x2e, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x24, 0x01, + 0x12, 0x04, 0x84, 0x07, 0x0a, 0x1f, 0x0a, 0x41, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x24, 0x02, 0x00, + 0x12, 0x04, 0x86, 0x07, 0x04, 0x1f, 0x1a, 0x31, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x62, 0x75, + 0x66, 0x66, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x20, 0x64, 0x65, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x69, + 0x6e, 0x67, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x24, 0x02, 0x00, 0x04, 0x12, 0x04, 0x86, 0x07, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x24, 0x02, 0x00, 0x05, 0x12, 0x04, 0x86, 0x07, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x24, 0x02, 0x00, 0x01, 0x12, 0x04, 0x86, 0x07, 0x14, 0x1a, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x24, 0x02, 0x00, 0x03, 0x12, 0x04, 0x86, 0x07, 0x1d, 0x1e, 0x0a, 0x10, 0x0a, + 0x06, 0x04, 0x00, 0x03, 0x24, 0x04, 0x00, 0x12, 0x06, 0x87, 0x07, 0x04, 0x8c, 0x07, 0x05, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x24, 0x04, 0x00, 0x01, 0x12, 0x04, 0x87, 0x07, 0x09, 0x0f, + 0x0a, 0x31, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x24, 0x04, 0x00, 0x02, 0x00, 0x12, 0x04, 0x89, 0x07, + 0x06, 0x18, 0x1a, 0x1f, 0x20, 0x55, 0x73, 0x65, 0x20, 0x6c, 0x69, 0x74, 0x74, 0x6c, 0x65, 0x20, + 0x65, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x62, 0x79, 0x74, 0x65, 0x20, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x2e, 0x0a, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x24, 0x04, 0x00, 0x02, 0x00, 0x01, + 0x12, 0x04, 0x89, 0x07, 0x06, 0x13, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x24, 0x04, 0x00, + 0x02, 0x00, 0x02, 0x12, 0x04, 0x89, 0x07, 0x16, 0x17, 0x0a, 0x2e, 0x0a, 0x08, 0x04, 0x00, 0x03, + 0x24, 0x04, 0x00, 0x02, 0x01, 0x12, 0x04, 0x8b, 0x07, 0x06, 0x15, 0x1a, 0x1c, 0x20, 0x55, 0x73, + 0x65, 0x20, 0x62, 0x69, 0x67, 0x20, 0x65, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x62, 0x79, 0x74, + 0x65, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x0a, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, + 0x24, 0x04, 0x00, 0x02, 0x01, 0x01, 0x12, 0x04, 0x8b, 0x07, 0x06, 0x10, 0x0a, 0x11, 0x0a, 0x09, + 0x04, 0x00, 0x03, 0x24, 0x04, 0x00, 0x02, 0x01, 0x02, 0x12, 0x04, 0x8b, 0x07, 0x13, 0x14, 0x0a, + 0x36, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x24, 0x02, 0x01, 0x12, 0x04, 0x8e, 0x07, 0x04, 0x1f, 0x1a, + 0x26, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x6e, 0x65, 0x73, + 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x20, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x24, 0x02, + 0x01, 0x04, 0x12, 0x04, 0x8e, 0x07, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x24, + 0x02, 0x01, 0x06, 0x12, 0x04, 0x8e, 0x07, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x24, 0x02, 0x01, 0x01, 0x12, 0x04, 0x8e, 0x07, 0x14, 0x1a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x24, 0x02, 0x01, 0x03, 0x12, 0x04, 0x8e, 0x07, 0x1d, 0x1e, 0x0a, 0x10, 0x0a, 0x06, 0x04, + 0x00, 0x03, 0x24, 0x04, 0x01, 0x12, 0x06, 0x8f, 0x07, 0x04, 0xac, 0x07, 0x05, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x24, 0x04, 0x01, 0x01, 0x12, 0x04, 0x8f, 0x07, 0x09, 0x18, 0x0a, 0x22, + 0x0a, 0x08, 0x04, 0x00, 0x03, 0x24, 0x04, 0x01, 0x02, 0x00, 0x12, 0x04, 0x91, 0x07, 0x06, 0x11, + 0x1a, 0x10, 0x2f, 0x20, 0x41, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x6b, 0x65, 0x79, + 0x2e, 0x0a, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x24, 0x04, 0x01, 0x02, 0x00, 0x01, 0x12, + 0x04, 0x91, 0x07, 0x06, 0x0c, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x24, 0x04, 0x01, 0x02, + 0x00, 0x02, 0x12, 0x04, 0x91, 0x07, 0x0f, 0x10, 0x0a, 0x1f, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x24, + 0x04, 0x01, 0x02, 0x01, 0x12, 0x04, 0x93, 0x07, 0x06, 0x0f, 0x1a, 0x0d, 0x2f, 0x20, 0x41, 0x20, + 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x2e, 0x0a, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, + 0x24, 0x04, 0x01, 0x02, 0x01, 0x01, 0x12, 0x04, 0x93, 0x07, 0x06, 0x0a, 0x0a, 0x11, 0x0a, 0x09, + 0x04, 0x00, 0x03, 0x24, 0x04, 0x01, 0x02, 0x01, 0x02, 0x12, 0x04, 0x93, 0x07, 0x0d, 0x0e, 0x0a, + 0x2d, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x24, 0x04, 0x01, 0x02, 0x02, 0x12, 0x04, 0x95, 0x07, 0x06, + 0x0d, 0x1a, 0x1b, 0x2f, 0x20, 0x41, 0x6e, 0x20, 0x38, 0x2d, 0x62, 0x69, 0x74, 0x20, 0x75, 0x6e, + 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x0a, 0x0a, 0x11, + 0x0a, 0x09, 0x04, 0x00, 0x03, 0x24, 0x04, 0x01, 0x02, 0x02, 0x01, 0x12, 0x04, 0x95, 0x07, 0x06, + 0x08, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x24, 0x04, 0x01, 0x02, 0x02, 0x02, 0x12, 0x04, + 0x95, 0x07, 0x0b, 0x0c, 0x0a, 0x2b, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x24, 0x04, 0x01, 0x02, 0x03, + 0x12, 0x04, 0x97, 0x07, 0x06, 0x0d, 0x1a, 0x19, 0x2f, 0x20, 0x41, 0x6e, 0x20, 0x38, 0x2d, 0x62, + 0x69, 0x74, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, + 0x0a, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x24, 0x04, 0x01, 0x02, 0x03, 0x01, 0x12, 0x04, + 0x97, 0x07, 0x06, 0x08, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x24, 0x04, 0x01, 0x02, 0x03, + 0x02, 0x12, 0x04, 0x97, 0x07, 0x0b, 0x0c, 0x0a, 0x2d, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x24, 0x04, + 0x01, 0x02, 0x04, 0x12, 0x04, 0x99, 0x07, 0x06, 0x0e, 0x1a, 0x1b, 0x2f, 0x20, 0x41, 0x20, 0x31, + 0x36, 0x2d, 0x62, 0x69, 0x74, 0x20, 0x75, 0x6e, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x0a, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x24, 0x04, 0x01, + 0x02, 0x04, 0x01, 0x12, 0x04, 0x99, 0x07, 0x06, 0x09, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, + 0x24, 0x04, 0x01, 0x02, 0x04, 0x02, 0x12, 0x04, 0x99, 0x07, 0x0c, 0x0d, 0x0a, 0x2b, 0x0a, 0x08, + 0x04, 0x00, 0x03, 0x24, 0x04, 0x01, 0x02, 0x05, 0x12, 0x04, 0x9b, 0x07, 0x06, 0x0e, 0x1a, 0x19, + 0x2f, 0x20, 0x41, 0x20, 0x31, 0x36, 0x2d, 0x62, 0x69, 0x74, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, + 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x0a, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, + 0x24, 0x04, 0x01, 0x02, 0x05, 0x01, 0x12, 0x04, 0x9b, 0x07, 0x06, 0x09, 0x0a, 0x11, 0x0a, 0x09, + 0x04, 0x00, 0x03, 0x24, 0x04, 0x01, 0x02, 0x05, 0x02, 0x12, 0x04, 0x9b, 0x07, 0x0c, 0x0d, 0x0a, + 0x2d, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x24, 0x04, 0x01, 0x02, 0x06, 0x12, 0x04, 0x9d, 0x07, 0x06, + 0x0e, 0x1a, 0x1b, 0x2f, 0x20, 0x41, 0x20, 0x33, 0x32, 0x2d, 0x62, 0x69, 0x74, 0x20, 0x75, 0x6e, + 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x0a, 0x0a, 0x11, + 0x0a, 0x09, 0x04, 0x00, 0x03, 0x24, 0x04, 0x01, 0x02, 0x06, 0x01, 0x12, 0x04, 0x9d, 0x07, 0x06, + 0x09, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x24, 0x04, 0x01, 0x02, 0x06, 0x02, 0x12, 0x04, + 0x9d, 0x07, 0x0c, 0x0d, 0x0a, 0x2b, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x24, 0x04, 0x01, 0x02, 0x07, + 0x12, 0x04, 0x9f, 0x07, 0x06, 0x0e, 0x1a, 0x19, 0x2f, 0x20, 0x41, 0x20, 0x33, 0x32, 0x2d, 0x62, + 0x69, 0x74, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, + 0x0a, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x24, 0x04, 0x01, 0x02, 0x07, 0x01, 0x12, 0x04, + 0x9f, 0x07, 0x06, 0x09, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x24, 0x04, 0x01, 0x02, 0x07, + 0x02, 0x12, 0x04, 0x9f, 0x07, 0x0c, 0x0d, 0x0a, 0x38, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x24, 0x04, + 0x01, 0x02, 0x08, 0x12, 0x04, 0xa1, 0x07, 0x06, 0x0e, 0x1a, 0x26, 0x2f, 0x20, 0x41, 0x20, 0x33, + 0x32, 0x2d, 0x62, 0x69, 0x74, 0x20, 0x49, 0x45, 0x45, 0x45, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, + 0x69, 0x6e, 0x67, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, + 0x0a, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x24, 0x04, 0x01, 0x02, 0x08, 0x01, 0x12, 0x04, + 0xa1, 0x07, 0x06, 0x09, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x24, 0x04, 0x01, 0x02, 0x08, + 0x02, 0x12, 0x04, 0xa1, 0x07, 0x0c, 0x0d, 0x0a, 0x2d, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x24, 0x04, + 0x01, 0x02, 0x09, 0x12, 0x04, 0xa3, 0x07, 0x06, 0x0f, 0x1a, 0x1b, 0x2f, 0x20, 0x41, 0x20, 0x36, + 0x34, 0x2d, 0x62, 0x69, 0x74, 0x20, 0x75, 0x6e, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x0a, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x24, 0x04, 0x01, + 0x02, 0x09, 0x01, 0x12, 0x04, 0xa3, 0x07, 0x06, 0x09, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, + 0x24, 0x04, 0x01, 0x02, 0x09, 0x02, 0x12, 0x04, 0xa3, 0x07, 0x0c, 0x0e, 0x0a, 0x2b, 0x0a, 0x08, + 0x04, 0x00, 0x03, 0x24, 0x04, 0x01, 0x02, 0x0a, 0x12, 0x04, 0xa5, 0x07, 0x06, 0x0f, 0x1a, 0x19, + 0x2f, 0x20, 0x41, 0x20, 0x36, 0x34, 0x2d, 0x62, 0x69, 0x74, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, + 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x0a, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, + 0x24, 0x04, 0x01, 0x02, 0x0a, 0x01, 0x12, 0x04, 0xa5, 0x07, 0x06, 0x09, 0x0a, 0x11, 0x0a, 0x09, + 0x04, 0x00, 0x03, 0x24, 0x04, 0x01, 0x02, 0x0a, 0x02, 0x12, 0x04, 0xa5, 0x07, 0x0c, 0x0e, 0x0a, + 0x38, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x24, 0x04, 0x01, 0x02, 0x0b, 0x12, 0x04, 0xa7, 0x07, 0x06, + 0x0f, 0x1a, 0x26, 0x2f, 0x20, 0x41, 0x20, 0x36, 0x34, 0x2d, 0x62, 0x69, 0x74, 0x20, 0x49, 0x45, + 0x45, 0x45, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x0a, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, + 0x24, 0x04, 0x01, 0x02, 0x0b, 0x01, 0x12, 0x04, 0xa7, 0x07, 0x06, 0x09, 0x0a, 0x11, 0x0a, 0x09, + 0x04, 0x00, 0x03, 0x24, 0x04, 0x01, 0x02, 0x0b, 0x02, 0x12, 0x04, 0xa7, 0x07, 0x0c, 0x0e, 0x0a, + 0x2e, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x24, 0x04, 0x01, 0x02, 0x0c, 0x12, 0x04, 0xa9, 0x07, 0x06, + 0x10, 0x1a, 0x1c, 0x2f, 0x20, 0x41, 0x20, 0x31, 0x32, 0x38, 0x2d, 0x62, 0x69, 0x74, 0x20, 0x75, + 0x6e, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x0a, 0x0a, + 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x24, 0x04, 0x01, 0x02, 0x0c, 0x01, 0x12, 0x04, 0xa9, 0x07, + 0x06, 0x0a, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x24, 0x04, 0x01, 0x02, 0x0c, 0x02, 0x12, + 0x04, 0xa9, 0x07, 0x0d, 0x0f, 0x0a, 0x2c, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x24, 0x04, 0x01, 0x02, + 0x0d, 0x12, 0x04, 0xab, 0x07, 0x06, 0x10, 0x1a, 0x1a, 0x2f, 0x20, 0x41, 0x20, 0x31, 0x32, 0x38, + 0x2d, 0x62, 0x69, 0x74, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x2e, 0x0a, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x24, 0x04, 0x01, 0x02, 0x0d, 0x01, + 0x12, 0x04, 0xab, 0x07, 0x06, 0x0a, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x24, 0x04, 0x01, + 0x02, 0x0d, 0x02, 0x12, 0x04, 0xab, 0x07, 0x0d, 0x0f, 0x0a, 0x34, 0x0a, 0x06, 0x04, 0x00, 0x03, + 0x24, 0x02, 0x02, 0x12, 0x04, 0xae, 0x07, 0x04, 0x26, 0x1a, 0x24, 0x2f, 0x20, 0x54, 0x68, 0x65, + 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x74, + 0x6f, 0x20, 0x64, 0x65, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x2e, 0x0a, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x24, 0x02, 0x02, 0x04, 0x12, 0x04, 0xae, 0x07, 0x04, 0x0c, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x24, 0x02, 0x02, 0x06, 0x12, 0x04, 0xae, 0x07, 0x0d, + 0x1c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x24, 0x02, 0x02, 0x01, 0x12, 0x04, 0xae, 0x07, + 0x1d, 0x21, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x24, 0x02, 0x02, 0x03, 0x12, 0x04, 0xae, + 0x07, 0x24, 0x25, 0x0a, 0x0e, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x25, 0x12, 0x06, 0xb1, 0x07, 0x02, + 0xba, 0x07, 0x03, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x25, 0x01, 0x12, 0x04, 0xb1, 0x07, + 0x0a, 0x1d, 0x0a, 0x10, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x25, 0x04, 0x00, 0x12, 0x06, 0xb2, 0x07, + 0x04, 0xb6, 0x07, 0x05, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x25, 0x04, 0x00, 0x01, 0x12, + 0x04, 0xb2, 0x07, 0x09, 0x0f, 0x0a, 0x10, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x25, 0x04, 0x00, 0x02, + 0x00, 0x12, 0x04, 0xb4, 0x07, 0x06, 0x15, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x25, 0x04, + 0x00, 0x02, 0x00, 0x01, 0x12, 0x04, 0xb4, 0x07, 0x06, 0x10, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, + 0x03, 0x25, 0x04, 0x00, 0x02, 0x00, 0x02, 0x12, 0x04, 0xb4, 0x07, 0x13, 0x14, 0x0a, 0x10, 0x0a, + 0x08, 0x04, 0x00, 0x03, 0x25, 0x04, 0x00, 0x02, 0x01, 0x12, 0x04, 0xb5, 0x07, 0x06, 0x15, 0x0a, + 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x25, 0x04, 0x00, 0x02, 0x01, 0x01, 0x12, 0x04, 0xb5, 0x07, + 0x06, 0x10, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x25, 0x04, 0x00, 0x02, 0x01, 0x02, 0x12, + 0x04, 0xb5, 0x07, 0x13, 0x14, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x25, 0x02, 0x00, 0x12, + 0x04, 0xb7, 0x07, 0x04, 0x1f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x25, 0x02, 0x00, 0x04, + 0x12, 0x04, 0xb7, 0x07, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x25, 0x02, 0x00, + 0x06, 0x12, 0x04, 0xb7, 0x07, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x25, 0x02, + 0x00, 0x01, 0x12, 0x04, 0xb7, 0x07, 0x14, 0x1a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x25, + 0x02, 0x00, 0x03, 0x12, 0x04, 0xb7, 0x07, 0x1d, 0x1e, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, + 0x25, 0x02, 0x01, 0x12, 0x04, 0xb8, 0x07, 0x04, 0x2b, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x25, 0x02, 0x01, 0x04, 0x12, 0x04, 0xb8, 0x07, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x25, 0x02, 0x01, 0x05, 0x12, 0x04, 0xb8, 0x07, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x25, 0x02, 0x01, 0x01, 0x12, 0x04, 0xb8, 0x07, 0x14, 0x26, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x25, 0x02, 0x01, 0x03, 0x12, 0x04, 0xb8, 0x07, 0x29, 0x2a, 0x0a, 0x0e, 0x0a, + 0x06, 0x04, 0x00, 0x03, 0x25, 0x02, 0x02, 0x12, 0x04, 0xb9, 0x07, 0x04, 0x1f, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x25, 0x02, 0x02, 0x04, 0x12, 0x04, 0xb9, 0x07, 0x04, 0x0c, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x25, 0x02, 0x02, 0x05, 0x12, 0x04, 0xb9, 0x07, 0x0d, 0x13, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x25, 0x02, 0x02, 0x01, 0x12, 0x04, 0xb9, 0x07, 0x14, 0x1a, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x25, 0x02, 0x02, 0x03, 0x12, 0x04, 0xb9, 0x07, 0x1d, + 0x1e, 0x0a, 0x0e, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x26, 0x12, 0x06, 0xbc, 0x07, 0x02, 0xc0, 0x07, + 0x03, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x26, 0x01, 0x12, 0x04, 0xbc, 0x07, 0x0a, 0x12, + 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x26, 0x02, 0x00, 0x12, 0x04, 0xbd, 0x07, 0x04, 0x31, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x26, 0x02, 0x00, 0x04, 0x12, 0x04, 0xbd, 0x07, 0x04, + 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x26, 0x02, 0x00, 0x05, 0x12, 0x04, 0xbd, 0x07, + 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x26, 0x02, 0x00, 0x01, 0x12, 0x04, 0xbd, + 0x07, 0x14, 0x2c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x26, 0x02, 0x00, 0x03, 0x12, 0x04, + 0xbd, 0x07, 0x2f, 0x30, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x26, 0x02, 0x01, 0x12, 0x04, + 0xbe, 0x07, 0x04, 0x32, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x26, 0x02, 0x01, 0x04, 0x12, + 0x04, 0xbe, 0x07, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x26, 0x02, 0x01, 0x05, + 0x12, 0x04, 0xbe, 0x07, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x26, 0x02, 0x01, + 0x01, 0x12, 0x04, 0xbe, 0x07, 0x14, 0x2d, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x26, 0x02, + 0x01, 0x03, 0x12, 0x04, 0xbe, 0x07, 0x30, 0x31, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x26, + 0x02, 0x02, 0x12, 0x04, 0xbf, 0x07, 0x04, 0x1f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x26, + 0x02, 0x02, 0x04, 0x12, 0x04, 0xbf, 0x07, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x26, 0x02, 0x02, 0x05, 0x12, 0x04, 0xbf, 0x07, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x26, 0x02, 0x02, 0x01, 0x12, 0x04, 0xbf, 0x07, 0x14, 0x1a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x26, 0x02, 0x02, 0x03, 0x12, 0x04, 0xbf, 0x07, 0x1d, 0x1e, 0x0a, 0x0e, 0x0a, 0x04, + 0x04, 0x00, 0x03, 0x27, 0x12, 0x06, 0xc2, 0x07, 0x02, 0xc6, 0x07, 0x03, 0x0a, 0x0d, 0x0a, 0x05, + 0x04, 0x00, 0x03, 0x27, 0x01, 0x12, 0x04, 0xc2, 0x07, 0x0a, 0x12, 0x0a, 0x0e, 0x0a, 0x06, 0x04, + 0x00, 0x03, 0x27, 0x02, 0x00, 0x12, 0x04, 0xc3, 0x07, 0x04, 0x2b, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x27, 0x02, 0x00, 0x04, 0x12, 0x04, 0xc3, 0x07, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x27, 0x02, 0x00, 0x05, 0x12, 0x04, 0xc3, 0x07, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x27, 0x02, 0x00, 0x01, 0x12, 0x04, 0xc3, 0x07, 0x14, 0x26, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x27, 0x02, 0x00, 0x03, 0x12, 0x04, 0xc3, 0x07, 0x29, 0x2a, 0x0a, + 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x27, 0x02, 0x01, 0x12, 0x04, 0xc4, 0x07, 0x04, 0x1e, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x27, 0x02, 0x01, 0x04, 0x12, 0x04, 0xc4, 0x07, 0x04, 0x0c, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x27, 0x02, 0x01, 0x05, 0x12, 0x04, 0xc4, 0x07, 0x0d, + 0x12, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x27, 0x02, 0x01, 0x01, 0x12, 0x04, 0xc4, 0x07, + 0x13, 0x19, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x27, 0x02, 0x01, 0x03, 0x12, 0x04, 0xc4, + 0x07, 0x1c, 0x1d, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x27, 0x02, 0x02, 0x12, 0x04, 0xc5, + 0x07, 0x04, 0x1f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x27, 0x02, 0x02, 0x04, 0x12, 0x04, + 0xc5, 0x07, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x27, 0x02, 0x02, 0x05, 0x12, + 0x04, 0xc5, 0x07, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x27, 0x02, 0x02, 0x01, + 0x12, 0x04, 0xc5, 0x07, 0x14, 0x1a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x27, 0x02, 0x02, + 0x03, 0x12, 0x04, 0xc5, 0x07, 0x1d, 0x1e, 0x0a, 0x0e, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x28, 0x12, + 0x06, 0xc8, 0x07, 0x02, 0xeb, 0x07, 0x03, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x28, 0x01, + 0x12, 0x04, 0xc8, 0x07, 0x0a, 0x18, 0x0a, 0x10, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x28, 0x04, 0x00, + 0x12, 0x06, 0xc9, 0x07, 0x04, 0xd0, 0x07, 0x05, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x28, + 0x04, 0x00, 0x01, 0x12, 0x04, 0xc9, 0x07, 0x09, 0x12, 0x0a, 0x35, 0x0a, 0x08, 0x04, 0x00, 0x03, + 0x28, 0x04, 0x00, 0x02, 0x00, 0x12, 0x04, 0xcb, 0x07, 0x06, 0x17, 0x1a, 0x23, 0x2f, 0x20, 0x55, + 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x73, 0x20, 0x74, 0x6f, + 0x20, 0x27, 0x3d, 0x3d, 0x27, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x0a, + 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x28, 0x04, 0x00, 0x02, 0x00, 0x01, 0x12, 0x04, 0xcb, + 0x07, 0x06, 0x12, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x28, 0x04, 0x00, 0x02, 0x00, 0x02, + 0x12, 0x04, 0xcb, 0x07, 0x15, 0x16, 0x0a, 0x37, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x28, 0x04, 0x00, + 0x02, 0x01, 0x12, 0x04, 0xcd, 0x07, 0x06, 0x17, 0x1a, 0x25, 0x2f, 0x20, 0x55, 0x73, 0x65, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, + 0x20, 0x27, 0x3e, 0x27, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x0a, 0x0a, + 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x28, 0x04, 0x00, 0x02, 0x01, 0x01, 0x12, 0x04, 0xcd, 0x07, + 0x06, 0x12, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x28, 0x04, 0x00, 0x02, 0x01, 0x02, 0x12, + 0x04, 0xcd, 0x07, 0x15, 0x16, 0x0a, 0x34, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x28, 0x04, 0x00, 0x02, + 0x02, 0x12, 0x04, 0xcf, 0x07, 0x06, 0x17, 0x1a, 0x22, 0x2f, 0x20, 0x55, 0x73, 0x65, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x27, 0x3c, 0x27, + 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x0a, 0x0a, 0x11, 0x0a, 0x09, 0x04, + 0x00, 0x03, 0x28, 0x04, 0x00, 0x02, 0x02, 0x01, 0x12, 0x04, 0xcf, 0x07, 0x06, 0x12, 0x0a, 0x11, + 0x0a, 0x09, 0x04, 0x00, 0x03, 0x28, 0x04, 0x00, 0x02, 0x02, 0x02, 0x12, 0x04, 0xcf, 0x07, 0x15, + 0x16, 0x0a, 0x59, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x28, 0x02, 0x00, 0x12, 0x04, 0xd2, 0x07, 0x04, + 0x1e, 0x1a, 0x49, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, + 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x73, 0x65, + 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x28, 0x6c, 0x68, + 0x73, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, 0x72, 0x68, + 0x73, 0x29, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x6e, 0x64, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x28, 0x02, 0x00, 0x04, 0x12, 0x04, 0xd2, 0x07, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x28, 0x02, 0x00, 0x06, 0x12, 0x04, 0xd2, 0x07, 0x0d, 0x16, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x28, 0x02, 0x00, 0x01, 0x12, 0x04, 0xd2, 0x07, 0x17, 0x19, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x28, 0x02, 0x00, 0x03, 0x12, 0x04, 0xd2, 0x07, 0x1c, 0x1d, + 0x0a, 0x10, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x28, 0x08, 0x00, 0x12, 0x06, 0xd3, 0x07, 0x04, 0xd8, + 0x07, 0x05, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x28, 0x08, 0x00, 0x01, 0x12, 0x04, 0xd3, + 0x07, 0x0a, 0x0d, 0x0a, 0x5e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x28, 0x02, 0x01, 0x12, 0x04, 0xd5, + 0x07, 0x06, 0x18, 0x1a, 0x4e, 0x2f, 0x20, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, + 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x65, 0x64, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x69, 0x73, 0x20, 0x65, 0x71, + 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x20, + 0x68, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x69, 0x64, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x6e, + 0x64, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x28, 0x02, 0x01, 0x06, 0x12, 0x04, + 0xd5, 0x07, 0x06, 0x0f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x28, 0x02, 0x01, 0x01, 0x12, + 0x04, 0xd5, 0x07, 0x10, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x28, 0x02, 0x01, 0x03, + 0x12, 0x04, 0xd5, 0x07, 0x16, 0x17, 0x0a, 0x54, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x28, 0x02, 0x02, + 0x12, 0x04, 0xd7, 0x07, 0x06, 0x1b, 0x1a, 0x44, 0x2f, 0x20, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x20, 0x6f, 0x72, 0x20, 0x60, 0x24, 0x7b, 0x43, 0x41, 0x43, 0x48, 0x45, 0x5f, 0x4b, 0x45, 0x59, + 0x7d, 0x60, 0x20, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x67, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x69, + 0x64, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x6e, 0x64, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x28, 0x02, 0x02, 0x05, 0x12, 0x04, 0xd7, 0x07, 0x06, 0x0c, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x28, 0x02, 0x02, 0x01, 0x12, 0x04, 0xd7, 0x07, 0x0d, 0x16, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x28, 0x02, 0x02, 0x03, 0x12, 0x04, 0xd7, 0x07, 0x19, 0x1a, 0x0a, + 0x10, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x28, 0x08, 0x01, 0x12, 0x06, 0xd9, 0x07, 0x04, 0xde, 0x07, + 0x05, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x28, 0x08, 0x01, 0x01, 0x12, 0x04, 0xd9, 0x07, + 0x0a, 0x0d, 0x0a, 0x5f, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x28, 0x02, 0x03, 0x12, 0x04, 0xdb, 0x07, + 0x06, 0x18, 0x1a, 0x4f, 0x2f, 0x20, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x20, + 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x65, 0x64, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x69, 0x73, 0x20, 0x65, 0x71, 0x75, + 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, + 0x68, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x69, 0x64, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x6e, + 0x64, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x28, 0x02, 0x03, 0x06, 0x12, 0x04, + 0xdb, 0x07, 0x06, 0x0f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x28, 0x02, 0x03, 0x01, 0x12, + 0x04, 0xdb, 0x07, 0x10, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x28, 0x02, 0x03, 0x03, + 0x12, 0x04, 0xdb, 0x07, 0x16, 0x17, 0x0a, 0x55, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x28, 0x02, 0x04, + 0x12, 0x04, 0xdd, 0x07, 0x06, 0x1b, 0x1a, 0x45, 0x2f, 0x20, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x20, 0x6f, 0x72, 0x20, 0x60, 0x24, 0x7b, 0x43, 0x41, 0x43, 0x48, 0x45, 0x5f, 0x4b, 0x45, 0x59, + 0x7d, 0x60, 0x20, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x67, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x20, 0x73, + 0x69, 0x64, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x6e, 0x64, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x28, 0x02, 0x04, 0x05, 0x12, 0x04, 0xdd, 0x07, 0x06, 0x0c, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x28, 0x02, 0x04, 0x01, 0x12, 0x04, 0xdd, 0x07, 0x0d, 0x16, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x28, 0x02, 0x04, 0x03, 0x12, 0x04, 0xdd, 0x07, 0x19, 0x1a, + 0x0a, 0x4f, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x28, 0x02, 0x05, 0x12, 0x04, 0xe0, 0x07, 0x04, 0x23, + 0x1a, 0x3f, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, + 0x62, 0x20, 0x74, 0x6f, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x20, 0x69, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, + 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2e, + 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x28, 0x02, 0x05, 0x04, 0x12, 0x04, 0xe0, 0x07, + 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x28, 0x02, 0x05, 0x06, 0x12, 0x04, 0xe0, + 0x07, 0x0d, 0x16, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x28, 0x02, 0x05, 0x01, 0x12, 0x04, + 0xe0, 0x07, 0x17, 0x1e, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x28, 0x02, 0x05, 0x03, 0x12, + 0x04, 0xe0, 0x07, 0x21, 0x22, 0x0a, 0x68, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x28, 0x02, 0x06, 0x12, + 0x04, 0xe2, 0x07, 0x04, 0x26, 0x1a, 0x58, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x76, 0x61, 0x6c, + 0x75, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2e, 0x20, 0x43, + 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x73, 0x65, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x20, 0x60, + 0x24, 0x7b, 0x43, 0x41, 0x43, 0x48, 0x45, 0x5f, 0x4b, 0x45, 0x59, 0x7d, 0x60, 0x2e, 0x0a, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x28, 0x02, 0x06, 0x04, 0x12, 0x04, 0xe2, 0x07, 0x04, 0x0c, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x28, 0x02, 0x06, 0x05, 0x12, 0x04, 0xe2, 0x07, 0x0d, + 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x28, 0x02, 0x06, 0x01, 0x12, 0x04, 0xe2, 0x07, + 0x14, 0x21, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x28, 0x02, 0x06, 0x03, 0x12, 0x04, 0xe2, + 0x07, 0x24, 0x25, 0x0a, 0x50, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x28, 0x02, 0x07, 0x12, 0x04, 0xe4, + 0x07, 0x04, 0x24, 0x1a, 0x40, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x4f, 0x72, 0x61, 0x63, 0x6c, + 0x65, 0x4a, 0x6f, 0x62, 0x20, 0x74, 0x6f, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x20, + 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x66, 0x61, + 0x6c, 0x73, 0x65, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x28, 0x02, 0x07, 0x04, + 0x12, 0x04, 0xe4, 0x07, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x28, 0x02, 0x07, + 0x06, 0x12, 0x04, 0xe4, 0x07, 0x0d, 0x16, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x28, 0x02, + 0x07, 0x01, 0x12, 0x04, 0xe4, 0x07, 0x17, 0x1f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x28, + 0x02, 0x07, 0x03, 0x12, 0x04, 0xe4, 0x07, 0x22, 0x23, 0x0a, 0x69, 0x0a, 0x06, 0x04, 0x00, 0x03, + 0x28, 0x02, 0x08, 0x12, 0x04, 0xe6, 0x07, 0x04, 0x27, 0x1a, 0x59, 0x2f, 0x20, 0x54, 0x68, 0x65, + 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x73, 0x65, 0x20, 0x69, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x66, 0x61, 0x6c, + 0x73, 0x65, 0x2e, 0x20, 0x43, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x73, 0x65, 0x74, 0x20, 0x74, + 0x6f, 0x20, 0x61, 0x20, 0x60, 0x24, 0x7b, 0x43, 0x41, 0x43, 0x48, 0x45, 0x5f, 0x4b, 0x45, 0x59, + 0x7d, 0x60, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x28, 0x02, 0x08, 0x04, 0x12, + 0x04, 0xe6, 0x07, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x28, 0x02, 0x08, 0x05, + 0x12, 0x04, 0xe6, 0x07, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x28, 0x02, 0x08, + 0x01, 0x12, 0x04, 0xe6, 0x07, 0x14, 0x22, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x28, 0x02, + 0x08, 0x03, 0x12, 0x04, 0xe6, 0x07, 0x25, 0x26, 0x0a, 0x4f, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x28, + 0x02, 0x09, 0x12, 0x04, 0xe8, 0x07, 0x04, 0x27, 0x1a, 0x3f, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, + 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x20, 0x74, 0x6f, 0x20, 0x65, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x65, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x65, + 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x28, 0x02, 0x09, 0x04, 0x12, 0x04, 0xe8, 0x07, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x28, 0x02, 0x09, 0x06, 0x12, 0x04, 0xe8, 0x07, 0x0d, 0x16, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x28, 0x02, 0x09, 0x01, 0x12, 0x04, 0xe8, 0x07, 0x17, 0x21, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x28, 0x02, 0x09, 0x03, 0x12, 0x04, 0xe8, 0x07, 0x24, 0x26, 0x0a, 0x68, 0x0a, + 0x06, 0x04, 0x00, 0x03, 0x28, 0x02, 0x0a, 0x12, 0x04, 0xea, 0x07, 0x04, 0x2a, 0x1a, 0x58, 0x2f, + 0x20, 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x75, + 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x65, 0x76, 0x61, + 0x6c, 0x75, 0x61, 0x74, 0x65, 0x2e, 0x20, 0x43, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x73, 0x65, + 0x74, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x20, 0x60, 0x24, 0x7b, 0x43, 0x41, 0x43, 0x48, 0x45, 0x5f, + 0x4b, 0x45, 0x59, 0x7d, 0x60, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x28, 0x02, + 0x0a, 0x04, 0x12, 0x04, 0xea, 0x07, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x28, + 0x02, 0x0a, 0x05, 0x12, 0x04, 0xea, 0x07, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x28, 0x02, 0x0a, 0x01, 0x12, 0x04, 0xea, 0x07, 0x14, 0x24, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x28, 0x02, 0x0a, 0x03, 0x12, 0x04, 0xea, 0x07, 0x27, 0x29, 0x0a, 0xe8, 0x02, 0x0a, 0x04, + 0x04, 0x00, 0x03, 0x29, 0x12, 0x06, 0xfa, 0x07, 0x02, 0x85, 0x08, 0x03, 0x1a, 0xd7, 0x02, 0x0a, + 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x74, 0x20, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x20, 0x74, 0x6f, 0x20, 0x61, 0x20, 0x73, 0x65, 0x74, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x20, 0x70, 0x6c, 0x61, 0x63, + 0x65, 0x73, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2a, 0x2a, 0x5f, + 0x3a, 0x20, 0x54, 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x72, 0x75, + 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, + 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x52, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x73, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x54, 0x68, 0x65, 0x20, 0x72, 0x75, 0x6e, 0x6e, + 0x69, 0x6e, 0x67, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x72, 0x6f, 0x75, 0x6e, 0x64, + 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x20, 0x73, 0x65, 0x74, 0x20, 0x6e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x20, 0x70, 0x6c, + 0x61, 0x63, 0x65, 0x73, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, + 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x64, 0x6f, 0x77, 0x6e, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x38, 0x20, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x20, + 0x70, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, + 0x7b, 0x20, 0x22, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, + 0x20, 0x22, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x22, 0x3a, 0x20, 0x22, 0x4d, 0x45, 0x54, 0x48, + 0x4f, 0x44, 0x5f, 0x52, 0x4f, 0x55, 0x4e, 0x44, 0x5f, 0x44, 0x4f, 0x57, 0x4e, 0x22, 0x2c, 0x20, + 0x22, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x73, 0x22, 0x3a, 0x20, 0x38, 0x20, 0x7d, 0x20, + 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x29, 0x01, 0x12, + 0x04, 0xfa, 0x07, 0x0a, 0x13, 0x0a, 0x10, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x29, 0x04, 0x00, 0x12, + 0x06, 0xfb, 0x07, 0x04, 0x80, 0x08, 0x05, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x29, 0x04, + 0x00, 0x01, 0x12, 0x04, 0xfb, 0x07, 0x09, 0x0f, 0x0a, 0x2b, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x29, + 0x04, 0x00, 0x02, 0x00, 0x12, 0x04, 0xfd, 0x07, 0x06, 0x1a, 0x1a, 0x19, 0x2f, 0x20, 0x52, 0x6f, + 0x75, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x64, + 0x6f, 0x77, 0x6e, 0x2e, 0x0a, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x29, 0x04, 0x00, 0x02, + 0x00, 0x01, 0x12, 0x04, 0xfd, 0x07, 0x06, 0x15, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x29, + 0x04, 0x00, 0x02, 0x00, 0x02, 0x12, 0x04, 0xfd, 0x07, 0x18, 0x19, 0x0a, 0x29, 0x0a, 0x08, 0x04, + 0x00, 0x03, 0x29, 0x04, 0x00, 0x02, 0x01, 0x12, 0x04, 0xff, 0x07, 0x06, 0x1c, 0x1a, 0x17, 0x2f, + 0x20, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x20, 0x75, 0x70, 0x2e, 0x0a, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x29, 0x04, 0x00, + 0x02, 0x01, 0x01, 0x12, 0x04, 0xff, 0x07, 0x06, 0x17, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, + 0x29, 0x04, 0x00, 0x02, 0x01, 0x02, 0x12, 0x04, 0xff, 0x07, 0x1a, 0x1b, 0x0a, 0x2e, 0x0a, 0x06, + 0x04, 0x00, 0x03, 0x29, 0x02, 0x00, 0x12, 0x04, 0x82, 0x08, 0x04, 0x1f, 0x1a, 0x1e, 0x2f, 0x20, + 0x54, 0x68, 0x65, 0x20, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6d, 0x65, 0x74, + 0x68, 0x6f, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x73, 0x65, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x29, 0x02, 0x00, 0x04, 0x12, 0x04, 0x82, 0x08, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x29, 0x02, 0x00, 0x06, 0x12, 0x04, 0x82, 0x08, 0x0d, 0x13, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x29, 0x02, 0x00, 0x01, 0x12, 0x04, 0x82, 0x08, 0x14, 0x1a, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x29, 0x02, 0x00, 0x03, 0x12, 0x04, 0x82, 0x08, 0x1d, 0x1e, + 0x0a, 0x36, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x29, 0x02, 0x01, 0x12, 0x04, 0x84, 0x08, 0x04, 0x20, + 0x1a, 0x26, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x6f, + 0x75, 0x6e, 0x64, 0x20, 0x74, 0x6f, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x29, + 0x02, 0x01, 0x04, 0x12, 0x04, 0x84, 0x08, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x29, 0x02, 0x01, 0x05, 0x12, 0x04, 0x84, 0x08, 0x0d, 0x12, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x29, 0x02, 0x01, 0x01, 0x12, 0x04, 0x84, 0x08, 0x13, 0x1b, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x29, 0x02, 0x01, 0x03, 0x12, 0x04, 0x84, 0x08, 0x1e, 0x1f, 0x0a, 0xf6, 0x03, 0x0a, + 0x04, 0x04, 0x00, 0x03, 0x2a, 0x12, 0x06, 0x94, 0x08, 0x02, 0xa5, 0x08, 0x03, 0x1a, 0xe5, 0x03, + 0x0a, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x75, 0x6e, 0x6e, 0x69, + 0x6e, 0x67, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6e, 0x20, + 0x75, 0x70, 0x70, 0x65, 0x72, 0x2f, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x20, 0x62, 0x6f, 0x75, 0x6e, + 0x64, 0x2e, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x74, 0x79, 0x70, 0x69, 0x63, + 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x74, 0x61, + 0x73, 0x6b, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x6e, 0x20, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, + 0x6f, 0x62, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2a, 0x2a, 0x5f, + 0x3a, 0x20, 0x54, 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x72, 0x75, + 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, + 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x52, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x73, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x54, 0x68, 0x65, 0x20, 0x72, 0x75, 0x6e, 0x6e, + 0x69, 0x6e, 0x67, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x62, 0x6f, 0x75, 0x6e, 0x64, + 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6e, 0x20, 0x75, 0x70, 0x70, 0x65, 0x72, 0x20, 0x6f, + 0x72, 0x20, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x20, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x69, 0x66, + 0x20, 0x69, 0x74, 0x20, 0x65, 0x78, 0x63, 0x65, 0x65, 0x64, 0x73, 0x20, 0x61, 0x20, 0x67, 0x69, + 0x76, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x2e, 0x0a, 0x0a, + 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x42, + 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, + 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x20, 0x62, 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x20, 0x30, 0x2e, 0x39, 0x30, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x31, 0x2e, 0x31, 0x30, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, + 0x6e, 0x0a, 0x7b, 0x20, 0x22, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x3a, + 0x20, 0x7b, 0x20, 0x22, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x30, 0x2e, 0x39, 0x30, 0x22, 0x2c, 0x22, 0x6f, 0x6e, + 0x45, 0x78, 0x63, 0x65, 0x65, 0x64, 0x73, 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, + 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x30, 0x2e, 0x39, 0x30, 0x22, 0x2c, + 0x22, 0x75, 0x70, 0x70, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x31, 0x2e, 0x31, 0x30, 0x22, 0x2c, 0x22, 0x6f, 0x6e, 0x45, 0x78, 0x63, + 0x65, 0x65, 0x64, 0x73, 0x55, 0x70, 0x70, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x31, 0x2e, 0x31, 0x30, 0x22, 0x20, 0x7d, 0x20, 0x7d, + 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x2a, 0x01, 0x12, 0x04, + 0x94, 0x08, 0x0a, 0x13, 0x0a, 0x46, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x2a, 0x02, 0x00, 0x12, 0x04, + 0x96, 0x08, 0x04, 0x27, 0x1a, 0x36, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x4f, 0x72, 0x61, 0x63, + 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x20, 0x74, 0x6f, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x20, 0x62, + 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x2a, 0x02, 0x00, 0x04, 0x12, 0x04, 0x96, 0x08, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x2a, 0x02, 0x00, 0x06, 0x12, 0x04, 0x96, 0x08, 0x0d, 0x16, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2a, 0x02, 0x00, 0x01, 0x12, 0x04, 0x96, 0x08, 0x17, 0x22, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2a, 0x02, 0x00, 0x03, 0x12, 0x04, 0x96, 0x08, 0x25, 0x26, + 0x0a, 0x58, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x2a, 0x02, 0x01, 0x12, 0x04, 0x98, 0x08, 0x04, 0x2a, + 0x1a, 0x48, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x74, 0x6f, + 0x20, 0x75, 0x73, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x6f, 0x77, + 0x65, 0x72, 0x20, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x20, 0x43, 0x61, 0x6e, 0x20, 0x62, 0x65, + 0x20, 0x73, 0x65, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x20, 0x60, 0x24, 0x7b, 0x43, 0x41, 0x43, + 0x48, 0x45, 0x5f, 0x4b, 0x45, 0x59, 0x7d, 0x60, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x2a, 0x02, 0x01, 0x04, 0x12, 0x04, 0x98, 0x08, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x2a, 0x02, 0x01, 0x05, 0x12, 0x04, 0x98, 0x08, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x2a, 0x02, 0x01, 0x01, 0x12, 0x04, 0x98, 0x08, 0x14, 0x25, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x2a, 0x02, 0x01, 0x03, 0x12, 0x04, 0x98, 0x08, 0x28, 0x29, 0x0a, 0x46, + 0x0a, 0x06, 0x04, 0x00, 0x03, 0x2a, 0x02, 0x02, 0x12, 0x04, 0x9a, 0x08, 0x04, 0x27, 0x1a, 0x36, + 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x20, + 0x74, 0x6f, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x75, 0x70, 0x70, 0x65, 0x72, 0x20, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2a, 0x02, 0x02, + 0x04, 0x12, 0x04, 0x9a, 0x08, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2a, 0x02, + 0x02, 0x06, 0x12, 0x04, 0x9a, 0x08, 0x0d, 0x16, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2a, + 0x02, 0x02, 0x01, 0x12, 0x04, 0x9a, 0x08, 0x17, 0x22, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x2a, 0x02, 0x02, 0x03, 0x12, 0x04, 0x9a, 0x08, 0x25, 0x26, 0x0a, 0x58, 0x0a, 0x06, 0x04, 0x00, + 0x03, 0x2a, 0x02, 0x03, 0x12, 0x04, 0x9c, 0x08, 0x04, 0x2a, 0x1a, 0x48, 0x2f, 0x20, 0x54, 0x68, + 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x73, 0x65, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x70, 0x70, 0x65, 0x72, 0x20, 0x62, 0x6f, 0x75, + 0x6e, 0x64, 0x2e, 0x20, 0x43, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x73, 0x65, 0x74, 0x20, 0x74, + 0x6f, 0x20, 0x61, 0x20, 0x60, 0x24, 0x7b, 0x43, 0x41, 0x43, 0x48, 0x45, 0x5f, 0x4b, 0x45, 0x59, + 0x7d, 0x60, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2a, 0x02, 0x03, 0x04, 0x12, + 0x04, 0x9c, 0x08, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2a, 0x02, 0x03, 0x05, + 0x12, 0x04, 0x9c, 0x08, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2a, 0x02, 0x03, + 0x01, 0x12, 0x04, 0x9c, 0x08, 0x14, 0x25, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2a, 0x02, + 0x03, 0x03, 0x12, 0x04, 0x9c, 0x08, 0x28, 0x29, 0x0a, 0x4b, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x2a, + 0x02, 0x04, 0x12, 0x04, 0x9e, 0x08, 0x04, 0x32, 0x1a, 0x3b, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, + 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x20, 0x74, 0x6f, 0x20, 0x65, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x65, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x70, 0x70, 0x65, + 0x72, 0x20, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x69, 0x73, 0x20, 0x65, 0x78, 0x63, 0x65, 0x65, + 0x64, 0x65, 0x64, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2a, 0x02, 0x04, 0x04, + 0x12, 0x04, 0x9e, 0x08, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2a, 0x02, 0x04, + 0x06, 0x12, 0x04, 0x9e, 0x08, 0x0d, 0x16, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2a, 0x02, + 0x04, 0x01, 0x12, 0x04, 0x9e, 0x08, 0x17, 0x2d, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2a, + 0x02, 0x04, 0x03, 0x12, 0x04, 0x9e, 0x08, 0x30, 0x31, 0x0a, 0x63, 0x0a, 0x06, 0x04, 0x00, 0x03, + 0x2a, 0x02, 0x05, 0x12, 0x04, 0xa0, 0x08, 0x04, 0x35, 0x1a, 0x53, 0x2f, 0x20, 0x54, 0x68, 0x65, + 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x73, 0x65, 0x20, 0x69, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x70, 0x70, 0x65, 0x72, 0x20, 0x62, 0x6f, 0x75, 0x6e, 0x64, + 0x20, 0x69, 0x73, 0x20, 0x65, 0x78, 0x63, 0x65, 0x65, 0x64, 0x65, 0x64, 0x2e, 0x20, 0x43, 0x61, + 0x6e, 0x20, 0x62, 0x65, 0x20, 0x73, 0x65, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x20, 0x60, 0x24, + 0x7b, 0x43, 0x41, 0x43, 0x48, 0x45, 0x5f, 0x4b, 0x45, 0x59, 0x7d, 0x60, 0x2e, 0x0a, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2a, 0x02, 0x05, 0x04, 0x12, 0x04, 0xa0, 0x08, 0x04, 0x0c, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2a, 0x02, 0x05, 0x05, 0x12, 0x04, 0xa0, 0x08, 0x0d, 0x13, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2a, 0x02, 0x05, 0x01, 0x12, 0x04, 0xa0, 0x08, 0x14, + 0x30, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2a, 0x02, 0x05, 0x03, 0x12, 0x04, 0xa0, 0x08, + 0x33, 0x34, 0x0a, 0x4b, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x2a, 0x02, 0x06, 0x12, 0x04, 0xa2, 0x08, + 0x04, 0x32, 0x1a, 0x3b, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, + 0x4a, 0x6f, 0x62, 0x20, 0x74, 0x6f, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x20, 0x69, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x20, 0x62, 0x6f, 0x75, 0x6e, + 0x64, 0x20, 0x69, 0x73, 0x20, 0x65, 0x78, 0x63, 0x65, 0x65, 0x64, 0x65, 0x64, 0x2e, 0x0a, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2a, 0x02, 0x06, 0x04, 0x12, 0x04, 0xa2, 0x08, 0x04, 0x0c, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2a, 0x02, 0x06, 0x06, 0x12, 0x04, 0xa2, 0x08, 0x0d, + 0x16, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2a, 0x02, 0x06, 0x01, 0x12, 0x04, 0xa2, 0x08, + 0x17, 0x2d, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2a, 0x02, 0x06, 0x03, 0x12, 0x04, 0xa2, + 0x08, 0x30, 0x31, 0x0a, 0x63, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x2a, 0x02, 0x07, 0x12, 0x04, 0xa4, + 0x08, 0x04, 0x35, 0x1a, 0x53, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x20, 0x74, 0x6f, 0x20, 0x75, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, + 0x6f, 0x77, 0x65, 0x72, 0x20, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x69, 0x73, 0x20, 0x65, 0x78, + 0x63, 0x65, 0x65, 0x64, 0x65, 0x64, 0x2e, 0x20, 0x43, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x73, + 0x65, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x20, 0x60, 0x24, 0x7b, 0x43, 0x41, 0x43, 0x48, 0x45, + 0x5f, 0x4b, 0x45, 0x59, 0x7d, 0x60, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2a, + 0x02, 0x07, 0x04, 0x12, 0x04, 0xa4, 0x08, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x2a, 0x02, 0x07, 0x05, 0x12, 0x04, 0xa4, 0x08, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x2a, 0x02, 0x07, 0x01, 0x12, 0x04, 0xa4, 0x08, 0x14, 0x30, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x2a, 0x02, 0x07, 0x03, 0x12, 0x04, 0xa4, 0x08, 0x33, 0x34, 0x0a, 0x8c, 0x03, 0x0a, + 0x04, 0x04, 0x00, 0x03, 0x2b, 0x12, 0x06, 0xb4, 0x08, 0x02, 0xb9, 0x08, 0x03, 0x1a, 0xfb, 0x02, + 0x0a, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x6c, 0x79, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x20, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x61, + 0x20, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x20, 0x53, 0x65, 0x63, + 0x72, 0x65, 0x74, 0x73, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, + 0x61, 0x72, 0x65, 0x20, 0x6f, 0x77, 0x6e, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x61, 0x20, 0x73, + 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, + 0x79, 0x2e, 0x20, 0x41, 0x6e, 0x79, 0x20, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x20, 0x74, + 0x68, 0x61, 0x74, 0x20, 0x61, 0x72, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x20, 0x66, 0x65, 0x65, 0x64, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, + 0x62, 0x65, 0x20, 0x75, 0x6e, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x74, + 0x6f, 0x20, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x62, + 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x20, 0x6c, 0x61, 0x74, 0x65, 0x72, + 0x2e, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, + 0x4e, 0x6f, 0x6e, 0x65, 0x0a, 0x0a, 0x5f, 0x2a, 0x2a, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, + 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x54, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x0a, 0x0a, + 0x5f, 0x2a, 0x2a, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2a, 0x2a, 0x5f, 0x3a, 0x20, 0x53, + 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x54, 0x61, 0x73, 0x6b, 0x0a, 0x0a, 0x60, 0x60, 0x60, 0x6a, + 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x20, 0x22, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x54, 0x61, + 0x73, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0x20, 0x22, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, + 0x79, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x63, 0x63, 0x62, 0x32, 0x31, 0x74, 0x55, 0x43, 0x57, 0x6f, + 0x63, 0x4a, 0x65, 0x61, 0x36, 0x55, 0x6b, 0x33, 0x44, 0x67, 0x72, 0x4e, 0x5a, 0x61, 0x77, 0x67, + 0x6d, 0x4b, 0x65, 0x67, 0x44, 0x56, 0x65, 0x48, 0x77, 0x38, 0x63, 0x47, 0x4d, 0x44, 0x50, 0x69, + 0x35, 0x22, 0x20, 0x7d, 0x20, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, + 0x00, 0x03, 0x2b, 0x01, 0x12, 0x04, 0xb4, 0x08, 0x0a, 0x15, 0x0a, 0x49, 0x0a, 0x06, 0x04, 0x00, + 0x03, 0x2b, 0x02, 0x00, 0x12, 0x04, 0xb6, 0x08, 0x04, 0x22, 0x1a, 0x39, 0x2f, 0x20, 0x54, 0x68, + 0x65, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, + 0x61, 0x72, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x65, 0x64, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2b, 0x02, 0x00, 0x04, + 0x12, 0x04, 0xb6, 0x08, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2b, 0x02, 0x00, + 0x05, 0x12, 0x04, 0xb6, 0x08, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2b, 0x02, + 0x00, 0x01, 0x12, 0x04, 0xb6, 0x08, 0x14, 0x1d, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2b, + 0x02, 0x00, 0x03, 0x12, 0x04, 0xb6, 0x08, 0x20, 0x21, 0x0a, 0x75, 0x0a, 0x06, 0x04, 0x00, 0x03, + 0x2b, 0x02, 0x01, 0x12, 0x04, 0xb8, 0x08, 0x04, 0x1c, 0x1a, 0x65, 0x2f, 0x20, 0x54, 0x68, 0x65, + 0x20, 0x75, 0x72, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x73, 0x65, + 0x63, 0x72, 0x65, 0x74, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x69, 0x73, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, + 0x3a, 0x2f, 0x2f, 0x61, 0x70, 0x69, 0x2e, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x2e, 0x73, + 0x77, 0x69, 0x74, 0x63, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x2e, 0x78, 0x79, 0x7a, 0x2e, 0x0a, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2b, 0x02, 0x01, 0x04, 0x12, 0x04, 0xb8, 0x08, 0x04, + 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2b, 0x02, 0x01, 0x05, 0x12, 0x04, 0xb8, 0x08, + 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2b, 0x02, 0x01, 0x01, 0x12, 0x04, 0xb8, + 0x08, 0x14, 0x17, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2b, 0x02, 0x01, 0x03, 0x12, 0x04, + 0xb8, 0x08, 0x1a, 0x1b, 0x0a, 0x44, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x2c, 0x12, 0x06, 0xbc, 0x08, + 0x02, 0xc1, 0x08, 0x03, 0x1a, 0x34, 0x2f, 0x20, 0x47, 0x72, 0x61, 0x62, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x53, 0x61, 0x6e, + 0x63, 0x74, 0x75, 0x6d, 0x20, 0x4c, 0x53, 0x54, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, + 0x65, 0x20, 0x74, 0x6f, 0x20, 0x53, 0x4f, 0x4c, 0x2e, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, + 0x03, 0x2c, 0x01, 0x12, 0x04, 0xbc, 0x08, 0x0a, 0x1d, 0x0a, 0x6b, 0x0a, 0x06, 0x04, 0x00, 0x03, + 0x2c, 0x02, 0x00, 0x12, 0x04, 0xc0, 0x08, 0x04, 0x21, 0x1a, 0x5b, 0x2f, 0x20, 0x54, 0x68, 0x65, + 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x4c, 0x53, 0x54, 0x20, 0x6d, 0x69, 0x6e, 0x74, 0x2e, 0x0a, 0x2f, 0x0a, 0x2f, 0x20, 0x65, 0x2e, + 0x67, 0x2e, 0x20, 0x49, 0x4e, 0x46, 0x20, 0x2d, 0x20, 0x35, 0x6f, 0x56, 0x4e, 0x42, 0x65, 0x45, + 0x45, 0x51, 0x76, 0x59, 0x69, 0x31, 0x63, 0x58, 0x33, 0x69, 0x72, 0x38, 0x44, 0x78, 0x35, 0x6e, + 0x31, 0x50, 0x37, 0x70, 0x64, 0x78, 0x79, 0x64, 0x62, 0x47, 0x46, 0x32, 0x58, 0x34, 0x54, 0x78, + 0x56, 0x75, 0x73, 0x4a, 0x6d, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2c, 0x02, 0x00, + 0x04, 0x12, 0x04, 0xc0, 0x08, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2c, 0x02, + 0x00, 0x05, 0x12, 0x04, 0xc0, 0x08, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2c, + 0x02, 0x00, 0x01, 0x12, 0x04, 0xc0, 0x08, 0x14, 0x1c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x2c, 0x02, 0x00, 0x03, 0x12, 0x04, 0xc0, 0x08, 0x1f, 0x20, 0x0a, 0x7f, 0x0a, 0x04, 0x04, 0x00, + 0x03, 0x2d, 0x12, 0x06, 0xc5, 0x08, 0x02, 0xd0, 0x08, 0x03, 0x1a, 0x6f, 0x2f, 0x20, 0x4f, 0x6e, + 0x64, 0x6f, 0x55, 0x73, 0x64, 0x79, 0x54, 0x61, 0x73, 0x6b, 0x20, 0x72, 0x65, 0x70, 0x72, 0x65, + 0x73, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x61, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x20, 0x74, 0x68, 0x61, + 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, + 0x72, 0x69, 0x63, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x55, 0x53, 0x44, 0x59, 0x20, 0x72, 0x65, 0x6c, + 0x61, 0x74, 0x69, 0x76, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x55, 0x53, 0x44, 0x20, 0x75, 0x73, 0x69, + 0x6e, 0x67, 0x20, 0x61, 0x0a, 0x2f, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, + 0x20, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x2e, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, + 0x00, 0x03, 0x2d, 0x01, 0x12, 0x04, 0xc5, 0x08, 0x0a, 0x16, 0x0a, 0xe4, 0x01, 0x0a, 0x06, 0x04, + 0x00, 0x03, 0x2d, 0x04, 0x00, 0x12, 0x06, 0xca, 0x08, 0x04, 0xcd, 0x08, 0x05, 0x1a, 0xd1, 0x01, + 0x2f, 0x20, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, + 0x66, 0x69, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x20, + 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, + 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x55, + 0x53, 0x44, 0x59, 0x2e, 0x0a, 0x2f, 0x0a, 0x2f, 0x20, 0x2d, 0x20, 0x53, 0x54, 0x52, 0x41, 0x54, + 0x45, 0x47, 0x59, 0x5f, 0x46, 0x41, 0x49, 0x52, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x3a, 0x20, + 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x69, + 0x63, 0x65, 0x20, 0x62, 0x61, 0x73, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x61, 0x20, 0x66, 0x61, + 0x69, 0x72, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x0a, + 0x2f, 0x20, 0x2d, 0x20, 0x53, 0x54, 0x52, 0x41, 0x54, 0x45, 0x47, 0x59, 0x5f, 0x4d, 0x41, 0x52, + 0x4b, 0x45, 0x54, 0x3a, 0x20, 0x46, 0x65, 0x74, 0x63, 0x68, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6c, 0x79, 0x20, + 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x2e, + 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2d, 0x04, 0x00, 0x01, 0x12, 0x04, 0xca, 0x08, + 0x09, 0x11, 0x0a, 0x10, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x2d, 0x04, 0x00, 0x02, 0x00, 0x12, 0x04, + 0xcb, 0x08, 0x06, 0x1e, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x2d, 0x04, 0x00, 0x02, 0x00, + 0x01, 0x12, 0x04, 0xcb, 0x08, 0x06, 0x19, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x2d, 0x04, + 0x00, 0x02, 0x00, 0x02, 0x12, 0x04, 0xcb, 0x08, 0x1c, 0x1d, 0x0a, 0x10, 0x0a, 0x08, 0x04, 0x00, + 0x03, 0x2d, 0x04, 0x00, 0x02, 0x01, 0x12, 0x04, 0xcc, 0x08, 0x06, 0x1a, 0x0a, 0x11, 0x0a, 0x09, + 0x04, 0x00, 0x03, 0x2d, 0x04, 0x00, 0x02, 0x01, 0x01, 0x12, 0x04, 0xcc, 0x08, 0x06, 0x15, 0x0a, + 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x2d, 0x04, 0x00, 0x02, 0x01, 0x02, 0x12, 0x04, 0xcc, 0x08, + 0x18, 0x19, 0x0a, 0x44, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x2d, 0x02, 0x00, 0x12, 0x04, 0xcf, 0x08, + 0x04, 0x23, 0x1a, 0x34, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, + 0x67, 0x79, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x65, 0x74, 0x65, 0x72, + 0x6d, 0x69, 0x6e, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, 0x6f, + 0x66, 0x20, 0x55, 0x53, 0x44, 0x59, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2d, + 0x02, 0x00, 0x04, 0x12, 0x04, 0xcf, 0x08, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x2d, 0x02, 0x00, 0x06, 0x12, 0x04, 0xcf, 0x08, 0x0d, 0x15, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x2d, 0x02, 0x00, 0x01, 0x12, 0x04, 0xcf, 0x08, 0x16, 0x1e, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x2d, 0x02, 0x00, 0x03, 0x12, 0x04, 0xcf, 0x08, 0x21, 0x22, 0x0a, 0x3b, 0x0a, 0x04, + 0x04, 0x00, 0x03, 0x2e, 0x12, 0x06, 0xd3, 0x08, 0x02, 0xdc, 0x08, 0x03, 0x1a, 0x2b, 0x2f, 0x20, + 0x47, 0x72, 0x61, 0x62, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x77, 0x61, 0x70, 0x20, 0x70, 0x72, + 0x69, 0x63, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x61, 0x20, 0x4d, 0x65, 0x74, 0x65, 0x6f, + 0x72, 0x61, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, + 0x2e, 0x01, 0x12, 0x04, 0xd3, 0x08, 0x0a, 0x19, 0x0a, 0x10, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x2e, + 0x04, 0x00, 0x12, 0x06, 0xd4, 0x08, 0x04, 0xd7, 0x08, 0x05, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x2e, 0x04, 0x00, 0x01, 0x12, 0x04, 0xd4, 0x08, 0x09, 0x0d, 0x0a, 0x10, 0x0a, 0x08, 0x04, + 0x00, 0x03, 0x2e, 0x04, 0x00, 0x02, 0x00, 0x12, 0x04, 0xd5, 0x08, 0x06, 0x14, 0x0a, 0x11, 0x0a, + 0x09, 0x04, 0x00, 0x03, 0x2e, 0x04, 0x00, 0x02, 0x00, 0x01, 0x12, 0x04, 0xd5, 0x08, 0x06, 0x0f, + 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x2e, 0x04, 0x00, 0x02, 0x00, 0x02, 0x12, 0x04, 0xd5, + 0x08, 0x12, 0x13, 0x0a, 0x10, 0x0a, 0x08, 0x04, 0x00, 0x03, 0x2e, 0x04, 0x00, 0x02, 0x01, 0x12, + 0x04, 0xd6, 0x08, 0x06, 0x18, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x2e, 0x04, 0x00, 0x02, + 0x01, 0x01, 0x12, 0x04, 0xd6, 0x08, 0x06, 0x13, 0x0a, 0x11, 0x0a, 0x09, 0x04, 0x00, 0x03, 0x2e, + 0x04, 0x00, 0x02, 0x01, 0x02, 0x12, 0x04, 0xd6, 0x08, 0x16, 0x17, 0x0a, 0x2b, 0x0a, 0x06, 0x04, + 0x00, 0x03, 0x2e, 0x02, 0x00, 0x12, 0x04, 0xd9, 0x08, 0x04, 0x1d, 0x1a, 0x1b, 0x2f, 0x20, 0x54, + 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x0a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2e, + 0x02, 0x00, 0x04, 0x12, 0x04, 0xd9, 0x08, 0x04, 0x0c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x2e, 0x02, 0x00, 0x05, 0x12, 0x04, 0xd9, 0x08, 0x0d, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x2e, 0x02, 0x00, 0x01, 0x12, 0x04, 0xd9, 0x08, 0x14, 0x18, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x2e, 0x02, 0x00, 0x03, 0x12, 0x04, 0xd9, 0x08, 0x1b, 0x1c, 0x0a, 0x21, 0x0a, 0x06, + 0x04, 0x00, 0x03, 0x2e, 0x02, 0x01, 0x12, 0x04, 0xdb, 0x08, 0x04, 0x1b, 0x1a, 0x11, 0x2f, 0x20, + 0x54, 0x68, 0x65, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x20, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x0a, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2e, 0x02, 0x01, 0x04, 0x12, 0x04, 0xdb, 0x08, 0x04, 0x0c, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2e, 0x02, 0x01, 0x06, 0x12, 0x04, 0xdb, 0x08, 0x0d, + 0x11, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2e, 0x02, 0x01, 0x01, 0x12, 0x04, 0xdb, 0x08, + 0x12, 0x16, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2e, 0x02, 0x01, 0x03, 0x12, 0x04, 0xdb, + 0x08, 0x19, 0x1a, 0x0a, 0x70, 0x0a, 0x04, 0x04, 0x00, 0x03, 0x2f, 0x12, 0x06, 0xdf, 0x08, 0x02, + 0x97, 0x09, 0x03, 0x1a, 0x60, 0x2f, 0x20, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, + 0x73, 0x20, 0x61, 0x20, 0x73, 0x69, 0x6e, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x20, 0x6f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, + 0x20, 0x62, 0x79, 0x20, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x20, 0x74, 0x6f, + 0x20, 0x79, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x75, + 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x2e, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x2f, 0x01, 0x12, 0x04, + 0xdf, 0x08, 0x0a, 0x0e, 0x0a, 0x3c, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x2f, 0x09, 0x12, 0x04, 0xe1, + 0x08, 0x04, 0x10, 0x1a, 0x2d, 0x20, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x20, 0x6f, 0x62, + 0x73, 0x6f, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x20, 0x6b, 0x65, 0x79, 0x73, + 0x20, 0x2f, 0x20, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, + 0x2e, 0x0a, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x2f, 0x09, 0x00, 0x12, 0x04, 0xe1, 0x08, + 0x0d, 0x0f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x09, 0x00, 0x01, 0x12, 0x04, 0xe1, + 0x08, 0x0d, 0x0f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x09, 0x00, 0x02, 0x12, 0x04, + 0xe1, 0x08, 0x0d, 0x0f, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x2f, 0x0a, 0x12, 0x04, 0xe2, + 0x08, 0x04, 0x22, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x2f, 0x0a, 0x00, 0x12, 0x04, 0xe2, + 0x08, 0x0d, 0x21, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x2f, 0x09, 0x12, 0x04, 0xe3, 0x08, + 0x04, 0x10, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x2f, 0x09, 0x01, 0x12, 0x04, 0xe3, 0x08, + 0x0d, 0x0f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x09, 0x01, 0x01, 0x12, 0x04, 0xe3, + 0x08, 0x0d, 0x0f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x09, 0x01, 0x02, 0x12, 0x04, + 0xe3, 0x08, 0x0d, 0x0f, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x03, 0x2f, 0x0a, 0x12, 0x04, 0xe4, + 0x08, 0x04, 0x18, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x2f, 0x0a, 0x01, 0x12, 0x04, 0xe4, + 0x08, 0x0d, 0x17, 0x0a, 0x10, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x2f, 0x08, 0x00, 0x12, 0x06, 0xe6, + 0x08, 0x04, 0x96, 0x09, 0x05, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x08, 0x00, 0x01, + 0x12, 0x04, 0xe6, 0x08, 0x0a, 0x0e, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x00, + 0x12, 0x04, 0xe7, 0x08, 0x06, 0x1d, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x00, + 0x06, 0x12, 0x04, 0xe7, 0x08, 0x06, 0x0e, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, + 0x00, 0x01, 0x12, 0x04, 0xe7, 0x08, 0x0f, 0x18, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, + 0x02, 0x00, 0x03, 0x12, 0x04, 0xe7, 0x08, 0x1b, 0x1c, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, + 0x2f, 0x02, 0x01, 0x12, 0x04, 0xe8, 0x08, 0x06, 0x28, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x2f, 0x02, 0x01, 0x06, 0x12, 0x04, 0xe8, 0x08, 0x06, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x2f, 0x02, 0x01, 0x01, 0x12, 0x04, 0xe8, 0x08, 0x14, 0x23, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x2f, 0x02, 0x01, 0x03, 0x12, 0x04, 0xe8, 0x08, 0x26, 0x27, 0x0a, 0x0e, 0x0a, 0x06, + 0x04, 0x00, 0x03, 0x2f, 0x02, 0x02, 0x12, 0x04, 0xe9, 0x08, 0x06, 0x21, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x2f, 0x02, 0x02, 0x06, 0x12, 0x04, 0xe9, 0x08, 0x06, 0x10, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x02, 0x01, 0x12, 0x04, 0xe9, 0x08, 0x11, 0x1c, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x02, 0x03, 0x12, 0x04, 0xe9, 0x08, 0x1f, 0x20, 0x0a, + 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x03, 0x12, 0x04, 0xea, 0x08, 0x06, 0x1d, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x03, 0x06, 0x12, 0x04, 0xea, 0x08, 0x06, 0x0e, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x03, 0x01, 0x12, 0x04, 0xea, 0x08, 0x0f, + 0x18, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x03, 0x03, 0x12, 0x04, 0xea, 0x08, + 0x1b, 0x1c, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x04, 0x12, 0x04, 0xeb, 0x08, + 0x06, 0x27, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x04, 0x06, 0x12, 0x04, 0xeb, + 0x08, 0x06, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x04, 0x01, 0x12, 0x04, + 0xeb, 0x08, 0x14, 0x22, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x04, 0x03, 0x12, + 0x04, 0xeb, 0x08, 0x25, 0x26, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x05, 0x12, + 0x04, 0xec, 0x08, 0x06, 0x21, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x05, 0x06, + 0x12, 0x04, 0xec, 0x08, 0x06, 0x10, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x05, + 0x01, 0x12, 0x04, 0xec, 0x08, 0x11, 0x1c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, + 0x05, 0x03, 0x12, 0x04, 0xec, 0x08, 0x1f, 0x20, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x2f, + 0x02, 0x06, 0x12, 0x04, 0xed, 0x08, 0x06, 0x25, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, + 0x02, 0x06, 0x06, 0x12, 0x04, 0xed, 0x08, 0x06, 0x12, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x2f, 0x02, 0x06, 0x01, 0x12, 0x04, 0xed, 0x08, 0x13, 0x20, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x2f, 0x02, 0x06, 0x03, 0x12, 0x04, 0xed, 0x08, 0x23, 0x24, 0x0a, 0x0e, 0x0a, 0x06, 0x04, + 0x00, 0x03, 0x2f, 0x02, 0x07, 0x12, 0x04, 0xee, 0x08, 0x06, 0x2f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x2f, 0x02, 0x07, 0x06, 0x12, 0x04, 0xee, 0x08, 0x06, 0x16, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x2f, 0x02, 0x07, 0x01, 0x12, 0x04, 0xee, 0x08, 0x17, 0x2a, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x07, 0x03, 0x12, 0x04, 0xee, 0x08, 0x2d, 0x2e, 0x0a, 0x0e, + 0x0a, 0x06, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x08, 0x12, 0x04, 0xef, 0x08, 0x06, 0x34, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x08, 0x06, 0x12, 0x04, 0xef, 0x08, 0x06, 0x18, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x08, 0x01, 0x12, 0x04, 0xef, 0x08, 0x19, 0x2e, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x08, 0x03, 0x12, 0x04, 0xef, 0x08, 0x31, + 0x33, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x09, 0x12, 0x04, 0xf0, 0x08, 0x06, + 0x2c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x09, 0x06, 0x12, 0x04, 0xf0, 0x08, + 0x06, 0x15, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x09, 0x01, 0x12, 0x04, 0xf0, + 0x08, 0x16, 0x26, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x09, 0x03, 0x12, 0x04, + 0xf0, 0x08, 0x29, 0x2b, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x0a, 0x12, 0x04, + 0xf1, 0x08, 0x06, 0x20, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x0a, 0x06, 0x12, + 0x04, 0xf1, 0x08, 0x06, 0x0f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x0a, 0x01, + 0x12, 0x04, 0xf1, 0x08, 0x10, 0x1a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x0a, + 0x03, 0x12, 0x04, 0xf1, 0x08, 0x1d, 0x1f, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x2f, 0x02, + 0x0b, 0x12, 0x04, 0xf2, 0x08, 0x06, 0x1c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, + 0x0b, 0x06, 0x12, 0x04, 0xf2, 0x08, 0x06, 0x0d, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, + 0x02, 0x0b, 0x01, 0x12, 0x04, 0xf2, 0x08, 0x0e, 0x16, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x2f, 0x02, 0x0b, 0x03, 0x12, 0x04, 0xf2, 0x08, 0x19, 0x1b, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, + 0x03, 0x2f, 0x02, 0x0c, 0x12, 0x04, 0xf3, 0x08, 0x06, 0x2f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x2f, 0x02, 0x0c, 0x06, 0x12, 0x04, 0xf3, 0x08, 0x06, 0x16, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x2f, 0x02, 0x0c, 0x01, 0x12, 0x04, 0xf3, 0x08, 0x17, 0x29, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x2f, 0x02, 0x0c, 0x03, 0x12, 0x04, 0xf3, 0x08, 0x2c, 0x2e, 0x0a, 0x0e, 0x0a, + 0x06, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x0d, 0x12, 0x04, 0xf4, 0x08, 0x06, 0x2b, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x0d, 0x06, 0x12, 0x04, 0xf4, 0x08, 0x06, 0x14, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x0d, 0x01, 0x12, 0x04, 0xf4, 0x08, 0x15, 0x25, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x0d, 0x03, 0x12, 0x04, 0xf4, 0x08, 0x28, 0x2a, + 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x0e, 0x12, 0x04, 0xf5, 0x08, 0x06, 0x1c, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x0e, 0x06, 0x12, 0x04, 0xf5, 0x08, 0x06, + 0x0d, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x0e, 0x01, 0x12, 0x04, 0xf5, 0x08, + 0x0e, 0x16, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x0e, 0x03, 0x12, 0x04, 0xf5, + 0x08, 0x19, 0x1b, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x0f, 0x12, 0x04, 0xf6, + 0x08, 0x06, 0x26, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x0f, 0x06, 0x12, 0x04, + 0xf6, 0x08, 0x06, 0x12, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x0f, 0x01, 0x12, + 0x04, 0xf6, 0x08, 0x13, 0x20, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x0f, 0x03, + 0x12, 0x04, 0xf6, 0x08, 0x23, 0x25, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x10, + 0x12, 0x04, 0xf7, 0x08, 0x06, 0x1e, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x10, + 0x06, 0x12, 0x04, 0xf7, 0x08, 0x06, 0x0e, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, + 0x10, 0x01, 0x12, 0x04, 0xf7, 0x08, 0x0f, 0x18, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, + 0x02, 0x10, 0x03, 0x12, 0x04, 0xf7, 0x08, 0x1b, 0x1d, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, + 0x2f, 0x02, 0x11, 0x12, 0x04, 0xf8, 0x08, 0x06, 0x29, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x2f, 0x02, 0x11, 0x06, 0x12, 0x04, 0xf8, 0x08, 0x06, 0x13, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x2f, 0x02, 0x11, 0x01, 0x12, 0x04, 0xf8, 0x08, 0x14, 0x23, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x2f, 0x02, 0x11, 0x03, 0x12, 0x04, 0xf8, 0x08, 0x26, 0x28, 0x0a, 0x0e, 0x0a, 0x06, + 0x04, 0x00, 0x03, 0x2f, 0x02, 0x12, 0x12, 0x04, 0xf9, 0x08, 0x06, 0x1c, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x2f, 0x02, 0x12, 0x06, 0x12, 0x04, 0xf9, 0x08, 0x06, 0x0d, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x12, 0x01, 0x12, 0x04, 0xf9, 0x08, 0x0e, 0x16, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x12, 0x03, 0x12, 0x04, 0xf9, 0x08, 0x19, 0x1b, 0x0a, + 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x13, 0x12, 0x04, 0xfa, 0x08, 0x06, 0x2d, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x13, 0x06, 0x12, 0x04, 0xfa, 0x08, 0x06, 0x15, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x13, 0x01, 0x12, 0x04, 0xfa, 0x08, 0x16, + 0x27, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x13, 0x03, 0x12, 0x04, 0xfa, 0x08, + 0x2a, 0x2c, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x14, 0x12, 0x04, 0xfb, 0x08, + 0x06, 0x36, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x14, 0x06, 0x12, 0x04, 0xfb, + 0x08, 0x06, 0x19, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x14, 0x01, 0x12, 0x04, + 0xfb, 0x08, 0x1a, 0x30, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x14, 0x03, 0x12, + 0x04, 0xfb, 0x08, 0x33, 0x35, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x15, 0x12, + 0x04, 0xfc, 0x08, 0x06, 0x2d, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x15, 0x06, + 0x12, 0x04, 0xfc, 0x08, 0x06, 0x15, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x15, + 0x01, 0x12, 0x04, 0xfc, 0x08, 0x16, 0x27, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, + 0x15, 0x03, 0x12, 0x04, 0xfc, 0x08, 0x2a, 0x2c, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x2f, + 0x02, 0x16, 0x12, 0x04, 0xfd, 0x08, 0x06, 0x2b, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, + 0x02, 0x16, 0x06, 0x12, 0x04, 0xfd, 0x08, 0x06, 0x14, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x2f, 0x02, 0x16, 0x01, 0x12, 0x04, 0xfd, 0x08, 0x15, 0x25, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x2f, 0x02, 0x16, 0x03, 0x12, 0x04, 0xfd, 0x08, 0x28, 0x2a, 0x0a, 0x0e, 0x0a, 0x06, 0x04, + 0x00, 0x03, 0x2f, 0x02, 0x17, 0x12, 0x04, 0xfe, 0x08, 0x06, 0x22, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x2f, 0x02, 0x17, 0x06, 0x12, 0x04, 0xfe, 0x08, 0x06, 0x10, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x2f, 0x02, 0x17, 0x01, 0x12, 0x04, 0xfe, 0x08, 0x11, 0x1c, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x17, 0x03, 0x12, 0x04, 0xfe, 0x08, 0x1f, 0x21, 0x0a, 0x0e, + 0x0a, 0x06, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x18, 0x12, 0x04, 0xff, 0x08, 0x06, 0x2d, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x18, 0x06, 0x12, 0x04, 0xff, 0x08, 0x06, 0x15, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x18, 0x01, 0x12, 0x04, 0xff, 0x08, 0x16, 0x27, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x18, 0x03, 0x12, 0x04, 0xff, 0x08, 0x2a, + 0x2c, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x19, 0x12, 0x04, 0x80, 0x09, 0x06, + 0x30, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x19, 0x06, 0x12, 0x04, 0x80, 0x09, + 0x06, 0x16, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x19, 0x01, 0x12, 0x04, 0x80, + 0x09, 0x17, 0x2a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x19, 0x03, 0x12, 0x04, + 0x80, 0x09, 0x2d, 0x2f, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x1a, 0x12, 0x04, + 0x81, 0x09, 0x06, 0x32, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x1a, 0x06, 0x12, + 0x04, 0x81, 0x09, 0x06, 0x17, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x1a, 0x01, + 0x12, 0x04, 0x81, 0x09, 0x18, 0x2c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x1a, + 0x03, 0x12, 0x04, 0x81, 0x09, 0x2f, 0x31, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x2f, 0x02, + 0x1b, 0x12, 0x04, 0x82, 0x09, 0x06, 0x3e, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, + 0x1b, 0x06, 0x12, 0x04, 0x82, 0x09, 0x06, 0x1d, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, + 0x02, 0x1b, 0x01, 0x12, 0x04, 0x82, 0x09, 0x1e, 0x38, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x2f, 0x02, 0x1b, 0x03, 0x12, 0x04, 0x82, 0x09, 0x3b, 0x3d, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, + 0x03, 0x2f, 0x02, 0x1c, 0x12, 0x04, 0x83, 0x09, 0x06, 0x42, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x2f, 0x02, 0x1c, 0x06, 0x12, 0x04, 0x83, 0x09, 0x06, 0x1f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x2f, 0x02, 0x1c, 0x01, 0x12, 0x04, 0x83, 0x09, 0x20, 0x3c, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x2f, 0x02, 0x1c, 0x03, 0x12, 0x04, 0x83, 0x09, 0x3f, 0x41, 0x0a, 0x0e, 0x0a, + 0x06, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x1d, 0x12, 0x04, 0x84, 0x09, 0x06, 0x46, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x1d, 0x06, 0x12, 0x04, 0x84, 0x09, 0x06, 0x21, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x1d, 0x01, 0x12, 0x04, 0x84, 0x09, 0x22, 0x40, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x1d, 0x03, 0x12, 0x04, 0x84, 0x09, 0x43, 0x45, + 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x1e, 0x12, 0x04, 0x85, 0x09, 0x06, 0x20, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x1e, 0x06, 0x12, 0x04, 0x85, 0x09, 0x06, + 0x0f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x1e, 0x01, 0x12, 0x04, 0x85, 0x09, + 0x10, 0x1a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x1e, 0x03, 0x12, 0x04, 0x85, + 0x09, 0x1d, 0x1f, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x1f, 0x12, 0x04, 0x86, + 0x09, 0x06, 0x33, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x1f, 0x06, 0x12, 0x04, + 0x86, 0x09, 0x06, 0x18, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x1f, 0x01, 0x12, + 0x04, 0x86, 0x09, 0x19, 0x2d, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x1f, 0x03, + 0x12, 0x04, 0x86, 0x09, 0x30, 0x32, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x20, + 0x12, 0x04, 0x87, 0x09, 0x06, 0x31, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x20, + 0x06, 0x12, 0x04, 0x87, 0x09, 0x06, 0x17, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, + 0x20, 0x01, 0x12, 0x04, 0x87, 0x09, 0x18, 0x2b, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, + 0x02, 0x20, 0x03, 0x12, 0x04, 0x87, 0x09, 0x2e, 0x30, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, + 0x2f, 0x02, 0x21, 0x12, 0x04, 0x88, 0x09, 0x06, 0x45, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x2f, 0x02, 0x21, 0x06, 0x12, 0x04, 0x88, 0x09, 0x06, 0x20, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x2f, 0x02, 0x21, 0x01, 0x12, 0x04, 0x88, 0x09, 0x21, 0x3f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x2f, 0x02, 0x21, 0x03, 0x12, 0x04, 0x88, 0x09, 0x42, 0x44, 0x0a, 0x0e, 0x0a, 0x06, + 0x04, 0x00, 0x03, 0x2f, 0x02, 0x22, 0x12, 0x04, 0x89, 0x09, 0x06, 0x3a, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x2f, 0x02, 0x22, 0x06, 0x12, 0x04, 0x89, 0x09, 0x06, 0x1b, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x22, 0x01, 0x12, 0x04, 0x89, 0x09, 0x1c, 0x34, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x22, 0x03, 0x12, 0x04, 0x89, 0x09, 0x37, 0x39, 0x0a, + 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x23, 0x12, 0x04, 0x8a, 0x09, 0x06, 0x29, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x23, 0x06, 0x12, 0x04, 0x8a, 0x09, 0x06, 0x13, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x23, 0x01, 0x12, 0x04, 0x8a, 0x09, 0x14, + 0x23, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x23, 0x03, 0x12, 0x04, 0x8a, 0x09, + 0x26, 0x28, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x24, 0x12, 0x04, 0x8b, 0x09, + 0x06, 0x1c, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x24, 0x06, 0x12, 0x04, 0x8b, + 0x09, 0x06, 0x0d, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x24, 0x01, 0x12, 0x04, + 0x8b, 0x09, 0x0e, 0x16, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x24, 0x03, 0x12, + 0x04, 0x8b, 0x09, 0x19, 0x1b, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x25, 0x12, + 0x04, 0x8c, 0x09, 0x06, 0x35, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x25, 0x06, + 0x12, 0x04, 0x8c, 0x09, 0x06, 0x19, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x25, + 0x01, 0x12, 0x04, 0x8c, 0x09, 0x1a, 0x2f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, + 0x25, 0x03, 0x12, 0x04, 0x8c, 0x09, 0x32, 0x34, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x2f, + 0x02, 0x26, 0x12, 0x04, 0x8d, 0x09, 0x06, 0x1e, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, + 0x02, 0x26, 0x06, 0x12, 0x04, 0x8d, 0x09, 0x06, 0x0e, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x2f, 0x02, 0x26, 0x01, 0x12, 0x04, 0x8d, 0x09, 0x0f, 0x18, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x2f, 0x02, 0x26, 0x03, 0x12, 0x04, 0x8d, 0x09, 0x1b, 0x1d, 0x0a, 0x0e, 0x0a, 0x06, 0x04, + 0x00, 0x03, 0x2f, 0x02, 0x27, 0x12, 0x04, 0x8e, 0x09, 0x06, 0x1e, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x2f, 0x02, 0x27, 0x06, 0x12, 0x04, 0x8e, 0x09, 0x06, 0x0e, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x2f, 0x02, 0x27, 0x01, 0x12, 0x04, 0x8e, 0x09, 0x0f, 0x18, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x27, 0x03, 0x12, 0x04, 0x8e, 0x09, 0x1b, 0x1d, 0x0a, 0x0e, + 0x0a, 0x06, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x28, 0x12, 0x04, 0x8f, 0x09, 0x06, 0x2a, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x28, 0x06, 0x12, 0x04, 0x8f, 0x09, 0x06, 0x14, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x28, 0x01, 0x12, 0x04, 0x8f, 0x09, 0x15, 0x24, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x28, 0x03, 0x12, 0x04, 0x8f, 0x09, 0x27, + 0x29, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x29, 0x12, 0x04, 0x90, 0x09, 0x06, + 0x20, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x29, 0x06, 0x12, 0x04, 0x90, 0x09, + 0x06, 0x0f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x29, 0x01, 0x12, 0x04, 0x90, + 0x09, 0x10, 0x1a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x29, 0x03, 0x12, 0x04, + 0x90, 0x09, 0x1d, 0x1f, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x2a, 0x12, 0x04, + 0x91, 0x09, 0x06, 0x20, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x2a, 0x06, 0x12, + 0x04, 0x91, 0x09, 0x06, 0x0f, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x2a, 0x01, + 0x12, 0x04, 0x91, 0x09, 0x10, 0x1a, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x2a, + 0x03, 0x12, 0x04, 0x91, 0x09, 0x1d, 0x1f, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x2f, 0x02, + 0x2b, 0x12, 0x04, 0x92, 0x09, 0x06, 0x24, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, + 0x2b, 0x06, 0x12, 0x04, 0x92, 0x09, 0x06, 0x11, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, + 0x02, 0x2b, 0x01, 0x12, 0x04, 0x92, 0x09, 0x12, 0x1e, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, + 0x2f, 0x02, 0x2b, 0x03, 0x12, 0x04, 0x92, 0x09, 0x21, 0x23, 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, + 0x03, 0x2f, 0x02, 0x2c, 0x12, 0x04, 0x93, 0x09, 0x06, 0x36, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, + 0x03, 0x2f, 0x02, 0x2c, 0x06, 0x12, 0x04, 0x93, 0x09, 0x06, 0x19, 0x0a, 0x0f, 0x0a, 0x07, 0x04, + 0x00, 0x03, 0x2f, 0x02, 0x2c, 0x01, 0x12, 0x04, 0x93, 0x09, 0x1a, 0x30, 0x0a, 0x0f, 0x0a, 0x07, + 0x04, 0x00, 0x03, 0x2f, 0x02, 0x2c, 0x03, 0x12, 0x04, 0x93, 0x09, 0x33, 0x35, 0x0a, 0x0e, 0x0a, + 0x06, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x2d, 0x12, 0x04, 0x94, 0x09, 0x06, 0x27, 0x0a, 0x0f, 0x0a, + 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x2d, 0x06, 0x12, 0x04, 0x94, 0x09, 0x06, 0x12, 0x0a, 0x0f, + 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x2d, 0x01, 0x12, 0x04, 0x94, 0x09, 0x13, 0x21, 0x0a, + 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x2d, 0x03, 0x12, 0x04, 0x94, 0x09, 0x24, 0x26, + 0x0a, 0x0e, 0x0a, 0x06, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x2e, 0x12, 0x04, 0x95, 0x09, 0x06, 0x2d, + 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x2e, 0x06, 0x12, 0x04, 0x95, 0x09, 0x06, + 0x15, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x2e, 0x01, 0x12, 0x04, 0x95, 0x09, + 0x16, 0x27, 0x0a, 0x0f, 0x0a, 0x07, 0x04, 0x00, 0x03, 0x2f, 0x02, 0x2e, 0x03, 0x12, 0x04, 0x95, + 0x09, 0x2a, 0x2c, 0x0a, 0x42, 0x0a, 0x04, 0x04, 0x00, 0x02, 0x00, 0x12, 0x04, 0x99, 0x09, 0x02, + 0x1a, 0x1a, 0x34, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x65, 0x72, 0x66, 0x6f, + 0x72, 0x6d, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x4f, 0x72, 0x61, 0x63, + 0x6c, 0x65, 0x4a, 0x6f, 0x62, 0x2e, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x02, 0x00, 0x04, + 0x12, 0x04, 0x99, 0x09, 0x02, 0x0a, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x02, 0x00, 0x06, 0x12, + 0x04, 0x99, 0x09, 0x0b, 0x0f, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x02, 0x00, 0x01, 0x12, 0x04, + 0x99, 0x09, 0x10, 0x15, 0x0a, 0x0d, 0x0a, 0x05, 0x04, 0x00, 0x02, 0x00, 0x03, 0x12, 0x04, 0x99, + 0x09, 0x18, 0x19, +]; +include!("oracle_job.serde.rs"); +// @@protoc_insertion_point(module) diff --git a/rust/switchboard-on-demand-client/src/oracle_job.serde.rs b/rust/switchboard-on-demand-client/src/oracle_job.serde.rs new file mode 100644 index 0000000..dda7915 --- /dev/null +++ b/rust/switchboard-on-demand-client/src/oracle_job.serde.rs @@ -0,0 +1,8611 @@ +// @generated +impl serde::Serialize for OracleJob { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if !self.tasks.is_empty() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob", len)?; + if !self.tasks.is_empty() { + struct_ser.serialize_field("tasks", &self.tasks)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for OracleJob { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "tasks", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Tasks, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "tasks" => Ok(GeneratedField::Tasks), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = OracleJob; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut tasks__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Tasks => { + if tasks__.is_some() { + return Err(serde::de::Error::duplicate_field("tasks")); + } + tasks__ = Some(map_.next_value()?); + } + } + } + Ok(OracleJob { + tasks: tasks__.unwrap_or_default(), + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::AddTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.addition.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.AddTask", len)?; + if let Some(v) = self.addition.as_ref() { + match v { + oracle_job::add_task::Addition::Scalar(v) => { + struct_ser.serialize_field("scalar", v)?; + } + oracle_job::add_task::Addition::AggregatorPubkey(v) => { + struct_ser.serialize_field("aggregatorPubkey", v)?; + } + oracle_job::add_task::Addition::Job(v) => { + struct_ser.serialize_field("job", v)?; + } + oracle_job::add_task::Addition::Big(v) => { + struct_ser.serialize_field("big", v)?; + } + } + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::AddTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "scalar", + "aggregator_pubkey", + "aggregatorPubkey", + "job", + "big", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Scalar, + AggregatorPubkey, + Job, + Big, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "scalar" => Ok(GeneratedField::Scalar), + "aggregatorPubkey" | "aggregator_pubkey" => Ok(GeneratedField::AggregatorPubkey), + "job" => Ok(GeneratedField::Job), + "big" => Ok(GeneratedField::Big), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::AddTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.AddTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut addition__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Scalar => { + if addition__.is_some() { + return Err(serde::de::Error::duplicate_field("scalar")); + } + addition__ = map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| oracle_job::add_task::Addition::Scalar(x.0)); + } + GeneratedField::AggregatorPubkey => { + if addition__.is_some() { + return Err(serde::de::Error::duplicate_field("aggregatorPubkey")); + } + addition__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::add_task::Addition::AggregatorPubkey); + } + GeneratedField::Job => { + if addition__.is_some() { + return Err(serde::de::Error::duplicate_field("job")); + } + addition__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::add_task::Addition::Job) +; + } + GeneratedField::Big => { + if addition__.is_some() { + return Err(serde::de::Error::duplicate_field("big")); + } + addition__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::add_task::Addition::Big); + } + } + } + Ok(oracle_job::AddTask { + addition: addition__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.AddTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::AnchorFetchTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.program_id.is_some() { + len += 1; + } + if self.account_address.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.AnchorFetchTask", len)?; + if let Some(v) = self.program_id.as_ref() { + struct_ser.serialize_field("programId", v)?; + } + if let Some(v) = self.account_address.as_ref() { + struct_ser.serialize_field("accountAddress", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::AnchorFetchTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "program_id", + "programId", + "account_address", + "accountAddress", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + ProgramId, + AccountAddress, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "programId" | "program_id" => Ok(GeneratedField::ProgramId), + "accountAddress" | "account_address" => Ok(GeneratedField::AccountAddress), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::AnchorFetchTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.AnchorFetchTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut program_id__ = None; + let mut account_address__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::ProgramId => { + if program_id__.is_some() { + return Err(serde::de::Error::duplicate_field("programId")); + } + program_id__ = map_.next_value()?; + } + GeneratedField::AccountAddress => { + if account_address__.is_some() { + return Err(serde::de::Error::duplicate_field("accountAddress")); + } + account_address__ = map_.next_value()?; + } + } + } + Ok(oracle_job::AnchorFetchTask { + program_id: program_id__, + account_address: account_address__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.AnchorFetchTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::BoundTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.lower_bound.is_some() { + len += 1; + } + if self.lower_bound_value.is_some() { + len += 1; + } + if self.upper_bound.is_some() { + len += 1; + } + if self.upper_bound_value.is_some() { + len += 1; + } + if self.on_exceeds_upper_bound.is_some() { + len += 1; + } + if self.on_exceeds_upper_bound_value.is_some() { + len += 1; + } + if self.on_exceeds_lower_bound.is_some() { + len += 1; + } + if self.on_exceeds_lower_bound_value.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.BoundTask", len)?; + if let Some(v) = self.lower_bound.as_ref() { + struct_ser.serialize_field("lowerBound", v)?; + } + if let Some(v) = self.lower_bound_value.as_ref() { + struct_ser.serialize_field("lowerBoundValue", v)?; + } + if let Some(v) = self.upper_bound.as_ref() { + struct_ser.serialize_field("upperBound", v)?; + } + if let Some(v) = self.upper_bound_value.as_ref() { + struct_ser.serialize_field("upperBoundValue", v)?; + } + if let Some(v) = self.on_exceeds_upper_bound.as_ref() { + struct_ser.serialize_field("onExceedsUpperBound", v)?; + } + if let Some(v) = self.on_exceeds_upper_bound_value.as_ref() { + struct_ser.serialize_field("onExceedsUpperBoundValue", v)?; + } + if let Some(v) = self.on_exceeds_lower_bound.as_ref() { + struct_ser.serialize_field("onExceedsLowerBound", v)?; + } + if let Some(v) = self.on_exceeds_lower_bound_value.as_ref() { + struct_ser.serialize_field("onExceedsLowerBoundValue", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::BoundTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "lower_bound", + "lowerBound", + "lower_bound_value", + "lowerBoundValue", + "upper_bound", + "upperBound", + "upper_bound_value", + "upperBoundValue", + "on_exceeds_upper_bound", + "onExceedsUpperBound", + "on_exceeds_upper_bound_value", + "onExceedsUpperBoundValue", + "on_exceeds_lower_bound", + "onExceedsLowerBound", + "on_exceeds_lower_bound_value", + "onExceedsLowerBoundValue", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + LowerBound, + LowerBoundValue, + UpperBound, + UpperBoundValue, + OnExceedsUpperBound, + OnExceedsUpperBoundValue, + OnExceedsLowerBound, + OnExceedsLowerBoundValue, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "lowerBound" | "lower_bound" => Ok(GeneratedField::LowerBound), + "lowerBoundValue" | "lower_bound_value" => Ok(GeneratedField::LowerBoundValue), + "upperBound" | "upper_bound" => Ok(GeneratedField::UpperBound), + "upperBoundValue" | "upper_bound_value" => Ok(GeneratedField::UpperBoundValue), + "onExceedsUpperBound" | "on_exceeds_upper_bound" => Ok(GeneratedField::OnExceedsUpperBound), + "onExceedsUpperBoundValue" | "on_exceeds_upper_bound_value" => Ok(GeneratedField::OnExceedsUpperBoundValue), + "onExceedsLowerBound" | "on_exceeds_lower_bound" => Ok(GeneratedField::OnExceedsLowerBound), + "onExceedsLowerBoundValue" | "on_exceeds_lower_bound_value" => Ok(GeneratedField::OnExceedsLowerBoundValue), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::BoundTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.BoundTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut lower_bound__ = None; + let mut lower_bound_value__ = None; + let mut upper_bound__ = None; + let mut upper_bound_value__ = None; + let mut on_exceeds_upper_bound__ = None; + let mut on_exceeds_upper_bound_value__ = None; + let mut on_exceeds_lower_bound__ = None; + let mut on_exceeds_lower_bound_value__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::LowerBound => { + if lower_bound__.is_some() { + return Err(serde::de::Error::duplicate_field("lowerBound")); + } + lower_bound__ = map_.next_value()?; + } + GeneratedField::LowerBoundValue => { + if lower_bound_value__.is_some() { + return Err(serde::de::Error::duplicate_field("lowerBoundValue")); + } + lower_bound_value__ = map_.next_value()?; + } + GeneratedField::UpperBound => { + if upper_bound__.is_some() { + return Err(serde::de::Error::duplicate_field("upperBound")); + } + upper_bound__ = map_.next_value()?; + } + GeneratedField::UpperBoundValue => { + if upper_bound_value__.is_some() { + return Err(serde::de::Error::duplicate_field("upperBoundValue")); + } + upper_bound_value__ = map_.next_value()?; + } + GeneratedField::OnExceedsUpperBound => { + if on_exceeds_upper_bound__.is_some() { + return Err(serde::de::Error::duplicate_field("onExceedsUpperBound")); + } + on_exceeds_upper_bound__ = map_.next_value()?; + } + GeneratedField::OnExceedsUpperBoundValue => { + if on_exceeds_upper_bound_value__.is_some() { + return Err(serde::de::Error::duplicate_field("onExceedsUpperBoundValue")); + } + on_exceeds_upper_bound_value__ = map_.next_value()?; + } + GeneratedField::OnExceedsLowerBound => { + if on_exceeds_lower_bound__.is_some() { + return Err(serde::de::Error::duplicate_field("onExceedsLowerBound")); + } + on_exceeds_lower_bound__ = map_.next_value()?; + } + GeneratedField::OnExceedsLowerBoundValue => { + if on_exceeds_lower_bound_value__.is_some() { + return Err(serde::de::Error::duplicate_field("onExceedsLowerBoundValue")); + } + on_exceeds_lower_bound_value__ = map_.next_value()?; + } + } + } + Ok(oracle_job::BoundTask { + lower_bound: lower_bound__, + lower_bound_value: lower_bound_value__, + upper_bound: upper_bound__, + upper_bound_value: upper_bound_value__, + on_exceeds_upper_bound: on_exceeds_upper_bound__, + on_exceeds_upper_bound_value: on_exceeds_upper_bound_value__, + on_exceeds_lower_bound: on_exceeds_lower_bound__, + on_exceeds_lower_bound_value: on_exceeds_lower_bound_value__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.BoundTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::BufferLayoutParseTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.offset.is_some() { + len += 1; + } + if self.endian.is_some() { + len += 1; + } + if self.r#type.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.BufferLayoutParseTask", len)?; + if let Some(v) = self.offset.as_ref() { + struct_ser.serialize_field("offset", v)?; + } + if let Some(v) = self.endian.as_ref() { + let v = oracle_job::buffer_layout_parse_task::Endian::try_from(*v) + .map_err(|_| serde::ser::Error::custom(format!("Invalid variant {}", *v)))?; + struct_ser.serialize_field("endian", &v)?; + } + if let Some(v) = self.r#type.as_ref() { + let v = oracle_job::buffer_layout_parse_task::BufferParseType::try_from(*v) + .map_err(|_| serde::ser::Error::custom(format!("Invalid variant {}", *v)))?; + struct_ser.serialize_field("type", &v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::BufferLayoutParseTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "offset", + "endian", + "type", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Offset, + Endian, + Type, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "offset" => Ok(GeneratedField::Offset), + "endian" => Ok(GeneratedField::Endian), + "type" => Ok(GeneratedField::Type), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::BufferLayoutParseTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.BufferLayoutParseTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut offset__ = None; + let mut endian__ = None; + let mut r#type__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Offset => { + if offset__.is_some() { + return Err(serde::de::Error::duplicate_field("offset")); + } + offset__ = + map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| x.0) + ; + } + GeneratedField::Endian => { + if endian__.is_some() { + return Err(serde::de::Error::duplicate_field("endian")); + } + endian__ = map_.next_value::<::std::option::Option>()?.map(|x| x as i32); + } + GeneratedField::Type => { + if r#type__.is_some() { + return Err(serde::de::Error::duplicate_field("type")); + } + r#type__ = map_.next_value::<::std::option::Option>()?.map(|x| x as i32); + } + } + } + Ok(oracle_job::BufferLayoutParseTask { + offset: offset__, + endian: endian__, + r#type: r#type__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.BufferLayoutParseTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::buffer_layout_parse_task::BufferParseType { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + let variant = match self { + Self::Pubkey => "pubkey", + Self::Bool => "bool", + Self::U8 => "u8", + Self::I8 => "i8", + Self::U16 => "u16", + Self::I16 => "i16", + Self::U32 => "u32", + Self::I32 => "i32", + Self::F32 => "f32", + Self::U64 => "u64", + Self::I64 => "i64", + Self::F64 => "f64", + Self::U128 => "u128", + Self::I128 => "i128", + }; + serializer.serialize_str(variant) + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::buffer_layout_parse_task::BufferParseType { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "pubkey", + "bool", + "u8", + "i8", + "u16", + "i16", + "u32", + "i32", + "f32", + "u64", + "i64", + "f64", + "u128", + "i128", + ]; + + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::buffer_layout_parse_task::BufferParseType; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + fn visit_i64(self, v: i64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Signed(v), &self) + }) + } + + fn visit_u64(self, v: u64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Unsigned(v), &self) + }) + } + + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "pubkey" => Ok(oracle_job::buffer_layout_parse_task::BufferParseType::Pubkey), + "bool" => Ok(oracle_job::buffer_layout_parse_task::BufferParseType::Bool), + "u8" => Ok(oracle_job::buffer_layout_parse_task::BufferParseType::U8), + "i8" => Ok(oracle_job::buffer_layout_parse_task::BufferParseType::I8), + "u16" => Ok(oracle_job::buffer_layout_parse_task::BufferParseType::U16), + "i16" => Ok(oracle_job::buffer_layout_parse_task::BufferParseType::I16), + "u32" => Ok(oracle_job::buffer_layout_parse_task::BufferParseType::U32), + "i32" => Ok(oracle_job::buffer_layout_parse_task::BufferParseType::I32), + "f32" => Ok(oracle_job::buffer_layout_parse_task::BufferParseType::F32), + "u64" => Ok(oracle_job::buffer_layout_parse_task::BufferParseType::U64), + "i64" => Ok(oracle_job::buffer_layout_parse_task::BufferParseType::I64), + "f64" => Ok(oracle_job::buffer_layout_parse_task::BufferParseType::F64), + "u128" => Ok(oracle_job::buffer_layout_parse_task::BufferParseType::U128), + "i128" => Ok(oracle_job::buffer_layout_parse_task::BufferParseType::I128), + _ => Err(serde::de::Error::unknown_variant(value, FIELDS)), + } + } + } + deserializer.deserialize_any(GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::buffer_layout_parse_task::Endian { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + let variant = match self { + Self::LittleEndian => "LITTLE_ENDIAN", + Self::BigEndian => "BIG_ENDIAN", + }; + serializer.serialize_str(variant) + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::buffer_layout_parse_task::Endian { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "LITTLE_ENDIAN", + "BIG_ENDIAN", + ]; + + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::buffer_layout_parse_task::Endian; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + fn visit_i64(self, v: i64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Signed(v), &self) + }) + } + + fn visit_u64(self, v: u64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Unsigned(v), &self) + }) + } + + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "LITTLE_ENDIAN" => Ok(oracle_job::buffer_layout_parse_task::Endian::LittleEndian), + "BIG_ENDIAN" => Ok(oracle_job::buffer_layout_parse_task::Endian::BigEndian), + _ => Err(serde::de::Error::unknown_variant(value, FIELDS)), + } + } + } + deserializer.deserialize_any(GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::CacheTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if !self.cache_items.is_empty() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.CacheTask", len)?; + if !self.cache_items.is_empty() { + struct_ser.serialize_field("cacheItems", &self.cache_items)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::CacheTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "cache_items", + "cacheItems", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + CacheItems, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "cacheItems" | "cache_items" => Ok(GeneratedField::CacheItems), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::CacheTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.CacheTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut cache_items__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::CacheItems => { + if cache_items__.is_some() { + return Err(serde::de::Error::duplicate_field("cacheItems")); + } + cache_items__ = Some(map_.next_value()?); + } + } + } + Ok(oracle_job::CacheTask { + cache_items: cache_items__.unwrap_or_default(), + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.CacheTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::cache_task::CacheItem { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.variable_name.is_some() { + len += 1; + } + if self.job.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.CacheTask.CacheItem", len)?; + if let Some(v) = self.variable_name.as_ref() { + struct_ser.serialize_field("variableName", v)?; + } + if let Some(v) = self.job.as_ref() { + struct_ser.serialize_field("job", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::cache_task::CacheItem { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "variable_name", + "variableName", + "job", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + VariableName, + Job, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "variableName" | "variable_name" => Ok(GeneratedField::VariableName), + "job" => Ok(GeneratedField::Job), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::cache_task::CacheItem; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.CacheTask.CacheItem") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut variable_name__ = None; + let mut job__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::VariableName => { + if variable_name__.is_some() { + return Err(serde::de::Error::duplicate_field("variableName")); + } + variable_name__ = map_.next_value()?; + } + GeneratedField::Job => { + if job__.is_some() { + return Err(serde::de::Error::duplicate_field("job")); + } + job__ = map_.next_value()?; + } + } + } + Ok(oracle_job::cache_task::CacheItem { + variable_name: variable_name__, + job: job__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.CacheTask.CacheItem", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::ComparisonTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.op.is_some() { + len += 1; + } + if self.on_true.is_some() { + len += 1; + } + if self.on_true_value.is_some() { + len += 1; + } + if self.on_false.is_some() { + len += 1; + } + if self.on_false_value.is_some() { + len += 1; + } + if self.on_failure.is_some() { + len += 1; + } + if self.on_failure_value.is_some() { + len += 1; + } + if self.lhs.is_some() { + len += 1; + } + if self.rhs.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.ComparisonTask", len)?; + if let Some(v) = self.op.as_ref() { + let v = oracle_job::comparison_task::Operation::try_from(*v) + .map_err(|_| serde::ser::Error::custom(format!("Invalid variant {}", *v)))?; + struct_ser.serialize_field("op", &v)?; + } + if let Some(v) = self.on_true.as_ref() { + struct_ser.serialize_field("onTrue", v)?; + } + if let Some(v) = self.on_true_value.as_ref() { + struct_ser.serialize_field("onTrueValue", v)?; + } + if let Some(v) = self.on_false.as_ref() { + struct_ser.serialize_field("onFalse", v)?; + } + if let Some(v) = self.on_false_value.as_ref() { + struct_ser.serialize_field("onFalseValue", v)?; + } + if let Some(v) = self.on_failure.as_ref() { + struct_ser.serialize_field("onFailure", v)?; + } + if let Some(v) = self.on_failure_value.as_ref() { + struct_ser.serialize_field("onFailureValue", v)?; + } + if let Some(v) = self.lhs.as_ref() { + match v { + oracle_job::comparison_task::Lhs::Lhs(v) => { + struct_ser.serialize_field("lhs", v)?; + } + oracle_job::comparison_task::Lhs::LhsValue(v) => { + struct_ser.serialize_field("lhsValue", v)?; + } + } + } + if let Some(v) = self.rhs.as_ref() { + match v { + oracle_job::comparison_task::Rhs::Rhs(v) => { + struct_ser.serialize_field("rhs", v)?; + } + oracle_job::comparison_task::Rhs::RhsValue(v) => { + struct_ser.serialize_field("rhsValue", v)?; + } + } + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::ComparisonTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "op", + "on_true", + "onTrue", + "on_true_value", + "onTrueValue", + "on_false", + "onFalse", + "on_false_value", + "onFalseValue", + "on_failure", + "onFailure", + "on_failure_value", + "onFailureValue", + "lhs", + "lhs_value", + "lhsValue", + "rhs", + "rhs_value", + "rhsValue", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Op, + OnTrue, + OnTrueValue, + OnFalse, + OnFalseValue, + OnFailure, + OnFailureValue, + Lhs, + LhsValue, + Rhs, + RhsValue, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "op" => Ok(GeneratedField::Op), + "onTrue" | "on_true" => Ok(GeneratedField::OnTrue), + "onTrueValue" | "on_true_value" => Ok(GeneratedField::OnTrueValue), + "onFalse" | "on_false" => Ok(GeneratedField::OnFalse), + "onFalseValue" | "on_false_value" => Ok(GeneratedField::OnFalseValue), + "onFailure" | "on_failure" => Ok(GeneratedField::OnFailure), + "onFailureValue" | "on_failure_value" => Ok(GeneratedField::OnFailureValue), + "lhs" => Ok(GeneratedField::Lhs), + "lhsValue" | "lhs_value" => Ok(GeneratedField::LhsValue), + "rhs" => Ok(GeneratedField::Rhs), + "rhsValue" | "rhs_value" => Ok(GeneratedField::RhsValue), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::ComparisonTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.ComparisonTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut op__ = None; + let mut on_true__ = None; + let mut on_true_value__ = None; + let mut on_false__ = None; + let mut on_false_value__ = None; + let mut on_failure__ = None; + let mut on_failure_value__ = None; + let mut lhs__ = None; + let mut rhs__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Op => { + if op__.is_some() { + return Err(serde::de::Error::duplicate_field("op")); + } + op__ = map_.next_value::<::std::option::Option>()?.map(|x| x as i32); + } + GeneratedField::OnTrue => { + if on_true__.is_some() { + return Err(serde::de::Error::duplicate_field("onTrue")); + } + on_true__ = map_.next_value()?; + } + GeneratedField::OnTrueValue => { + if on_true_value__.is_some() { + return Err(serde::de::Error::duplicate_field("onTrueValue")); + } + on_true_value__ = map_.next_value()?; + } + GeneratedField::OnFalse => { + if on_false__.is_some() { + return Err(serde::de::Error::duplicate_field("onFalse")); + } + on_false__ = map_.next_value()?; + } + GeneratedField::OnFalseValue => { + if on_false_value__.is_some() { + return Err(serde::de::Error::duplicate_field("onFalseValue")); + } + on_false_value__ = map_.next_value()?; + } + GeneratedField::OnFailure => { + if on_failure__.is_some() { + return Err(serde::de::Error::duplicate_field("onFailure")); + } + on_failure__ = map_.next_value()?; + } + GeneratedField::OnFailureValue => { + if on_failure_value__.is_some() { + return Err(serde::de::Error::duplicate_field("onFailureValue")); + } + on_failure_value__ = map_.next_value()?; + } + GeneratedField::Lhs => { + if lhs__.is_some() { + return Err(serde::de::Error::duplicate_field("lhs")); + } + lhs__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::comparison_task::Lhs::Lhs) +; + } + GeneratedField::LhsValue => { + if lhs__.is_some() { + return Err(serde::de::Error::duplicate_field("lhsValue")); + } + lhs__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::comparison_task::Lhs::LhsValue); + } + GeneratedField::Rhs => { + if rhs__.is_some() { + return Err(serde::de::Error::duplicate_field("rhs")); + } + rhs__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::comparison_task::Rhs::Rhs) +; + } + GeneratedField::RhsValue => { + if rhs__.is_some() { + return Err(serde::de::Error::duplicate_field("rhsValue")); + } + rhs__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::comparison_task::Rhs::RhsValue); + } + } + } + Ok(oracle_job::ComparisonTask { + op: op__, + on_true: on_true__, + on_true_value: on_true_value__, + on_false: on_false__, + on_false_value: on_false_value__, + on_failure: on_failure__, + on_failure_value: on_failure_value__, + lhs: lhs__, + rhs: rhs__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.ComparisonTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::comparison_task::Operation { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + let variant = match self { + Self::Eq => "OPERATION_EQ", + Self::Gt => "OPERATION_GT", + Self::Lt => "OPERATION_LT", + }; + serializer.serialize_str(variant) + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::comparison_task::Operation { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "OPERATION_EQ", + "OPERATION_GT", + "OPERATION_LT", + ]; + + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::comparison_task::Operation; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + fn visit_i64(self, v: i64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Signed(v), &self) + }) + } + + fn visit_u64(self, v: u64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Unsigned(v), &self) + }) + } + + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "OPERATION_EQ" => Ok(oracle_job::comparison_task::Operation::Eq), + "OPERATION_GT" => Ok(oracle_job::comparison_task::Operation::Gt), + "OPERATION_LT" => Ok(oracle_job::comparison_task::Operation::Lt), + _ => Err(serde::de::Error::unknown_variant(value, FIELDS)), + } + } + } + deserializer.deserialize_any(GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::ConditionalTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if !self.attempt.is_empty() { + len += 1; + } + if !self.on_failure.is_empty() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.ConditionalTask", len)?; + if !self.attempt.is_empty() { + struct_ser.serialize_field("attempt", &self.attempt)?; + } + if !self.on_failure.is_empty() { + struct_ser.serialize_field("onFailure", &self.on_failure)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::ConditionalTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "attempt", + "on_failure", + "onFailure", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Attempt, + OnFailure, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "attempt" => Ok(GeneratedField::Attempt), + "onFailure" | "on_failure" => Ok(GeneratedField::OnFailure), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::ConditionalTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.ConditionalTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut attempt__ = None; + let mut on_failure__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Attempt => { + if attempt__.is_some() { + return Err(serde::de::Error::duplicate_field("attempt")); + } + attempt__ = Some(map_.next_value()?); + } + GeneratedField::OnFailure => { + if on_failure__.is_some() { + return Err(serde::de::Error::duplicate_field("onFailure")); + } + on_failure__ = Some(map_.next_value()?); + } + } + } + Ok(oracle_job::ConditionalTask { + attempt: attempt__.unwrap_or_default(), + on_failure: on_failure__.unwrap_or_default(), + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.ConditionalTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::CronParseTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.cron_pattern.is_some() { + len += 1; + } + if self.clock_offset.is_some() { + len += 1; + } + if self.clock.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.CronParseTask", len)?; + if let Some(v) = self.cron_pattern.as_ref() { + struct_ser.serialize_field("cronPattern", v)?; + } + if let Some(v) = self.clock_offset.as_ref() { + struct_ser.serialize_field("clockOffset", v)?; + } + if let Some(v) = self.clock.as_ref() { + let v = oracle_job::cron_parse_task::ClockType::try_from(*v) + .map_err(|_| serde::ser::Error::custom(format!("Invalid variant {}", *v)))?; + struct_ser.serialize_field("clock", &v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::CronParseTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "cron_pattern", + "cronPattern", + "clock_offset", + "clockOffset", + "clock", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + CronPattern, + ClockOffset, + Clock, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "cronPattern" | "cron_pattern" => Ok(GeneratedField::CronPattern), + "clockOffset" | "clock_offset" => Ok(GeneratedField::ClockOffset), + "clock" => Ok(GeneratedField::Clock), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::CronParseTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.CronParseTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut cron_pattern__ = None; + let mut clock_offset__ = None; + let mut clock__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::CronPattern => { + if cron_pattern__.is_some() { + return Err(serde::de::Error::duplicate_field("cronPattern")); + } + cron_pattern__ = map_.next_value()?; + } + GeneratedField::ClockOffset => { + if clock_offset__.is_some() { + return Err(serde::de::Error::duplicate_field("clockOffset")); + } + clock_offset__ = + map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| x.0) + ; + } + GeneratedField::Clock => { + if clock__.is_some() { + return Err(serde::de::Error::duplicate_field("clock")); + } + clock__ = map_.next_value::<::std::option::Option>()?.map(|x| x as i32); + } + } + } + Ok(oracle_job::CronParseTask { + cron_pattern: cron_pattern__, + clock_offset: clock_offset__, + clock: clock__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.CronParseTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::cron_parse_task::ClockType { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + let variant = match self { + Self::Oracle => "ORACLE", + Self::Sysclock => "SYSCLOCK", + }; + serializer.serialize_str(variant) + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::cron_parse_task::ClockType { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "ORACLE", + "SYSCLOCK", + ]; + + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::cron_parse_task::ClockType; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + fn visit_i64(self, v: i64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Signed(v), &self) + }) + } + + fn visit_u64(self, v: u64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Unsigned(v), &self) + }) + } + + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "ORACLE" => Ok(oracle_job::cron_parse_task::ClockType::Oracle), + "SYSCLOCK" => Ok(oracle_job::cron_parse_task::ClockType::Sysclock), + _ => Err(serde::de::Error::unknown_variant(value, FIELDS)), + } + } + } + deserializer.deserialize_any(GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::DivideTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.denominator.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.DivideTask", len)?; + if let Some(v) = self.denominator.as_ref() { + match v { + oracle_job::divide_task::Denominator::Scalar(v) => { + struct_ser.serialize_field("scalar", v)?; + } + oracle_job::divide_task::Denominator::AggregatorPubkey(v) => { + struct_ser.serialize_field("aggregatorPubkey", v)?; + } + oracle_job::divide_task::Denominator::Job(v) => { + struct_ser.serialize_field("job", v)?; + } + oracle_job::divide_task::Denominator::Big(v) => { + struct_ser.serialize_field("big", v)?; + } + } + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::DivideTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "scalar", + "aggregator_pubkey", + "aggregatorPubkey", + "job", + "big", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Scalar, + AggregatorPubkey, + Job, + Big, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "scalar" => Ok(GeneratedField::Scalar), + "aggregatorPubkey" | "aggregator_pubkey" => Ok(GeneratedField::AggregatorPubkey), + "job" => Ok(GeneratedField::Job), + "big" => Ok(GeneratedField::Big), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::DivideTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.DivideTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut denominator__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Scalar => { + if denominator__.is_some() { + return Err(serde::de::Error::duplicate_field("scalar")); + } + denominator__ = map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| oracle_job::divide_task::Denominator::Scalar(x.0)); + } + GeneratedField::AggregatorPubkey => { + if denominator__.is_some() { + return Err(serde::de::Error::duplicate_field("aggregatorPubkey")); + } + denominator__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::divide_task::Denominator::AggregatorPubkey); + } + GeneratedField::Job => { + if denominator__.is_some() { + return Err(serde::de::Error::duplicate_field("job")); + } + denominator__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::divide_task::Denominator::Job) +; + } + GeneratedField::Big => { + if denominator__.is_some() { + return Err(serde::de::Error::duplicate_field("big")); + } + denominator__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::divide_task::Denominator::Big); + } + } + } + Ok(oracle_job::DivideTask { + denominator: denominator__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.DivideTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::EwmaTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.aggregator_address.is_some() { + len += 1; + } + if self.period.is_some() { + len += 1; + } + if self.lambda.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.EwmaTask", len)?; + if let Some(v) = self.aggregator_address.as_ref() { + struct_ser.serialize_field("aggregatorAddress", v)?; + } + if let Some(v) = self.period.as_ref() { + struct_ser.serialize_field("period", v)?; + } + if let Some(v) = self.lambda.as_ref() { + struct_ser.serialize_field("lambda", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::EwmaTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "aggregator_address", + "aggregatorAddress", + "period", + "lambda", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + AggregatorAddress, + Period, + Lambda, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "aggregatorAddress" | "aggregator_address" => Ok(GeneratedField::AggregatorAddress), + "period" => Ok(GeneratedField::Period), + "lambda" => Ok(GeneratedField::Lambda), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::EwmaTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.EwmaTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut aggregator_address__ = None; + let mut period__ = None; + let mut lambda__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::AggregatorAddress => { + if aggregator_address__.is_some() { + return Err(serde::de::Error::duplicate_field("aggregatorAddress")); + } + aggregator_address__ = map_.next_value()?; + } + GeneratedField::Period => { + if period__.is_some() { + return Err(serde::de::Error::duplicate_field("period")); + } + period__ = + map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| x.0) + ; + } + GeneratedField::Lambda => { + if lambda__.is_some() { + return Err(serde::de::Error::duplicate_field("lambda")); + } + lambda__ = + map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| x.0) + ; + } + } + } + Ok(oracle_job::EwmaTask { + aggregator_address: aggregator_address__, + period: period__, + lambda: lambda__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.EwmaTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::HistoryFunctionTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.method.is_some() { + len += 1; + } + if self.aggregator_address.is_some() { + len += 1; + } + if self.period.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.HistoryFunctionTask", len)?; + if let Some(v) = self.method.as_ref() { + let v = oracle_job::history_function_task::Method::try_from(*v) + .map_err(|_| serde::ser::Error::custom(format!("Invalid variant {}", *v)))?; + struct_ser.serialize_field("method", &v)?; + } + if let Some(v) = self.aggregator_address.as_ref() { + struct_ser.serialize_field("aggregatorAddress", v)?; + } + if let Some(v) = self.period.as_ref() { + struct_ser.serialize_field("period", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::HistoryFunctionTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "method", + "aggregator_address", + "aggregatorAddress", + "period", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Method, + AggregatorAddress, + Period, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "method" => Ok(GeneratedField::Method), + "aggregatorAddress" | "aggregator_address" => Ok(GeneratedField::AggregatorAddress), + "period" => Ok(GeneratedField::Period), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::HistoryFunctionTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.HistoryFunctionTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut method__ = None; + let mut aggregator_address__ = None; + let mut period__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Method => { + if method__.is_some() { + return Err(serde::de::Error::duplicate_field("method")); + } + method__ = map_.next_value::<::std::option::Option>()?.map(|x| x as i32); + } + GeneratedField::AggregatorAddress => { + if aggregator_address__.is_some() { + return Err(serde::de::Error::duplicate_field("aggregatorAddress")); + } + aggregator_address__ = map_.next_value()?; + } + GeneratedField::Period => { + if period__.is_some() { + return Err(serde::de::Error::duplicate_field("period")); + } + period__ = + map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| x.0) + ; + } + } + } + Ok(oracle_job::HistoryFunctionTask { + method: method__, + aggregator_address: aggregator_address__, + period: period__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.HistoryFunctionTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::history_function_task::Method { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + let variant = match self { + Self::Min => "METHOD_MIN", + Self::Max => "METHOD_MAX", + }; + serializer.serialize_str(variant) + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::history_function_task::Method { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "METHOD_MIN", + "METHOD_MAX", + ]; + + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::history_function_task::Method; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + fn visit_i64(self, v: i64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Signed(v), &self) + }) + } + + fn visit_u64(self, v: u64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Unsigned(v), &self) + }) + } + + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "METHOD_MIN" => Ok(oracle_job::history_function_task::Method::Min), + "METHOD_MAX" => Ok(oracle_job::history_function_task::Method::Max), + _ => Err(serde::de::Error::unknown_variant(value, FIELDS)), + } + } + } + deserializer.deserialize_any(GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::HttpTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.url.is_some() { + len += 1; + } + if self.method.is_some() { + len += 1; + } + if !self.headers.is_empty() { + len += 1; + } + if self.body.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.HttpTask", len)?; + if let Some(v) = self.url.as_ref() { + struct_ser.serialize_field("url", v)?; + } + if let Some(v) = self.method.as_ref() { + let v = oracle_job::http_task::Method::try_from(*v) + .map_err(|_| serde::ser::Error::custom(format!("Invalid variant {}", *v)))?; + struct_ser.serialize_field("method", &v)?; + } + if !self.headers.is_empty() { + struct_ser.serialize_field("headers", &self.headers)?; + } + if let Some(v) = self.body.as_ref() { + struct_ser.serialize_field("body", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::HttpTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "url", + "method", + "headers", + "body", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Url, + Method, + Headers, + Body, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "url" => Ok(GeneratedField::Url), + "method" => Ok(GeneratedField::Method), + "headers" => Ok(GeneratedField::Headers), + "body" => Ok(GeneratedField::Body), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::HttpTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.HttpTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut url__ = None; + let mut method__ = None; + let mut headers__ = None; + let mut body__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Url => { + if url__.is_some() { + return Err(serde::de::Error::duplicate_field("url")); + } + url__ = map_.next_value()?; + } + GeneratedField::Method => { + if method__.is_some() { + return Err(serde::de::Error::duplicate_field("method")); + } + method__ = map_.next_value::<::std::option::Option>()?.map(|x| x as i32); + } + GeneratedField::Headers => { + if headers__.is_some() { + return Err(serde::de::Error::duplicate_field("headers")); + } + headers__ = Some(map_.next_value()?); + } + GeneratedField::Body => { + if body__.is_some() { + return Err(serde::de::Error::duplicate_field("body")); + } + body__ = map_.next_value()?; + } + } + } + Ok(oracle_job::HttpTask { + url: url__, + method: method__, + headers: headers__.unwrap_or_default(), + body: body__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.HttpTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::http_task::Header { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.key.is_some() { + len += 1; + } + if self.value.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.HttpTask.Header", len)?; + if let Some(v) = self.key.as_ref() { + struct_ser.serialize_field("key", v)?; + } + if let Some(v) = self.value.as_ref() { + struct_ser.serialize_field("value", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::http_task::Header { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "key", + "value", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Key, + Value, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "key" => Ok(GeneratedField::Key), + "value" => Ok(GeneratedField::Value), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::http_task::Header; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.HttpTask.Header") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut key__ = None; + let mut value__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Key => { + if key__.is_some() { + return Err(serde::de::Error::duplicate_field("key")); + } + key__ = map_.next_value()?; + } + GeneratedField::Value => { + if value__.is_some() { + return Err(serde::de::Error::duplicate_field("value")); + } + value__ = map_.next_value()?; + } + } + } + Ok(oracle_job::http_task::Header { + key: key__, + value: value__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.HttpTask.Header", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::http_task::Method { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + let variant = match self { + Self::Unkown => "METHOD_UNKOWN", + Self::Get => "METHOD_GET", + Self::Post => "METHOD_POST", + }; + serializer.serialize_str(variant) + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::http_task::Method { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "METHOD_UNKOWN", + "METHOD_GET", + "METHOD_POST", + ]; + + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::http_task::Method; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + fn visit_i64(self, v: i64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Signed(v), &self) + }) + } + + fn visit_u64(self, v: u64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Unsigned(v), &self) + }) + } + + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "METHOD_UNKOWN" => Ok(oracle_job::http_task::Method::Unkown), + "METHOD_GET" => Ok(oracle_job::http_task::Method::Get), + "METHOD_POST" => Ok(oracle_job::http_task::Method::Post), + _ => Err(serde::de::Error::unknown_variant(value, FIELDS)), + } + } + } + deserializer.deserialize_any(GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::JsonParseTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.path.is_some() { + len += 1; + } + if self.aggregation_method.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.JsonParseTask", len)?; + if let Some(v) = self.path.as_ref() { + struct_ser.serialize_field("path", v)?; + } + if let Some(v) = self.aggregation_method.as_ref() { + let v = oracle_job::json_parse_task::AggregationMethod::try_from(*v) + .map_err(|_| serde::ser::Error::custom(format!("Invalid variant {}", *v)))?; + struct_ser.serialize_field("aggregationMethod", &v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::JsonParseTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "path", + "aggregation_method", + "aggregationMethod", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Path, + AggregationMethod, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "path" => Ok(GeneratedField::Path), + "aggregationMethod" | "aggregation_method" => Ok(GeneratedField::AggregationMethod), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::JsonParseTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.JsonParseTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut path__ = None; + let mut aggregation_method__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Path => { + if path__.is_some() { + return Err(serde::de::Error::duplicate_field("path")); + } + path__ = map_.next_value()?; + } + GeneratedField::AggregationMethod => { + if aggregation_method__.is_some() { + return Err(serde::de::Error::duplicate_field("aggregationMethod")); + } + aggregation_method__ = map_.next_value::<::std::option::Option>()?.map(|x| x as i32); + } + } + } + Ok(oracle_job::JsonParseTask { + path: path__, + aggregation_method: aggregation_method__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.JsonParseTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::json_parse_task::AggregationMethod { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + let variant = match self { + Self::None => "NONE", + Self::Min => "MIN", + Self::Max => "MAX", + Self::Sum => "SUM", + Self::Mean => "MEAN", + Self::Median => "MEDIAN", + }; + serializer.serialize_str(variant) + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::json_parse_task::AggregationMethod { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "NONE", + "MIN", + "MAX", + "SUM", + "MEAN", + "MEDIAN", + ]; + + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::json_parse_task::AggregationMethod; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + fn visit_i64(self, v: i64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Signed(v), &self) + }) + } + + fn visit_u64(self, v: u64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Unsigned(v), &self) + }) + } + + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "NONE" => Ok(oracle_job::json_parse_task::AggregationMethod::None), + "MIN" => Ok(oracle_job::json_parse_task::AggregationMethod::Min), + "MAX" => Ok(oracle_job::json_parse_task::AggregationMethod::Max), + "SUM" => Ok(oracle_job::json_parse_task::AggregationMethod::Sum), + "MEAN" => Ok(oracle_job::json_parse_task::AggregationMethod::Mean), + "MEDIAN" => Ok(oracle_job::json_parse_task::AggregationMethod::Median), + _ => Err(serde::de::Error::unknown_variant(value, FIELDS)), + } + } + } + deserializer.deserialize_any(GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::JupiterSwapTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.in_token_address.is_some() { + len += 1; + } + if self.out_token_address.is_some() { + len += 1; + } + if self.slippage.is_some() { + len += 1; + } + if self.routes_filters.is_some() { + len += 1; + } + if self.swap_amount.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.JupiterSwapTask", len)?; + if let Some(v) = self.in_token_address.as_ref() { + struct_ser.serialize_field("inTokenAddress", v)?; + } + if let Some(v) = self.out_token_address.as_ref() { + struct_ser.serialize_field("outTokenAddress", v)?; + } + if let Some(v) = self.slippage.as_ref() { + struct_ser.serialize_field("slippage", v)?; + } + if let Some(v) = self.routes_filters.as_ref() { + match v { + oracle_job::jupiter_swap_task::RoutesFilters::AllowList(v) => { + struct_ser.serialize_field("allowList", v)?; + } + oracle_job::jupiter_swap_task::RoutesFilters::DenyList(v) => { + struct_ser.serialize_field("denyList", v)?; + } + } + } + if let Some(v) = self.swap_amount.as_ref() { + match v { + oracle_job::jupiter_swap_task::SwapAmount::BaseAmount(v) => { + struct_ser.serialize_field("baseAmount", v)?; + } + oracle_job::jupiter_swap_task::SwapAmount::QuoteAmount(v) => { + struct_ser.serialize_field("quoteAmount", v)?; + } + oracle_job::jupiter_swap_task::SwapAmount::BaseAmountString(v) => { + struct_ser.serialize_field("baseAmountString", v)?; + } + oracle_job::jupiter_swap_task::SwapAmount::QuoteAmountString(v) => { + struct_ser.serialize_field("quoteAmountString", v)?; + } + } + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::JupiterSwapTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "in_token_address", + "inTokenAddress", + "out_token_address", + "outTokenAddress", + "slippage", + "allow_list", + "allowList", + "deny_list", + "denyList", + "base_amount", + "baseAmount", + "quote_amount", + "quoteAmount", + "base_amount_string", + "baseAmountString", + "quote_amount_string", + "quoteAmountString", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + InTokenAddress, + OutTokenAddress, + Slippage, + AllowList, + DenyList, + BaseAmount, + QuoteAmount, + BaseAmountString, + QuoteAmountString, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "inTokenAddress" | "in_token_address" => Ok(GeneratedField::InTokenAddress), + "outTokenAddress" | "out_token_address" => Ok(GeneratedField::OutTokenAddress), + "slippage" => Ok(GeneratedField::Slippage), + "allowList" | "allow_list" => Ok(GeneratedField::AllowList), + "denyList" | "deny_list" => Ok(GeneratedField::DenyList), + "baseAmount" | "base_amount" => Ok(GeneratedField::BaseAmount), + "quoteAmount" | "quote_amount" => Ok(GeneratedField::QuoteAmount), + "baseAmountString" | "base_amount_string" => Ok(GeneratedField::BaseAmountString), + "quoteAmountString" | "quote_amount_string" => Ok(GeneratedField::QuoteAmountString), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::JupiterSwapTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.JupiterSwapTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut in_token_address__ = None; + let mut out_token_address__ = None; + let mut slippage__ = None; + let mut routes_filters__ = None; + let mut swap_amount__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::InTokenAddress => { + if in_token_address__.is_some() { + return Err(serde::de::Error::duplicate_field("inTokenAddress")); + } + in_token_address__ = map_.next_value()?; + } + GeneratedField::OutTokenAddress => { + if out_token_address__.is_some() { + return Err(serde::de::Error::duplicate_field("outTokenAddress")); + } + out_token_address__ = map_.next_value()?; + } + GeneratedField::Slippage => { + if slippage__.is_some() { + return Err(serde::de::Error::duplicate_field("slippage")); + } + slippage__ = + map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| x.0) + ; + } + GeneratedField::AllowList => { + if routes_filters__.is_some() { + return Err(serde::de::Error::duplicate_field("allowList")); + } + routes_filters__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::jupiter_swap_task::RoutesFilters::AllowList) +; + } + GeneratedField::DenyList => { + if routes_filters__.is_some() { + return Err(serde::de::Error::duplicate_field("denyList")); + } + routes_filters__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::jupiter_swap_task::RoutesFilters::DenyList) +; + } + GeneratedField::BaseAmount => { + if swap_amount__.is_some() { + return Err(serde::de::Error::duplicate_field("baseAmount")); + } + swap_amount__ = map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| oracle_job::jupiter_swap_task::SwapAmount::BaseAmount(x.0)); + } + GeneratedField::QuoteAmount => { + if swap_amount__.is_some() { + return Err(serde::de::Error::duplicate_field("quoteAmount")); + } + swap_amount__ = map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| oracle_job::jupiter_swap_task::SwapAmount::QuoteAmount(x.0)); + } + GeneratedField::BaseAmountString => { + if swap_amount__.is_some() { + return Err(serde::de::Error::duplicate_field("baseAmountString")); + } + swap_amount__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::jupiter_swap_task::SwapAmount::BaseAmountString); + } + GeneratedField::QuoteAmountString => { + if swap_amount__.is_some() { + return Err(serde::de::Error::duplicate_field("quoteAmountString")); + } + swap_amount__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::jupiter_swap_task::SwapAmount::QuoteAmountString); + } + } + } + Ok(oracle_job::JupiterSwapTask { + in_token_address: in_token_address__, + out_token_address: out_token_address__, + slippage: slippage__, + routes_filters: routes_filters__, + swap_amount: swap_amount__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.JupiterSwapTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::jupiter_swap_task::FilterList { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if !self.labels.is_empty() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.JupiterSwapTask.FilterList", len)?; + if !self.labels.is_empty() { + struct_ser.serialize_field("labels", &self.labels)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::jupiter_swap_task::FilterList { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "labels", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Labels, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "labels" => Ok(GeneratedField::Labels), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::jupiter_swap_task::FilterList; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.JupiterSwapTask.FilterList") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut labels__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Labels => { + if labels__.is_some() { + return Err(serde::de::Error::duplicate_field("labels")); + } + labels__ = Some(map_.next_value()?); + } + } + } + Ok(oracle_job::jupiter_swap_task::FilterList { + labels: labels__.unwrap_or_default(), + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.JupiterSwapTask.FilterList", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::LendingRateTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.protocol.is_some() { + len += 1; + } + if self.asset_mint.is_some() { + len += 1; + } + if self.field.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.LendingRateTask", len)?; + if let Some(v) = self.protocol.as_ref() { + struct_ser.serialize_field("protocol", v)?; + } + if let Some(v) = self.asset_mint.as_ref() { + struct_ser.serialize_field("assetMint", v)?; + } + if let Some(v) = self.field.as_ref() { + let v = oracle_job::lending_rate_task::Field::try_from(*v) + .map_err(|_| serde::ser::Error::custom(format!("Invalid variant {}", *v)))?; + struct_ser.serialize_field("field", &v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::LendingRateTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "protocol", + "asset_mint", + "assetMint", + "field", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Protocol, + AssetMint, + Field, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "protocol" => Ok(GeneratedField::Protocol), + "assetMint" | "asset_mint" => Ok(GeneratedField::AssetMint), + "field" => Ok(GeneratedField::Field), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::LendingRateTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.LendingRateTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut protocol__ = None; + let mut asset_mint__ = None; + let mut field__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Protocol => { + if protocol__.is_some() { + return Err(serde::de::Error::duplicate_field("protocol")); + } + protocol__ = map_.next_value()?; + } + GeneratedField::AssetMint => { + if asset_mint__.is_some() { + return Err(serde::de::Error::duplicate_field("assetMint")); + } + asset_mint__ = map_.next_value()?; + } + GeneratedField::Field => { + if field__.is_some() { + return Err(serde::de::Error::duplicate_field("field")); + } + field__ = map_.next_value::<::std::option::Option>()?.map(|x| x as i32); + } + } + } + Ok(oracle_job::LendingRateTask { + protocol: protocol__, + asset_mint: asset_mint__, + field: field__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.LendingRateTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::lending_rate_task::Field { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + let variant = match self { + Self::DepositRate => "FIELD_DEPOSIT_RATE", + Self::BorrowRate => "FIELD_BORROW_RATE", + }; + serializer.serialize_str(variant) + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::lending_rate_task::Field { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "FIELD_DEPOSIT_RATE", + "FIELD_BORROW_RATE", + ]; + + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::lending_rate_task::Field; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + fn visit_i64(self, v: i64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Signed(v), &self) + }) + } + + fn visit_u64(self, v: u64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Unsigned(v), &self) + }) + } + + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "FIELD_DEPOSIT_RATE" => Ok(oracle_job::lending_rate_task::Field::DepositRate), + "FIELD_BORROW_RATE" => Ok(oracle_job::lending_rate_task::Field::BorrowRate), + _ => Err(serde::de::Error::unknown_variant(value, FIELDS)), + } + } + } + deserializer.deserialize_any(GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::LpExchangeRateTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.in_token_address.is_some() { + len += 1; + } + if self.out_token_address.is_some() { + len += 1; + } + if self.pool_address.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.LpExchangeRateTask", len)?; + if let Some(v) = self.in_token_address.as_ref() { + struct_ser.serialize_field("inTokenAddress", v)?; + } + if let Some(v) = self.out_token_address.as_ref() { + struct_ser.serialize_field("outTokenAddress", v)?; + } + if let Some(v) = self.pool_address.as_ref() { + match v { + oracle_job::lp_exchange_rate_task::PoolAddress::MercurialPoolAddress(v) => { + struct_ser.serialize_field("mercurialPoolAddress", v)?; + } + oracle_job::lp_exchange_rate_task::PoolAddress::SaberPoolAddress(v) => { + struct_ser.serialize_field("saberPoolAddress", v)?; + } + oracle_job::lp_exchange_rate_task::PoolAddress::OrcaPoolTokenMintAddress(v) => { + struct_ser.serialize_field("orcaPoolTokenMintAddress", v)?; + } + oracle_job::lp_exchange_rate_task::PoolAddress::RaydiumPoolAddress(v) => { + struct_ser.serialize_field("raydiumPoolAddress", v)?; + } + oracle_job::lp_exchange_rate_task::PoolAddress::OrcaPoolAddress(v) => { + struct_ser.serialize_field("orcaPoolAddress", v)?; + } + oracle_job::lp_exchange_rate_task::PoolAddress::PortReserveAddress(v) => { + struct_ser.serialize_field("portReserveAddress", v)?; + } + } + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::LpExchangeRateTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "in_token_address", + "inTokenAddress", + "out_token_address", + "outTokenAddress", + "mercurial_pool_address", + "mercurialPoolAddress", + "saber_pool_address", + "saberPoolAddress", + "orca_pool_token_mint_address", + "orcaPoolTokenMintAddress", + "raydium_pool_address", + "raydiumPoolAddress", + "orca_pool_address", + "orcaPoolAddress", + "port_reserve_address", + "portReserveAddress", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + InTokenAddress, + OutTokenAddress, + MercurialPoolAddress, + SaberPoolAddress, + OrcaPoolTokenMintAddress, + RaydiumPoolAddress, + OrcaPoolAddress, + PortReserveAddress, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "inTokenAddress" | "in_token_address" => Ok(GeneratedField::InTokenAddress), + "outTokenAddress" | "out_token_address" => Ok(GeneratedField::OutTokenAddress), + "mercurialPoolAddress" | "mercurial_pool_address" => Ok(GeneratedField::MercurialPoolAddress), + "saberPoolAddress" | "saber_pool_address" => Ok(GeneratedField::SaberPoolAddress), + "orcaPoolTokenMintAddress" | "orca_pool_token_mint_address" => Ok(GeneratedField::OrcaPoolTokenMintAddress), + "raydiumPoolAddress" | "raydium_pool_address" => Ok(GeneratedField::RaydiumPoolAddress), + "orcaPoolAddress" | "orca_pool_address" => Ok(GeneratedField::OrcaPoolAddress), + "portReserveAddress" | "port_reserve_address" => Ok(GeneratedField::PortReserveAddress), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::LpExchangeRateTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.LpExchangeRateTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut in_token_address__ = None; + let mut out_token_address__ = None; + let mut pool_address__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::InTokenAddress => { + if in_token_address__.is_some() { + return Err(serde::de::Error::duplicate_field("inTokenAddress")); + } + in_token_address__ = map_.next_value()?; + } + GeneratedField::OutTokenAddress => { + if out_token_address__.is_some() { + return Err(serde::de::Error::duplicate_field("outTokenAddress")); + } + out_token_address__ = map_.next_value()?; + } + GeneratedField::MercurialPoolAddress => { + if pool_address__.is_some() { + return Err(serde::de::Error::duplicate_field("mercurialPoolAddress")); + } + pool_address__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::lp_exchange_rate_task::PoolAddress::MercurialPoolAddress); + } + GeneratedField::SaberPoolAddress => { + if pool_address__.is_some() { + return Err(serde::de::Error::duplicate_field("saberPoolAddress")); + } + pool_address__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::lp_exchange_rate_task::PoolAddress::SaberPoolAddress); + } + GeneratedField::OrcaPoolTokenMintAddress => { + if pool_address__.is_some() { + return Err(serde::de::Error::duplicate_field("orcaPoolTokenMintAddress")); + } + pool_address__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::lp_exchange_rate_task::PoolAddress::OrcaPoolTokenMintAddress); + } + GeneratedField::RaydiumPoolAddress => { + if pool_address__.is_some() { + return Err(serde::de::Error::duplicate_field("raydiumPoolAddress")); + } + pool_address__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::lp_exchange_rate_task::PoolAddress::RaydiumPoolAddress); + } + GeneratedField::OrcaPoolAddress => { + if pool_address__.is_some() { + return Err(serde::de::Error::duplicate_field("orcaPoolAddress")); + } + pool_address__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::lp_exchange_rate_task::PoolAddress::OrcaPoolAddress); + } + GeneratedField::PortReserveAddress => { + if pool_address__.is_some() { + return Err(serde::de::Error::duplicate_field("portReserveAddress")); + } + pool_address__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::lp_exchange_rate_task::PoolAddress::PortReserveAddress); + } + } + } + Ok(oracle_job::LpExchangeRateTask { + in_token_address: in_token_address__, + out_token_address: out_token_address__, + pool_address: pool_address__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.LpExchangeRateTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::LpTokenPriceTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if !self.price_feed_addresses.is_empty() { + len += 1; + } + if !self.price_feed_jobs.is_empty() { + len += 1; + } + if self.use_fair_price.is_some() { + len += 1; + } + if self.pool_address.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.LpTokenPriceTask", len)?; + if !self.price_feed_addresses.is_empty() { + struct_ser.serialize_field("priceFeedAddresses", &self.price_feed_addresses)?; + } + if !self.price_feed_jobs.is_empty() { + struct_ser.serialize_field("priceFeedJobs", &self.price_feed_jobs)?; + } + if let Some(v) = self.use_fair_price.as_ref() { + struct_ser.serialize_field("useFairPrice", v)?; + } + if let Some(v) = self.pool_address.as_ref() { + match v { + oracle_job::lp_token_price_task::PoolAddress::MercurialPoolAddress(v) => { + struct_ser.serialize_field("mercurialPoolAddress", v)?; + } + oracle_job::lp_token_price_task::PoolAddress::SaberPoolAddress(v) => { + struct_ser.serialize_field("saberPoolAddress", v)?; + } + oracle_job::lp_token_price_task::PoolAddress::OrcaPoolAddress(v) => { + struct_ser.serialize_field("orcaPoolAddress", v)?; + } + oracle_job::lp_token_price_task::PoolAddress::RaydiumPoolAddress(v) => { + struct_ser.serialize_field("raydiumPoolAddress", v)?; + } + } + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::LpTokenPriceTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "price_feed_addresses", + "priceFeedAddresses", + "price_feed_jobs", + "priceFeedJobs", + "use_fair_price", + "useFairPrice", + "mercurial_pool_address", + "mercurialPoolAddress", + "saber_pool_address", + "saberPoolAddress", + "orca_pool_address", + "orcaPoolAddress", + "raydium_pool_address", + "raydiumPoolAddress", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + PriceFeedAddresses, + PriceFeedJobs, + UseFairPrice, + MercurialPoolAddress, + SaberPoolAddress, + OrcaPoolAddress, + RaydiumPoolAddress, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "priceFeedAddresses" | "price_feed_addresses" => Ok(GeneratedField::PriceFeedAddresses), + "priceFeedJobs" | "price_feed_jobs" => Ok(GeneratedField::PriceFeedJobs), + "useFairPrice" | "use_fair_price" => Ok(GeneratedField::UseFairPrice), + "mercurialPoolAddress" | "mercurial_pool_address" => Ok(GeneratedField::MercurialPoolAddress), + "saberPoolAddress" | "saber_pool_address" => Ok(GeneratedField::SaberPoolAddress), + "orcaPoolAddress" | "orca_pool_address" => Ok(GeneratedField::OrcaPoolAddress), + "raydiumPoolAddress" | "raydium_pool_address" => Ok(GeneratedField::RaydiumPoolAddress), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::LpTokenPriceTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.LpTokenPriceTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut price_feed_addresses__ = None; + let mut price_feed_jobs__ = None; + let mut use_fair_price__ = None; + let mut pool_address__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::PriceFeedAddresses => { + if price_feed_addresses__.is_some() { + return Err(serde::de::Error::duplicate_field("priceFeedAddresses")); + } + price_feed_addresses__ = Some(map_.next_value()?); + } + GeneratedField::PriceFeedJobs => { + if price_feed_jobs__.is_some() { + return Err(serde::de::Error::duplicate_field("priceFeedJobs")); + } + price_feed_jobs__ = Some(map_.next_value()?); + } + GeneratedField::UseFairPrice => { + if use_fair_price__.is_some() { + return Err(serde::de::Error::duplicate_field("useFairPrice")); + } + use_fair_price__ = map_.next_value()?; + } + GeneratedField::MercurialPoolAddress => { + if pool_address__.is_some() { + return Err(serde::de::Error::duplicate_field("mercurialPoolAddress")); + } + pool_address__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::lp_token_price_task::PoolAddress::MercurialPoolAddress); + } + GeneratedField::SaberPoolAddress => { + if pool_address__.is_some() { + return Err(serde::de::Error::duplicate_field("saberPoolAddress")); + } + pool_address__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::lp_token_price_task::PoolAddress::SaberPoolAddress); + } + GeneratedField::OrcaPoolAddress => { + if pool_address__.is_some() { + return Err(serde::de::Error::duplicate_field("orcaPoolAddress")); + } + pool_address__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::lp_token_price_task::PoolAddress::OrcaPoolAddress); + } + GeneratedField::RaydiumPoolAddress => { + if pool_address__.is_some() { + return Err(serde::de::Error::duplicate_field("raydiumPoolAddress")); + } + pool_address__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::lp_token_price_task::PoolAddress::RaydiumPoolAddress); + } + } + } + Ok(oracle_job::LpTokenPriceTask { + price_feed_addresses: price_feed_addresses__.unwrap_or_default(), + price_feed_jobs: price_feed_jobs__.unwrap_or_default(), + use_fair_price: use_fair_price__, + pool_address: pool_address__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.LpTokenPriceTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::MangoPerpMarketTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.perp_market_address.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.MangoPerpMarketTask", len)?; + if let Some(v) = self.perp_market_address.as_ref() { + struct_ser.serialize_field("perpMarketAddress", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::MangoPerpMarketTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "perp_market_address", + "perpMarketAddress", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + PerpMarketAddress, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "perpMarketAddress" | "perp_market_address" => Ok(GeneratedField::PerpMarketAddress), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::MangoPerpMarketTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.MangoPerpMarketTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut perp_market_address__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::PerpMarketAddress => { + if perp_market_address__.is_some() { + return Err(serde::de::Error::duplicate_field("perpMarketAddress")); + } + perp_market_address__ = map_.next_value()?; + } + } + } + Ok(oracle_job::MangoPerpMarketTask { + perp_market_address: perp_market_address__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.MangoPerpMarketTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::MarinadeStateTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let len = 0; + let struct_ser = serializer.serialize_struct("oracle_job.OracleJob.MarinadeStateTask", len)?; + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::MarinadeStateTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + Err(serde::de::Error::unknown_field(value, FIELDS)) + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::MarinadeStateTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.MarinadeStateTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + while map_.next_key::()?.is_some() { + let _ = map_.next_value::()?; + } + Ok(oracle_job::MarinadeStateTask { + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.MarinadeStateTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::MaxTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if !self.tasks.is_empty() { + len += 1; + } + if !self.jobs.is_empty() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.MaxTask", len)?; + if !self.tasks.is_empty() { + struct_ser.serialize_field("tasks", &self.tasks)?; + } + if !self.jobs.is_empty() { + struct_ser.serialize_field("jobs", &self.jobs)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::MaxTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "tasks", + "jobs", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Tasks, + Jobs, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "tasks" => Ok(GeneratedField::Tasks), + "jobs" => Ok(GeneratedField::Jobs), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::MaxTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.MaxTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut tasks__ = None; + let mut jobs__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Tasks => { + if tasks__.is_some() { + return Err(serde::de::Error::duplicate_field("tasks")); + } + tasks__ = Some(map_.next_value()?); + } + GeneratedField::Jobs => { + if jobs__.is_some() { + return Err(serde::de::Error::duplicate_field("jobs")); + } + jobs__ = Some(map_.next_value()?); + } + } + } + Ok(oracle_job::MaxTask { + tasks: tasks__.unwrap_or_default(), + jobs: jobs__.unwrap_or_default(), + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.MaxTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::MeanTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if !self.tasks.is_empty() { + len += 1; + } + if !self.jobs.is_empty() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.MeanTask", len)?; + if !self.tasks.is_empty() { + struct_ser.serialize_field("tasks", &self.tasks)?; + } + if !self.jobs.is_empty() { + struct_ser.serialize_field("jobs", &self.jobs)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::MeanTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "tasks", + "jobs", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Tasks, + Jobs, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "tasks" => Ok(GeneratedField::Tasks), + "jobs" => Ok(GeneratedField::Jobs), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::MeanTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.MeanTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut tasks__ = None; + let mut jobs__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Tasks => { + if tasks__.is_some() { + return Err(serde::de::Error::duplicate_field("tasks")); + } + tasks__ = Some(map_.next_value()?); + } + GeneratedField::Jobs => { + if jobs__.is_some() { + return Err(serde::de::Error::duplicate_field("jobs")); + } + jobs__ = Some(map_.next_value()?); + } + } + } + Ok(oracle_job::MeanTask { + tasks: tasks__.unwrap_or_default(), + jobs: jobs__.unwrap_or_default(), + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.MeanTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::MedianTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if !self.tasks.is_empty() { + len += 1; + } + if !self.jobs.is_empty() { + len += 1; + } + if self.min_successful_required.is_some() { + len += 1; + } + if self.max_range_percent.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.MedianTask", len)?; + if !self.tasks.is_empty() { + struct_ser.serialize_field("tasks", &self.tasks)?; + } + if !self.jobs.is_empty() { + struct_ser.serialize_field("jobs", &self.jobs)?; + } + if let Some(v) = self.min_successful_required.as_ref() { + struct_ser.serialize_field("minSuccessfulRequired", v)?; + } + if let Some(v) = self.max_range_percent.as_ref() { + struct_ser.serialize_field("maxRangePercent", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::MedianTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "tasks", + "jobs", + "min_successful_required", + "minSuccessfulRequired", + "max_range_percent", + "maxRangePercent", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Tasks, + Jobs, + MinSuccessfulRequired, + MaxRangePercent, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "tasks" => Ok(GeneratedField::Tasks), + "jobs" => Ok(GeneratedField::Jobs), + "minSuccessfulRequired" | "min_successful_required" => Ok(GeneratedField::MinSuccessfulRequired), + "maxRangePercent" | "max_range_percent" => Ok(GeneratedField::MaxRangePercent), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::MedianTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.MedianTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut tasks__ = None; + let mut jobs__ = None; + let mut min_successful_required__ = None; + let mut max_range_percent__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Tasks => { + if tasks__.is_some() { + return Err(serde::de::Error::duplicate_field("tasks")); + } + tasks__ = Some(map_.next_value()?); + } + GeneratedField::Jobs => { + if jobs__.is_some() { + return Err(serde::de::Error::duplicate_field("jobs")); + } + jobs__ = Some(map_.next_value()?); + } + GeneratedField::MinSuccessfulRequired => { + if min_successful_required__.is_some() { + return Err(serde::de::Error::duplicate_field("minSuccessfulRequired")); + } + min_successful_required__ = + map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| x.0) + ; + } + GeneratedField::MaxRangePercent => { + if max_range_percent__.is_some() { + return Err(serde::de::Error::duplicate_field("maxRangePercent")); + } + max_range_percent__ = map_.next_value()?; + } + } + } + Ok(oracle_job::MedianTask { + tasks: tasks__.unwrap_or_default(), + jobs: jobs__.unwrap_or_default(), + min_successful_required: min_successful_required__, + max_range_percent: max_range_percent__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.MedianTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::MeteoraSwapTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.pool.is_some() { + len += 1; + } + if self.r#type.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.MeteoraSwapTask", len)?; + if let Some(v) = self.pool.as_ref() { + struct_ser.serialize_field("pool", v)?; + } + if let Some(v) = self.r#type.as_ref() { + let v = oracle_job::meteora_swap_task::Type::try_from(*v) + .map_err(|_| serde::ser::Error::custom(format!("Invalid variant {}", *v)))?; + struct_ser.serialize_field("type", &v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::MeteoraSwapTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "pool", + "type", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Pool, + Type, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "pool" => Ok(GeneratedField::Pool), + "type" => Ok(GeneratedField::Type), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::MeteoraSwapTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.MeteoraSwapTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut pool__ = None; + let mut r#type__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Pool => { + if pool__.is_some() { + return Err(serde::de::Error::duplicate_field("pool")); + } + pool__ = map_.next_value()?; + } + GeneratedField::Type => { + if r#type__.is_some() { + return Err(serde::de::Error::duplicate_field("type")); + } + r#type__ = map_.next_value::<::std::option::Option>()?.map(|x| x as i32); + } + } + } + Ok(oracle_job::MeteoraSwapTask { + pool: pool__, + r#type: r#type__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.MeteoraSwapTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::meteora_swap_task::Type { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + let variant = match self { + Self::Dlmm => "TYPE_DLMM", + Self::Standard => "TYPE_STANDARD", + }; + serializer.serialize_str(variant) + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::meteora_swap_task::Type { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "TYPE_DLMM", + "TYPE_STANDARD", + ]; + + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::meteora_swap_task::Type; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + fn visit_i64(self, v: i64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Signed(v), &self) + }) + } + + fn visit_u64(self, v: u64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Unsigned(v), &self) + }) + } + + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "TYPE_DLMM" => Ok(oracle_job::meteora_swap_task::Type::Dlmm), + "TYPE_STANDARD" => Ok(oracle_job::meteora_swap_task::Type::Standard), + _ => Err(serde::de::Error::unknown_variant(value, FIELDS)), + } + } + } + deserializer.deserialize_any(GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::MinTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if !self.tasks.is_empty() { + len += 1; + } + if !self.jobs.is_empty() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.MinTask", len)?; + if !self.tasks.is_empty() { + struct_ser.serialize_field("tasks", &self.tasks)?; + } + if !self.jobs.is_empty() { + struct_ser.serialize_field("jobs", &self.jobs)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::MinTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "tasks", + "jobs", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Tasks, + Jobs, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "tasks" => Ok(GeneratedField::Tasks), + "jobs" => Ok(GeneratedField::Jobs), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::MinTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.MinTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut tasks__ = None; + let mut jobs__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Tasks => { + if tasks__.is_some() { + return Err(serde::de::Error::duplicate_field("tasks")); + } + tasks__ = Some(map_.next_value()?); + } + GeneratedField::Jobs => { + if jobs__.is_some() { + return Err(serde::de::Error::duplicate_field("jobs")); + } + jobs__ = Some(map_.next_value()?); + } + } + } + Ok(oracle_job::MinTask { + tasks: tasks__.unwrap_or_default(), + jobs: jobs__.unwrap_or_default(), + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.MinTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::MultiplyTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.multiple.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.MultiplyTask", len)?; + if let Some(v) = self.multiple.as_ref() { + match v { + oracle_job::multiply_task::Multiple::Scalar(v) => { + struct_ser.serialize_field("scalar", v)?; + } + oracle_job::multiply_task::Multiple::AggregatorPubkey(v) => { + struct_ser.serialize_field("aggregatorPubkey", v)?; + } + oracle_job::multiply_task::Multiple::Job(v) => { + struct_ser.serialize_field("job", v)?; + } + oracle_job::multiply_task::Multiple::Big(v) => { + struct_ser.serialize_field("big", v)?; + } + } + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::MultiplyTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "scalar", + "aggregator_pubkey", + "aggregatorPubkey", + "job", + "big", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Scalar, + AggregatorPubkey, + Job, + Big, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "scalar" => Ok(GeneratedField::Scalar), + "aggregatorPubkey" | "aggregator_pubkey" => Ok(GeneratedField::AggregatorPubkey), + "job" => Ok(GeneratedField::Job), + "big" => Ok(GeneratedField::Big), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::MultiplyTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.MultiplyTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut multiple__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Scalar => { + if multiple__.is_some() { + return Err(serde::de::Error::duplicate_field("scalar")); + } + multiple__ = map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| oracle_job::multiply_task::Multiple::Scalar(x.0)); + } + GeneratedField::AggregatorPubkey => { + if multiple__.is_some() { + return Err(serde::de::Error::duplicate_field("aggregatorPubkey")); + } + multiple__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::multiply_task::Multiple::AggregatorPubkey); + } + GeneratedField::Job => { + if multiple__.is_some() { + return Err(serde::de::Error::duplicate_field("job")); + } + multiple__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::multiply_task::Multiple::Job) +; + } + GeneratedField::Big => { + if multiple__.is_some() { + return Err(serde::de::Error::duplicate_field("big")); + } + multiple__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::multiply_task::Multiple::Big); + } + } + } + Ok(oracle_job::MultiplyTask { + multiple: multiple__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.MultiplyTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::OndoUsdyTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.strategy.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.OndoUsdyTask", len)?; + if let Some(v) = self.strategy.as_ref() { + let v = oracle_job::ondo_usdy_task::Strategy::try_from(*v) + .map_err(|_| serde::ser::Error::custom(format!("Invalid variant {}", *v)))?; + struct_ser.serialize_field("strategy", &v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::OndoUsdyTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "strategy", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Strategy, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "strategy" => Ok(GeneratedField::Strategy), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::OndoUsdyTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.OndoUsdyTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut strategy__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Strategy => { + if strategy__.is_some() { + return Err(serde::de::Error::duplicate_field("strategy")); + } + strategy__ = map_.next_value::<::std::option::Option>()?.map(|x| x as i32); + } + } + } + Ok(oracle_job::OndoUsdyTask { + strategy: strategy__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.OndoUsdyTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::ondo_usdy_task::Strategy { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + let variant = match self { + Self::FairValue => "STRATEGY_FAIR_VALUE", + Self::Market => "STRATEGY_MARKET", + }; + serializer.serialize_str(variant) + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::ondo_usdy_task::Strategy { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "STRATEGY_FAIR_VALUE", + "STRATEGY_MARKET", + ]; + + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::ondo_usdy_task::Strategy; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + fn visit_i64(self, v: i64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Signed(v), &self) + }) + } + + fn visit_u64(self, v: u64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Unsigned(v), &self) + }) + } + + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "STRATEGY_FAIR_VALUE" => Ok(oracle_job::ondo_usdy_task::Strategy::FairValue), + "STRATEGY_MARKET" => Ok(oracle_job::ondo_usdy_task::Strategy::Market), + _ => Err(serde::de::Error::unknown_variant(value, FIELDS)), + } + } + } + deserializer.deserialize_any(GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::OracleTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.pyth_allowed_confidence_interval.is_some() { + len += 1; + } + if self.chainlink_configs.is_some() { + len += 1; + } + if self.pyth_configs.is_some() { + len += 1; + } + if self.aggregator_address.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.OracleTask", len)?; + if let Some(v) = self.pyth_allowed_confidence_interval.as_ref() { + struct_ser.serialize_field("pythAllowedConfidenceInterval", v)?; + } + if let Some(v) = self.chainlink_configs.as_ref() { + struct_ser.serialize_field("chainlinkConfigs", v)?; + } + if let Some(v) = self.pyth_configs.as_ref() { + struct_ser.serialize_field("pythConfigs", v)?; + } + if let Some(v) = self.aggregator_address.as_ref() { + match v { + oracle_job::oracle_task::AggregatorAddress::SwitchboardAddress(v) => { + struct_ser.serialize_field("switchboardAddress", v)?; + } + oracle_job::oracle_task::AggregatorAddress::PythAddress(v) => { + struct_ser.serialize_field("pythAddress", v)?; + } + oracle_job::oracle_task::AggregatorAddress::ChainlinkAddress(v) => { + struct_ser.serialize_field("chainlinkAddress", v)?; + } + } + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::OracleTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "pyth_allowed_confidence_interval", + "pythAllowedConfidenceInterval", + "chainlink_configs", + "chainlinkConfigs", + "pyth_configs", + "pythConfigs", + "switchboard_address", + "switchboardAddress", + "pyth_address", + "pythAddress", + "chainlink_address", + "chainlinkAddress", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + PythAllowedConfidenceInterval, + ChainlinkConfigs, + PythConfigs, + SwitchboardAddress, + PythAddress, + ChainlinkAddress, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "pythAllowedConfidenceInterval" | "pyth_allowed_confidence_interval" => Ok(GeneratedField::PythAllowedConfidenceInterval), + "chainlinkConfigs" | "chainlink_configs" => Ok(GeneratedField::ChainlinkConfigs), + "pythConfigs" | "pyth_configs" => Ok(GeneratedField::PythConfigs), + "switchboardAddress" | "switchboard_address" => Ok(GeneratedField::SwitchboardAddress), + "pythAddress" | "pyth_address" => Ok(GeneratedField::PythAddress), + "chainlinkAddress" | "chainlink_address" => Ok(GeneratedField::ChainlinkAddress), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::OracleTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.OracleTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut pyth_allowed_confidence_interval__ = None; + let mut chainlink_configs__ = None; + let mut pyth_configs__ = None; + let mut aggregator_address__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::PythAllowedConfidenceInterval => { + if pyth_allowed_confidence_interval__.is_some() { + return Err(serde::de::Error::duplicate_field("pythAllowedConfidenceInterval")); + } + pyth_allowed_confidence_interval__ = + map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| x.0) + ; + } + GeneratedField::ChainlinkConfigs => { + if chainlink_configs__.is_some() { + return Err(serde::de::Error::duplicate_field("chainlinkConfigs")); + } + chainlink_configs__ = map_.next_value()?; + } + GeneratedField::PythConfigs => { + if pyth_configs__.is_some() { + return Err(serde::de::Error::duplicate_field("pythConfigs")); + } + pyth_configs__ = map_.next_value()?; + } + GeneratedField::SwitchboardAddress => { + if aggregator_address__.is_some() { + return Err(serde::de::Error::duplicate_field("switchboardAddress")); + } + aggregator_address__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::oracle_task::AggregatorAddress::SwitchboardAddress); + } + GeneratedField::PythAddress => { + if aggregator_address__.is_some() { + return Err(serde::de::Error::duplicate_field("pythAddress")); + } + aggregator_address__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::oracle_task::AggregatorAddress::PythAddress); + } + GeneratedField::ChainlinkAddress => { + if aggregator_address__.is_some() { + return Err(serde::de::Error::duplicate_field("chainlinkAddress")); + } + aggregator_address__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::oracle_task::AggregatorAddress::ChainlinkAddress); + } + } + } + Ok(oracle_job::OracleTask { + pyth_allowed_confidence_interval: pyth_allowed_confidence_interval__, + chainlink_configs: chainlink_configs__, + pyth_configs: pyth_configs__, + aggregator_address: aggregator_address__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.OracleTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::oracle_task::ChainlinkConfigs { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.provider.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.OracleTask.ChainlinkConfigs", len)?; + if let Some(v) = self.provider.as_ref() { + struct_ser.serialize_field("provider", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::oracle_task::ChainlinkConfigs { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "provider", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Provider, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "provider" => Ok(GeneratedField::Provider), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::oracle_task::ChainlinkConfigs; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.OracleTask.ChainlinkConfigs") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut provider__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Provider => { + if provider__.is_some() { + return Err(serde::de::Error::duplicate_field("provider")); + } + provider__ = map_.next_value()?; + } + } + } + Ok(oracle_job::oracle_task::ChainlinkConfigs { + provider: provider__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.OracleTask.ChainlinkConfigs", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::oracle_task::PythConfigs { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.hermes_url.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.OracleTask.PythConfigs", len)?; + if let Some(v) = self.hermes_url.as_ref() { + struct_ser.serialize_field("hermesUrl", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::oracle_task::PythConfigs { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "hermes_url", + "hermesUrl", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + HermesUrl, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "hermesUrl" | "hermes_url" => Ok(GeneratedField::HermesUrl), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::oracle_task::PythConfigs; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.OracleTask.PythConfigs") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut hermes_url__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::HermesUrl => { + if hermes_url__.is_some() { + return Err(serde::de::Error::duplicate_field("hermesUrl")); + } + hermes_url__ = map_.next_value()?; + } + } + } + Ok(oracle_job::oracle_task::PythConfigs { + hermes_url: hermes_url__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.OracleTask.PythConfigs", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::PancakeswapExchangeRateTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.in_token_address.is_some() { + len += 1; + } + if self.out_token_address.is_some() { + len += 1; + } + if self.in_token_amount.is_some() { + len += 1; + } + if self.slippage.is_some() { + len += 1; + } + if self.provider.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.PancakeswapExchangeRateTask", len)?; + if let Some(v) = self.in_token_address.as_ref() { + struct_ser.serialize_field("inTokenAddress", v)?; + } + if let Some(v) = self.out_token_address.as_ref() { + struct_ser.serialize_field("outTokenAddress", v)?; + } + if let Some(v) = self.in_token_amount.as_ref() { + struct_ser.serialize_field("inTokenAmount", v)?; + } + if let Some(v) = self.slippage.as_ref() { + struct_ser.serialize_field("slippage", v)?; + } + if let Some(v) = self.provider.as_ref() { + struct_ser.serialize_field("provider", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::PancakeswapExchangeRateTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "in_token_address", + "inTokenAddress", + "out_token_address", + "outTokenAddress", + "in_token_amount", + "inTokenAmount", + "slippage", + "provider", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + InTokenAddress, + OutTokenAddress, + InTokenAmount, + Slippage, + Provider, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "inTokenAddress" | "in_token_address" => Ok(GeneratedField::InTokenAddress), + "outTokenAddress" | "out_token_address" => Ok(GeneratedField::OutTokenAddress), + "inTokenAmount" | "in_token_amount" => Ok(GeneratedField::InTokenAmount), + "slippage" => Ok(GeneratedField::Slippage), + "provider" => Ok(GeneratedField::Provider), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::PancakeswapExchangeRateTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.PancakeswapExchangeRateTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut in_token_address__ = None; + let mut out_token_address__ = None; + let mut in_token_amount__ = None; + let mut slippage__ = None; + let mut provider__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::InTokenAddress => { + if in_token_address__.is_some() { + return Err(serde::de::Error::duplicate_field("inTokenAddress")); + } + in_token_address__ = map_.next_value()?; + } + GeneratedField::OutTokenAddress => { + if out_token_address__.is_some() { + return Err(serde::de::Error::duplicate_field("outTokenAddress")); + } + out_token_address__ = map_.next_value()?; + } + GeneratedField::InTokenAmount => { + if in_token_amount__.is_some() { + return Err(serde::de::Error::duplicate_field("inTokenAmount")); + } + in_token_amount__ = + map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| x.0) + ; + } + GeneratedField::Slippage => { + if slippage__.is_some() { + return Err(serde::de::Error::duplicate_field("slippage")); + } + slippage__ = + map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| x.0) + ; + } + GeneratedField::Provider => { + if provider__.is_some() { + return Err(serde::de::Error::duplicate_field("provider")); + } + provider__ = map_.next_value()?; + } + } + } + Ok(oracle_job::PancakeswapExchangeRateTask { + in_token_address: in_token_address__, + out_token_address: out_token_address__, + in_token_amount: in_token_amount__, + slippage: slippage__, + provider: provider__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.PancakeswapExchangeRateTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::PerpMarketTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.market_address.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.PerpMarketTask", len)?; + if let Some(v) = self.market_address.as_ref() { + match v { + oracle_job::perp_market_task::MarketAddress::MangoMarketAddress(v) => { + struct_ser.serialize_field("mangoMarketAddress", v)?; + } + oracle_job::perp_market_task::MarketAddress::DriftMarketAddress(v) => { + struct_ser.serialize_field("driftMarketAddress", v)?; + } + oracle_job::perp_market_task::MarketAddress::ZetaMarketAddress(v) => { + struct_ser.serialize_field("zetaMarketAddress", v)?; + } + oracle_job::perp_market_task::MarketAddress::ZoMarketAddress(v) => { + struct_ser.serialize_field("zoMarketAddress", v)?; + } + } + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::PerpMarketTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "mango_market_address", + "mangoMarketAddress", + "drift_market_address", + "driftMarketAddress", + "zeta_market_address", + "zetaMarketAddress", + "zo_market_address", + "zoMarketAddress", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + MangoMarketAddress, + DriftMarketAddress, + ZetaMarketAddress, + ZoMarketAddress, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "mangoMarketAddress" | "mango_market_address" => Ok(GeneratedField::MangoMarketAddress), + "driftMarketAddress" | "drift_market_address" => Ok(GeneratedField::DriftMarketAddress), + "zetaMarketAddress" | "zeta_market_address" => Ok(GeneratedField::ZetaMarketAddress), + "zoMarketAddress" | "zo_market_address" => Ok(GeneratedField::ZoMarketAddress), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::PerpMarketTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.PerpMarketTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut market_address__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::MangoMarketAddress => { + if market_address__.is_some() { + return Err(serde::de::Error::duplicate_field("mangoMarketAddress")); + } + market_address__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::perp_market_task::MarketAddress::MangoMarketAddress); + } + GeneratedField::DriftMarketAddress => { + if market_address__.is_some() { + return Err(serde::de::Error::duplicate_field("driftMarketAddress")); + } + market_address__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::perp_market_task::MarketAddress::DriftMarketAddress); + } + GeneratedField::ZetaMarketAddress => { + if market_address__.is_some() { + return Err(serde::de::Error::duplicate_field("zetaMarketAddress")); + } + market_address__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::perp_market_task::MarketAddress::ZetaMarketAddress); + } + GeneratedField::ZoMarketAddress => { + if market_address__.is_some() { + return Err(serde::de::Error::duplicate_field("zoMarketAddress")); + } + market_address__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::perp_market_task::MarketAddress::ZoMarketAddress); + } + } + } + Ok(oracle_job::PerpMarketTask { + market_address: market_address__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.PerpMarketTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::PowTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.exponent.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.PowTask", len)?; + if let Some(v) = self.exponent.as_ref() { + match v { + oracle_job::pow_task::Exponent::Scalar(v) => { + struct_ser.serialize_field("scalar", v)?; + } + oracle_job::pow_task::Exponent::AggregatorPubkey(v) => { + struct_ser.serialize_field("aggregatorPubkey", v)?; + } + oracle_job::pow_task::Exponent::Big(v) => { + struct_ser.serialize_field("big", v)?; + } + } + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::PowTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "scalar", + "aggregator_pubkey", + "aggregatorPubkey", + "big", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Scalar, + AggregatorPubkey, + Big, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "scalar" => Ok(GeneratedField::Scalar), + "aggregatorPubkey" | "aggregator_pubkey" => Ok(GeneratedField::AggregatorPubkey), + "big" => Ok(GeneratedField::Big), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::PowTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.PowTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut exponent__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Scalar => { + if exponent__.is_some() { + return Err(serde::de::Error::duplicate_field("scalar")); + } + exponent__ = map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| oracle_job::pow_task::Exponent::Scalar(x.0)); + } + GeneratedField::AggregatorPubkey => { + if exponent__.is_some() { + return Err(serde::de::Error::duplicate_field("aggregatorPubkey")); + } + exponent__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::pow_task::Exponent::AggregatorPubkey); + } + GeneratedField::Big => { + if exponent__.is_some() { + return Err(serde::de::Error::duplicate_field("big")); + } + exponent__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::pow_task::Exponent::Big); + } + } + } + Ok(oracle_job::PowTask { + exponent: exponent__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.PowTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::RegexExtractTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.pattern.is_some() { + len += 1; + } + if self.group_number.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.RegexExtractTask", len)?; + if let Some(v) = self.pattern.as_ref() { + struct_ser.serialize_field("pattern", v)?; + } + if let Some(v) = self.group_number.as_ref() { + struct_ser.serialize_field("groupNumber", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::RegexExtractTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "pattern", + "group_number", + "groupNumber", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Pattern, + GroupNumber, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "pattern" => Ok(GeneratedField::Pattern), + "groupNumber" | "group_number" => Ok(GeneratedField::GroupNumber), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::RegexExtractTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.RegexExtractTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut pattern__ = None; + let mut group_number__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Pattern => { + if pattern__.is_some() { + return Err(serde::de::Error::duplicate_field("pattern")); + } + pattern__ = map_.next_value()?; + } + GeneratedField::GroupNumber => { + if group_number__.is_some() { + return Err(serde::de::Error::duplicate_field("groupNumber")); + } + group_number__ = + map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| x.0) + ; + } + } + } + Ok(oracle_job::RegexExtractTask { + pattern: pattern__, + group_number: group_number__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.RegexExtractTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::RoundTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.method.is_some() { + len += 1; + } + if self.decimals.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.RoundTask", len)?; + if let Some(v) = self.method.as_ref() { + let v = oracle_job::round_task::Method::try_from(*v) + .map_err(|_| serde::ser::Error::custom(format!("Invalid variant {}", *v)))?; + struct_ser.serialize_field("method", &v)?; + } + if let Some(v) = self.decimals.as_ref() { + struct_ser.serialize_field("decimals", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::RoundTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "method", + "decimals", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Method, + Decimals, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "method" => Ok(GeneratedField::Method), + "decimals" => Ok(GeneratedField::Decimals), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::RoundTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.RoundTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut method__ = None; + let mut decimals__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Method => { + if method__.is_some() { + return Err(serde::de::Error::duplicate_field("method")); + } + method__ = map_.next_value::<::std::option::Option>()?.map(|x| x as i32); + } + GeneratedField::Decimals => { + if decimals__.is_some() { + return Err(serde::de::Error::duplicate_field("decimals")); + } + decimals__ = + map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| x.0) + ; + } + } + } + Ok(oracle_job::RoundTask { + method: method__, + decimals: decimals__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.RoundTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::round_task::Method { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + let variant = match self { + Self::RoundUp => "METHOD_ROUND_UP", + Self::RoundDown => "METHOD_ROUND_DOWN", + }; + serializer.serialize_str(variant) + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::round_task::Method { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "METHOD_ROUND_UP", + "METHOD_ROUND_DOWN", + ]; + + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::round_task::Method; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + fn visit_i64(self, v: i64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Signed(v), &self) + }) + } + + fn visit_u64(self, v: u64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Unsigned(v), &self) + }) + } + + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "METHOD_ROUND_UP" => Ok(oracle_job::round_task::Method::RoundUp), + "METHOD_ROUND_DOWN" => Ok(oracle_job::round_task::Method::RoundDown), + _ => Err(serde::de::Error::unknown_variant(value, FIELDS)), + } + } + } + deserializer.deserialize_any(GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::SanctumLstPriceTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.lst_mint.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.SanctumLstPriceTask", len)?; + if let Some(v) = self.lst_mint.as_ref() { + struct_ser.serialize_field("lstMint", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::SanctumLstPriceTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "lst_mint", + "lstMint", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + LstMint, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "lstMint" | "lst_mint" => Ok(GeneratedField::LstMint), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::SanctumLstPriceTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.SanctumLstPriceTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut lst_mint__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::LstMint => { + if lst_mint__.is_some() { + return Err(serde::de::Error::duplicate_field("lstMint")); + } + lst_mint__ = map_.next_value()?; + } + } + } + Ok(oracle_job::SanctumLstPriceTask { + lst_mint: lst_mint__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.SanctumLstPriceTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::SecretsTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.authority.is_some() { + len += 1; + } + if self.url.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.SecretsTask", len)?; + if let Some(v) = self.authority.as_ref() { + struct_ser.serialize_field("authority", v)?; + } + if let Some(v) = self.url.as_ref() { + struct_ser.serialize_field("url", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::SecretsTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "authority", + "url", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Authority, + Url, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "authority" => Ok(GeneratedField::Authority), + "url" => Ok(GeneratedField::Url), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::SecretsTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.SecretsTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut authority__ = None; + let mut url__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Authority => { + if authority__.is_some() { + return Err(serde::de::Error::duplicate_field("authority")); + } + authority__ = map_.next_value()?; + } + GeneratedField::Url => { + if url__.is_some() { + return Err(serde::de::Error::duplicate_field("url")); + } + url__ = map_.next_value()?; + } + } + } + Ok(oracle_job::SecretsTask { + authority: authority__, + url: url__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.SecretsTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::SerumSwapTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.serum_pool_address.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.SerumSwapTask", len)?; + if let Some(v) = self.serum_pool_address.as_ref() { + struct_ser.serialize_field("serumPoolAddress", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::SerumSwapTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "serum_pool_address", + "serumPoolAddress", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + SerumPoolAddress, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "serumPoolAddress" | "serum_pool_address" => Ok(GeneratedField::SerumPoolAddress), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::SerumSwapTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.SerumSwapTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut serum_pool_address__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::SerumPoolAddress => { + if serum_pool_address__.is_some() { + return Err(serde::de::Error::duplicate_field("serumPoolAddress")); + } + serum_pool_address__ = map_.next_value()?; + } + } + } + Ok(oracle_job::SerumSwapTask { + serum_pool_address: serum_pool_address__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.SerumSwapTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::SolanaAccountDataFetchTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.pubkey.is_some() { + len += 1; + } + if self.network.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.SolanaAccountDataFetchTask", len)?; + if let Some(v) = self.pubkey.as_ref() { + struct_ser.serialize_field("pubkey", v)?; + } + if let Some(v) = self.network.as_ref() { + let v = oracle_job::solana_account_data_fetch_task::Network::try_from(*v) + .map_err(|_| serde::ser::Error::custom(format!("Invalid variant {}", *v)))?; + struct_ser.serialize_field("network", &v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::SolanaAccountDataFetchTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "pubkey", + "network", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Pubkey, + Network, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "pubkey" => Ok(GeneratedField::Pubkey), + "network" => Ok(GeneratedField::Network), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::SolanaAccountDataFetchTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.SolanaAccountDataFetchTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut pubkey__ = None; + let mut network__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Pubkey => { + if pubkey__.is_some() { + return Err(serde::de::Error::duplicate_field("pubkey")); + } + pubkey__ = map_.next_value()?; + } + GeneratedField::Network => { + if network__.is_some() { + return Err(serde::de::Error::duplicate_field("network")); + } + network__ = map_.next_value::<::std::option::Option>()?.map(|x| x as i32); + } + } + } + Ok(oracle_job::SolanaAccountDataFetchTask { + pubkey: pubkey__, + network: network__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.SolanaAccountDataFetchTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::solana_account_data_fetch_task::Network { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + let variant = match self { + Self::Mainnet => "NETWORK_MAINNET", + Self::Testnet => "NETWORK_TESTNET", + Self::Devnet => "NETWORK_DEVNET", + }; + serializer.serialize_str(variant) + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::solana_account_data_fetch_task::Network { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "NETWORK_MAINNET", + "NETWORK_TESTNET", + "NETWORK_DEVNET", + ]; + + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::solana_account_data_fetch_task::Network; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + fn visit_i64(self, v: i64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Signed(v), &self) + }) + } + + fn visit_u64(self, v: u64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Unsigned(v), &self) + }) + } + + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "NETWORK_MAINNET" => Ok(oracle_job::solana_account_data_fetch_task::Network::Mainnet), + "NETWORK_TESTNET" => Ok(oracle_job::solana_account_data_fetch_task::Network::Testnet), + "NETWORK_DEVNET" => Ok(oracle_job::solana_account_data_fetch_task::Network::Devnet), + _ => Err(serde::de::Error::unknown_variant(value, FIELDS)), + } + } + } + deserializer.deserialize_any(GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::SplStakePoolTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.pubkey.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.SplStakePoolTask", len)?; + if let Some(v) = self.pubkey.as_ref() { + struct_ser.serialize_field("pubkey", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::SplStakePoolTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "pubkey", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Pubkey, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "pubkey" => Ok(GeneratedField::Pubkey), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::SplStakePoolTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.SplStakePoolTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut pubkey__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Pubkey => { + if pubkey__.is_some() { + return Err(serde::de::Error::duplicate_field("pubkey")); + } + pubkey__ = map_.next_value()?; + } + } + } + Ok(oracle_job::SplStakePoolTask { + pubkey: pubkey__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.SplStakePoolTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::SplTokenParseTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.account_address.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.SplTokenParseTask", len)?; + if let Some(v) = self.account_address.as_ref() { + match v { + oracle_job::spl_token_parse_task::AccountAddress::TokenAccountAddress(v) => { + struct_ser.serialize_field("tokenAccountAddress", v)?; + } + oracle_job::spl_token_parse_task::AccountAddress::MintAddress(v) => { + struct_ser.serialize_field("mintAddress", v)?; + } + } + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::SplTokenParseTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "token_account_address", + "tokenAccountAddress", + "mint_address", + "mintAddress", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + TokenAccountAddress, + MintAddress, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "tokenAccountAddress" | "token_account_address" => Ok(GeneratedField::TokenAccountAddress), + "mintAddress" | "mint_address" => Ok(GeneratedField::MintAddress), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::SplTokenParseTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.SplTokenParseTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut account_address__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::TokenAccountAddress => { + if account_address__.is_some() { + return Err(serde::de::Error::duplicate_field("tokenAccountAddress")); + } + account_address__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::spl_token_parse_task::AccountAddress::TokenAccountAddress); + } + GeneratedField::MintAddress => { + if account_address__.is_some() { + return Err(serde::de::Error::duplicate_field("mintAddress")); + } + account_address__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::spl_token_parse_task::AccountAddress::MintAddress); + } + } + } + Ok(oracle_job::SplTokenParseTask { + account_address: account_address__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.SplTokenParseTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::SubtractTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.subtraction.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.SubtractTask", len)?; + if let Some(v) = self.subtraction.as_ref() { + match v { + oracle_job::subtract_task::Subtraction::Scalar(v) => { + struct_ser.serialize_field("scalar", v)?; + } + oracle_job::subtract_task::Subtraction::AggregatorPubkey(v) => { + struct_ser.serialize_field("aggregatorPubkey", v)?; + } + oracle_job::subtract_task::Subtraction::Job(v) => { + struct_ser.serialize_field("job", v)?; + } + oracle_job::subtract_task::Subtraction::Big(v) => { + struct_ser.serialize_field("big", v)?; + } + } + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::SubtractTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "scalar", + "aggregator_pubkey", + "aggregatorPubkey", + "job", + "big", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Scalar, + AggregatorPubkey, + Job, + Big, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "scalar" => Ok(GeneratedField::Scalar), + "aggregatorPubkey" | "aggregator_pubkey" => Ok(GeneratedField::AggregatorPubkey), + "job" => Ok(GeneratedField::Job), + "big" => Ok(GeneratedField::Big), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::SubtractTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.SubtractTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut subtraction__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Scalar => { + if subtraction__.is_some() { + return Err(serde::de::Error::duplicate_field("scalar")); + } + subtraction__ = map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| oracle_job::subtract_task::Subtraction::Scalar(x.0)); + } + GeneratedField::AggregatorPubkey => { + if subtraction__.is_some() { + return Err(serde::de::Error::duplicate_field("aggregatorPubkey")); + } + subtraction__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::subtract_task::Subtraction::AggregatorPubkey); + } + GeneratedField::Job => { + if subtraction__.is_some() { + return Err(serde::de::Error::duplicate_field("job")); + } + subtraction__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::subtract_task::Subtraction::Job) +; + } + GeneratedField::Big => { + if subtraction__.is_some() { + return Err(serde::de::Error::duplicate_field("big")); + } + subtraction__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::subtract_task::Subtraction::Big); + } + } + } + Ok(oracle_job::SubtractTask { + subtraction: subtraction__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.SubtractTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::SushiswapExchangeRateTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.in_token_address.is_some() { + len += 1; + } + if self.out_token_address.is_some() { + len += 1; + } + if self.in_token_amount.is_some() { + len += 1; + } + if self.slippage.is_some() { + len += 1; + } + if self.provider.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.SushiswapExchangeRateTask", len)?; + if let Some(v) = self.in_token_address.as_ref() { + struct_ser.serialize_field("inTokenAddress", v)?; + } + if let Some(v) = self.out_token_address.as_ref() { + struct_ser.serialize_field("outTokenAddress", v)?; + } + if let Some(v) = self.in_token_amount.as_ref() { + struct_ser.serialize_field("inTokenAmount", v)?; + } + if let Some(v) = self.slippage.as_ref() { + struct_ser.serialize_field("slippage", v)?; + } + if let Some(v) = self.provider.as_ref() { + struct_ser.serialize_field("provider", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::SushiswapExchangeRateTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "in_token_address", + "inTokenAddress", + "out_token_address", + "outTokenAddress", + "in_token_amount", + "inTokenAmount", + "slippage", + "provider", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + InTokenAddress, + OutTokenAddress, + InTokenAmount, + Slippage, + Provider, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "inTokenAddress" | "in_token_address" => Ok(GeneratedField::InTokenAddress), + "outTokenAddress" | "out_token_address" => Ok(GeneratedField::OutTokenAddress), + "inTokenAmount" | "in_token_amount" => Ok(GeneratedField::InTokenAmount), + "slippage" => Ok(GeneratedField::Slippage), + "provider" => Ok(GeneratedField::Provider), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::SushiswapExchangeRateTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.SushiswapExchangeRateTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut in_token_address__ = None; + let mut out_token_address__ = None; + let mut in_token_amount__ = None; + let mut slippage__ = None; + let mut provider__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::InTokenAddress => { + if in_token_address__.is_some() { + return Err(serde::de::Error::duplicate_field("inTokenAddress")); + } + in_token_address__ = map_.next_value()?; + } + GeneratedField::OutTokenAddress => { + if out_token_address__.is_some() { + return Err(serde::de::Error::duplicate_field("outTokenAddress")); + } + out_token_address__ = map_.next_value()?; + } + GeneratedField::InTokenAmount => { + if in_token_amount__.is_some() { + return Err(serde::de::Error::duplicate_field("inTokenAmount")); + } + in_token_amount__ = + map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| x.0) + ; + } + GeneratedField::Slippage => { + if slippage__.is_some() { + return Err(serde::de::Error::duplicate_field("slippage")); + } + slippage__ = + map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| x.0) + ; + } + GeneratedField::Provider => { + if provider__.is_some() { + return Err(serde::de::Error::duplicate_field("provider")); + } + provider__ = map_.next_value()?; + } + } + } + Ok(oracle_job::SushiswapExchangeRateTask { + in_token_address: in_token_address__, + out_token_address: out_token_address__, + in_token_amount: in_token_amount__, + slippage: slippage__, + provider: provider__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.SushiswapExchangeRateTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::SysclockOffsetTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let len = 0; + let struct_ser = serializer.serialize_struct("oracle_job.OracleJob.SysclockOffsetTask", len)?; + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::SysclockOffsetTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + Err(serde::de::Error::unknown_field(value, FIELDS)) + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::SysclockOffsetTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.SysclockOffsetTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + while map_.next_key::()?.is_some() { + let _ = map_.next_value::()?; + } + Ok(oracle_job::SysclockOffsetTask { + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.SysclockOffsetTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::Task { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.task.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.Task", len)?; + if let Some(v) = self.task.as_ref() { + match v { + oracle_job::task::Task::HttpTask(v) => { + struct_ser.serialize_field("httpTask", v)?; + } + oracle_job::task::Task::JsonParseTask(v) => { + struct_ser.serialize_field("jsonParseTask", v)?; + } + oracle_job::task::Task::MedianTask(v) => { + struct_ser.serialize_field("medianTask", v)?; + } + oracle_job::task::Task::MeanTask(v) => { + struct_ser.serialize_field("meanTask", v)?; + } + oracle_job::task::Task::WebsocketTask(v) => { + struct_ser.serialize_field("websocketTask", v)?; + } + oracle_job::task::Task::DivideTask(v) => { + struct_ser.serialize_field("divideTask", v)?; + } + oracle_job::task::Task::MultiplyTask(v) => { + struct_ser.serialize_field("multiplyTask", v)?; + } + oracle_job::task::Task::LpTokenPriceTask(v) => { + struct_ser.serialize_field("lpTokenPriceTask", v)?; + } + oracle_job::task::Task::LpExchangeRateTask(v) => { + struct_ser.serialize_field("lpExchangeRateTask", v)?; + } + oracle_job::task::Task::ConditionalTask(v) => { + struct_ser.serialize_field("conditionalTask", v)?; + } + oracle_job::task::Task::ValueTask(v) => { + struct_ser.serialize_field("valueTask", v)?; + } + oracle_job::task::Task::MaxTask(v) => { + struct_ser.serialize_field("maxTask", v)?; + } + oracle_job::task::Task::RegexExtractTask(v) => { + struct_ser.serialize_field("regexExtractTask", v)?; + } + oracle_job::task::Task::XstepPriceTask(v) => { + struct_ser.serialize_field("xstepPriceTask", v)?; + } + oracle_job::task::Task::AddTask(v) => { + struct_ser.serialize_field("addTask", v)?; + } + oracle_job::task::Task::SubtractTask(v) => { + struct_ser.serialize_field("subtractTask", v)?; + } + oracle_job::task::Task::TwapTask(v) => { + struct_ser.serialize_field("twapTask", v)?; + } + oracle_job::task::Task::SerumSwapTask(v) => { + struct_ser.serialize_field("serumSwapTask", v)?; + } + oracle_job::task::Task::PowTask(v) => { + struct_ser.serialize_field("powTask", v)?; + } + oracle_job::task::Task::LendingRateTask(v) => { + struct_ser.serialize_field("lendingRateTask", v)?; + } + oracle_job::task::Task::MangoPerpMarketTask(v) => { + struct_ser.serialize_field("mangoPerpMarketTask", v)?; + } + oracle_job::task::Task::JupiterSwapTask(v) => { + struct_ser.serialize_field("jupiterSwapTask", v)?; + } + oracle_job::task::Task::PerpMarketTask(v) => { + struct_ser.serialize_field("perpMarketTask", v)?; + } + oracle_job::task::Task::OracleTask(v) => { + struct_ser.serialize_field("oracleTask", v)?; + } + oracle_job::task::Task::AnchorFetchTask(v) => { + struct_ser.serialize_field("anchorFetchTask", v)?; + } + oracle_job::task::Task::SplStakePoolTask(v) => { + struct_ser.serialize_field("splStakePoolTask", v)?; + } + oracle_job::task::Task::SplTokenParseTask(v) => { + struct_ser.serialize_field("splTokenParseTask", v)?; + } + oracle_job::task::Task::UniswapExchangeRateTask(v) => { + struct_ser.serialize_field("uniswapExchangeRateTask", v)?; + } + oracle_job::task::Task::SushiswapExchangeRateTask(v) => { + struct_ser.serialize_field("sushiswapExchangeRateTask", v)?; + } + oracle_job::task::Task::PancakeswapExchangeRateTask(v) => { + struct_ser.serialize_field("pancakeswapExchangeRateTask", v)?; + } + oracle_job::task::Task::CacheTask(v) => { + struct_ser.serialize_field("cacheTask", v)?; + } + oracle_job::task::Task::SysclockOffsetTask(v) => { + struct_ser.serialize_field("sysclockOffsetTask", v)?; + } + oracle_job::task::Task::MarinadeStateTask(v) => { + struct_ser.serialize_field("marinadeStateTask", v)?; + } + oracle_job::task::Task::SolanaAccountDataFetchTask(v) => { + struct_ser.serialize_field("solanaAccountDataFetchTask", v)?; + } + oracle_job::task::Task::BufferLayoutParseTask(v) => { + struct_ser.serialize_field("bufferLayoutParseTask", v)?; + } + oracle_job::task::Task::CronParseTask(v) => { + struct_ser.serialize_field("cronParseTask", v)?; + } + oracle_job::task::Task::MinTask(v) => { + struct_ser.serialize_field("minTask", v)?; + } + oracle_job::task::Task::HistoryFunctionTask(v) => { + struct_ser.serialize_field("historyFunctionTask", v)?; + } + oracle_job::task::Task::VwapTask(v) => { + struct_ser.serialize_field("vwapTask", v)?; + } + oracle_job::task::Task::EwmaTask(v) => { + struct_ser.serialize_field("ewmaTask", v)?; + } + oracle_job::task::Task::ComparisonTask(v) => { + struct_ser.serialize_field("comparisonTask", v)?; + } + oracle_job::task::Task::RoundTask(v) => { + struct_ser.serialize_field("roundTask", v)?; + } + oracle_job::task::Task::BoundTask(v) => { + struct_ser.serialize_field("boundTask", v)?; + } + oracle_job::task::Task::SecretsTask(v) => { + struct_ser.serialize_field("secretsTask", v)?; + } + oracle_job::task::Task::SanctumLstPriceTask(v) => { + struct_ser.serialize_field("sanctumLstPriceTask", v)?; + } + oracle_job::task::Task::OndoUsdyTask(v) => { + struct_ser.serialize_field("ondoUsdyTask", v)?; + } + oracle_job::task::Task::MeteoraSwapTask(v) => { + struct_ser.serialize_field("meteoraSwapTask", v)?; + } + } + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::Task { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "http_task", + "httpTask", + "json_parse_task", + "jsonParseTask", + "median_task", + "medianTask", + "mean_task", + "meanTask", + "websocket_task", + "websocketTask", + "divide_task", + "divideTask", + "multiply_task", + "multiplyTask", + "lp_token_price_task", + "lpTokenPriceTask", + "lp_exchange_rate_task", + "lpExchangeRateTask", + "conditional_task", + "conditionalTask", + "value_task", + "valueTask", + "max_task", + "maxTask", + "regex_extract_task", + "regexExtractTask", + "xstep_price_task", + "xstepPriceTask", + "add_task", + "addTask", + "subtract_task", + "subtractTask", + "twap_task", + "twapTask", + "serum_swap_task", + "serumSwapTask", + "pow_task", + "powTask", + "lending_rate_task", + "lendingRateTask", + "mango_perp_market_task", + "mangoPerpMarketTask", + "jupiter_swap_task", + "jupiterSwapTask", + "perp_market_task", + "perpMarketTask", + "oracle_task", + "oracleTask", + "anchor_fetch_task", + "anchorFetchTask", + "spl_stake_pool_task", + "splStakePoolTask", + "spl_token_parse_task", + "splTokenParseTask", + "uniswap_exchange_rate_task", + "uniswapExchangeRateTask", + "sushiswap_exchange_rate_task", + "sushiswapExchangeRateTask", + "pancakeswap_exchange_rate_task", + "pancakeswapExchangeRateTask", + "cache_task", + "cacheTask", + "sysclock_offset_task", + "sysclockOffsetTask", + "marinade_state_task", + "marinadeStateTask", + "solana_account_data_fetch_task", + "solanaAccountDataFetchTask", + "buffer_layout_parse_task", + "bufferLayoutParseTask", + "cron_parse_task", + "cronParseTask", + "min_task", + "minTask", + "history_function_task", + "historyFunctionTask", + "vwap_task", + "vwapTask", + "ewma_task", + "ewmaTask", + "comparison_task", + "comparisonTask", + "round_task", + "roundTask", + "bound_task", + "boundTask", + "secrets_task", + "secretsTask", + "sanctum_lst_price_task", + "sanctumLstPriceTask", + "ondo_usdy_task", + "ondoUsdyTask", + "meteora_swap_task", + "meteoraSwapTask", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + HttpTask, + JsonParseTask, + MedianTask, + MeanTask, + WebsocketTask, + DivideTask, + MultiplyTask, + LpTokenPriceTask, + LpExchangeRateTask, + ConditionalTask, + ValueTask, + MaxTask, + RegexExtractTask, + XstepPriceTask, + AddTask, + SubtractTask, + TwapTask, + SerumSwapTask, + PowTask, + LendingRateTask, + MangoPerpMarketTask, + JupiterSwapTask, + PerpMarketTask, + OracleTask, + AnchorFetchTask, + SplStakePoolTask, + SplTokenParseTask, + UniswapExchangeRateTask, + SushiswapExchangeRateTask, + PancakeswapExchangeRateTask, + CacheTask, + SysclockOffsetTask, + MarinadeStateTask, + SolanaAccountDataFetchTask, + BufferLayoutParseTask, + CronParseTask, + MinTask, + HistoryFunctionTask, + VwapTask, + EwmaTask, + ComparisonTask, + RoundTask, + BoundTask, + SecretsTask, + SanctumLstPriceTask, + OndoUsdyTask, + MeteoraSwapTask, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "httpTask" | "http_task" => Ok(GeneratedField::HttpTask), + "jsonParseTask" | "json_parse_task" => Ok(GeneratedField::JsonParseTask), + "medianTask" | "median_task" => Ok(GeneratedField::MedianTask), + "meanTask" | "mean_task" => Ok(GeneratedField::MeanTask), + "websocketTask" | "websocket_task" => Ok(GeneratedField::WebsocketTask), + "divideTask" | "divide_task" => Ok(GeneratedField::DivideTask), + "multiplyTask" | "multiply_task" => Ok(GeneratedField::MultiplyTask), + "lpTokenPriceTask" | "lp_token_price_task" => Ok(GeneratedField::LpTokenPriceTask), + "lpExchangeRateTask" | "lp_exchange_rate_task" => Ok(GeneratedField::LpExchangeRateTask), + "conditionalTask" | "conditional_task" => Ok(GeneratedField::ConditionalTask), + "valueTask" | "value_task" => Ok(GeneratedField::ValueTask), + "maxTask" | "max_task" => Ok(GeneratedField::MaxTask), + "regexExtractTask" | "regex_extract_task" => Ok(GeneratedField::RegexExtractTask), + "xstepPriceTask" | "xstep_price_task" => Ok(GeneratedField::XstepPriceTask), + "addTask" | "add_task" => Ok(GeneratedField::AddTask), + "subtractTask" | "subtract_task" => Ok(GeneratedField::SubtractTask), + "twapTask" | "twap_task" => Ok(GeneratedField::TwapTask), + "serumSwapTask" | "serum_swap_task" => Ok(GeneratedField::SerumSwapTask), + "powTask" | "pow_task" => Ok(GeneratedField::PowTask), + "lendingRateTask" | "lending_rate_task" => Ok(GeneratedField::LendingRateTask), + "mangoPerpMarketTask" | "mango_perp_market_task" => Ok(GeneratedField::MangoPerpMarketTask), + "jupiterSwapTask" | "jupiter_swap_task" => Ok(GeneratedField::JupiterSwapTask), + "perpMarketTask" | "perp_market_task" => Ok(GeneratedField::PerpMarketTask), + "oracleTask" | "oracle_task" => Ok(GeneratedField::OracleTask), + "anchorFetchTask" | "anchor_fetch_task" => Ok(GeneratedField::AnchorFetchTask), + "splStakePoolTask" | "spl_stake_pool_task" => Ok(GeneratedField::SplStakePoolTask), + "splTokenParseTask" | "spl_token_parse_task" => Ok(GeneratedField::SplTokenParseTask), + "uniswapExchangeRateTask" | "uniswap_exchange_rate_task" => Ok(GeneratedField::UniswapExchangeRateTask), + "sushiswapExchangeRateTask" | "sushiswap_exchange_rate_task" => Ok(GeneratedField::SushiswapExchangeRateTask), + "pancakeswapExchangeRateTask" | "pancakeswap_exchange_rate_task" => Ok(GeneratedField::PancakeswapExchangeRateTask), + "cacheTask" | "cache_task" => Ok(GeneratedField::CacheTask), + "sysclockOffsetTask" | "sysclock_offset_task" => Ok(GeneratedField::SysclockOffsetTask), + "marinadeStateTask" | "marinade_state_task" => Ok(GeneratedField::MarinadeStateTask), + "solanaAccountDataFetchTask" | "solana_account_data_fetch_task" => Ok(GeneratedField::SolanaAccountDataFetchTask), + "bufferLayoutParseTask" | "buffer_layout_parse_task" => Ok(GeneratedField::BufferLayoutParseTask), + "cronParseTask" | "cron_parse_task" => Ok(GeneratedField::CronParseTask), + "minTask" | "min_task" => Ok(GeneratedField::MinTask), + "historyFunctionTask" | "history_function_task" => Ok(GeneratedField::HistoryFunctionTask), + "vwapTask" | "vwap_task" => Ok(GeneratedField::VwapTask), + "ewmaTask" | "ewma_task" => Ok(GeneratedField::EwmaTask), + "comparisonTask" | "comparison_task" => Ok(GeneratedField::ComparisonTask), + "roundTask" | "round_task" => Ok(GeneratedField::RoundTask), + "boundTask" | "bound_task" => Ok(GeneratedField::BoundTask), + "secretsTask" | "secrets_task" => Ok(GeneratedField::SecretsTask), + "sanctumLstPriceTask" | "sanctum_lst_price_task" => Ok(GeneratedField::SanctumLstPriceTask), + "ondoUsdyTask" | "ondo_usdy_task" => Ok(GeneratedField::OndoUsdyTask), + "meteoraSwapTask" | "meteora_swap_task" => Ok(GeneratedField::MeteoraSwapTask), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::Task; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.Task") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut task__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::HttpTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("httpTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::HttpTask) +; + } + GeneratedField::JsonParseTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("jsonParseTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::JsonParseTask) +; + } + GeneratedField::MedianTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("medianTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::MedianTask) +; + } + GeneratedField::MeanTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("meanTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::MeanTask) +; + } + GeneratedField::WebsocketTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("websocketTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::WebsocketTask) +; + } + GeneratedField::DivideTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("divideTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::DivideTask) +; + } + GeneratedField::MultiplyTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("multiplyTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::MultiplyTask) +; + } + GeneratedField::LpTokenPriceTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("lpTokenPriceTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::LpTokenPriceTask) +; + } + GeneratedField::LpExchangeRateTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("lpExchangeRateTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::LpExchangeRateTask) +; + } + GeneratedField::ConditionalTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("conditionalTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::ConditionalTask) +; + } + GeneratedField::ValueTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("valueTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::ValueTask) +; + } + GeneratedField::MaxTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("maxTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::MaxTask) +; + } + GeneratedField::RegexExtractTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("regexExtractTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::RegexExtractTask) +; + } + GeneratedField::XstepPriceTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("xstepPriceTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::XstepPriceTask) +; + } + GeneratedField::AddTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("addTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::AddTask) +; + } + GeneratedField::SubtractTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("subtractTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::SubtractTask) +; + } + GeneratedField::TwapTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("twapTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::TwapTask) +; + } + GeneratedField::SerumSwapTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("serumSwapTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::SerumSwapTask) +; + } + GeneratedField::PowTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("powTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::PowTask) +; + } + GeneratedField::LendingRateTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("lendingRateTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::LendingRateTask) +; + } + GeneratedField::MangoPerpMarketTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("mangoPerpMarketTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::MangoPerpMarketTask) +; + } + GeneratedField::JupiterSwapTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("jupiterSwapTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::JupiterSwapTask) +; + } + GeneratedField::PerpMarketTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("perpMarketTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::PerpMarketTask) +; + } + GeneratedField::OracleTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("oracleTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::OracleTask) +; + } + GeneratedField::AnchorFetchTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("anchorFetchTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::AnchorFetchTask) +; + } + GeneratedField::SplStakePoolTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("splStakePoolTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::SplStakePoolTask) +; + } + GeneratedField::SplTokenParseTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("splTokenParseTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::SplTokenParseTask) +; + } + GeneratedField::UniswapExchangeRateTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("uniswapExchangeRateTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::UniswapExchangeRateTask) +; + } + GeneratedField::SushiswapExchangeRateTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("sushiswapExchangeRateTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::SushiswapExchangeRateTask) +; + } + GeneratedField::PancakeswapExchangeRateTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("pancakeswapExchangeRateTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::PancakeswapExchangeRateTask) +; + } + GeneratedField::CacheTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("cacheTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::CacheTask) +; + } + GeneratedField::SysclockOffsetTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("sysclockOffsetTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::SysclockOffsetTask) +; + } + GeneratedField::MarinadeStateTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("marinadeStateTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::MarinadeStateTask) +; + } + GeneratedField::SolanaAccountDataFetchTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("solanaAccountDataFetchTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::SolanaAccountDataFetchTask) +; + } + GeneratedField::BufferLayoutParseTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("bufferLayoutParseTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::BufferLayoutParseTask) +; + } + GeneratedField::CronParseTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("cronParseTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::CronParseTask) +; + } + GeneratedField::MinTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("minTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::MinTask) +; + } + GeneratedField::HistoryFunctionTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("historyFunctionTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::HistoryFunctionTask) +; + } + GeneratedField::VwapTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("vwapTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::VwapTask) +; + } + GeneratedField::EwmaTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("ewmaTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::EwmaTask) +; + } + GeneratedField::ComparisonTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("comparisonTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::ComparisonTask) +; + } + GeneratedField::RoundTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("roundTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::RoundTask) +; + } + GeneratedField::BoundTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("boundTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::BoundTask) +; + } + GeneratedField::SecretsTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("secretsTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::SecretsTask) +; + } + GeneratedField::SanctumLstPriceTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("sanctumLstPriceTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::SanctumLstPriceTask) +; + } + GeneratedField::OndoUsdyTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("ondoUsdyTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::OndoUsdyTask) +; + } + GeneratedField::MeteoraSwapTask => { + if task__.is_some() { + return Err(serde::de::Error::duplicate_field("meteoraSwapTask")); + } + task__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::task::Task::MeteoraSwapTask) +; + } + } + } + Ok(oracle_job::Task { + task: task__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.Task", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::TwapTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.aggregator_pubkey.is_some() { + len += 1; + } + if self.period.is_some() { + len += 1; + } + if self.weight_by_propagation_time.is_some() { + len += 1; + } + if self.min_samples.is_some() { + len += 1; + } + if self.ending_unix_timestamp.is_some() { + len += 1; + } + if self.ending_unix_timestamp_task.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.TwapTask", len)?; + if let Some(v) = self.aggregator_pubkey.as_ref() { + struct_ser.serialize_field("aggregatorPubkey", v)?; + } + if let Some(v) = self.period.as_ref() { + struct_ser.serialize_field("period", v)?; + } + if let Some(v) = self.weight_by_propagation_time.as_ref() { + struct_ser.serialize_field("weightByPropagationTime", v)?; + } + if let Some(v) = self.min_samples.as_ref() { + struct_ser.serialize_field("minSamples", v)?; + } + if let Some(v) = self.ending_unix_timestamp.as_ref() { + struct_ser.serialize_field("endingUnixTimestamp", v)?; + } + if let Some(v) = self.ending_unix_timestamp_task.as_ref() { + struct_ser.serialize_field("endingUnixTimestampTask", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::TwapTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "aggregator_pubkey", + "aggregatorPubkey", + "period", + "weight_by_propagation_time", + "weightByPropagationTime", + "min_samples", + "minSamples", + "ending_unix_timestamp", + "endingUnixTimestamp", + "ending_unix_timestamp_task", + "endingUnixTimestampTask", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + AggregatorPubkey, + Period, + WeightByPropagationTime, + MinSamples, + EndingUnixTimestamp, + EndingUnixTimestampTask, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "aggregatorPubkey" | "aggregator_pubkey" => Ok(GeneratedField::AggregatorPubkey), + "period" => Ok(GeneratedField::Period), + "weightByPropagationTime" | "weight_by_propagation_time" => Ok(GeneratedField::WeightByPropagationTime), + "minSamples" | "min_samples" => Ok(GeneratedField::MinSamples), + "endingUnixTimestamp" | "ending_unix_timestamp" => Ok(GeneratedField::EndingUnixTimestamp), + "endingUnixTimestampTask" | "ending_unix_timestamp_task" => Ok(GeneratedField::EndingUnixTimestampTask), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::TwapTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.TwapTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut aggregator_pubkey__ = None; + let mut period__ = None; + let mut weight_by_propagation_time__ = None; + let mut min_samples__ = None; + let mut ending_unix_timestamp__ = None; + let mut ending_unix_timestamp_task__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::AggregatorPubkey => { + if aggregator_pubkey__.is_some() { + return Err(serde::de::Error::duplicate_field("aggregatorPubkey")); + } + aggregator_pubkey__ = map_.next_value()?; + } + GeneratedField::Period => { + if period__.is_some() { + return Err(serde::de::Error::duplicate_field("period")); + } + period__ = + map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| x.0) + ; + } + GeneratedField::WeightByPropagationTime => { + if weight_by_propagation_time__.is_some() { + return Err(serde::de::Error::duplicate_field("weightByPropagationTime")); + } + weight_by_propagation_time__ = map_.next_value()?; + } + GeneratedField::MinSamples => { + if min_samples__.is_some() { + return Err(serde::de::Error::duplicate_field("minSamples")); + } + min_samples__ = + map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| x.0) + ; + } + GeneratedField::EndingUnixTimestamp => { + if ending_unix_timestamp__.is_some() { + return Err(serde::de::Error::duplicate_field("endingUnixTimestamp")); + } + ending_unix_timestamp__ = + map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| x.0) + ; + } + GeneratedField::EndingUnixTimestampTask => { + if ending_unix_timestamp_task__.is_some() { + return Err(serde::de::Error::duplicate_field("endingUnixTimestampTask")); + } + ending_unix_timestamp_task__ = map_.next_value()?; + } + } + } + Ok(oracle_job::TwapTask { + aggregator_pubkey: aggregator_pubkey__, + period: period__, + weight_by_propagation_time: weight_by_propagation_time__, + min_samples: min_samples__, + ending_unix_timestamp: ending_unix_timestamp__, + ending_unix_timestamp_task: ending_unix_timestamp_task__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.TwapTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::UniswapExchangeRateTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.in_token_address.is_some() { + len += 1; + } + if self.out_token_address.is_some() { + len += 1; + } + if self.in_token_amount.is_some() { + len += 1; + } + if self.slippage.is_some() { + len += 1; + } + if self.provider.is_some() { + len += 1; + } + if self.version.is_some() { + len += 1; + } + if self.router_address.is_some() { + len += 1; + } + if self.factory_address.is_some() { + len += 1; + } + if self.quoter_address.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.UniswapExchangeRateTask", len)?; + if let Some(v) = self.in_token_address.as_ref() { + struct_ser.serialize_field("inTokenAddress", v)?; + } + if let Some(v) = self.out_token_address.as_ref() { + struct_ser.serialize_field("outTokenAddress", v)?; + } + if let Some(v) = self.in_token_amount.as_ref() { + struct_ser.serialize_field("inTokenAmount", v)?; + } + if let Some(v) = self.slippage.as_ref() { + struct_ser.serialize_field("slippage", v)?; + } + if let Some(v) = self.provider.as_ref() { + struct_ser.serialize_field("provider", v)?; + } + if let Some(v) = self.version.as_ref() { + let v = oracle_job::uniswap_exchange_rate_task::Version::try_from(*v) + .map_err(|_| serde::ser::Error::custom(format!("Invalid variant {}", *v)))?; + struct_ser.serialize_field("version", &v)?; + } + if let Some(v) = self.router_address.as_ref() { + struct_ser.serialize_field("routerAddress", v)?; + } + if let Some(v) = self.factory_address.as_ref() { + struct_ser.serialize_field("factoryAddress", v)?; + } + if let Some(v) = self.quoter_address.as_ref() { + struct_ser.serialize_field("quoterAddress", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::UniswapExchangeRateTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "in_token_address", + "inTokenAddress", + "out_token_address", + "outTokenAddress", + "in_token_amount", + "inTokenAmount", + "slippage", + "provider", + "version", + "router_address", + "routerAddress", + "factory_address", + "factoryAddress", + "quoter_address", + "quoterAddress", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + InTokenAddress, + OutTokenAddress, + InTokenAmount, + Slippage, + Provider, + Version, + RouterAddress, + FactoryAddress, + QuoterAddress, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "inTokenAddress" | "in_token_address" => Ok(GeneratedField::InTokenAddress), + "outTokenAddress" | "out_token_address" => Ok(GeneratedField::OutTokenAddress), + "inTokenAmount" | "in_token_amount" => Ok(GeneratedField::InTokenAmount), + "slippage" => Ok(GeneratedField::Slippage), + "provider" => Ok(GeneratedField::Provider), + "version" => Ok(GeneratedField::Version), + "routerAddress" | "router_address" => Ok(GeneratedField::RouterAddress), + "factoryAddress" | "factory_address" => Ok(GeneratedField::FactoryAddress), + "quoterAddress" | "quoter_address" => Ok(GeneratedField::QuoterAddress), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::UniswapExchangeRateTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.UniswapExchangeRateTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut in_token_address__ = None; + let mut out_token_address__ = None; + let mut in_token_amount__ = None; + let mut slippage__ = None; + let mut provider__ = None; + let mut version__ = None; + let mut router_address__ = None; + let mut factory_address__ = None; + let mut quoter_address__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::InTokenAddress => { + if in_token_address__.is_some() { + return Err(serde::de::Error::duplicate_field("inTokenAddress")); + } + in_token_address__ = map_.next_value()?; + } + GeneratedField::OutTokenAddress => { + if out_token_address__.is_some() { + return Err(serde::de::Error::duplicate_field("outTokenAddress")); + } + out_token_address__ = map_.next_value()?; + } + GeneratedField::InTokenAmount => { + if in_token_amount__.is_some() { + return Err(serde::de::Error::duplicate_field("inTokenAmount")); + } + in_token_amount__ = + map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| x.0) + ; + } + GeneratedField::Slippage => { + if slippage__.is_some() { + return Err(serde::de::Error::duplicate_field("slippage")); + } + slippage__ = + map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| x.0) + ; + } + GeneratedField::Provider => { + if provider__.is_some() { + return Err(serde::de::Error::duplicate_field("provider")); + } + provider__ = map_.next_value()?; + } + GeneratedField::Version => { + if version__.is_some() { + return Err(serde::de::Error::duplicate_field("version")); + } + version__ = map_.next_value::<::std::option::Option>()?.map(|x| x as i32); + } + GeneratedField::RouterAddress => { + if router_address__.is_some() { + return Err(serde::de::Error::duplicate_field("routerAddress")); + } + router_address__ = map_.next_value()?; + } + GeneratedField::FactoryAddress => { + if factory_address__.is_some() { + return Err(serde::de::Error::duplicate_field("factoryAddress")); + } + factory_address__ = map_.next_value()?; + } + GeneratedField::QuoterAddress => { + if quoter_address__.is_some() { + return Err(serde::de::Error::duplicate_field("quoterAddress")); + } + quoter_address__ = map_.next_value()?; + } + } + } + Ok(oracle_job::UniswapExchangeRateTask { + in_token_address: in_token_address__, + out_token_address: out_token_address__, + in_token_amount: in_token_amount__, + slippage: slippage__, + provider: provider__, + version: version__, + router_address: router_address__, + factory_address: factory_address__, + quoter_address: quoter_address__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.UniswapExchangeRateTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::uniswap_exchange_rate_task::Version { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + let variant = match self { + Self::V2Deprecated => "VERSION_V2_DEPRECATED", + Self::V3Deprecated => "VERSION_V3_DEPRECATED", + Self::V2 => "VERSION_V2", + Self::V3 => "VERSION_V3", + }; + serializer.serialize_str(variant) + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::uniswap_exchange_rate_task::Version { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "VERSION_V2_DEPRECATED", + "VERSION_V3_DEPRECATED", + "VERSION_V2", + "VERSION_V3", + ]; + + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::uniswap_exchange_rate_task::Version; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + fn visit_i64(self, v: i64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Signed(v), &self) + }) + } + + fn visit_u64(self, v: u64) -> std::result::Result + where + E: serde::de::Error, + { + i32::try_from(v) + .ok() + .and_then(|x| x.try_into().ok()) + .ok_or_else(|| { + serde::de::Error::invalid_value(serde::de::Unexpected::Unsigned(v), &self) + }) + } + + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "VERSION_V2_DEPRECATED" => Ok(oracle_job::uniswap_exchange_rate_task::Version::V2Deprecated), + "VERSION_V3_DEPRECATED" => Ok(oracle_job::uniswap_exchange_rate_task::Version::V3Deprecated), + "VERSION_V2" => Ok(oracle_job::uniswap_exchange_rate_task::Version::V2), + "VERSION_V3" => Ok(oracle_job::uniswap_exchange_rate_task::Version::V3), + _ => Err(serde::de::Error::unknown_variant(value, FIELDS)), + } + } + } + deserializer.deserialize_any(GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::ValueTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.value.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.ValueTask", len)?; + if let Some(v) = self.value.as_ref() { + match v { + oracle_job::value_task::Value::Value(v) => { + struct_ser.serialize_field("value", v)?; + } + oracle_job::value_task::Value::AggregatorPubkey(v) => { + struct_ser.serialize_field("aggregatorPubkey", v)?; + } + oracle_job::value_task::Value::Big(v) => { + struct_ser.serialize_field("big", v)?; + } + oracle_job::value_task::Value::Hex(v) => { + struct_ser.serialize_field("hex", v)?; + } + oracle_job::value_task::Value::Utf8(v) => { + struct_ser.serialize_field("utf8", v)?; + } + } + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::ValueTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "value", + "aggregator_pubkey", + "aggregatorPubkey", + "big", + "hex", + "utf8", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Value, + AggregatorPubkey, + Big, + Hex, + Utf8, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "value" => Ok(GeneratedField::Value), + "aggregatorPubkey" | "aggregator_pubkey" => Ok(GeneratedField::AggregatorPubkey), + "big" => Ok(GeneratedField::Big), + "hex" => Ok(GeneratedField::Hex), + "utf8" => Ok(GeneratedField::Utf8), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::ValueTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.ValueTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut value__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Value => { + if value__.is_some() { + return Err(serde::de::Error::duplicate_field("value")); + } + value__ = map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| oracle_job::value_task::Value::Value(x.0)); + } + GeneratedField::AggregatorPubkey => { + if value__.is_some() { + return Err(serde::de::Error::duplicate_field("aggregatorPubkey")); + } + value__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::value_task::Value::AggregatorPubkey); + } + GeneratedField::Big => { + if value__.is_some() { + return Err(serde::de::Error::duplicate_field("big")); + } + value__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::value_task::Value::Big); + } + GeneratedField::Hex => { + if value__.is_some() { + return Err(serde::de::Error::duplicate_field("hex")); + } + value__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::value_task::Value::Hex); + } + GeneratedField::Utf8 => { + if value__.is_some() { + return Err(serde::de::Error::duplicate_field("utf8")); + } + value__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::value_task::Value::Utf8); + } + } + } + Ok(oracle_job::ValueTask { + value: value__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.ValueTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::VwapTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.price_aggregator_address.is_some() { + len += 1; + } + if self.volume_aggregator_address.is_some() { + len += 1; + } + if self.period.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.VwapTask", len)?; + if let Some(v) = self.price_aggregator_address.as_ref() { + struct_ser.serialize_field("priceAggregatorAddress", v)?; + } + if let Some(v) = self.volume_aggregator_address.as_ref() { + struct_ser.serialize_field("volumeAggregatorAddress", v)?; + } + if let Some(v) = self.period.as_ref() { + struct_ser.serialize_field("period", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::VwapTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "price_aggregator_address", + "priceAggregatorAddress", + "volume_aggregator_address", + "volumeAggregatorAddress", + "period", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + PriceAggregatorAddress, + VolumeAggregatorAddress, + Period, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "priceAggregatorAddress" | "price_aggregator_address" => Ok(GeneratedField::PriceAggregatorAddress), + "volumeAggregatorAddress" | "volume_aggregator_address" => Ok(GeneratedField::VolumeAggregatorAddress), + "period" => Ok(GeneratedField::Period), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::VwapTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.VwapTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut price_aggregator_address__ = None; + let mut volume_aggregator_address__ = None; + let mut period__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::PriceAggregatorAddress => { + if price_aggregator_address__.is_some() { + return Err(serde::de::Error::duplicate_field("priceAggregatorAddress")); + } + price_aggregator_address__ = map_.next_value()?; + } + GeneratedField::VolumeAggregatorAddress => { + if volume_aggregator_address__.is_some() { + return Err(serde::de::Error::duplicate_field("volumeAggregatorAddress")); + } + volume_aggregator_address__ = map_.next_value()?; + } + GeneratedField::Period => { + if period__.is_some() { + return Err(serde::de::Error::duplicate_field("period")); + } + period__ = + map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| x.0) + ; + } + } + } + Ok(oracle_job::VwapTask { + price_aggregator_address: price_aggregator_address__, + volume_aggregator_address: volume_aggregator_address__, + period: period__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.VwapTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::WebsocketTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.url.is_some() { + len += 1; + } + if self.subscription.is_some() { + len += 1; + } + if self.max_data_age_seconds.is_some() { + len += 1; + } + if self.filter.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.WebsocketTask", len)?; + if let Some(v) = self.url.as_ref() { + struct_ser.serialize_field("url", v)?; + } + if let Some(v) = self.subscription.as_ref() { + struct_ser.serialize_field("subscription", v)?; + } + if let Some(v) = self.max_data_age_seconds.as_ref() { + struct_ser.serialize_field("maxDataAgeSeconds", v)?; + } + if let Some(v) = self.filter.as_ref() { + struct_ser.serialize_field("filter", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::WebsocketTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "url", + "subscription", + "max_data_age_seconds", + "maxDataAgeSeconds", + "filter", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Url, + Subscription, + MaxDataAgeSeconds, + Filter, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "url" => Ok(GeneratedField::Url), + "subscription" => Ok(GeneratedField::Subscription), + "maxDataAgeSeconds" | "max_data_age_seconds" => Ok(GeneratedField::MaxDataAgeSeconds), + "filter" => Ok(GeneratedField::Filter), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::WebsocketTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.WebsocketTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut url__ = None; + let mut subscription__ = None; + let mut max_data_age_seconds__ = None; + let mut filter__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Url => { + if url__.is_some() { + return Err(serde::de::Error::duplicate_field("url")); + } + url__ = map_.next_value()?; + } + GeneratedField::Subscription => { + if subscription__.is_some() { + return Err(serde::de::Error::duplicate_field("subscription")); + } + subscription__ = map_.next_value()?; + } + GeneratedField::MaxDataAgeSeconds => { + if max_data_age_seconds__.is_some() { + return Err(serde::de::Error::duplicate_field("maxDataAgeSeconds")); + } + max_data_age_seconds__ = + map_.next_value::<::std::option::Option<::pbjson::private::NumberDeserialize<_>>>()?.map(|x| x.0) + ; + } + GeneratedField::Filter => { + if filter__.is_some() { + return Err(serde::de::Error::duplicate_field("filter")); + } + filter__ = map_.next_value()?; + } + } + } + Ok(oracle_job::WebsocketTask { + url: url__, + subscription: subscription__, + max_data_age_seconds: max_data_age_seconds__, + filter: filter__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.WebsocketTask", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for oracle_job::XStepPriceTask { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.step_source.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("oracle_job.OracleJob.XStepPriceTask", len)?; + if let Some(v) = self.step_source.as_ref() { + match v { + oracle_job::x_step_price_task::StepSource::StepJob(v) => { + struct_ser.serialize_field("stepJob", v)?; + } + oracle_job::x_step_price_task::StepSource::StepAggregatorPubkey(v) => { + struct_ser.serialize_field("stepAggregatorPubkey", v)?; + } + } + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for oracle_job::XStepPriceTask { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "step_job", + "stepJob", + "step_aggregator_pubkey", + "stepAggregatorPubkey", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + StepJob, + StepAggregatorPubkey, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "stepJob" | "step_job" => Ok(GeneratedField::StepJob), + "stepAggregatorPubkey" | "step_aggregator_pubkey" => Ok(GeneratedField::StepAggregatorPubkey), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = oracle_job::XStepPriceTask; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct oracle_job.OracleJob.XStepPriceTask") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut step_source__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::StepJob => { + if step_source__.is_some() { + return Err(serde::de::Error::duplicate_field("stepJob")); + } + step_source__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::x_step_price_task::StepSource::StepJob) +; + } + GeneratedField::StepAggregatorPubkey => { + if step_source__.is_some() { + return Err(serde::de::Error::duplicate_field("stepAggregatorPubkey")); + } + step_source__ = map_.next_value::<::std::option::Option<_>>()?.map(oracle_job::x_step_price_task::StepSource::StepAggregatorPubkey); + } + } + } + Ok(oracle_job::XStepPriceTask { + step_source: step_source__, + }) + } + } + deserializer.deserialize_struct("oracle_job.OracleJob.XStepPriceTask", FIELDS, GeneratedVisitor) + } +} diff --git a/rust/switchboard-on-demand-client/src/pull_feed.rs b/rust/switchboard-on-demand-client/src/pull_feed.rs new file mode 100644 index 0000000..597e74f --- /dev/null +++ b/rust/switchboard-on-demand-client/src/pull_feed.rs @@ -0,0 +1,473 @@ +use crate::Gateway; +use crate::OracleAccountData; +use crate::State; +use crate::*; +use std::sync::Arc; +use tokio::sync::OnceCell; +use anyhow_ext::anyhow; +use anyhow_ext::Context; +use dashmap::DashMap; +use anyhow_ext::Error as AnyhowError; +use associated_token_account::get_associated_token_address; +use associated_token_account::NATIVE_MINT; +use associated_token_account::SPL_TOKEN_PROGRAM_ID; +use base64::{engine::general_purpose::STANDARD as base64, Engine as _}; +use bs58; +use bytemuck; +use futures::future::try_join_all; +use tokio::join; +use rust_decimal::Decimal; +use serde::{Deserialize, Serialize}; +use solana_client::nonblocking::rpc_client::RpcClient; +use solana_sdk::instruction::AccountMeta; +use solana_sdk::instruction::Instruction; +use solana_sdk::pubkey::Pubkey; +use solana_sdk::system_program; +use std::future::Future; +use std::pin::Pin; +use std::result::Result; +#[cfg(feature = "solana_sdk_1_16")] +use solana_sdk::address_lookup_table_account::AddressLookupTableAccount; +#[cfg(not(feature = "solana_sdk_1_16"))] +use solana_sdk::address_lookup_table::AddressLookupTableAccount; + +type LutCache = DashMap; +type JobCache = DashMap<[u8; 32], OnceCell>>; +type PullFeedCache = DashMap>; + +pub struct SbContext { + pub lut_cache: LutCache, + pub job_cache: JobCache, + pub pull_feed_cache: PullFeedCache, +} +impl SbContext { + pub fn new() -> Arc { + Arc::new(SbContext { + lut_cache: DashMap::new(), + job_cache: DashMap::new(), + pull_feed_cache: DashMap::new(), + }) + } +} + +async fn fetch_and_cache_luts( + client: &RpcClient, + context: Arc, + oracle_keys: &[Pubkey], +) -> Result, AnyhowError> { + let mut luts = Vec::new(); + let mut keys_to_fetch = Vec::new(); + + for &key in oracle_keys { + if let Some(cached_lut) = context.lut_cache.get(&key) { + luts.push(cached_lut.clone()); + } else { + keys_to_fetch.push(key); + } + } + + if !keys_to_fetch.is_empty() { + let fetched_luts = load_lookup_tables::(client, &keys_to_fetch).await?; + for (key, lut) in keys_to_fetch.into_iter().zip(fetched_luts.into_iter()) { + context.lut_cache.insert(key, lut.clone()); + luts.push(lut); + } + } + + Ok(luts) +} + +#[derive(Clone, Debug)] +pub struct OracleResponse { + pub value: Option, + pub error: String, + pub oracle: Pubkey, + pub signature: [u8; 64], + pub recovery_id: u8, +} + +#[derive(Clone, Debug, Default)] +pub struct FetchUpdateParams { + pub feed: Pubkey, + pub payer: Pubkey, + pub gateway: Gateway, + pub crossbar: Option, + pub num_signatures: Option, + pub debug: Option, +} + +#[derive(Clone, Debug, Default)] +pub struct FetchUpdateManyParams { + pub feeds: Vec, + pub payer: Pubkey, + pub gateway: Gateway, + pub crossbar: Option, + pub num_signatures: Option, + pub debug: Option, +} + +#[derive(Serialize, Deserialize, Clone, Debug)] +pub struct SolanaSubmitSignaturesParams { + pub queue: Pubkey, + pub feed: Pubkey, + pub payer: Pubkey, +} + +pub struct PullFeed; + +impl PullFeed { + pub async fn load_data( + client: &RpcClient, + key: &Pubkey, + ) -> Result { + let account = client + .get_account_data(key) + .await + .map_err(|_| anyhow!("PullFeed.load_data: Account not found"))?; + let account = account[8..].to_vec(); + let data = bytemuck::try_from_bytes::(&account) + .map_err(|_| anyhow!("PullFeed.load_data: Failed to parse data"))?; + Ok(data.clone()) + } + + pub fn get_solana_submit_signatures_ix( + slot: u64, + responses: Vec, + params: SolanaSubmitSignaturesParams, + ) -> Result { + let mut submissions = Vec::new(); + for resp in &responses { + let mut value_i128 = i128::MAX; + if let Some(mut val) = resp.value { + val.rescale(18); + value_i128 = val.mantissa(); + } + submissions.push(Submission { + value: value_i128, + signature: resp.signature, + recovery_id: resp.recovery_id, + offset: 0, + }); + } + let mut remaining_accounts = Vec::new(); + for resp in &responses { + remaining_accounts.push(AccountMeta::new_readonly(resp.oracle, false)); + } + for resp in responses { + let stats_key = OracleAccountData::stats_key(&resp.oracle); + remaining_accounts.push(AccountMeta::new(stats_key, false)); + } + let mut submit_ix = Instruction { + program_id: *SWITCHBOARD_ON_DEMAND_PROGRAM_ID, + data: PullFeedSubmitResponseParams { slot, submissions }.data(), + accounts: PullFeedSubmitResponse { + feed: params.feed, + queue: params.queue, + program_state: State::key(), + recent_slothashes: solana_sdk::sysvar::slot_hashes::ID, + payer: params.payer, + system_program: system_program::ID, + reward_vault: get_associated_token_address(¶ms.queue, &NATIVE_MINT), + token_program: *SPL_TOKEN_PROGRAM_ID, + token_mint: *NATIVE_MINT, + } + .to_account_metas(None), + }; + submit_ix.accounts.extend(remaining_accounts); + Ok(submit_ix) + } + + pub async fn fetch_update_ix( + context: Arc, + client: &RpcClient, + params: FetchUpdateParams, + ) -> Result< + ( + Instruction, + Vec, + usize, + Vec, + ), + AnyhowError, + > { + let latest_slot = SlotHashSysvar::get_latest_slothash(&client) + .await + .context("PullFeed.fetchUpdateIx: Failed to fetch latest slot")?; + + let feed_data = context + .pull_feed_cache + .entry(params.feed) + .or_insert_with(OnceCell::new) + .get_or_try_init(||{ + PullFeed::load_data(&client, ¶ms.feed) + }) + .await? + .clone(); + + let feed_hash = feed_data.feed_hash; + let jobs = context + .job_cache + .entry(feed_hash) + .or_insert_with(OnceCell::new) + .get_or_try_init(|| { + let crossbar = params.crossbar.clone().unwrap_or_default(); + async move { + let jobs_data = crossbar + .fetch(&hex::encode(feed_hash)) + .await + .context("PullFeed.fetchUpdateIx: Failed to fetch jobs")?; + + let jobs: Vec = serde_json::from_value(jobs_data.get("jobs").unwrap().clone()) + .context("PullFeed.fetchUpdateIx: Failed to deserialize jobs")?; + + Ok::, AnyhowError>(jobs) + } + }) + .await?.clone(); + + let encoded_jobs = encode_jobs(jobs); + let gateway = params.gateway; + + let num_signatures = if params.num_signatures.is_none() { + (feed_data.min_sample_size as f64 + ((feed_data.min_sample_size as f64) / 3.0).ceil()) as u32 + } else { + params.num_signatures.unwrap() + }; + + let price_signatures = gateway + .fetch_signatures_from_encoded(FetchSignaturesParams { + recent_hash: Some(bs58::encode(latest_slot.hash.clone()).into_string()), + encoded_jobs: encoded_jobs.clone(), + num_signatures: num_signatures, + max_variance: Some((feed_data.max_variance / 1_000_000_000) as u32), + min_responses: Some(feed_data.min_responses), + use_timestamp: Some(false), + }) + .await + .context("PullFeed.fetchUpdateIx: Failed to fetch signatures")?; + + let mut num_successes = 0; + let oracle_responses: Vec = price_signatures + .responses + .iter() + .map(|x| { + let value = x.success_value.parse::().ok(); + let mut formatted_value = None; + if let Some(val) = value { + num_successes += 1; + formatted_value = Some(Decimal::from_i128_with_scale(val, 18)); + } + OracleResponse { + value: formatted_value, + error: x.failure_error.clone(), + oracle: Pubkey::new_from_array( + hex::decode(x.oracle_pubkey.clone()) + .unwrap() + .try_into() + .unwrap(), + ), + recovery_id: x.recovery_id as u8, + signature: base64 + .decode(x.signature.clone()) + .unwrap_or(Vec::new()) + .try_into() + .unwrap_or([0; 64]), + } + }) + .collect(); + + if params.debug.unwrap_or(false) { + println!("priceSignatures: {:?}", price_signatures); + } + + if num_successes == 0 { + return Err(anyhow_ext::Error::msg(format!( + "PullFeed.fetchUpdateIx Failure: No successful responses" + ))); + } + + let submit_signatures_ix = PullFeed::get_solana_submit_signatures_ix( + latest_slot.slot, + oracle_responses.clone(), + SolanaSubmitSignaturesParams { + feed: params.feed, + queue: feed_data.queue, + payer: params.payer, + }, + ) + .context("PullFeed.fetchUpdateIx: Failed to create submit signatures instruction")?; + + let oracle_keys: Vec = oracle_responses.iter().map(|x| x.oracle).collect(); + let feed_key = [params.feed]; + let queue_key = [feed_data.queue]; + + let (oracle_luts, pull_feed_lut, queue_lut) = join!( + fetch_and_cache_luts::(client, context.clone(), &oracle_keys), + fetch_and_cache_luts::(client, context.clone(), &feed_key), + fetch_and_cache_luts::(client, context.clone(), &queue_key) + ); + let oracle_luts = oracle_luts?; + let pull_feed_lut = pull_feed_lut?; + let queue_lut = queue_lut?; + + let mut luts = oracle_luts; + luts.extend(pull_feed_lut); + luts.extend(queue_lut); + + Ok((submit_signatures_ix, oracle_responses, num_successes, luts)) + } + + /// Fetch the oracle responses and format them into a Solana instruction. + /// Also fetches relevant lookup tables for the instruction. + /// This is much like fetch_update_ix method, but for multiple feeds at once. + /// # Arguments + /// * `client` - The RPC client + /// * `params` - The parameters for the fetch + pub async fn fetch_update_many_ix( + context: Arc, + client: &RpcClient, + params: FetchUpdateManyParams, + ) -> Result<(Instruction, Vec), AnyhowError> { + let crossbar = params.crossbar.clone().unwrap_or_default(); + let gateway = params.gateway; + let mut num_signatures = params.num_signatures.unwrap_or(1); + let mut feed_configs = Vec::new(); + let mut queue = Pubkey::default(); + + for feed in ¶ms.feeds { + let data = context + .pull_feed_cache + .entry(*feed) + .or_insert_with(OnceCell::new) + .get_or_try_init(|| PullFeed::load_data(client, &feed)) + .await? + .clone(); + let num_sig_lower_bound = data.min_sample_size as u32 + ((data.min_sample_size as f64) / 3.0).ceil() as u32; + if num_signatures < num_sig_lower_bound { + num_signatures = num_sig_lower_bound; + } + queue = data.queue; + let jobs = context + .job_cache + .entry(data.feed_hash) + .or_insert_with(OnceCell::new) + .get_or_try_init(|| { + let crossbar = params.crossbar.clone().unwrap_or_default(); + async move { + let jobs_data = crossbar + .fetch(&hex::encode(data.feed_hash)) + .await + .context("PullFeed.fetchUpdateIx: Failed to fetch jobs")?; + + let jobs: Vec = serde_json::from_value(jobs_data.get("jobs").unwrap().clone()) + .context("PullFeed.fetchUpdateIx: Failed to deserialize jobs")?; + + Ok::, AnyhowError>(jobs) + } + }) + .await?.clone(); + let encoded_jobs = encode_jobs(jobs); + let max_variance = (data.max_variance / 1_000_000_000) as u32; + let min_responses = data.min_responses; + let feed_config = FeedConfig { + encoded_jobs, + max_variance: Some(max_variance), + min_responses: Some(min_responses), + }; + feed_configs.push(feed_config); + } + let latest_slot = SlotHashSysvar::get_latest_slothash(&client) + .await + .context("PullFeed.fetchUpdateIx: Failed to fetch latest slot")?; + let price_signatures = gateway + .fetch_signatures_multi(FetchSignaturesMultiParams { + recent_hash: Some(bs58::encode(latest_slot.hash.clone()).into_string()), + num_signatures: Some(num_signatures), + feed_configs, + use_timestamp: Some(false), + }) + .await + .context("PullFeed.fetchUpdateIx: fetch signatures failure")?; + if params.debug.unwrap_or(false) { + println!("priceSignatures: {:?}", price_signatures); + } + + let mut submissions: Vec = Vec::new(); + for x in &price_signatures.oracle_responses { + submissions.push(MultiSubmission { + values: x + .feed_responses + .iter() + .map(|x| x.success_value.parse().unwrap_or(i128::MAX)) + .collect(), + signature: base64 + .decode(x.signature.clone()) + .context("base64:decode failure")? + .try_into() + .map_err(|_| anyhow!("base64:decode failure"))?, + recovery_id: x.recovery_id as u8, + }); + } + let ix_data = PullFeedSubmitResponseManyParams { + slot: latest_slot.slot, + submissions, + }; + let mut remaining_accounts = Vec::new(); + let oracle_keys: Vec = price_signatures + .oracle_responses + .iter() + .map(|x| { + Pubkey::new_from_array( + hex::decode(x.feed_responses.get(0).unwrap().oracle_pubkey.clone()) + .unwrap_or_default() + .try_into() + .unwrap(), + ) + }) + .collect(); + for feed in ¶ms.feeds { + remaining_accounts.push(AccountMeta::new(*feed, false)); + } + for oracle in oracle_keys.iter() { + remaining_accounts.push(AccountMeta::new_readonly(*oracle, false)); + let stats_key = OracleAccountData::stats_key(&oracle); + remaining_accounts.push(AccountMeta::new(stats_key, false)); + } + + + let queue_key = [queue]; + let (oracle_luts_result, pull_feed_luts_result, queue_lut_result) = join!( + fetch_and_cache_luts::(client, context.clone(), &oracle_keys), + fetch_and_cache_luts::(client, context.clone(), ¶ms.feeds), + fetch_and_cache_luts::(client, context.clone(), &queue_key) + ); + + // Handle the results after they are all awaited + let oracle_luts = oracle_luts_result?; + let pull_feed_luts = pull_feed_luts_result?; + let queue_lut = queue_lut_result?; + + let mut luts = oracle_luts; + luts.extend(pull_feed_luts); + luts.extend(queue_lut); + + let mut submit_ix = Instruction { + program_id: *SWITCHBOARD_ON_DEMAND_PROGRAM_ID, + data: ix_data.data(), + accounts: PullFeedSubmitResponseMany { + queue: queue, + program_state: State::key(), + recent_slothashes: solana_sdk::sysvar::slot_hashes::ID, + payer: params.payer, + system_program: system_program::ID, + reward_vault: get_associated_token_address(&queue, &NATIVE_MINT), + token_program: *SPL_TOKEN_PROGRAM_ID, + token_mint: *NATIVE_MINT, + } + .to_account_metas(None), + }; + submit_ix.accounts.extend(remaining_accounts); + + Ok((submit_ix, luts)) + } +} diff --git a/rust/switchboard-on-demand-client/src/recent_slothashes.rs b/rust/switchboard-on-demand-client/src/recent_slothashes.rs new file mode 100644 index 0000000..e766367 --- /dev/null +++ b/rust/switchboard-on-demand-client/src/recent_slothashes.rs @@ -0,0 +1,32 @@ +use anyhow_ext::Context; +use anyhow_ext::Error as AnyhowError; +use arrayref::array_ref; +use bytemuck; +use solana_client::nonblocking::rpc_client::RpcClient; +use std::result::Result; +use solana_sdk::commitment_config::CommitmentConfig; + +#[repr(C)] +#[derive(bytemuck::Pod, bytemuck::Zeroable, Debug, Clone, Copy)] +pub struct SlotHash { + pub slot: u64, + pub hash: [u8; 32], +} + +pub struct SlotHashSysvar; +impl<'a> SlotHashSysvar { + pub async fn get_latest_slothash(client: &RpcClient) -> Result { + let slots_data = client.get_account_with_commitment( + &solana_sdk::sysvar::slot_hashes::ID, + CommitmentConfig::confirmed()) + .await + .context("Failed to fetch slot hashes")? + .value + .context("Failed to fetch slot hashes")? + .data; + let slots: &[u8] = array_ref![slots_data, 8, 20_480]; + // 20_480 / 40 = 512 + let slots: &[SlotHash] = bytemuck::cast_slice::(slots); + Ok(slots[0]) + } +} diff --git a/rust/switchboard-on-demand/.env b/rust/switchboard-on-demand/.env new file mode 100644 index 0000000..e4477b1 --- /dev/null +++ b/rust/switchboard-on-demand/.env @@ -0,0 +1 @@ +SOLANA_DEVNET_RPC_URL="https://switchbo-switchbo-6225.devnet.rpcpool.com/f6fb9f02-0777-498b-b8f5-67cbb1fc0d14" \ No newline at end of file diff --git a/rust/switchboard-on-demand/.gitignore b/rust/switchboard-on-demand/.gitignore new file mode 100644 index 0000000..c71a954 --- /dev/null +++ b/rust/switchboard-on-demand/.gitignore @@ -0,0 +1,3 @@ +!.env + +doc \ No newline at end of file diff --git a/rust/switchboard-on-demand/Cargo.lock b/rust/switchboard-on-demand/Cargo.lock new file mode 100644 index 0000000..92e6be5 --- /dev/null +++ b/rust/switchboard-on-demand/Cargo.lock @@ -0,0 +1,6269 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "Inflector" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" +dependencies = [ + "lazy_static", + "regex", +] + +[[package]] +name = "addr2line" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "aead" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b613b8e1e3cf911a086f53f03bf286f52fd7a7258e4fa606f0ef220d39d8877" +dependencies = [ + "generic-array", +] + +[[package]] +name = "aes" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e8b47f52ea9bae42228d07ec09eb676433d7c4ed1ebdf0f1d1c29ed446f1ab8" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", + "opaque-debug", +] + +[[package]] +name = "aes-gcm-siv" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589c637f0e68c877bbd59a4599bbe849cac8e5f3e4b5a3ebae8f528cd218dcdc" +dependencies = [ + "aead", + "aes", + "cipher", + "ctr", + "polyval", + "subtle", + "zeroize", +] + +[[package]] +name = "ahash" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" +dependencies = [ + "getrandom 0.2.15", + "once_cell", + "version_check", +] + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "getrandom 0.2.15", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +dependencies = [ + "alloc-no-stdlib", +] + +[[package]] +name = "anchor-attribute-access-control" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5f619f1d04f53621925ba8a2e633ba5a6081f2ae14758cbb67f38fd823e0a3e" +dependencies = [ + "anchor-syn", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-attribute-account" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7f2a3e1df4685f18d12a943a9f2a7456305401af21a07c9fe076ef9ecd6e400" +dependencies = [ + "anchor-syn", + "bs58 0.5.1", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-attribute-constant" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9423945cb55627f0b30903288e78baf6f62c6c8ab28fb344b6b25f1ffee3dca7" +dependencies = [ + "anchor-syn", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-attribute-error" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93ed12720033cc3c3bf3cfa293349c2275cd5ab99936e33dd4bf283aaad3e241" +dependencies = [ + "anchor-syn", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-attribute-event" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eef4dc0371eba2d8c8b54794b0b0eb786a234a559b77593d6f80825b6d2c77a2" +dependencies = [ + "anchor-syn", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-attribute-program" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b18c4f191331e078d4a6a080954d1576241c29c56638783322a18d308ab27e4f" +dependencies = [ + "anchor-syn", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-client" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb48c4a7911038da546dc752655a29fa49f6bd50ebc1edca218bac8da1012acd" +dependencies = [ + "anchor-lang", + "anyhow", + "futures", + "regex", + "serde", + "solana-account-decoder", + "solana-client", + "solana-sdk", + "thiserror", + "tokio", + "url", +] + +[[package]] +name = "anchor-derive-accounts" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5de10d6e9620d3bcea56c56151cad83c5992f50d5960b3a9bebc4a50390ddc3c" +dependencies = [ + "anchor-syn", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-derive-serde" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4e2e5be518ec6053d90a2a7f26843dbee607583c779e6c8395951b9739bdfbe" +dependencies = [ + "anchor-syn", + "borsh-derive-internal 0.10.3", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-derive-space" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ecc31d19fa54840e74b7a979d44bcea49d70459de846088a1d71e87ba53c419" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-lang" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35da4785497388af0553586d55ebdc08054a8b1724720ef2749d313494f2b8ad" +dependencies = [ + "anchor-attribute-access-control", + "anchor-attribute-account", + "anchor-attribute-constant", + "anchor-attribute-error", + "anchor-attribute-event", + "anchor-attribute-program", + "anchor-derive-accounts", + "anchor-derive-serde", + "anchor-derive-space", + "arrayref", + "base64 0.13.1", + "bincode", + "borsh 0.10.3", + "bytemuck", + "getrandom 0.2.15", + "solana-program", + "thiserror", +] + +[[package]] +name = "anchor-spl" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c4fd6e43b2ca6220d2ef1641539e678bfc31b6cc393cf892b373b5997b6a39a" +dependencies = [ + "anchor-lang", + "solana-program", + "spl-associated-token-account", + "spl-token 4.0.0", + "spl-token-2022 0.9.0", +] + +[[package]] +name = "anchor-syn" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9101b84702fed2ea57bd22992f75065da5648017135b844283a2f6d74f27825" +dependencies = [ + "anyhow", + "bs58 0.5.1", + "heck", + "proc-macro2", + "quote", + "serde", + "serde_json", + "sha2 0.10.8", + "syn 1.0.109", + "thiserror", +] + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "ansi_term" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" +dependencies = [ + "winapi", +] + +[[package]] +name = "anyhow" +version = "1.0.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" +dependencies = [ + "backtrace", +] + +[[package]] +name = "arc-swap" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" + +[[package]] +name = "ark-bn254" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a22f4561524cd949590d78d7d4c5df8f592430d221f7f3c9497bbafd8972120f" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-std", +] + +[[package]] +name = "ark-ec" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" +dependencies = [ + "ark-ff", + "ark-poly", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", + "itertools", + "num-traits", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm", + "ark-ff-macros", + "ark-serialize", + "ark-std", + "derivative", + "digest 0.10.7", + "itertools", + "num-bigint 0.4.5", + "num-traits", + "paste", + "rustc_version", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint 0.4.5", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-poly" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" +dependencies = [ + "ark-ff", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-serialize-derive", + "ark-std", + "digest 0.10.7", + "num-bigint 0.4.5", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + +[[package]] +name = "arrayref" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" + +[[package]] +name = "arrayvec" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" + +[[package]] +name = "ascii" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eab1c04a571841102f5345a8fc0f6bb3d31c315dec879b5c6e42e40ce7ffa34e" + +[[package]] +name = "asn1-rs" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6fd5ddaf0351dff5b8da21b2fb4ff8e08ddd02857f0bf69c47639106c0fff0" +dependencies = [ + "asn1-rs-derive", + "asn1-rs-impl", + "displaydoc", + "nom", + "num-traits", + "rusticata-macros", + "thiserror", + "time", +] + +[[package]] +name = "asn1-rs-derive" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "726535892e8eae7e70657b4c8ea93d26b8553afb1ce617caee529ef96d7dee6c" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "synstructure", +] + +[[package]] +name = "asn1-rs-impl" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2777730b2039ac0f95f093556e61b6d26cebed5393ca6f152717777cec3a42ed" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "assert_matches" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9" + +[[package]] +name = "async-channel" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" +dependencies = [ + "concurrent-queue", + "event-listener", + "futures-core", +] + +[[package]] +name = "async-compression" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd066d0b4ef8ecb03a55319dc13aa6910616d0f44008a045bb1835af830abff5" +dependencies = [ + "brotli", + "flate2", + "futures-core", + "memchr", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "async-mutex" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479db852db25d9dbf6204e6cb6253698f175c15726470f78af0d918e99d6156e" +dependencies = [ + "event-listener", +] + +[[package]] +name = "async-trait" +version = "0.1.80" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi 0.1.19", + "libc", + "winapi", +] + +[[package]] +name = "autocfg" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" + +[[package]] +name = "backtrace" +version = "0.3.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + +[[package]] +name = "base-x" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cbbc9d0964165b47557570cce6c952866c2678457aca742aafc9fb771d30270" + +[[package]] +name = "base64" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64ct" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6b4d9b1225d28d360ec6a231d65af1fd99a2a095154c8040689617290569c5c" + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" +dependencies = [ + "serde", +] + +[[package]] +name = "bitmaps" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "031043d04099746d8db04daf1fa424b2bc8bd69d92b25962dcde24da39ab64a2" +dependencies = [ + "typenum", +] + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "blake3" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30cca6d3674597c30ddf2c587bf8d9d65c9a84d2326d941cc79c9842dfe0ef52" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", + "digest 0.10.7", +] + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "block-padding", + "generic-array", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block-padding" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" + +[[package]] +name = "borsh" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15bf3650200d8bffa99015595e10f1fbd17de07abbc25bb067da79e769939bfa" +dependencies = [ + "borsh-derive 0.9.3", + "hashbrown 0.11.2", +] + +[[package]] +name = "borsh" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4114279215a005bc675e386011e594e1d9b800918cea18fcadadcce864a2046b" +dependencies = [ + "borsh-derive 0.10.3", + "hashbrown 0.13.2", +] + +[[package]] +name = "borsh" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6362ed55def622cddc70a4746a68554d7b687713770de539e59a739b249f8ed" +dependencies = [ + "borsh-derive 1.5.1", + "cfg_aliases", +] + +[[package]] +name = "borsh-derive" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6441c552f230375d18e3cc377677914d2ca2b0d36e52129fe15450a2dce46775" +dependencies = [ + "borsh-derive-internal 0.9.3", + "borsh-schema-derive-internal 0.9.3", + "proc-macro-crate 0.1.5", + "proc-macro2", + "syn 1.0.109", +] + +[[package]] +name = "borsh-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0754613691538d51f329cce9af41d7b7ca150bc973056f1156611489475f54f7" +dependencies = [ + "borsh-derive-internal 0.10.3", + "borsh-schema-derive-internal 0.10.3", + "proc-macro-crate 0.1.5", + "proc-macro2", + "syn 1.0.109", +] + +[[package]] +name = "borsh-derive" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3ef8005764f53cd4dca619f5bf64cafd4664dada50ece25e4d81de54c80cc0b" +dependencies = [ + "once_cell", + "proc-macro-crate 3.1.0", + "proc-macro2", + "quote", + "syn 2.0.66", + "syn_derive", +] + +[[package]] +name = "borsh-derive-internal" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5449c28a7b352f2d1e592a8a28bf139bc71afb0764a14f3c02500935d8c44065" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "borsh-derive-internal" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afb438156919598d2c7bad7e1c0adf3d26ed3840dbc010db1a882a65583ca2fb" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "borsh-schema-derive-internal" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdbd5696d8bfa21d53d9fe39a714a18538bad11492a42d066dbbc395fb1951c0" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "borsh-schema-derive-internal" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634205cc43f74a1b9046ef87c4540ebda95696ec0f315024860cad7c5b0f5ccd" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "brotli" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74f7971dbd9326d58187408ab83117d8ac1bb9c17b085fdacd1cf2f598719b6b" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "4.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a45bd2e4095a8b518033b128020dd4a55aab1c0a381ba4404a472630f4bc362" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bs58" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" + +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "bv" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8834bb1d8ee5dc048ee3124f2c7c1afcc6bc9aed03f11e9dfd8c69470a5db340" +dependencies = [ + "feature-probe", + "serde", +] + +[[package]] +name = "bytecheck" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" +dependencies = [ + "bytecheck_derive", + "ptr_meta", + "simdutf8", +] + +[[package]] +name = "bytecheck_derive" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "bytemuck" +version = "1.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b236fc92302c97ed75b38da1f4917b5cdda4984745740f153a5d3059e48d725e" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ee891b04274a59bd38b412188e24b849617b2e45a0fd8d057deb63e7403761b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" + +[[package]] +name = "caps" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "190baaad529bcfbde9e1a19022c42781bdb6ff9de25721abdb8fd98c0807730b" +dependencies = [ + "libc", + "thiserror", +] + +[[package]] +name = "cc" +version = "1.0.99" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c51067fd44124faa7f870b4b1c969379ad32b2ba805aa959430ceaa384f695" +dependencies = [ + "jobserver", + "libc", + "once_cell", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "chrono" +version = "0.4.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "serde", + "wasm-bindgen", + "windows-targets 0.52.5", +] + +[[package]] +name = "cipher" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ee52072ec15386f770805afd189a01c8841be8696bed250fa2f13c4c0d6dfb7" +dependencies = [ + "generic-array", +] + +[[package]] +name = "clap" +version = "2.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" +dependencies = [ + "ansi_term", + "atty", + "bitflags 1.3.2", + "strsim 0.8.0", + "textwrap 0.11.0", + "unicode-width", + "vec_map", +] + +[[package]] +name = "clap" +version = "3.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" +dependencies = [ + "atty", + "bitflags 1.3.2", + "clap_lex", + "indexmap 1.9.3", + "once_cell", + "strsim 0.10.0", + "termcolor", + "textwrap 0.16.1", +] + +[[package]] +name = "clap_lex" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" +dependencies = [ + "os_str_bytes", +] + +[[package]] +name = "combine" +version = "3.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da3da6baa321ec19e1cc41d31bf599f00c783d0517095cdaf0332e3fe8d20680" +dependencies = [ + "ascii", + "byteorder", + "either", + "memchr", + "unreachable", +] + +[[package]] +name = "common-multipart-rfc7578" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baee326bc603965b0f26583e1ecd7c111c41b49bd92a344897476a352798869" +dependencies = [ + "bytes", + "futures-core", + "futures-util", + "http", + "mime", + "mime_guess", + "rand 0.8.5", + "thiserror", +] + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "console" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" +dependencies = [ + "encode_unicode", + "lazy_static", + "libc", + "unicode-width", + "windows-sys 0.52.0", +] + +[[package]] +name = "console_error_panic_hook" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" +dependencies = [ + "cfg-if", + "wasm-bindgen", +] + +[[package]] +name = "console_log" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89f72f65e8501878b8a004d5a1afb780987e2ce2b4532c562e367a72c57499f" +dependencies = [ + "log", + "web-sys", +] + +[[package]] +name = "const-oid" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d6f2aa4d0537bcc1c74df8755072bd31c1ef1a3a1b85a68e8404a8c353b7b8b" + +[[package]] +name = "const-oid" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4c78c047431fee22c1a7bb92e00ad095a02a983affe4d8a72e2a2c62c1b94f3" + +[[package]] +name = "constant_time_eq" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" + +[[package]] +name = "core2" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505" +dependencies = [ + "memchr", +] + +[[package]] +name = "cpufeatures" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "crypto-bigint" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83bd3bb4314701c568e340cd8cf78c975aa0ca79e03d3f6d1677d5b0c9c0c03" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "crypto-mac" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" +dependencies = [ + "generic-array", + "subtle", +] + +[[package]] +name = "ctr" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "049bb91fb4aaf0e3c7efa6cd5ef877dbbbd15b39dad06d9948de4ec8a75761ea" +dependencies = [ + "cipher", +] + +[[package]] +name = "curve25519-dalek" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90f9d052967f590a76e62eb387bd0bbb1b000182c3cefe5364db6b7211651bc0" +dependencies = [ + "byteorder", + "digest 0.9.0", + "rand_core 0.5.1", + "serde", + "subtle", + "zeroize", +] + +[[package]] +name = "darling" +version = "0.20.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83b2eb4d90d12bdda5ed17de686c2acb4c57914f8f921b8da7e112b5a36f3fe1" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622687fe0bac72a04e5599029151f5796111b90f1baaa9b544d807a5e31cd120" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim 0.11.1", + "syn 2.0.66", +] + +[[package]] +name = "darling_macro" +version = "0.20.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "733cabb43482b1a1b53eee8583c2b9e8684d592215ea83efd305dd31bc2f0178" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "dashmap" +version = "5.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" +dependencies = [ + "cfg-if", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + +[[package]] +name = "data-encoding" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" + +[[package]] +name = "data-encoding-macro" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1559b6cba622276d6d63706db152618eeb15b89b3e4041446b05876e352e639" +dependencies = [ + "data-encoding", + "data-encoding-macro-internal", +] + +[[package]] +name = "data-encoding-macro-internal" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "332d754c0af53bc87c108fed664d121ecf59207ec4196041f04d6ab9002ad33f" +dependencies = [ + "data-encoding", + "syn 1.0.109", +] + +[[package]] +name = "der" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79b71cca7d95d7681a4b3b9cdf63c8dbc3730d0584c2c74e31416d64a90493f4" +dependencies = [ + "const-oid 0.6.2", + "crypto-bigint", +] + +[[package]] +name = "der" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6919815d73839e7ad218de758883aae3a257ba6759ce7a9992501efbb53d705c" +dependencies = [ + "const-oid 0.7.1", +] + +[[package]] +name = "der-parser" +version = "8.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbd676fbbab537128ef0278adb5576cf363cff6aa22a7b24effe97347cfab61e" +dependencies = [ + "asn1-rs", + "displaydoc", + "nom", + "num-bigint 0.4.5", + "num-traits", + "rusticata-macros", +] + +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", +] + +[[package]] +name = "derivation-path" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e5c37193a1db1d8ed868c03ec7b152175f26160a5b740e5e484143877e0adf0" + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "dialoguer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59c6f2989294b9a498d3ad5491a79c6deb604617378e1cdc4bfc1c1361fe2f87" +dependencies = [ + "console", + "shell-words", + "tempfile", + "zeroize", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer 0.10.4", + "crypto-common", + "subtle", +] + +[[package]] +name = "dirs" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "displaydoc" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "dlopen2" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09b4f5f101177ff01b8ec4ecc81eead416a8aa42819a2869311b3420fa114ffa" +dependencies = [ + "dlopen2_derive", + "libc", + "once_cell", + "winapi", +] + +[[package]] +name = "dlopen2_derive" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6cbae11b3de8fce2a456e8ea3dada226b35fe791f0dc1d360c0941f0bb681f3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "eager" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abe71d579d1812060163dff96056261deb5bf6729b100fa2e36a68b9649ba3d3" + +[[package]] +name = "ed25519" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91cff35c70bba8a626e3185d8cd48cc11b5437e1a5bcd15b9b5fa3c64b6dfee7" +dependencies = [ + "signature", +] + +[[package]] +name = "ed25519-dalek" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" +dependencies = [ + "curve25519-dalek", + "ed25519", + "rand 0.7.3", + "serde", + "sha2 0.9.9", + "zeroize", +] + +[[package]] +name = "ed25519-dalek-bip32" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d2be62a4061b872c8c0873ee4fc6f101ce7b889d039f019c5fa2af471a59908" +dependencies = [ + "derivation-path", + "ed25519-dalek", + "hmac 0.12.1", + "sha2 0.10.8", +] + +[[package]] +name = "either" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dca9240753cf90908d7e4aac30f630662b02aebaa1b58a3cadabdb23385b58b" + +[[package]] +name = "encode_unicode" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" + +[[package]] +name = "encoding_rs" +version = "0.8.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "enum-iterator" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fd242f399be1da0a5354aa462d57b4ab2b4ee0683cc552f7c007d2d12d36e94" +dependencies = [ + "enum-iterator-derive", +] + +[[package]] +name = "enum-iterator-derive" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1ab991c1362ac86c61ab6f556cff143daa22e5a15e4e189df818b2fd19fe65b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "env_logger" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a12e6657c4c97ebab115a42dcee77225f7f482cdd841cf7088c657a42e9e00e7" +dependencies = [ + "atty", + "humantime", + "log", + "regex", + "termcolor", +] + +[[package]] +name = "envy" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f47e0157f2cb54f5ae1bd371b30a2ae4311e1c028f575cd4e81de7353215965" +dependencies = [ + "serde", +] + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "erased-serde" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24e2389d65ab4fab27dc2a5de7b191e1f6617d1f1c8855c0dc569c94a4cbb18d" +dependencies = [ + "serde", + "typeid", +] + +[[package]] +name = "errno" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + +[[package]] +name = "fastrand" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" + +[[package]] +name = "feature-probe" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835a3dc7d1ec9e75e2b5fb4ba75396837112d2060b03f7d43bc1897c7f7211da" + +[[package]] +name = "flate2" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futures" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" + +[[package]] +name = "futures-executor" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" + +[[package]] +name = "futures-macro" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "futures-sink" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" + +[[package]] +name = "futures-task" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" + +[[package]] +name = "futures-util" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "serde", + "typenum", + "version_check", +] + +[[package]] +name = "gethostname" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1ebd34e35c46e00bb73e81363248d627782724609fe1b6396f553f68fe3862e" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "gimli" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" + +[[package]] +name = "goblin" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7666983ed0dd8d21a6f6576ee00053ca0926fb281a5522577a4dbd0f1b54143" +dependencies = [ + "log", + "plain", + "scroll", +] + +[[package]] +name = "h2" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap 2.2.6", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hash32" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" +dependencies = [ + "byteorder", +] + +[[package]] +name = "hashbrown" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" +dependencies = [ + "ahash 0.7.8", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash 0.7.8", +] + +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash 0.8.11", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + +[[package]] +name = "heck" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +dependencies = [ + "serde", +] + +[[package]] +name = "histogram" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12cb882ccb290b8646e554b157ab0b71e64e8d5bef775cd66b6531e52d302669" + +[[package]] +name = "hmac" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840" +dependencies = [ + "crypto-mac", + "digest 0.9.0", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "hmac-drbg" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17ea0a1394df5b6574da6e0c1ade9e78868c9fb0a4e5ef4428e32da4676b85b1" +dependencies = [ + "digest 0.9.0", + "generic-array", + "hmac 0.8.1", +] + +[[package]] +name = "http" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +dependencies = [ + "bytes", + "http", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "humantime" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" + +[[package]] +name = "hyper" +version = "0.14.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f361cde2f109281a220d4307746cdfd5ee3f410da58a70377762396775634b33" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper-multipart-rfc7578" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0eb2cf73e96e9925f4bed948e763aa2901c2f1a3a5f713ee41917433ced6671" +dependencies = [ + "bytes", + "common-multipart-rfc7578", + "futures-core", + "http", + "hyper", +] + +[[package]] +name = "hyper-rustls" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1788965e61b367cd03a62950836d5cd41560c3577d90e40e0819373194d1661c" +dependencies = [ + "http", + "hyper", + "log", + "rustls 0.20.9", + "rustls-native-certs", + "tokio", + "tokio-rustls 0.23.4", +] + +[[package]] +name = "hyper-rustls" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" +dependencies = [ + "futures-util", + "http", + "hyper", + "rustls 0.21.12", + "tokio", + "tokio-rustls 0.24.1", +] + +[[package]] +name = "hyper-tls" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +dependencies = [ + "bytes", + "hyper", + "native-tls", + "tokio", + "tokio-native-tls", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "im" +version = "15.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0acd33ff0285af998aaf9b57342af478078f53492322fafc47450e09397e0e9" +dependencies = [ + "bitmaps", + "rand_core 0.6.4", + "rand_xoshiro", + "rayon", + "serde", + "sized-chunks", + "typenum", + "version_check", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", +] + +[[package]] +name = "indexmap" +version = "2.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" +dependencies = [ + "equivalent", + "hashbrown 0.14.5", +] + +[[package]] +name = "indicatif" +version = "0.17.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "763a5a8f45087d6bcea4222e7b72c291a054edf80e4ef6efd2a4979878c7bea3" +dependencies = [ + "console", + "instant", + "number_prefix", + "portable-atomic", + "unicode-width", +] + +[[package]] +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "ipfs-api" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d8cc57cf12ae4af611e53dd04053e1cfb815917c51c410aa30399bf377046ab" +dependencies = [ + "ipfs-api-backend-hyper", +] + +[[package]] +name = "ipfs-api-backend-hyper" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9d131b408b4caafe1e7c00d410a09ad3eb7e3ab68690cf668e86904b2176b4" +dependencies = [ + "async-trait", + "base64 0.13.1", + "bytes", + "futures", + "http", + "hyper", + "hyper-multipart-rfc7578", + "hyper-rustls 0.23.2", + "ipfs-api-prelude", + "thiserror", +] + +[[package]] +name = "ipfs-api-prelude" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b74065805db266ba2c6edbd670b23c4714824a955628472b2e46cc9f3a869cb" +dependencies = [ + "async-trait", + "bytes", + "cfg-if", + "common-multipart-rfc7578", + "dirs", + "futures", + "http", + "multiaddr", + "multibase", + "serde", + "serde_json", + "serde_urlencoded", + "thiserror", + "tokio", + "tokio-util", + "tracing", + "typed-builder", + "walkdir", +] + +[[package]] +name = "ipnet" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" + +[[package]] +name = "jobserver" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" +dependencies = [ + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "jsonrpc-core" +version = "18.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14f7f76aef2d054868398427f6c54943cf3d1caa9a7ec7d0c38d69df97a965eb" +dependencies = [ + "futures", + "futures-executor", + "futures-util", + "log", + "serde", + "serde_derive", + "serde_json", +] + +[[package]] +name = "keccak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +dependencies = [ + "cpufeatures", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +dependencies = [ + "spin 0.5.2", +] + +[[package]] +name = "libc" +version = "0.2.155" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" + +[[package]] +name = "libm" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" + +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.5.0", + "libc", +] + +[[package]] +name = "libsecp256k1" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9d220bc1feda2ac231cb78c3d26f27676b8cf82c96971f7aeef3d0cf2797c73" +dependencies = [ + "arrayref", + "base64 0.12.3", + "digest 0.9.0", + "hmac-drbg", + "libsecp256k1-core 0.2.2", + "libsecp256k1-gen-ecmult 0.2.1", + "libsecp256k1-gen-genmult 0.2.1", + "rand 0.7.3", + "serde", + "sha2 0.9.9", + "typenum", +] + +[[package]] +name = "libsecp256k1" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95b09eff1b35ed3b33b877ced3a691fc7a481919c7e29c53c906226fcf55e2a1" +dependencies = [ + "arrayref", + "base64 0.13.1", + "digest 0.9.0", + "hmac-drbg", + "libsecp256k1-core 0.3.0", + "libsecp256k1-gen-ecmult 0.3.0", + "libsecp256k1-gen-genmult 0.3.0", + "rand 0.8.5", + "serde", + "sha2 0.9.9", + "typenum", +] + +[[package]] +name = "libsecp256k1-core" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0f6ab710cec28cef759c5f18671a27dae2a5f952cdaaee1d8e2908cb2478a80" +dependencies = [ + "crunchy", + "digest 0.9.0", + "subtle", +] + +[[package]] +name = "libsecp256k1-core" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5be9b9bb642d8522a44d533eab56c16c738301965504753b03ad1de3425d5451" +dependencies = [ + "crunchy", + "digest 0.9.0", + "subtle", +] + +[[package]] +name = "libsecp256k1-gen-ecmult" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccab96b584d38fac86a83f07e659f0deafd0253dc096dab5a36d53efe653c5c3" +dependencies = [ + "libsecp256k1-core 0.2.2", +] + +[[package]] +name = "libsecp256k1-gen-ecmult" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3038c808c55c87e8a172643a7d87187fc6c4174468159cb3090659d55bcb4809" +dependencies = [ + "libsecp256k1-core 0.3.0", +] + +[[package]] +name = "libsecp256k1-gen-genmult" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67abfe149395e3aa1c48a2beb32b068e2334402df8181f818d3aee2b304c4f5d" +dependencies = [ + "libsecp256k1-core 0.2.2", +] + +[[package]] +name = "libsecp256k1-gen-genmult" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db8d6ba2cec9eacc40e6e8ccc98931840301f1006e95647ceb2dd5c3aa06f7c" +dependencies = [ + "libsecp256k1-core 0.3.0", +] + +[[package]] +name = "light-poseidon" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c9a85a9752c549ceb7578064b4ed891179d20acd85f27318573b64d2d7ee7ee" +dependencies = [ + "ark-bn254", + "ark-ff", + "num-bigint 0.4.5", + "thiserror", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" +dependencies = [ + "value-bag", +] + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "memmap2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" +dependencies = [ + "libc", +] + +[[package]] +name = "memoffset" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" +dependencies = [ + "autocfg", +] + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "merlin" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58c38e2799fc0978b65dfff8023ec7843e2330bb462f19198840b34b6582397d" +dependencies = [ + "byteorder", + "keccak", + "rand_core 0.6.4", + "zeroize", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "mime_guess" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" +dependencies = [ + "mime", + "unicase", +] + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" +dependencies = [ + "adler", +] + +[[package]] +name = "mio" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +dependencies = [ + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.48.0", +] + +[[package]] +name = "multiaddr" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b36f567c7099511fa8612bbbb52dda2419ce0bdbacf31714e3a5ffdb766d3bd" +dependencies = [ + "arrayref", + "byteorder", + "data-encoding", + "log", + "multibase", + "multihash", + "percent-encoding", + "serde", + "static_assertions", + "unsigned-varint", + "url", +] + +[[package]] +name = "multibase" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b3539ec3c1f04ac9748a260728e855f261b4977f5c3406612c884564f329404" +dependencies = [ + "base-x", + "data-encoding", + "data-encoding-macro", +] + +[[package]] +name = "multihash" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835d6ff01d610179fbce3de1694d007e500bf33a7f29689838941d6bf783ae40" +dependencies = [ + "core2", + "multihash-derive", + "unsigned-varint", +] + +[[package]] +name = "multihash-derive" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6d4752e6230d8ef7adf7bd5d8c4b1f6561c1014c5ba9a37445ccefe18aa1db" +dependencies = [ + "proc-macro-crate 1.1.3", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", + "synstructure", +] + +[[package]] +name = "native-tls" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "nix" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "libc", + "memoffset 0.7.1", + "pin-utils", +] + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "num" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8536030f9fea7127f841b45bb6243b27255787fb4eb83958aa1ef9d2fdc0c36" +dependencies = [ + "num-bigint 0.2.6", + "num-complex 0.2.4", + "num-integer", + "num-iter", + "num-rational 0.2.4", + "num-traits", +] + +[[package]] +name = "num" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" +dependencies = [ + "num-bigint 0.4.5", + "num-complex 0.4.6", + "num-integer", + "num-iter", + "num-rational 0.4.2", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c165a9ab64cf766f73521c0dd2cfdff64f488b8f0b3e621face3462d3db536d7" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-bigint-dig" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9bc3e36fd683e004fd59c64a425e0e991616f5a8b617c3b9a933a93c168facc" +dependencies = [ + "byteorder", + "lazy_static", + "libm", + "num-integer", + "num-iter", + "num-traits", + "rand 0.8.5", + "smallvec", + "zeroize", +] + +[[package]] +name = "num-complex" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6b19411a9719e753aff12e5187b74d60d3dc449ec3f4dc21e3989c3f554bc95" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-complex" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-derive" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c000134b5dbf44adc5cb772486d335293351644b801551abe8f75c84cfa4aef" +dependencies = [ + "autocfg", + "num-bigint 0.2.6", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint 0.4.5", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi 0.3.9", + "libc", +] + +[[package]] +name = "num_enum" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" +dependencies = [ + "num_enum_derive 0.5.11", +] + +[[package]] +name = "num_enum" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a015b430d3c108a207fd776d2e2196aaf8b1cf8cf93253e3a097ff3085076a1" +dependencies = [ + "num_enum_derive 0.6.1", +] + +[[package]] +name = "num_enum" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02339744ee7253741199f897151b38e72257d13802d4ee837285cc2990a90845" +dependencies = [ + "num_enum_derive 0.7.2", +] + +[[package]] +name = "num_enum_derive" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" +dependencies = [ + "proc-macro-crate 1.1.3", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "num_enum_derive" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6" +dependencies = [ + "proc-macro-crate 1.1.3", + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "681030a937600a36906c185595136d26abfebb4aa9c65701cefcaf8578bb982b" +dependencies = [ + "proc-macro-crate 3.1.0", + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "number_prefix" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" + +[[package]] +name = "object" +version = "0.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "576dfe1fc8f9df304abb159d767a29d0476f7750fbf8aa7ad07816004a207434" +dependencies = [ + "memchr", +] + +[[package]] +name = "oid-registry" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bedf36ffb6ba96c2eb7144ef6270557b52e54b20c0a8e1eb2ff99a6c6959bff" +dependencies = [ + "asn1-rs", +] + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + +[[package]] +name = "openssl" +version = "0.10.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" +dependencies = [ + "bitflags 2.5.0", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "openssl-sys" +version = "0.9.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c597637d56fbc83893a35eb0dd04b2b8e7a50c91e64e9493e398b5df4fb45fa2" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "os_str_bytes" +version = "6.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1" + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.52.5", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pbkdf2" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "216eaa586a190f0a738f2f918511eecfa90f13295abec0e457cdebcceda80cbd" +dependencies = [ + "crypto-mac", +] + +[[package]] +name = "pbkdf2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "pem" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8835c273a76a90455d7344889b0964598e3316e2a79ede8e36f16bdcf2228b8" +dependencies = [ + "base64 0.13.1", +] + +[[package]] +name = "pem-rfc7468" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84e93a3b1cc0510b03020f33f21e62acdde3dcaef432edc95bea377fbd4c2cd4" +dependencies = [ + "base64ct", +] + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "percentage" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fd23b938276f14057220b707937bcb42fa76dda7560e57a2da30cb52d557937" +dependencies = [ + "num 0.2.1", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkcs1" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "116bee8279d783c0cf370efa1a94632f2108e5ef0bb32df31f051647810a4e2c" +dependencies = [ + "der 0.4.5", + "pem-rfc7468", + "zeroize", +] + +[[package]] +name = "pkcs8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee3ef9b64d26bad0536099c816c6734379e45bbd5f14798def6809e5cc350447" +dependencies = [ + "der 0.4.5", + "pem-rfc7468", + "pkcs1", + "spki 0.4.1", + "zeroize", +] + +[[package]] +name = "pkcs8" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cabda3fb821068a9a4fab19a683eac3af12edf0f34b94a8be53c4972b8149d0" +dependencies = [ + "der 0.5.1", + "spki 0.5.4", + "zeroize", +] + +[[package]] +name = "pkg-config" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" + +[[package]] +name = "plain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" + +[[package]] +name = "polyval" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8419d2b623c7c0896ff2d5d96e2cb4ede590fed28fcc34934f4c33c036e620a1" +dependencies = [ + "cfg-if", + "cpufeatures", + "opaque-debug", + "universal-hash", +] + +[[package]] +name = "portable-atomic" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "proc-macro-crate" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" +dependencies = [ + "toml", +] + +[[package]] +name = "proc-macro-crate" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e17d47ce914bf4de440332250b0edd23ce48c005f59fab39d3335866b114f11a" +dependencies = [ + "thiserror", + "toml", +] + +[[package]] +name = "proc-macro-crate" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" +dependencies = [ + "toml_edit", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.85" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22244ce15aa966053a896d1accb3a6e68469b97c7f33f284b99f0d576879fc23" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "ptr_meta" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "qstring" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d464fae65fff2680baf48019211ce37aaec0c78e9264c84a3e484717f965104e" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "qualifier_attr" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e2e25ee72f5b24d773cae88422baddefff7714f97aab68d96fe2b6fc4a28fb2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "quinn" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cc2c5017e4b43d5995dcea317bc46c1e09404c0a9664d2908f7f02dfe943d75" +dependencies = [ + "bytes", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls 0.21.12", + "thiserror", + "tokio", + "tracing", +] + +[[package]] +name = "quinn-proto" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "141bf7dfde2fbc246bfd3fe12f2455aa24b0fbd9af535d8c86c7bd1381ff2b1a" +dependencies = [ + "bytes", + "rand 0.8.5", + "ring 0.16.20", + "rustc-hash", + "rustls 0.21.12", + "rustls-native-certs", + "slab", + "thiserror", + "tinyvec", + "tracing", +] + +[[package]] +name = "quinn-udp" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "055b4e778e8feb9f93c4e439f71dc2156ef13360b432b799e179a8c4cdf0b1d7" +dependencies = [ + "bytes", + "libc", + "socket2", + "tracing", + "windows-sys 0.48.0", +] + +[[package]] +name = "quote" +version = "1.0.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.15", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "rand_xoshiro" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f97cdb2a36ed4183de61b2f824cc45c9f1037f28afe0a322e9fff4c108b5aaa" +dependencies = [ + "rand_core 0.6.4", +] + +[[package]] +name = "rayon" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "rcgen" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffbe84efe2f38dea12e9bfc1f65377fdf03e53a18cb3b995faedf7934c7e785b" +dependencies = [ + "pem", + "ring 0.16.20", + "time", + "yasna", +] + +[[package]] +name = "redox_syscall" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c82cf8cff14456045f55ec4241383baeff27af886adb72ffb2162f99911de0fd" +dependencies = [ + "bitflags 2.5.0", +] + +[[package]] +name = "redox_users" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891" +dependencies = [ + "getrandom 0.2.15", + "libredox", + "thiserror", +] + +[[package]] +name = "regex" +version = "1.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" + +[[package]] +name = "rend" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" +dependencies = [ + "bytecheck", +] + +[[package]] +name = "reqwest" +version = "0.11.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" +dependencies = [ + "async-compression", + "base64 0.21.7", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "hyper", + "hyper-rustls 0.24.2", + "hyper-tls", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls 0.21.12", + "rustls-pemfile", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "system-configuration", + "tokio", + "tokio-native-tls", + "tokio-rustls 0.24.1", + "tokio-util", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webpki-roots 0.25.4", + "winreg", +] + +[[package]] +name = "ring" +version = "0.16.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +dependencies = [ + "cc", + "libc", + "once_cell", + "spin 0.5.2", + "untrusted 0.7.1", + "web-sys", + "winapi", +] + +[[package]] +name = "ring" +version = "0.17.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.15", + "libc", + "spin 0.9.8", + "untrusted 0.9.0", + "windows-sys 0.52.0", +] + +[[package]] +name = "rkyv" +version = "0.7.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cba464629b3394fc4dbc6f940ff8f5b4ff5c7aef40f29166fd4ad12acbc99c0" +dependencies = [ + "bitvec", + "bytecheck", + "bytes", + "hashbrown 0.12.3", + "ptr_meta", + "rend", + "rkyv_derive", + "seahash", + "tinyvec", + "uuid", +] + +[[package]] +name = "rkyv_derive" +version = "0.7.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7dddfff8de25e6f62b9d64e6e432bf1c6736c57d20323e15ee10435fbda7c65" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "rpassword" +version = "7.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80472be3c897911d0137b2d2b9055faf6eeac5b14e324073d83bc17b191d7e3f" +dependencies = [ + "libc", + "rtoolbox", + "windows-sys 0.48.0", +] + +[[package]] +name = "rsa" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e05c2603e2823634ab331437001b411b9ed11660fbc4066f3908c84a9439260d" +dependencies = [ + "byteorder", + "digest 0.9.0", + "lazy_static", + "num-bigint-dig", + "num-integer", + "num-iter", + "num-traits", + "pkcs1", + "pkcs8 0.7.6", + "rand 0.8.5", + "subtle", + "zeroize", +] + +[[package]] +name = "rtoolbox" +version = "0.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c247d24e63230cdb56463ae328478bd5eac8b8faa8c69461a77e8e323afac90e" +dependencies = [ + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "rust_decimal" +version = "1.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1790d1c4c0ca81211399e0e0af16333276f375209e71a37b67698a373db5b47a" +dependencies = [ + "arrayvec", + "borsh 1.5.1", + "bytes", + "num-traits", + "rand 0.8.5", + "rkyv", + "serde", + "serde_json", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + +[[package]] +name = "rusticata-macros" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632" +dependencies = [ + "nom", +] + +[[package]] +name = "rustix" +version = "0.38.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +dependencies = [ + "bitflags 2.5.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustls" +version = "0.20.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b80e3dec595989ea8510028f30c408a4630db12c9cbb8de34203b89d6577e99" +dependencies = [ + "log", + "ring 0.16.20", + "sct", + "webpki", +] + +[[package]] +name = "rustls" +version = "0.21.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" +dependencies = [ + "log", + "ring 0.17.8", + "rustls-webpki", + "sct", +] + +[[package]] +name = "rustls-native-certs" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" +dependencies = [ + "openssl-probe", + "rustls-pemfile", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64 0.21.7", +] + +[[package]] +name = "rustls-webpki" +version = "0.101.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +dependencies = [ + "ring 0.17.8", + "untrusted 0.9.0", +] + +[[package]] +name = "rustversion" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" + +[[package]] +name = "ryu" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schannel" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "scroll" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04c565b551bafbef4157586fa379538366e4385d42082f255bfd96e4fe8519da" +dependencies = [ + "scroll_derive", +] + +[[package]] +name = "scroll_derive" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1db149f81d46d2deba7cd3c50772474707729550221e69588478ebf9ada425ae" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "sct" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" +dependencies = [ + "ring 0.17.8", + "untrusted 0.9.0", +] + +[[package]] +name = "seahash" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" + +[[package]] +name = "security-framework" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0" +dependencies = [ + "bitflags 2.5.0", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "317936bbbd05227752583946b9e66d7ce3b489f84e11a94a510b4437fef407d7" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" + +[[package]] +name = "serde" +version = "1.0.203" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_bytes" +version = "0.11.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b8497c313fd43ab992087548117643f6fcd935cbf36f176ffda0aacf9591734" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_derive" +version = "1.0.203" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "serde_fmt" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1d4ddca14104cd60529e8c7f7ba71a2c8acd8f7f5cfcdc2faf97eeb7c3010a4" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_json" +version = "1.0.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "455182ea6142b14f93f4bc5320a2b31c1f266b66a4a5c858b013302a5d8cbfc3" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_with" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07ff71d2c147a7b57362cead5e22f772cd52f6ab31cfcd9edcd7f6aeb2a0afbe" +dependencies = [ + "serde", + "serde_with_macros", +] + +[[package]] +name = "serde_with_macros" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "881b6f881b17d13214e5d494c939ebab463d01264ce1811e9d4ac3a882e7695f" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.7", +] + +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.7", +] + +[[package]] +name = "sha3" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f81199417d4e5de3f04b1e871023acea7389672c4135918f05aa9cbf2f2fa809" +dependencies = [ + "block-buffer 0.9.0", + "digest 0.9.0", + "keccak", + "opaque-debug", +] + +[[package]] +name = "sha3" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +dependencies = [ + "digest 0.10.7", + "keccak", +] + +[[package]] +name = "shell-words" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" + +[[package]] +name = "signal-hook-registry" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +dependencies = [ + "libc", +] + +[[package]] +name = "signature" +version = "1.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" + +[[package]] +name = "simdutf8" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" + +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + +[[package]] +name = "sized-chunks" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16d69225bde7a69b235da73377861095455d298f2b970996eec25ddbb42b3d1e" +dependencies = [ + "bitmaps", + "typenum", +] + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "socket2" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "solana-account-decoder" +version = "1.18.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4973213a11c2e1b924b36e0c6688682b5aa4623f8d4eeaa1204c32cee524e6d6" +dependencies = [ + "Inflector", + "base64 0.21.7", + "bincode", + "bs58 0.4.0", + "bv", + "lazy_static", + "serde", + "serde_derive", + "serde_json", + "solana-config-program", + "solana-sdk", + "spl-token 4.0.0", + "spl-token-2022 1.0.0", + "spl-token-group-interface", + "spl-token-metadata-interface", + "thiserror", + "zstd", +] + +[[package]] +name = "solana-address-lookup-table-program" +version = "1.18.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4e57cb8f2e90361280b246f70bb7f5f86f4e4ff1ad5bbdfe18a81bea141f03a" +dependencies = [ + "bincode", + "bytemuck", + "log", + "num-derive 0.4.2", + "num-traits", + "rustc_version", + "serde", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-program", + "solana-program-runtime", + "solana-sdk", + "thiserror", +] + +[[package]] +name = "solana-clap-utils" +version = "1.18.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "909f4553d0b31bb5b97533a6b64cc321a4eace9112d6efbabcf4408ea1b3f1db" +dependencies = [ + "chrono", + "clap 2.34.0", + "rpassword", + "solana-remote-wallet", + "solana-sdk", + "thiserror", + "tiny-bip39", + "uriparse", + "url", +] + +[[package]] +name = "solana-client" +version = "1.18.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5cc431df6cc1dd964134fa4ec7df765d3af3fae9c2148f96a3c4fb500290633" +dependencies = [ + "async-trait", + "bincode", + "dashmap", + "futures", + "futures-util", + "indexmap 2.2.6", + "indicatif", + "log", + "quinn", + "rayon", + "solana-connection-cache", + "solana-measure", + "solana-metrics", + "solana-pubsub-client", + "solana-quic-client", + "solana-rpc-client", + "solana-rpc-client-api", + "solana-rpc-client-nonce-utils", + "solana-sdk", + "solana-streamer", + "solana-thin-client", + "solana-tpu-client", + "solana-udp-client", + "thiserror", + "tokio", +] + +[[package]] +name = "solana-config-program" +version = "1.18.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e38b040d3a42e8f7d80c4a86bb0d49d7aed663b56b0fe0ae135d2d145fb7ae3a" +dependencies = [ + "bincode", + "chrono", + "serde", + "serde_derive", + "solana-program-runtime", + "solana-sdk", +] + +[[package]] +name = "solana-connection-cache" +version = "1.18.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae02622c63943485f0af3d0896626eaf6478e734f0b6bc61c7cc5320963c6e75" +dependencies = [ + "async-trait", + "bincode", + "crossbeam-channel", + "futures-util", + "indexmap 2.2.6", + "log", + "rand 0.8.5", + "rayon", + "rcgen", + "solana-measure", + "solana-metrics", + "solana-sdk", + "thiserror", + "tokio", +] + +[[package]] +name = "solana-frozen-abi" +version = "1.18.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4867f66e9527fa44451c861c1dc6d9b2a7c7a668d7c6a297cdefbe39f4395b33" +dependencies = [ + "block-buffer 0.10.4", + "bs58 0.4.0", + "bv", + "either", + "generic-array", + "im", + "lazy_static", + "log", + "memmap2", + "rustc_version", + "serde", + "serde_bytes", + "serde_derive", + "sha2 0.10.8", + "solana-frozen-abi-macro", + "subtle", + "thiserror", +] + +[[package]] +name = "solana-frozen-abi-macro" +version = "1.18.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "168f24d97347b85f05192df58d6be3e3047a4aadc4001bc1b9e711a5ec878eea" +dependencies = [ + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.66", +] + +[[package]] +name = "solana-logger" +version = "1.18.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0511082fc62f2d086520fff5aa1917c389d8c840930c08ad255ae05952c08a2" +dependencies = [ + "env_logger", + "lazy_static", + "log", +] + +[[package]] +name = "solana-measure" +version = "1.18.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be55a3df105431d25f86f2a7da0cbbde5f54c1f0782ca59367ea4a8037bc6797" +dependencies = [ + "log", + "solana-sdk", +] + +[[package]] +name = "solana-metrics" +version = "1.18.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddec097ed7572804389195128dbd57958b427829153c6cd8ec3343c86fe3cd22" +dependencies = [ + "crossbeam-channel", + "gethostname", + "lazy_static", + "log", + "reqwest", + "solana-sdk", + "thiserror", +] + +[[package]] +name = "solana-net-utils" +version = "1.18.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "258fa7c29fb7605b8d2ed89aa0d43c640d14f4147ad1f5b3fdad19a1ac145ca5" +dependencies = [ + "bincode", + "clap 3.2.25", + "crossbeam-channel", + "log", + "nix", + "rand 0.8.5", + "serde", + "serde_derive", + "socket2", + "solana-logger", + "solana-sdk", + "solana-version", + "tokio", + "url", +] + +[[package]] +name = "solana-perf" +version = "1.18.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca422edcf16a6e64003ca118575ea641f7b750f14a0ad28c71dd84f33dcb912a" +dependencies = [ + "ahash 0.8.11", + "bincode", + "bv", + "caps", + "curve25519-dalek", + "dlopen2", + "fnv", + "lazy_static", + "libc", + "log", + "nix", + "rand 0.8.5", + "rayon", + "rustc_version", + "serde", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-metrics", + "solana-rayon-threadlimit", + "solana-sdk", + "solana-vote-program", +] + +[[package]] +name = "solana-program" +version = "1.18.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bc5a636dc75e5c25651e34f7a36afc9ae60d38166687c5b0375abb580ac81a2" +dependencies = [ + "ark-bn254", + "ark-ec", + "ark-ff", + "ark-serialize", + "base64 0.21.7", + "bincode", + "bitflags 2.5.0", + "blake3", + "borsh 0.10.3", + "borsh 0.9.3", + "borsh 1.5.1", + "bs58 0.4.0", + "bv", + "bytemuck", + "cc", + "console_error_panic_hook", + "console_log", + "curve25519-dalek", + "getrandom 0.2.15", + "itertools", + "js-sys", + "lazy_static", + "libc", + "libsecp256k1 0.6.0", + "light-poseidon", + "log", + "memoffset 0.9.1", + "num-bigint 0.4.5", + "num-derive 0.4.2", + "num-traits", + "parking_lot", + "rand 0.8.5", + "rustc_version", + "rustversion", + "serde", + "serde_bytes", + "serde_derive", + "serde_json", + "sha2 0.10.8", + "sha3 0.10.8", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-sdk-macro", + "thiserror", + "tiny-bip39", + "wasm-bindgen", + "zeroize", +] + +[[package]] +name = "solana-program-runtime" +version = "1.18.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf373c3da0387f47fee4c5ed2465a9628b9db026a62211a692a9285aa9251544" +dependencies = [ + "base64 0.21.7", + "bincode", + "eager", + "enum-iterator", + "itertools", + "libc", + "log", + "num-derive 0.4.2", + "num-traits", + "percentage", + "rand 0.8.5", + "rustc_version", + "serde", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-measure", + "solana-metrics", + "solana-sdk", + "solana_rbpf", + "thiserror", +] + +[[package]] +name = "solana-pubsub-client" +version = "1.18.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97b9abc76168d19927561db6a3685b98752bd0961b4ce4f8b7f85ee12238c017" +dependencies = [ + "crossbeam-channel", + "futures-util", + "log", + "reqwest", + "semver", + "serde", + "serde_derive", + "serde_json", + "solana-account-decoder", + "solana-rpc-client-api", + "solana-sdk", + "thiserror", + "tokio", + "tokio-stream", + "tokio-tungstenite", + "tungstenite", + "url", +] + +[[package]] +name = "solana-quic-client" +version = "1.18.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7952c5306a0be5f5276448cd20246b31265bfa884f29a077a24303c6a16aeb34" +dependencies = [ + "async-mutex", + "async-trait", + "futures", + "itertools", + "lazy_static", + "log", + "quinn", + "quinn-proto", + "rcgen", + "rustls 0.21.12", + "solana-connection-cache", + "solana-measure", + "solana-metrics", + "solana-net-utils", + "solana-rpc-client-api", + "solana-sdk", + "solana-streamer", + "thiserror", + "tokio", +] + +[[package]] +name = "solana-rayon-threadlimit" +version = "1.18.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4fa0cc66f8e73d769bca2ede3012ba2ef8ab67963e832808665369f2cf81743" +dependencies = [ + "lazy_static", + "num_cpus", +] + +[[package]] +name = "solana-remote-wallet" +version = "1.18.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "289803796d4ff7b4699504d3ab9e9d9c5205ea3892b2ebe397b377494dbd75d4" +dependencies = [ + "console", + "dialoguer", + "log", + "num-derive 0.4.2", + "num-traits", + "parking_lot", + "qstring", + "semver", + "solana-sdk", + "thiserror", + "uriparse", +] + +[[package]] +name = "solana-rpc-client" +version = "1.18.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6cb55a08018776a62ecff52139fbcdab1a7baa4e8f077202be58156e8dde4d5f" +dependencies = [ + "async-trait", + "base64 0.21.7", + "bincode", + "bs58 0.4.0", + "indicatif", + "log", + "reqwest", + "semver", + "serde", + "serde_derive", + "serde_json", + "solana-account-decoder", + "solana-rpc-client-api", + "solana-sdk", + "solana-transaction-status", + "solana-version", + "solana-vote-program", + "tokio", +] + +[[package]] +name = "solana-rpc-client-api" +version = "1.18.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72a8403038f4d6ab65bc7e7afb3afe8d9824c592232553c5cef55cf3de36025d" +dependencies = [ + "base64 0.21.7", + "bs58 0.4.0", + "jsonrpc-core", + "reqwest", + "semver", + "serde", + "serde_derive", + "serde_json", + "solana-account-decoder", + "solana-sdk", + "solana-transaction-status", + "solana-version", + "spl-token-2022 1.0.0", + "thiserror", +] + +[[package]] +name = "solana-rpc-client-nonce-utils" +version = "1.18.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4caca735caf76d51c074c3bacbfe38094bf7f92cfbe7b5b13f3bc4946e64f889" +dependencies = [ + "clap 2.34.0", + "solana-clap-utils", + "solana-rpc-client", + "solana-sdk", + "thiserror", +] + +[[package]] +name = "solana-sdk" +version = "1.18.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df43d3a1e1637397ab43cbc216a5a8f977ec8a3cc3f3ae8c3851c83a3255dbcf" +dependencies = [ + "assert_matches", + "base64 0.21.7", + "bincode", + "bitflags 2.5.0", + "borsh 1.5.1", + "bs58 0.4.0", + "bytemuck", + "byteorder", + "chrono", + "derivation-path", + "digest 0.10.7", + "ed25519-dalek", + "ed25519-dalek-bip32", + "generic-array", + "hmac 0.12.1", + "itertools", + "js-sys", + "lazy_static", + "libsecp256k1 0.6.0", + "log", + "memmap2", + "num-derive 0.4.2", + "num-traits", + "num_enum 0.7.2", + "pbkdf2 0.11.0", + "qstring", + "qualifier_attr", + "rand 0.7.3", + "rand 0.8.5", + "rustc_version", + "rustversion", + "serde", + "serde_bytes", + "serde_derive", + "serde_json", + "serde_with", + "sha2 0.10.8", + "sha3 0.10.8", + "siphasher", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-logger", + "solana-program", + "solana-sdk-macro", + "thiserror", + "uriparse", + "wasm-bindgen", +] + +[[package]] +name = "solana-sdk-macro" +version = "1.18.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86c76414183a325038ff020b22c07d1e9d2da0703ddc0244acfed37ee2921d96" +dependencies = [ + "bs58 0.4.0", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.66", +] + +[[package]] +name = "solana-security-txt" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "468aa43b7edb1f9b7b7b686d5c3aeb6630dc1708e86e31343499dd5c4d775183" + +[[package]] +name = "solana-streamer" +version = "1.18.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fad1bdb955ec6d23a1dbf87e403ff3e610d68616275693125a893d7ed4b2d323" +dependencies = [ + "async-channel", + "bytes", + "crossbeam-channel", + "futures-util", + "histogram", + "indexmap 2.2.6", + "itertools", + "libc", + "log", + "nix", + "pem", + "percentage", + "pkcs8 0.8.0", + "quinn", + "quinn-proto", + "rand 0.8.5", + "rcgen", + "rustls 0.21.12", + "smallvec", + "solana-metrics", + "solana-perf", + "solana-sdk", + "thiserror", + "tokio", + "x509-parser", +] + +[[package]] +name = "solana-thin-client" +version = "1.18.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc301310ba0755c449a8800136f67f8ad14419b366404629894cd10021495360" +dependencies = [ + "bincode", + "log", + "rayon", + "solana-connection-cache", + "solana-rpc-client", + "solana-rpc-client-api", + "solana-sdk", +] + +[[package]] +name = "solana-tpu-client" +version = "1.18.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb887bd5078ff015e103e9ee54a6713380590efa8ff1804b3a653f07188928c6" +dependencies = [ + "async-trait", + "bincode", + "futures-util", + "indexmap 2.2.6", + "indicatif", + "log", + "rayon", + "solana-connection-cache", + "solana-measure", + "solana-metrics", + "solana-pubsub-client", + "solana-rpc-client", + "solana-rpc-client-api", + "solana-sdk", + "thiserror", + "tokio", +] + +[[package]] +name = "solana-transaction-status" +version = "1.18.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a0cdfdf63192fb60de094fae8e81159e4e3e9aac9659fe3f9ef0e707023fb32" +dependencies = [ + "Inflector", + "base64 0.21.7", + "bincode", + "borsh 0.10.3", + "bs58 0.4.0", + "lazy_static", + "log", + "serde", + "serde_derive", + "serde_json", + "solana-account-decoder", + "solana-sdk", + "spl-associated-token-account", + "spl-memo", + "spl-token 4.0.0", + "spl-token-2022 1.0.0", + "thiserror", +] + +[[package]] +name = "solana-udp-client" +version = "1.18.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ea0d6d8d66e36371577f51c4d1d6192a66f1fa4efe7161a36d94677640dcadb" +dependencies = [ + "async-trait", + "solana-connection-cache", + "solana-net-utils", + "solana-sdk", + "solana-streamer", + "thiserror", + "tokio", +] + +[[package]] +name = "solana-version" +version = "1.18.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f4c2f531c22ce806b211118be8928a791425f97de4592371fb57b246ed33e34" +dependencies = [ + "log", + "rustc_version", + "semver", + "serde", + "serde_derive", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-sdk", +] + +[[package]] +name = "solana-vote-program" +version = "1.18.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d8a6486017e71a3714a8e1a635e17209135cc20535ba9808ccf106d80ff6e8b" +dependencies = [ + "bincode", + "log", + "num-derive 0.4.2", + "num-traits", + "rustc_version", + "serde", + "serde_derive", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-metrics", + "solana-program", + "solana-program-runtime", + "solana-sdk", + "thiserror", +] + +[[package]] +name = "solana-zk-token-sdk" +version = "1.18.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "513407f88394e437b4ff5aad892bc5bf51a655ae2401e6e63549734d3695c46f" +dependencies = [ + "aes-gcm-siv", + "base64 0.21.7", + "bincode", + "bytemuck", + "byteorder", + "curve25519-dalek", + "getrandom 0.1.16", + "itertools", + "lazy_static", + "merlin", + "num-derive 0.4.2", + "num-traits", + "rand 0.7.3", + "serde", + "serde_json", + "sha3 0.9.1", + "solana-program", + "solana-sdk", + "subtle", + "thiserror", + "zeroize", +] + +[[package]] +name = "solana_rbpf" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d457cc2ba742c120492a64b7fa60e22c575e891f6b55039f4d736568fb112a3" +dependencies = [ + "byteorder", + "combine", + "goblin", + "hash32", + "libc", + "log", + "rand 0.8.5", + "rustc-demangle", + "scroll", + "thiserror", + "winapi", +] + +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + +[[package]] +name = "spki" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c01a0c15da1b0b0e1494112e7af814a678fec9bd157881b49beac661e9b6f32" +dependencies = [ + "der 0.4.5", +] + +[[package]] +name = "spki" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d01ac02a6ccf3e07db148d2be087da624fea0221a16152ed01f0496a6b0a27" +dependencies = [ + "base64ct", + "der 0.5.1", +] + +[[package]] +name = "spl-associated-token-account" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "992d9c64c2564cc8f63a4b508bf3ebcdf2254b0429b13cd1d31adb6162432a5f" +dependencies = [ + "assert_matches", + "borsh 0.10.3", + "num-derive 0.4.2", + "num-traits", + "solana-program", + "spl-token 4.0.0", + "spl-token-2022 1.0.0", + "thiserror", +] + +[[package]] +name = "spl-discriminator" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daa600f2fe56f32e923261719bae640d873edadbc5237681a39b8e37bfd4d263" +dependencies = [ + "bytemuck", + "solana-program", + "spl-discriminator-derive", +] + +[[package]] +name = "spl-discriminator-derive" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07fd7858fc4ff8fb0e34090e41d7eb06a823e1057945c26d480bfc21d2338a93" +dependencies = [ + "quote", + "spl-discriminator-syn", + "syn 2.0.66", +] + +[[package]] +name = "spl-discriminator-syn" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18fea7be851bd98d10721782ea958097c03a0c2a07d8d4997041d0ece6319a63" +dependencies = [ + "proc-macro2", + "quote", + "sha2 0.10.8", + "syn 2.0.66", + "thiserror", +] + +[[package]] +name = "spl-memo" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f180b03318c3dbab3ef4e1e4d46d5211ae3c780940dd0a28695aba4b59a75a" +dependencies = [ + "solana-program", +] + +[[package]] +name = "spl-pod" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85a5db7e4efb1107b0b8e52a13f035437cdcb36ef99c58f6d467f089d9b2915a" +dependencies = [ + "borsh 0.10.3", + "bytemuck", + "solana-program", + "solana-zk-token-sdk", + "spl-program-error", +] + +[[package]] +name = "spl-program-error" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e0657b6490196971d9e729520ba934911ff41fbb2cb9004463dbe23cf8b4b4f" +dependencies = [ + "num-derive 0.4.2", + "num-traits", + "solana-program", + "spl-program-error-derive", + "thiserror", +] + +[[package]] +name = "spl-program-error-derive" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1845dfe71fd68f70382232742e758557afe973ae19e6c06807b2c30f5d5cb474" +dependencies = [ + "proc-macro2", + "quote", + "sha2 0.10.8", + "syn 2.0.66", +] + +[[package]] +name = "spl-tlv-account-resolution" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "062e148d3eab7b165582757453632ffeef490c02c86a48bfdb4988f63eefb3b9" +dependencies = [ + "bytemuck", + "solana-program", + "spl-discriminator", + "spl-pod", + "spl-program-error", + "spl-type-length-value", +] + +[[package]] +name = "spl-tlv-account-resolution" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f335787add7fa711819f9e7c573f8145a5358a709446fe2d24bf2a88117c90" +dependencies = [ + "bytemuck", + "solana-program", + "spl-discriminator", + "spl-pod", + "spl-program-error", + "spl-type-length-value", +] + +[[package]] +name = "spl-token" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e85e168a785e82564160dcb87b2a8e04cee9bfd1f4d488c729d53d6a4bd300d" +dependencies = [ + "arrayref", + "bytemuck", + "num-derive 0.3.3", + "num-traits", + "num_enum 0.5.11", + "solana-program", + "thiserror", +] + +[[package]] +name = "spl-token" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08459ba1b8f7c1020b4582c4edf0f5c7511a5e099a7a97570c9698d4f2337060" +dependencies = [ + "arrayref", + "bytemuck", + "num-derive 0.3.3", + "num-traits", + "num_enum 0.6.1", + "solana-program", + "thiserror", +] + +[[package]] +name = "spl-token-2022" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4abf34a65ba420584a0c35f3903f8d727d1f13ababbdc3f714c6b065a686e86" +dependencies = [ + "arrayref", + "bytemuck", + "num-derive 0.4.2", + "num-traits", + "num_enum 0.7.2", + "solana-program", + "solana-zk-token-sdk", + "spl-memo", + "spl-pod", + "spl-token 4.0.0", + "spl-token-metadata-interface", + "spl-transfer-hook-interface 0.3.0", + "spl-type-length-value", + "thiserror", +] + +[[package]] +name = "spl-token-2022" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d697fac19fd74ff472dfcc13f0b442dd71403178ce1de7b5d16f83a33561c059" +dependencies = [ + "arrayref", + "bytemuck", + "num-derive 0.4.2", + "num-traits", + "num_enum 0.7.2", + "solana-program", + "solana-security-txt", + "solana-zk-token-sdk", + "spl-memo", + "spl-pod", + "spl-token 4.0.0", + "spl-token-group-interface", + "spl-token-metadata-interface", + "spl-transfer-hook-interface 0.4.1", + "spl-type-length-value", + "thiserror", +] + +[[package]] +name = "spl-token-group-interface" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b889509d49fa74a4a033ca5dae6c2307e9e918122d97e58562f5c4ffa795c75d" +dependencies = [ + "bytemuck", + "solana-program", + "spl-discriminator", + "spl-pod", + "spl-program-error", +] + +[[package]] +name = "spl-token-metadata-interface" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c16ce3ba6979645fb7627aa1e435576172dd63088dc7848cb09aa331fa1fe4f" +dependencies = [ + "borsh 0.10.3", + "solana-program", + "spl-discriminator", + "spl-pod", + "spl-program-error", + "spl-type-length-value", +] + +[[package]] +name = "spl-transfer-hook-interface" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "051d31803f873cabe71aec3c1b849f35248beae5d19a347d93a5c9cccc5d5a9b" +dependencies = [ + "arrayref", + "bytemuck", + "solana-program", + "spl-discriminator", + "spl-pod", + "spl-program-error", + "spl-tlv-account-resolution 0.4.0", + "spl-type-length-value", +] + +[[package]] +name = "spl-transfer-hook-interface" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7aabdb7c471566f6ddcee724beb8618449ea24b399e58d464d6b5bc7db550259" +dependencies = [ + "arrayref", + "bytemuck", + "solana-program", + "spl-discriminator", + "spl-pod", + "spl-program-error", + "spl-tlv-account-resolution 0.5.2", + "spl-type-length-value", +] + +[[package]] +name = "spl-type-length-value" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f9ebd75d29c5f48de5f6a9c114e08531030b75b8ac2c557600ac7da0b73b1e8" +dependencies = [ + "bytemuck", + "solana-program", + "spl-discriminator", + "spl-pod", + "spl-program-error", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "strsim" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "subtle" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" + +[[package]] +name = "sval" +version = "2.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53eb957fbc79a55306d5d25d87daf3627bc3800681491cda0709eef36c748bfe" + +[[package]] +name = "sval_buffer" +version = "2.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96e860aef60e9cbf37888d4953a13445abf523c534640d1f6174d310917c410d" +dependencies = [ + "sval", + "sval_ref", +] + +[[package]] +name = "sval_dynamic" +version = "2.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea3f2b07929a1127d204ed7cb3905049381708245727680e9139dac317ed556f" +dependencies = [ + "sval", +] + +[[package]] +name = "sval_fmt" +version = "2.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4e188677497de274a1367c4bda15bd2296de4070d91729aac8f0a09c1abf64d" +dependencies = [ + "itoa", + "ryu", + "sval", +] + +[[package]] +name = "sval_json" +version = "2.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32f456c07dae652744781f2245d5e3b78e6a9ebad70790ac11eb15dbdbce5282" +dependencies = [ + "itoa", + "ryu", + "sval", +] + +[[package]] +name = "sval_nested" +version = "2.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "886feb24709f0476baaebbf9ac10671a50163caa7e439d7a7beb7f6d81d0a6fb" +dependencies = [ + "sval", + "sval_buffer", + "sval_ref", +] + +[[package]] +name = "sval_ref" +version = "2.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be2e7fc517d778f44f8cb64140afa36010999565528d48985f55e64d45f369ce" +dependencies = [ + "sval", +] + +[[package]] +name = "sval_serde" +version = "2.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79bf66549a997ff35cd2114a27ac4b0c2843280f2cfa84b240d169ecaa0add46" +dependencies = [ + "serde", + "sval", + "sval_nested", +] + +[[package]] +name = "switchboard-common" +version = "0.11.3" +dependencies = [ + "anyhow", + "async-trait", + "base64 0.21.7", + "bincode", + "envy", + "futures", + "hex", + "ipfs-api", + "ipfs-api-backend-hyper", + "ipfs-api-prelude", + "log", + "serde", + "serde_json", + "sha2 0.10.8", + "sha3 0.10.8", + "tokio", +] + +[[package]] +name = "switchboard-on-demand" +version = "0.1.16" +dependencies = [ + "anchor-client", + "anchor-lang", + "anchor-spl", + "arc-swap", + "async-trait", + "base64 0.21.7", + "bincode", + "borsh 0.10.3", + "bytemuck", + "futures", + "lazy_static", + "libsecp256k1 0.7.1", + "log", + "num 0.4.3", + "rand 0.8.5", + "reqwest", + "rsa", + "rust_decimal", + "serde", + "serde_json", + "sha2 0.10.8", + "solana-address-lookup-table-program", + "solana-client", + "solana-program", + "solana-sdk", + "spl-associated-token-account", + "spl-token 3.5.0", + "switchboard-common", + "tokio", + "tokio-util", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c42f3f41a2de00b01c0aaad383c5a45241efc8b2d1eda5661812fda5f3cdcff5" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn_derive" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1329189c02ff984e9736652b1631330da25eaa6bc639089ed4915d25446cbe7b" +dependencies = [ + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + +[[package]] +name = "synstructure" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "unicode-xid", +] + +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "tempfile" +version = "3.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" +dependencies = [ + "cfg-if", + "fastrand", + "rustix", + "windows-sys 0.52.0", +] + +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "textwrap" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" +dependencies = [ + "unicode-width", +] + +[[package]] +name = "textwrap" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23d434d3f8967a09480fb04132ebe0a3e088c173e6d0ee7897abbdf4eab0f8b9" + +[[package]] +name = "thiserror" +version = "1.0.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "time" +version = "0.3.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + +[[package]] +name = "time-macros" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tiny-bip39" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffc59cb9dfc85bb312c3a78fd6aa8a8582e310b0fa885d5bb877f6dcc601839d" +dependencies = [ + "anyhow", + "hmac 0.8.1", + "once_cell", + "pbkdf2 0.4.0", + "rand 0.7.3", + "rustc-hash", + "sha2 0.9.9", + "thiserror", + "unicode-normalization", + "wasm-bindgen", + "zeroize", +] + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba4f4a02a7a80d6f274636f0aa95c7e383b912d41fe721a31f29e29698585a4a" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "num_cpus", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "tracing", + "windows-sys 0.48.0", +] + +[[package]] +name = "tokio-macros" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.23.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" +dependencies = [ + "rustls 0.20.9", + "tokio", + "webpki", +] + +[[package]] +name = "tokio-rustls" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" +dependencies = [ + "rustls 0.21.12", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c" +dependencies = [ + "futures-util", + "log", + "rustls 0.21.12", + "tokio", + "tokio-rustls 0.24.1", + "tungstenite", + "webpki-roots 0.25.4", +] + +[[package]] +name = "tokio-util" +version = "0.7.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "slab", + "tokio", +] + +[[package]] +name = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_datetime" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" + +[[package]] +name = "toml_edit" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" +dependencies = [ + "indexmap 2.2.6", + "toml_datetime", + "winnow", +] + +[[package]] +name = "tower-service" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" + +[[package]] +name = "tracing" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +dependencies = [ + "once_cell", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "tungstenite" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e3dac10fd62eaf6617d3a904ae222845979aec67c615d1c842b4002c7666fb9" +dependencies = [ + "byteorder", + "bytes", + "data-encoding", + "http", + "httparse", + "log", + "rand 0.8.5", + "rustls 0.21.12", + "sha1", + "thiserror", + "url", + "utf-8", + "webpki-roots 0.24.0", +] + +[[package]] +name = "typed-builder" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89851716b67b937e393b3daa8423e67ddfc4bbbf1654bcf05488e95e0828db0c" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "typeid" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "059d83cc991e7a42fc37bd50941885db0888e34209f8cfd9aab07ddec03bc9cf" + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "unicase" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" +dependencies = [ + "version_check", +] + +[[package]] +name = "unicode-bidi" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "unicode-normalization" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-segmentation" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" + +[[package]] +name = "unicode-width" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" + +[[package]] +name = "unicode-xid" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" + +[[package]] +name = "universal-hash" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f214e8f697e925001e66ec2c6e37a4ef93f0f78c2eed7814394e10c62025b05" +dependencies = [ + "generic-array", + "subtle", +] + +[[package]] +name = "unreachable" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" +dependencies = [ + "void", +] + +[[package]] +name = "unsigned-varint" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6889a77d49f1f013504cec6bf97a2c730394adedaeb1deb5ea08949a50541105" + +[[package]] +name = "untrusted" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "uriparse" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0200d0fc04d809396c2ad43f3c95da3582a2556eba8d453c1087f4120ee352ff" +dependencies = [ + "fnv", + "lazy_static", +] + +[[package]] +name = "url" +version = "2.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "uuid" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a183cf7feeba97b4dd1c0d46788634f6221d87fa961b305bed08c851829efcc0" + +[[package]] +name = "value-bag" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a84c137d37ab0142f0f2ddfe332651fdbf252e7b7dbb4e67b6c1f1b2e925101" +dependencies = [ + "value-bag-serde1", + "value-bag-sval2", +] + +[[package]] +name = "value-bag-serde1" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccacf50c5cb077a9abb723c5bcb5e0754c1a433f1e1de89edc328e2760b6328b" +dependencies = [ + "erased-serde", + "serde", + "serde_fmt", +] + +[[package]] +name = "value-bag-sval2" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1785bae486022dfb9703915d42287dcb284c1ee37bd1080eeba78cc04721285b" +dependencies = [ + "sval", + "sval_buffer", + "sval_dynamic", + "sval_fmt", + "sval_json", + "sval_ref", + "sval_serde", +] + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "vec_map" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "void" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.66", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" + +[[package]] +name = "web-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed63aea5ce73d0ff405984102c42de94fc55a6b75765d621c65262469b3c9b53" +dependencies = [ + "ring 0.17.8", + "untrusted 0.9.0", +] + +[[package]] +name = "webpki-roots" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b291546d5d9d1eab74f069c77749f2cb8504a12caa20f0f2de93ddbf6f411888" +dependencies = [ + "rustls-webpki", +] + +[[package]] +name = "webpki-roots" +version = "0.25.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.5", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.5", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" +dependencies = [ + "windows_aarch64_gnullvm 0.52.5", + "windows_aarch64_msvc 0.52.5", + "windows_i686_gnu 0.52.5", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.5", + "windows_x86_64_gnu 0.52.5", + "windows_x86_64_gnullvm 0.52.5", + "windows_x86_64_msvc 0.52.5", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" + +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "winreg" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "x509-parser" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0ecbeb7b67ce215e40e3cc7f2ff902f94a223acf44995934763467e7b1febc8" +dependencies = [ + "asn1-rs", + "base64 0.13.1", + "data-encoding", + "der-parser", + "lazy_static", + "nom", + "oid-registry", + "rusticata-macros", + "thiserror", + "time", +] + +[[package]] +name = "yasna" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e17bb3549cc1321ae1296b9cdc2698e2b6cb1992adfa19a8c72e5b7a738f44cd" +dependencies = [ + "time", +] + +[[package]] +name = "zerocopy" +version = "0.7.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae87e3fcd617500e5d106f0380cf7b77f3c6092aae37191433159dda23cfb087" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "zeroize" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4756f7db3f7b5574938c3eb1c117038b8e07f95ee6718c0efad4ac21508f1efd" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "zstd" +version = "0.11.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "5.0.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" +dependencies = [ + "libc", + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.11+zstd.1.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75652c55c0b6f3e6f12eb786fe1bc960396bf05a1eb3bf1f3691c3610ac2e6d4" +dependencies = [ + "cc", + "pkg-config", +] diff --git a/rust/switchboard-on-demand/Cargo.toml b/rust/switchboard-on-demand/Cargo.toml new file mode 100644 index 0000000..7896f8d --- /dev/null +++ b/rust/switchboard-on-demand/Cargo.toml @@ -0,0 +1,61 @@ +[package] +name = "switchboard-on-demand" +version = "0.1.17" +# docs.rs autobuild has difficulty with ahash dep. Host yuorself at https://tiiny.host/ +documentation = "https://switchboard-on-demand-rust-docs.web.app" +edition = "2021" +resolver = "2" +description = "A Rust library to interact with the Switchboard Solana program." +readme = "README.md" +keywords = ["switchboard", "oracle", "solana"] +homepage = "https://switchboard.xyz" +repository = "https://github.com/switchboard-xyz/solana-sdk/tree/main/rust/switchboard-solana" +license = "MIT" + +[lib] +crate-type = ["cdylib", "lib"] +name = "switchboard_on_demand" +doctest = false + +[features] +default = ["cpi"] +no-entrypoint = [] +cpi = ["no-entrypoint"] +secrets = ["rand", "rsa", "reqwest"] +ipfs = ["switchboard-common/ipfs"] +all-features = ["secrets", "ipfs", "cpi", "no-entrypoint", "client"] +pid_override = [] +client = ["anchor-spl", "solana-client", "solana-sdk", "anchor-lang", "anchor-client", "switchboard-common/client", "tokio", "tokio-util", "reqwest"] +devnet = [] + +[dependencies] +arc-swap = "1.6" +async-trait = "0.1.77" +base64 = "0.21.4" +bincode = { version = "^1" } +borsh = { version = "0.10.3" } +bytemuck = "^1" +futures = "0.3" +lazy_static = "1.4.0" +libsecp256k1 = "0.7.1" +log = { version = "0.4", features = ["kv_unstable", "kv_unstable_std"] } +rust_decimal = "^1" +serde = { version = "^1", features = ["derive"] } +serde_json = { version = "^1" } +sha2 = "0.10.8" +solana-address-lookup-table-program = ">= 1.14, <2.0" +solana-program = ">= 1.14, <2.0" +switchboard-common = { version = "0.11.3", path = "../switchboard-common", features = [] } +spl-token = { version = "3", features = ["no-entrypoint"] } +spl-associated-token-account = { version = "2", features = ["no-entrypoint"] } +anchor-lang = { version = "0.29.0", optional = true } +anchor-spl = { version = "0.29.0", optional = true } +anchor-client = { version = "0.29.0", optional = true } +solana-client = { version = "1.17.16, <2.0", optional = true } +solana-sdk = { version = "1.17.16, <2.0", optional = true } +tokio = { version = "1", features = ["full", "tracing"], optional = true } +tokio-util = { version = "0.7.10", features = ["time"], optional = true } +rand = { version = "0.8.5", optional = true } +reqwest = { version = "0.11", features = ["json"], optional = true } +rsa = { version = "0.5.0", optional = true } +num = "0.4.3" diff --git a/rust/switchboard-on-demand/DOCS.md b/rust/switchboard-on-demand/DOCS.md new file mode 100644 index 0000000..139b892 --- /dev/null +++ b/rust/switchboard-on-demand/DOCS.md @@ -0,0 +1,37 @@ +# Docs + +## Prerequisites + +To deploy the `switchboard-on-demand` docs site, you will need to install the Firebase CLI and connect your account. + +```bash +curl -sL https://firebase.tools | upgrade=true bash +``` + +After logging in (using `firebase login`), you will also need to make sure that your Firebase account has access to the `switchboard-docs` project: + +```bash +❯ firebase projects:list +✔ Preparing the list of your Firebase projects +┌────────────────────────┬────────────────────────┬────────────────┬──────────────────────┐ +│ Project Display Name │ Project ID │ Project Number │ Resource Location ID │ +├────────────────────────┼────────────────────────┼────────────────┼──────────────────────┤ +│ Switchboard Docs │ switchboard-docs │ 659732266249 │ [Not specified] │ +└────────────────────────┴────────────────────────┴────────────────┴──────────────────────┘ +``` + +If access is needed, contact [Mitch](mailto://mitch@switchboard.xyz) or [Jack](mailto://jack@switchboard.xyz). + +## Generate / Deploy Site + +To deploy the docs for the `switchboard-on-demand` Rust SDK, simply run the following script: + +```bash +# Generates the docs site and opens locally. +pnpm docgen --open + +# Generates the docs site and tries to deploy to Firebase. +# +# Note that you will need to be logged into the Firebase CLI (See above). +pnpm docgen:deploy +``` diff --git a/rust/switchboard-on-demand/README.md b/rust/switchboard-on-demand/README.md new file mode 100644 index 0000000..356ea3e --- /dev/null +++ b/rust/switchboard-on-demand/README.md @@ -0,0 +1,67 @@ +
+ +![Switchboard Logo](https://github.com/switchboard-xyz/core-sdk/raw/main/website/static/img/icons/switchboard/avatar.png) + +# switchboard-on-demand + +> A Rust library for seamless interaction with Switchboard Oracle accounts on the Solana blockchain. + +[![Crates.io](https://img.shields.io/crates/v/switchboard-solana.svg?style=flat-square&logo=rust)](https://crates.io/crates/switchboard-solana) +[![Discord](https://img.shields.io/discord/841525135311634443?label=Discord&logo=discord&logoColor=white&style=flat-square)](https://discord.gg/switchboardxyz) +[![Twitter Follow](https://img.shields.io/twitter/follow/switchboardxyz?style=social)](https://twitter.com/switchboardxyz) + +

+ Switchboard Documentation: docs.switchboard.xyz +
+ Rustdoc: switchboard-on-demand-rust-docs.web.app +

+ +
+ +## Overview + +`switchboard-on-demand` provides Rust developers with an efficient and easy-to-use client for integrating Solana-based oracles from Switchboard into their applications. This library empowers developers to leverage decentralized, trustless, and highly reliable oracle data for various applications, particularly in the DeFi and Web3 spaces. + +## Features + +- **On-Demand Oracle Data**: Fetch real-time, accurate, and tamper-proof data for blockchain applications. +- **Custom Oracle Creation**: Design and deploy your own oracles tailored to your specific data needs. +- **High Fidelity Financial Data**: Ideal for applications requiring precise and dependable financial data. +- **Privacy-Focused**: Operates within confidential runtimes to ensure data integrity and security. + +## Getting Started + +### Prerequisites + +Ensure you have the following installed: +- Rust (latest stable version) +- Cargo +- Solana CLI tools (if interacting directly with the Solana blockchain) + +### Installation + +Add `switchboard-on-demand` to your `Cargo.toml`: + +```toml +[dependencies] +switchboard-on-demand = "0.1.0" +``` + +### Using on chain + +```rust +use switchboard_on_demand::PullFeedAccountData; +use rust_decimal::Decimal; + +pub fn solana_ix<'a>(mut ctx: Context>, params: Params) -> Result<()> { + // Assume `account_info` is obtained from the Solana blockchain + let feed = PullFeedAccountData::parse(ctx.accounts.sb_feed)?; + let max_stale_slots = 100; // Define the maximum number of slots before data is considered stale + let min_samples = 5; // Set the minimum number of samples for data accuracy + let price: Decimal = feed.get_value(&Clock::get()?, max_stale_slots, min_samples, true)?; + + msg!("Oracle Price: {}", price); + + Ok(()) +} +``` diff --git a/rust/switchboard-on-demand/firebase.json b/rust/switchboard-on-demand/firebase.json new file mode 100644 index 0000000..1558d88 --- /dev/null +++ b/rust/switchboard-on-demand/firebase.json @@ -0,0 +1,14 @@ +{ + "hosting": [ + { + "site": "switchboard-on-demand-rust-docs", + "public": "doc", + "rewrites": [ + { + "source": "**", + "destination": "index.html" + } + ] + } + ] +} diff --git a/rust/switchboard-on-demand/package.json b/rust/switchboard-on-demand/package.json new file mode 100644 index 0000000..0f51ddc --- /dev/null +++ b/rust/switchboard-on-demand/package.json @@ -0,0 +1,12 @@ +{ + "name": "switchboard-on-demand-rust-docs", + "scripts": { + "docgen": "cargo doc --all-features --no-deps", + "docgen:compile": "pnpm docgen && ts-node ./scripts/compile_docs.ts", + "docgen:deploy": "pnpm docgen:compile && cd target && firebase deploy --project docs --only hosting:switchboard-on-demand-rust-docs" + }, + "dependencies": { + "fs-extra": "^11.2.0", + "@types/fs-extra": "^11.0.4" + } +} diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/.github/workflows/rust.yml b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/.github/workflows/rust.yml new file mode 100644 index 0000000..c551724 --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/.github/workflows/rust.yml @@ -0,0 +1,156 @@ +name: Rust + +on: [push, pull_request] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Install latest stable + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + components: clippy + - name: check nostd + uses: actions-rs/cargo@v1 + with: + command: check + args: --no-default-features + - name: test nostd + uses: actions-rs/cargo@v1 + with: + command: test + args: --no-default-features + - name: check constrandom + uses: actions-rs/cargo@v1 + with: + command: check + args: --no-default-features --features compile-time-rng + - name: test constrandom + uses: actions-rs/cargo@v1 + with: + command: test + args: --no-default-features --features compile-time-rng + - name: check fixed-seed + uses: actions-rs/cargo@v1 + with: + command: check + args: --no-default-features --features std + - name: check + uses: actions-rs/cargo@v1 + with: + command: check + - name: test + uses: actions-rs/cargo@v1 + with: + command: test + nightly: + name: nightly + runs-on: ubuntu-latest + env: + RUSTFLAGS: -C target-cpu=native + steps: + - uses: actions/checkout@v2 + - name: Install latest nightly + uses: actions-rs/toolchain@v1 + with: + toolchain: nightly + override: true + components: clippy + - name: check nightly + uses: actions-rs/cargo@v1 + with: + command: check + - name: test nightly + uses: actions-rs/cargo@v1 + with: + command: test + - name: check serde + uses: actions-rs/cargo@v1 + with: + command: check + args: --features serde + - name: test serde + uses: actions-rs/cargo@v1 + with: + command: test + args: --features serde + linux_arm7: + name: Linux ARMv7 + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions-rs/toolchain@v1 + with: + toolchain: stable + target: armv7-unknown-linux-gnueabihf + - uses: actions-rs/cargo@v1 + with: + command: check + args: --target armv7-unknown-linux-gnueabihf + i686-unknown-linux-gnu: + name: Linux i686 + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions-rs/toolchain@v1 + with: + toolchain: stable + target: i686-unknown-linux-gnu + - name: Install cross compile tools + run: sudo apt-get install -y gcc-multilib libc6-i386 libc6-dev-i386 + - uses: actions-rs/cargo@v1 + with: + command: check + args: --target i686-unknown-linux-gnu + - uses: actions-rs/cargo@v1 + with: + command: test + args: --target i686-unknown-linux-gnu + x86_64-unknown-linux-gnu: + name: Linux x86_64 - nightly + runs-on: ubuntu-latest + env: + RUSTFLAGS: -C target-cpu=skylake -C target-feature=+aes + steps: + - uses: actions/checkout@v2 + - uses: actions-rs/toolchain@v1 + with: + toolchain: nightly + override: true + target: x86_64-unknown-linux-gnu + - uses: actions-rs/cargo@v1 + with: + command: check + args: --target x86_64-unknown-linux-gnu + - uses: actions-rs/cargo@v1 + with: + command: test + args: --target x86_64-unknown-linux-gnu + thumbv6m: + name: thumbv6m + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions-rs/toolchain@v1 + with: + toolchain: stable + target: thumbv6m-none-eabi + - uses: actions-rs/cargo@v1 + with: + command: check + args: --target thumbv6m-none-eabi --no-default-features + wasm32-unknown-unknown: + name: wasm + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions-rs/toolchain@v1 + with: + toolchain: stable + target: wasm32-unknown-unknown + - uses: actions-rs/cargo@v1 + with: + command: check + args: --target wasm32-unknown-unknown --no-default-features diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/.gitignore b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/.gitignore new file mode 100644 index 0000000..fc89f1b --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/.gitignore @@ -0,0 +1,3 @@ +.idea/ +Cargo.lock +target diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/Cargo.toml b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/Cargo.toml new file mode 100644 index 0000000..f0346c0 --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/Cargo.toml @@ -0,0 +1,103 @@ +[package] +name = "ahash" +version = "0.8.4" +authors = ["Tom Kaitchuck "] +license = "MIT OR Apache-2.0" +description = "A non-cryptographic hash function using AES-NI for high performance" +documentation = "https://docs.rs/ahash" +repository = "https://github.com/tkaitchuck/ahash" +keywords = ["hash", "hasher", "hashmap", "aes", "no-std"] +categories = ["algorithms", "data-structures", "no-std"] +edition = "2018" +readme = "README.md" +build = "./build.rs" +exclude = ["/smhasher", "/benchmark_tools"] + +[lib] +name = "ahash" +path = "src/lib.rs" +test = true +doctest = true +bench = true +doc = true + +[features] +stdsimd = [] +default = ["std", "runtime-rng"] + +# Enabling this will enable `AHashMap` and `AHashSet`. +std = [] + +# Runtime random key generation using getrandom. +runtime-rng = ["getrandom"] + +# This is an alternative to runtime key generation which does compile time key generation if runtime-rng is not available. +# (If runtime-rng is enabled this does nothing.) +# If this is on (and runtime-rng is off) it implies the produced binary will not be identical. +# If this is disabled and runtime-rng is unavailable constant keys are used. +compile-time-rng = ["const-random"] + +# Do not use any random number generator (either at compile time or runtime) +# If either runtime-rng or compile-time-rng are enabled this does nothing. +no-rng = [] + +# in case this is being used on an architecture lacking core::sync::atomic::AtomicUsize and friends +atomic-polyfill = [ "dep:atomic-polyfill", "once_cell/atomic-polyfill"] + +[[bench]] +name = "ahash" +path = "tests/bench.rs" +harness = false + +[[bench]] +name = "map" +path = "tests/map_tests.rs" +harness = false + +[profile.test] +opt-level = 2 +lto = 'fat' + +[profile.release] +opt-level = 3 +debug = false +lto = 'fat' +debug-assertions = false +codegen-units = 1 + +[profile.bench] +opt-level = 3 +debug = false +lto = 'fat' +debug-assertions = false +codegen-units = 1 + +[build-dependencies] +version_check = "0.9.4" + +[dependencies] +const-random = { version = "0.1.12", optional = true } +serde = { version = "1.0.117", optional = true } +cfg-if = "1.0" +atomic-polyfill = { version="1.0.1", optional=true} +getrandom = { version = "0.2.7", optional = true } +zerocopy = { version = "0.7.0", default-features = false, features = ["simd"] } + +[target.'cfg(not(all(target_arch = "arm", target_os = "none")))'.dependencies] +once_cell = { version = "1.13.1", default-features = false, features = ["unstable", "alloc"] } + +[dev-dependencies] +no-panic = "0.1.10" +criterion = {version = "0.3.2", features = ["html_reports"] } +seahash = "4.0" +fnv = "1.0.5" +fxhash = "0.2.1" +hex = "0.4.2" +rand = "0.8.5" +serde_json = "1.0.59" +hashbrown = "0.12.3" + +[package.metadata.docs.rs] +rustc-args = ["-C", "target-feature=+aes"] +rustdoc-args = ["-C", "target-feature=+aes"] +features = ["std"] diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/FAQ.md b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/FAQ.md new file mode 100644 index 0000000..26c4a68 --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/FAQ.md @@ -0,0 +1,118 @@ +## How does aHash prevent DOS attacks + +AHash is designed to [prevent an adversary that does not know the key from being able to create hash collisions or partial collisions.](https://github.com/tkaitchuck/aHash/wiki/How-aHash-is-resists-DOS-attacks) + +If you are a cryptographer and would like to help review aHash's algorithm, please post a comment [here](https://github.com/tkaitchuck/aHash/issues/11). + +In short, this is achieved by ensuring that: + +* aHash is designed to [resist differential crypto analysis](https://github.com/tkaitchuck/aHash/wiki/How-aHash-is-resists-DOS-attacks#differential-analysis). Meaning it should not be possible to devise a scheme to "cancel" out a modification of the internal state from a block of input via some corresponding change in a subsequent block of input. + * This is achieved by not performing any "premixing" - This reversible mixing gave previous hashes such as murmurhash confidence in their quality, but could be undone by a deliberate attack. + * Before it is used each chunk of input is "masked" such as by xoring it with an unpredictable value. +* aHash obeys the '[strict avalanche criterion](https://en.wikipedia.org/wiki/Avalanche_effect#Strict_avalanche_criterion)': +Each bit of input has the potential to flip every bit of the output. +* Similarly, each bit in the key can affect every bit in the output. +* Input bits never effect just one, or a very few, bits in intermediate state. This is specifically designed to prevent the sort of +[differential attacks launched by the sipHash authors](https://emboss.github.io/blog/2012/12/14/breaking-murmur-hash-flooding-dos-reloaded/) which cancel previous inputs. +* The `finish` call at the end of the hash is designed to not expose individual bits of the internal state. + * For example in the main algorithm 256bits of state and 256bits of keys are reduced to 64 total bits using 3 rounds of AES encryption. +Reversing this is more than non-trivial. Most of the information is by definition gone, and any given bit of the internal state is fully diffused across the output. +* In both aHash and its fallback the internal state is divided into two halves which are updated by two unrelated techniques using the same input. - This means that if there is a way to attack one of them it likely won't be able to attack both of them at the same time. +* It is deliberately difficult to 'chain' collisions. (This has been the major technique used to weaponize attacks on other hash functions) + +More details are available on [the wiki](https://github.com/tkaitchuck/aHash/wiki/How-aHash-is-resists-DOS-attacks). + +## Why not use a cryptographic hash in a hashmap. + +Cryptographic hashes are designed to make is nearly impossible to find two items that collide when the attacker has full control +over the input. This has several implications: + +* They are very difficult to construct, and have to go to a lot of effort to ensure that collisions are not possible. +* They have no notion of a 'key'. Rather, they are fully deterministic and provide exactly one hash for a given input. + +For a HashMap the requirements are different. + +* Speed is very important, especially for short inputs. Often the key for a HashMap is a single `u32` or similar, and to be effective +the bucket that it should be hashed to needs to be computed in just a few CPU cycles. +* A hashmap does not need to provide a hard and fast guarantee that no two inputs will ever collide. Hence, hashCodes are not 256bits +but are just 64 or 32 bits in length. Often the first thing done with the hashcode is to truncate it further to compute which among a few buckets should be used for a key. + * Here collisions are expected, and a cheap to deal with provided there is no systematic way to generated huge numbers of values that all +go to the same bucket. + * This also means that unlike a cryptographic hash partial collisions matter. It doesn't do a hashmap any good to produce a unique 256bit hash if +the lower 12 bits are all the same. This means that even a provably irreversible hash would not offer protection from a DOS attack in a hashmap +because an attacker can easily just brute force the bottom N bits. + +From a cryptography point of view, a hashmap needs something closer to a block cypher. +Where the input can be quickly mixed in a way that cannot be reversed without knowing a key. + +## Why isn't aHash cryptographically secure + +It is not designed to be. +Attempting to use aHash as a secure hash will likely fail to hold up for several reasons: + +1. aHash relies on random keys which are assumed to not be observable by an attacker. For a cryptographic hash all inputs can be seen and controlled by the attacker. +2. aHash has not yet gone through peer review, which is a pre-requisite for security critical algorithms. +3. Because aHash uses reduced rounds of AES as opposed to the standard of 10. Things like the SQUARE attack apply to part of the internal state. +(These are mitigated by other means to prevent producing collections, but would be a problem in other contexts). +4. Like any cypher based hash, it will show certain statistical deviations from truly random output when comparing a (VERY) large number of hashes. +(By definition cyphers have fewer collisions than truly random data.) + +There are efforts to build a secure hash function that uses AES-NI for acceleration, but aHash is not one of them. + +## How is aHash so fast + +AHash uses a number of tricks. + +One trick is taking advantage of specialization. If aHash is compiled on nightly it will take +advantage of specialized hash implementations for strings, slices, and primitives. + +Another is taking advantage of hardware instructions. +When it is available aHash uses AES rounds using the AES-NI instruction. AES-NI is very fast (on an intel i7-6700 it +is as fast as a 64 bit multiplication.) and handles 16 bytes of input at a time, while being a very strong permutation. + +This is obviously much faster than most standard approaches to hashing, and does a better job of scrambling data than most non-secure hashes. + +On an intel i7-6700 compiled on nightly Rust with flags `-C opt-level=3 -C target-cpu=native -C codegen-units=1`: + +| Input | SipHash 1-3 time | FnvHash time|FxHash time| aHash time| aHash Fallback* | +|----------------|-----------|-----------|-----------|-----------|---------------| +| u8 | 9.3271 ns | 0.808 ns | **0.594 ns** | 0.7704 ns | 0.7664 ns | +| u16 | 9.5139 ns | 0.803 ns | **0.594 ns** | 0.7653 ns | 0.7704 ns | +| u32 | 9.1196 ns | 1.4424 ns | **0.594 ns** | 0.7637 ns | 0.7712 ns | +| u64 | 10.854 ns | 3.0484 ns | **0.628 ns** | 0.7788 ns | 0.7888 ns | +| u128 | 12.465 ns | 7.0728 ns | 0.799 ns | **0.6174 ns** | 0.6250 ns | +| 1 byte string | 11.745 ns | 2.4743 ns | 2.4000 ns | **1.4921 ns** | 1.5861 ns | +| 3 byte string | 12.066 ns | 3.5221 ns | 2.9253 ns | **1.4745 ns** | 1.8518 ns | +| 4 byte string | 11.634 ns | 4.0770 ns | 1.8818 ns | **1.5206 ns** | 1.8924 ns | +| 7 byte string | 14.762 ns | 5.9780 ns | 3.2282 ns | **1.5207 ns** | 1.8933 ns | +| 8 byte string | 13.442 ns | 4.0535 ns | 2.9422 ns | **1.6262 ns** | 1.8929 ns | +| 15 byte string | 16.880 ns | 8.3434 ns | 4.6070 ns | **1.6265 ns** | 1.7965 ns | +| 16 byte string | 15.155 ns | 7.5796 ns | 3.2619 ns | **1.6262 ns** | 1.8011 ns | +| 24 byte string | 16.521 ns | 12.492 ns | 3.5424 ns | **1.6266 ns** | 2.8311 ns | +| 68 byte string | 24.598 ns | 50.715 ns | 5.8312 ns | **4.8282 ns** | 5.4824 ns | +| 132 byte string| 39.224 ns | 119.96 ns | 11.777 ns | **6.5087 ns** | 9.1459 ns | +|1024 byte string| 254.00 ns | 1087.3 ns | 156.41 ns | **25.402 ns** | 54.566 ns | + +* Fallback refers to the algorithm aHash would use if AES instructions are unavailable. +For reference a hash that does nothing (not even reads the input data takes) **0.520 ns**. So that represents the fastest +possible time. + +As you can see above aHash like `FxHash` provides a large speedup over `SipHash-1-3` which is already nearly twice as fast as `SipHash-2-4`. + +Rust's HashMap by default uses `SipHash-1-3` because faster hash functions such as `FxHash` are predictable and vulnerable to denial of +service attacks. While `aHash` has both very strong scrambling and very high performance. + +AHash performs well when dealing with large inputs because aHash reads 8 or 16 bytes at a time. (depending on availability of AES-NI) + +Because of this, and its optimized logic, `aHash` is able to outperform `FxHash` with strings. +It also provides especially good performance dealing with unaligned input. +(Notice the big performance gaps between 3 vs 4, 7 vs 8 and 15 vs 16 in `FxHash` above) + +### Which CPUs can use the hardware acceleration + +Hardware AES instructions are built into Intel processors built after 2010 and AMD processors after 2012. +It is also available on [many other CPUs](https://en.wikipedia.org/wiki/AES_instruction_set) should in eventually +be able to get aHash to work. However, only X86 and X86-64 are the only supported architectures at the moment, as currently +they are the only architectures for which Rust provides an intrinsic. + +aHash also uses `sse2` and `sse3` instructions. X86 processors that have `aesni` also have these instruction sets. diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/LICENSE-APACHE b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/LICENSE-APACHE new file mode 100644 index 0000000..16fe87b --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/LICENSE-APACHE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/LICENSE-MIT b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/LICENSE-MIT new file mode 100644 index 0000000..cba2010 --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/LICENSE-MIT @@ -0,0 +1,25 @@ +Copyright (c) 2018 Tom Kaitchuck + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/README.md b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/README.md new file mode 100644 index 0000000..18c421d --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/README.md @@ -0,0 +1,108 @@ +# aHash ![Build Status](https://img.shields.io/github/actions/workflow/status/tkaitchuck/aHash/rust.yml?branch=master) ![Licence](https://img.shields.io/crates/l/ahash) ![Downloads](https://img.shields.io/crates/d/ahash) + +AHash is the [fastest](https://github.com/tkaitchuck/aHash/blob/master/compare/readme.md#Speed), +[DOS resistant hash](https://github.com/tkaitchuck/aHash/wiki/How-aHash-is-resists-DOS-attacks) currently available in Rust. +AHash is intended *exclusively* for use in in-memory hashmaps. + +AHash's output is of [high quality](https://github.com/tkaitchuck/aHash/blob/master/compare/readme.md#Quality) but aHash is **not** a cryptographically secure hash. + +## Design + +Because AHash is a keyed hash, each map will produce completely different hashes, which cannot be predicted without knowing the keys. +[This prevents DOS attacks where an attacker sends a large number of items whose hashes collide that get used as keys in a hashmap.](https://github.com/tkaitchuck/aHash/wiki/How-aHash-is-resists-DOS-attacks) + +This also avoids [accidentally quadratic behavior by reading from one map and writing to another.](https://accidentallyquadratic.tumblr.com/post/153545455987/rust-hash-iteration-reinsertion) + +## Goals and Non-Goals + +AHash does *not* have a fixed standard for its output. This allows it to improve over time. For example, +if any faster algorithm is found, aHash will be updated to incorporate the technique. +Similarly, should any flaw in aHash's DOS resistance be found, aHash will be changed to correct the flaw. + +Because it does not have a fixed standard, different computers or computers on different versions of the code will observe different hash values. +As such, aHash is not recommended for use other than in-memory maps. Specifically, aHash is not intended for network use or in applications which persist hashed values. +(In these cases `HighwayHash` would be a better choice) + +Additionally, aHash is not intended to be cryptographically secure and should not be used as a MAC, or anywhere which requires a cryptographically secure hash. +(In these cases `SHA-3` would be a better choice) + +## Usage + +AHash is a drop in replacement for the default implementation of the `Hasher` trait. To construct a `HashMap` using aHash +as its hasher do the following: + +```rust +use ahash::{AHasher, RandomState}; +use std::collections::HashMap; + +let mut map: HashMap = HashMap::default(); +map.insert(12, 34); +``` +For convenience, wrappers called `AHashMap` and `AHashSet` are also provided. +These do the same thing with slightly less typing. +```rust +use ahash::AHashMap; + +let mut map: AHashMap = AHashMap::new(); +map.insert(12, 34); +map.insert(56, 78); +``` + +## Flags + +The aHash package has the following flags: +* `std`: This enables features which require the standard library. (On by default) This includes providing the utility classes `AHashMap` and `AHashSet`. +* `serde`: Enables `serde` support for the utility classes `AHashMap` and `AHashSet`. +* `runtime-rng`: To obtain a seed for Hashers will obtain randomness from the operating system. (On by default) +This is done using the [getrandom](https://github.com/rust-random/getrandom) crate. +* `compile-time-rng`: For OS targets without access to a random number generator, `compile-time-rng` provides an alternative. +If `getrandom` is unavailable and `compile-time-rng` is enabled, aHash will generate random numbers at compile time and embed them in the binary. +This allows for DOS resistance even if there is no random number generator available at runtime (assuming the compiled binary is not public). +This makes the binary non-deterministic. (If non-determinism is a problem see [constrandom's documentation](https://github.com/tkaitchuck/constrandom#deterministic-builds)) + +If both `runtime-rng` and `compile-time-rng` are enabled the `runtime-rng` will take precedence and `compile-time-rng` will do nothing. +If neither flag is set, seeds can be supplied by the application. [Multiple apis](https://docs.rs/ahash/latest/ahash/random_state/struct.RandomState.html) +are available to do this. + +## Comparison with other hashers + +A full comparison with other hashing algorithms can be found [here](https://github.com/tkaitchuck/aHash/blob/master/compare/readme.md) + +![Hasher performance](https://docs.google.com/spreadsheets/d/e/2PACX-1vSK7Li2nS-Bur9arAYF9IfT37MP-ohAe1v19lZu5fd9MajI1fSveLAQZyEie4Ea9k5-SWHTff7nL2DW/pubchart?oid=1323618938&format=image) + +For a more representative performance comparison which includes the overhead of using a HashMap, see [HashBrown's benchmarks](https://github.com/rust-lang/hashbrown#performance) +as HashBrown now uses aHash as its hasher by default. + +## Hash quality + +AHash passes the full [SMHasher test suite](https://github.com/rurban/smhasher). + +The code to reproduce the result, and the full output [are checked into the repo](https://github.com/tkaitchuck/aHash/tree/master/smhasher). + +## Additional FAQ + +A separate FAQ document is maintained [here](https://github.com/tkaitchuck/aHash/blob/master/FAQ.md). +If you have questions not covered there, open an issue [here](https://github.com/tkaitchuck/aHash/issues). + +## License + +Licensed under either of: + + * Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0) + * MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT) + +at your option. + +## Contribution + +Unless you explicitly state otherwise, any contribution intentionally submitted +for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any +additional terms or conditions. + + + + + + + + diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/benchmark_tools/Cargo.toml b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/benchmark_tools/Cargo.toml new file mode 100644 index 0000000..70fcee5 --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/benchmark_tools/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "aHash" +version = "0.1.0" +edition = "2018" +publish = false +description = "A tool for benchmarking hashing algorithms" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +once_cell = "1.8.0" +byteorder = "1.4.3" +ahash = "0.7.4" \ No newline at end of file diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/benchmark_tools/benchmark_tools.iml b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/benchmark_tools/benchmark_tools.iml new file mode 100644 index 0000000..2fecef3 --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/benchmark_tools/benchmark_tools.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/benchmark_tools/src/data_reader.rs b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/benchmark_tools/src/data_reader.rs new file mode 100644 index 0000000..cd13526 --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/benchmark_tools/src/data_reader.rs @@ -0,0 +1,51 @@ +use std::fs::File; +use std::hash::{BuildHasher, Hasher}; +use std::io::{BufReader, BufRead, Error, Read}; +use byteorder::{ReadBytesExt, LittleEndian}; + +pub fn test_hasher(input_file: File, builder: B) -> Result { + let mut result: u64 = 0; + let mut input = BufReader::new(input_file); + let mut hasher = builder.build_hasher(); + while input.has_data_left()? { + let code = input.read_u8()?; + match code { + b'1' => { + let i = input.read_u8()?; + hasher.write_u8(i); + } + b'2' => { + let i = input.read_u16::()?; + hasher.write_u16(i); + } + b'4' => { + let i = input.read_u32::()?; + hasher.write_u32(i); + } + b'8' => { + let i = input.read_u64::()?; + hasher.write_u64(i); + } + b'B' => { + let i = input.read_u128::()?; + hasher.write_u128(i); + } + b'u' => { + let i = input.read_u64::()?; + hasher.write_usize(i as usize); + } + b's' => { + let len = input.read_u32::()?; + let mut slice = vec![0; len as usize]; + input.read_exact(&mut slice[..])?; + hasher.write(&slice[..]); + } + b'f' => { + result = result.wrapping_add(hasher.finish()); + hasher = builder.build_hasher(); + } + code => panic!("Unexpected code: {}", code) + } + } + Ok(result) +} \ No newline at end of file diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/benchmark_tools/src/main.rs b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/benchmark_tools/src/main.rs new file mode 100644 index 0000000..386f136 --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/benchmark_tools/src/main.rs @@ -0,0 +1,34 @@ +#![feature(buf_read_has_data_left)] + +mod persisting_hasher; +mod data_reader; + +use persisting_hasher::*; +use data_reader::*; +use std::collections::HashMap; +use std::fs::File; +use std::time::SystemTime; +use std::alloc::System; + +fn capture_output_example() { + let builder = PersistingHasherBuilder::default(); + let mut map = HashMap::with_capacity_and_hasher(10, builder); + map.insert(1, 2); + map.insert(3, 4); + let builder = PersistingHasherBuilder::default(); + let mut map = HashMap::with_capacity_and_hasher(10, builder); + map.insert("1", 2); + map.insert("3", 4); + PersistingHasherBuilder::default().flush(); +} + +fn main() { + // capture_output_example(); + + //Given a previously captured set of hashed data, time how long it takes using a different algorithm. + let file = File::open("hash_output-295253").unwrap(); + let rand = ahash::RandomState::new(); + let start_time = SystemTime::now(); + let result = test_hasher(file, rand).unwrap(); + println!("Completed after {:?} with result: {:x}", SystemTime::now().duration_since(start_time).unwrap(), result) +} diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/benchmark_tools/src/persisting_hasher.rs b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/benchmark_tools/src/persisting_hasher.rs new file mode 100644 index 0000000..b50060d --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/benchmark_tools/src/persisting_hasher.rs @@ -0,0 +1,144 @@ +use std::convert::TryInto; +use std::fs::File; +use std::hash::{Hasher, BuildHasher}; +use std::io::{BufWriter, Write}; +use std::sync::{Arc, Mutex}; +use std::sync::atomic::{AtomicU64, Ordering}; +use once_cell::sync::OnceCell; +use std::process::id; + +static GLOBAL_COUNT: AtomicU64 = AtomicU64::new(0); +static GLOBAL_OUT: OnceCell>>> = OnceCell::new(); + +pub struct PersistingHasherBuilder { + id: u64, + out: Arc>>, +} + +impl PersistingHasherBuilder { + pub fn flush(&self) { + let mut guard = self.out.lock().unwrap(); + guard.flush().unwrap(); + } +} + +impl Default for PersistingHasherBuilder { + fn default() -> Self { + PersistingHasherBuilder { + id: GLOBAL_COUNT.fetch_add(1, Ordering::SeqCst), + out: GLOBAL_OUT.get_or_init(|| + Arc::new(Mutex::new(BufWriter::new(File::create( + format!("hash_output-{}", id())).unwrap())))).clone(), + } + } +} + +impl BuildHasher for PersistingHasherBuilder { + type Hasher = PersistingHasher; + + fn build_hasher(&self) -> Self::Hasher { + PersistingHasher { + hash: self.id, + out: self.out.clone(), + } + } +} + +pub struct PersistingHasher { + /// Used to compute a hash + hash: u64, + /// File to write data out to + out: Arc>>, +} + +impl PersistingHasher { + fn add_to_hash(&mut self, i: u64) { + self.hash = self + .hash + .rotate_right(31) + .wrapping_add(i) + .wrapping_mul(0xcfee444d8b59a89b); + } +} + +impl Hasher for PersistingHasher { + fn finish(&self) -> u64 { + let mut guard = self.out.lock().unwrap(); + write!(guard, "f").unwrap(); + self.hash + } + + fn write(&mut self, mut bytes: &[u8]) { + let read_u64 = |bytes: &[u8]| u64::from_ne_bytes(bytes[..8].try_into().unwrap()); + + while bytes.len() >= 8 { + self.add_to_hash(read_u64(bytes)); + bytes = &bytes[8..]; + } + if bytes.len() >= 4 { + self.add_to_hash(u32::from_ne_bytes(bytes[..4].try_into().unwrap()) as u64); + bytes = &bytes[4..]; + } + if bytes.len() >= 2 { + self.add_to_hash(u16::from_ne_bytes(bytes[..2].try_into().unwrap()) as u64); + bytes = &bytes[2..]; + } + if bytes.len() >= 1 { + self.add_to_hash(bytes[0] as u64); + } + + let mut guard = self.out.lock().unwrap(); + write!(guard, "s").unwrap(); + guard.write_all(&(bytes.len() as u32).to_le_bytes()).unwrap(); + guard.write_all(bytes).unwrap(); + } + + fn write_u8(&mut self, i: u8) { + self.add_to_hash(i as u64); + + let mut guard = self.out.lock().unwrap(); + write!(guard, "1").unwrap(); + guard.write_all(&i.to_le_bytes()).unwrap(); + } + + fn write_u16(&mut self, i: u16) { + self.add_to_hash(i as u64); + + let mut guard = self.out.lock().unwrap(); + write!(guard, "2").unwrap(); + guard.write_all(&i.to_le_bytes()).unwrap(); + } + + fn write_u32(&mut self, i: u32) { + self.add_to_hash(i as u64); + + let mut guard = self.out.lock().unwrap(); + write!(guard, "4").unwrap(); + guard.write_all(&i.to_le_bytes()).unwrap(); + } + + fn write_u64(&mut self, i: u64) { + self.add_to_hash(i as u64); + + let mut guard = self.out.lock().unwrap(); + write!(guard, "8").unwrap(); + guard.write_all(&i.to_le_bytes()).unwrap(); + } + + fn write_u128(&mut self, i: u128) { + self.add_to_hash((i >> 64) as u64); + self.add_to_hash(i as u64); + + let mut guard = self.out.lock().unwrap(); + write!(guard, "B").unwrap(); + guard.write_all(&i.to_le_bytes()).unwrap(); + } + + fn write_usize(&mut self, i: usize) { + self.add_to_hash(i as u64); + + let mut guard = self.out.lock().unwrap(); + write!(guard, "u").unwrap(); + guard.write_all(&(i as u64).to_le_bytes()).unwrap(); + } +} \ No newline at end of file diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/build.rs b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/build.rs new file mode 100644 index 0000000..0c5b769 --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/build.rs @@ -0,0 +1,23 @@ +#![deny(warnings)] + +use std::env; + +fn main() { + println!("cargo:rerun-if-changed=build.rs"); + if let Some(true) = version_check::supports_feature("specialize") { + println!("cargo:rustc-cfg=feature=\"specialize\""); + } + if let Some(true) = version_check::supports_feature("stdsimd") { + println!("cargo:rustc-cfg=feature=\"stdsimd\""); + } + let arch = env::var("CARGO_CFG_TARGET_ARCH").expect("CARGO_CFG_TARGET_ARCH was not set"); + if arch.eq_ignore_ascii_case("x86_64") + || arch.eq_ignore_ascii_case("aarch64") + || arch.eq_ignore_ascii_case("mips64") + || arch.eq_ignore_ascii_case("powerpc64") + || arch.eq_ignore_ascii_case("riscv64gc") + || arch.eq_ignore_ascii_case("s390x") + { + println!("cargo:rustc-cfg=feature=\"folded_multiply\""); + } +} diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/compare/Cargo.toml b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/compare/Cargo.toml new file mode 100644 index 0000000..88bdf19 --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/compare/Cargo.toml @@ -0,0 +1,43 @@ +[package] +name = "ahash-compare" +version = "0.0.1" +authors = ["Tom Kaitchuck "] +license = "MIT OR Apache-2.0" +description = "A hash algorithm benchmark" +documentation = "https://docs.rs/ahash" +repository = "https://github.com/tkaitchuck/ahash" +keywords = ["hash", "hashmap", "aes", "aes-ni", "no-std"] +edition = "2018" +readme = "README.md" + +[features] +default = ["std"] +std = ["ahash/std"] +compile-time-rng = ["ahash/compile-time-rng"] + +[[bench]] +name = "compare" +path = "tests/compare.rs" +harness = false + +[profile.bench] +opt-level = 3 +debug = false +lto = 'fat' +debug-assertions = false +codegen-units = 1 + +[dependencies] +ahash = { path = "../", default-features = false } + +[dev-dependencies] +criterion = "0.3.3" +fnv = "1.0.7" +fxhash = "0.2.1" +farmhash = "1.1.5" +highway = "1.1.0" +metrohash = "1.0.6" +siphasher = "1" +t1ha = "0.1.0" +wyhash = "0.5" +xxhash-rust = {version = "0.8", features = ["xxh3"]} diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/compare/Table.png b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/compare/Table.png new file mode 100644 index 0000000000000000000000000000000000000000..89e67ee124857ad5143e7b9e066bedfe5c35c2a6 GIT binary patch literal 281849 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 z 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%0Dd(<see>x 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%0AVs8rCw-BOpyn*j4k@>VG%u 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�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 LvSfvXap3;|@xrjN literal 0 HcmV?d00001 diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/compare/readme.md b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/compare/readme.md new file mode 100644 index 0000000..58146e5 --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/compare/readme.md @@ -0,0 +1,123 @@ +# Comparison with other hashers + +[![Comparison chart](Table.png)](https://docs.google.com/spreadsheets/d/e/2PACX-1vSK7Li2nS-Bur9arAYF9IfT37MP-ohAe1v19lZu5fd9MajI1fSveLAQZyEie4Ea9k5-SWHTff7nL2DW/pubhtml?gid=0&single=true) + +## Design + +AHash is designed *exclusively* for use in in-memory hashmaps. It does not have a fixed standard, but uses different +algorithms depending on the availability of hardware instructions. Whenever possible aHash uses the [hardware AES instruction](https://en.wikipedia.org/wiki/AES_instruction_set) +on X86 processors when it is available. If no specialized instructions are available, it falls back on an +[algorithm based on multiplication](https://github.com/tkaitchuck/aHash/wiki/AHash-fallback-algorithm)). + +Because aHash does not have a fixed standard for its output, it can optimize its performance to a much greater extent than +algorithms which don't have this flexibility. This is great for Hashmaps but makes aHash inappropriate for applications where +a hash needs to be sent over the network, or persisted. + +## Quality + +**AHash passes the full [SMHasher test suite](https://github.com/rurban/smhasher)** both with and without AES support. +The output of the tests is checked into the [smhasher subdirectory](../smhasher). + +At **over 50GB/s** aHash is the fastest algorithm to pass the full test suite by more than a factor of 2. +Even the fallback algorithm is in the top 5 in terms of throughput, beating out many other algorithms that rely on SSE and AVX instructions. + +## Speed + +aHash is the fastest non-trivial hasher implementation in Rust. Below is a comparison with 10 other popular hashing algorithms. + +![Hasher perfromance](https://docs.google.com/spreadsheets/d/e/2PACX-1vSK7Li2nS-Bur9arAYF9IfT37MP-ohAe1v19lZu5fd9MajI1fSveLAQZyEie4Ea9k5-SWHTff7nL2DW/pubchart?oid=1323618938&format=image) + +## DOS resistance + +AHash provides DOS resistance by incorporating random keys into the hash. There is a full explanation [here](https://github.com/tkaitchuck/aHash/wiki/How-aHash-is-resists-DOS-attacks). + +If the `std` feature flag is enabled (On by default) it uses the `getrandom` crate to generate random seeds upon initialization. +If `std` is disabled and the `compile-time-rng` flag is enabled instead it will use the `const-random` to generate random seeds +at compile time and embed them into the application binary. + +If neither `std` or `compile-time-rng` flags are enabled aHash will fall back on using the numeric value of memory addresses as a source of randomness. +This is somewhat strong if ALSR is turned on (it is by default in Rust) but for some platforms this is not available. +As a result this should not be relied on. For this reason it is strongly recommended that if you disable `std` because you program needs to run in a +`no-std` environment to enable the `compile-time-rng` feature flag. + + +# Why use aHash over X + +## SipHash + +For a hashmap: Because aHash nearly **10x** faster. + +SipHash is however useful in other contexts, such as for a HMAC, where aHash would be completely inappropriate. + +*SipHash-2-4* is designed to provide DOS attack resistance, and has no presently known attacks +against this claim that doesn't involve learning bits of the key. + +SipHash is also available in the "1-3" variant which is about twice as fast as the standard version. +The SipHash authors don't recommend using this variation when DOS attacks are a concern, but there are still no known +practical DOS attacks against the algorithm. Rust has opted for the "1-3" version as the default in `std::collections::HashMap`, +because the speed trade off of "2-4" was not worth it. + +As you can see in the graph above, aHash is **much** faster than even *SipHash-1-3*, and also provides DOS resistance. + +## FxHash + +In terms of performance, aHash is faster than the FXhash for strings and byte arrays but not primitives. +So it might seem like using Fxhash for hashmaps when the key is a primitive is a good idea. This is *not* the case. + +When FX hash is operating on a 4 or 8 byte input such as a u32 or a u64, it reduces to multiplying the input by a fixed +constant. This is a bad hashing algorithm because it means that lower bits can never be influenced by any higher bit. In +the context of a hashmap where the low order bits are used to determine which bucket to put an item in, this isn't +any better than the identity function. Any keys that happen to end in the same bit pattern will all collide. +Some examples of where this is likely to occur are: + +* Strings encoded in base64 +* Null terminated strings (when working with C code) +* Integers that have the lower bits as zeros. (IE any multiple of small power of 2, which isn't a rare pattern in computer programs.) + * For example when taking lengths of data or locations in data it is common for values to +have a multiple of 1024, if these were used as keys in a map they will collide and end up in the same bucket. + +Like any non-keyed hash FxHash can be attacked. But FxHash is so prone to this that you may find yourself doing it accidentally. + +For example, it is possible to [accidentally introduce quadratic behavior by reading from one map in iteration order and writing to another.](https://accidentallyquadratic.tumblr.com/post/153545455987/rust-hash-iteration-reinsertion) + +Fxhash flaws make sense when you understand it for what it is. It is a quick and dirty hash, nothing more. +it was not published and promoted by its creator, it was **found**! + +Because it is error-prone, FxHash should never be used as a default. In specialized instances where the keys are understood +it makes sense, but given that aHash is faster on almost any object, it's probably not worth it. + +## FnvHash + +FnvHash is also a poor default. It only handles one byte at a time, so its performance really suffers with large inputs. +It is also non-keyed so it is still subject to DOS attacks and [accidentally quadratic behavior.](https://accidentallyquadratic.tumblr.com/post/153545455987/rust-hash-iteration-reinsertion) + +## MurmurHash, CityHash, MetroHash, FarmHash, and HighwayHash + +Murmur, City, Metro, Farm and Highway are all related, and appear to directly replace one another. + +They are all fine hashing algorithms, they do a good job of scrambling data, but they are all targeted at a different +usecase. They are intended to work in distributed systems where the hash is expected to be the same over time and from one +computer to the next, efficiently hashing large volumes of data. + +This is quite different from the needs of a Hasher used in a hashmap. In a map the typical value is under 10 bytes. None +of these algorithms scale down to handle that small of data at a competitive time. What's more the restriction that they +provide consistent output prevents them from taking advantage of different hardware capabilities on different CPUs. It makes +sense for a hashmap to work differently on a phone than on a server, or in WASM. + +If you need to persist or transmit a hash of a file, then using one of these is probably a good idea. +HighwayHash seems to be the preferred solution as it offers high throughput for large objects and is DOS resistant. + +## t1ha and XXHash +Like aHash, t1ha and XXHash are targeted at hashmaps and uses hardware instructions including AES for different platforms rather than having a single standard. +Both are fast, but AHash is faster than either one, both with and without AES. This is particularly true of smaller inputs such as integers. +T1ha's hashes do not pass the full of the SMHasher test suite. + +Neither XXHash nor T1ha explicitly claim DOS resistance, but both are keyed hashes, and do not have any obvious way to force collisions. +As of this writing there doesn't appear to be a maintained crate implementing the latest version of t1ha. + +## wyHash +Similarly, wyHash is targeted at hashmaps. WyHash is quite fast, but is not DOS resistant. + +There are fixed strings which when encountered caused the internal state to reset. This makes wyHash trivial to attack. + +AHash outperforms wyHash across all input sizes, regardless of which CPU instructions are available. \ No newline at end of file diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/compare/resources/sheet.css b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/compare/resources/sheet.css new file mode 100644 index 0000000..eb0ebd6 --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/compare/resources/sheet.css @@ -0,0 +1 @@ +a{text-decoration:none}a:link{color:#15c}a:visited{color:#61c}a:active{color:#d14836}a:hover{text-decoration:underline}.quantumIconsIcon{font-family:'Material Icons Extended';font-weight:normal;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-rendering:optimizeLegibility;text-transform:none;display:inline-block;word-wrap:normal;direction:ltr;font-feature-settings:'liga' 1;-webkit-font-smoothing:antialiased}html[dir="rtl"] .quantumIconsRtlIcon{-moz-transform:scaleX(-1);-o-transform:scaleX(-1);-webkit-transform:scaleX(-1);transform:scaleX(-1);filter:FlipH;-ms-filter:"FlipH"}.ac-renderer{font:normal 13px Arial,sans-serif;position:absolute;background:#fff;border:1px solid #666;-moz-box-shadow:2px 2px 2px rgba(102,102,102,.4);-webkit-box-shadow:2px 2px 2px rgba(102,102,102,.4);width:300px}.ac-row{cursor:pointer;padding:.4em}.ac-highlighted{font-weight:bold}.ac-active{background-color:#b2b4bf}.goog-inline-block{position:relative;display:-moz-inline-box;display:inline-block}* html .goog-inline-block{display:inline}*:first-child+html .goog-inline-block{display:inline}.jfk-button{-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;cursor:default;font-size:11px;font-weight:bold;text-align:center;white-space:nowrap;margin-right:16px;height:27px;line-height:27px;min-width:54px;outline:0px;padding:0 8px}.jfk-button-hover{-webkit-box-shadow:0 1px 1px rgba(0,0,0,.1);-moz-box-shadow:0 1px 1px rgba(0,0,0,.1);box-shadow:0 1px 1px rgba(0,0,0,.1)}.jfk-button-selected{-webkit-box-shadow:inset 0px 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0px 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0px 1px 2px rgba(0,0,0,0.1)}.jfk-button .jfk-button-img{margin-top:-3px;vertical-align:middle}.jfk-button-label{margin-left:5px}.jfk-button-narrow{min-width:34px;padding:0}.jfk-button-collapse-left,.jfk-button-collapse-right{z-index:1}.jfk-button-collapse-left.jfk-button-disabled{z-index:0}.jfk-button-checked.jfk-button-collapse-left,.jfk-button-checked.jfk-button-collapse-right{z-index:2}.jfk-button-collapse-left:focus,.jfk-button-collapse-right:focus,.jfk-button-hover.jfk-button-collapse-left,.jfk-button-hover.jfk-button-collapse-right{z-index:3}.jfk-button-collapse-left{margin-left:-1px;-moz-border-radius-bottomleft:0;-moz-border-radius-topleft:0;-webkit-border-bottom-left-radius:0;-webkit-border-top-left-radius:0;border-bottom-left-radius:0;border-top-left-radius:0}.jfk-button-collapse-right{margin-right:0px;-moz-border-radius-topright:0;-moz-border-radius-bottomright:0;-webkit-border-top-right-radius:0;-webkit-border-bottom-right-radius:0;border-top-right-radius:0;border-bottom-right-radius:0}.jfk-button.jfk-button-disabled:active{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.jfk-button-action{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;background-color:#4d90fe;background-image:-webkit-linear-gradient(top,#4d90fe,#4787ed);background-image:-moz-linear-gradient(top,#4d90fe,#4787ed);background-image:-ms-linear-gradient(top,#4d90fe,#4787ed);background-image:-o-linear-gradient(top,#4d90fe,#4787ed);background-image:linear-gradient(top,#4d90fe,#4787ed);border:1px solid #3079ed;color:#fff}.jfk-button-action.jfk-button-hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;background-color:#357ae8;background-image:-webkit-linear-gradient(top,#4d90fe,#357ae8);background-image:-moz-linear-gradient(top,#4d90fe,#357ae8);background-image:-ms-linear-gradient(top,#4d90fe,#357ae8);background-image:-o-linear-gradient(top,#4d90fe,#357ae8);background-image:linear-gradient(top,#4d90fe,#357ae8);border:1px solid #2f5bb7;border-bottom-color:#2f5bb7}.jfk-button-action:focus{-webkit-box-shadow:inset 0 0 0 1px #fff;-moz-box-shadow:inset 0 0 0 1px #fff;box-shadow:inset 0 0 0 1px #fff;border:1px solid #fff;border:rgba(0,0,0,0) solid 1px;outline:1px solid #4d90fe;outline:rgba(0,0,0,0) 0}.jfk-button-action.jfk-button-clear-outline{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;outline:none}.jfk-button-action:active{-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.3);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.3);box-shadow:inset 0 1px 2px rgba(0,0,0,0.3);background:#357ae8;border:1px solid #2f5bb7;border-top:1px solid #2f5bb7}.jfk-button-action.jfk-button-disabled{background:#4d90fe;filter:alpha(opacity=50);opacity:0.5}.jfk-button-contrast{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;background-color:#f5f5f5;background-image:-webkit-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:-moz-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:-ms-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:-o-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:linear-gradient(top,#f5f5f5,#f1f1f1);color:#333;border:1px solid #dcdcdc;border:1px solid rgba(0,0,0,0.1)}.jfk-button-contrast.jfk-button-hover,.jfk-button-contrast.jfk-button-clear-outline.jfk-button-hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;background-color:#f8f8f8;background-image:-webkit-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-moz-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-ms-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-o-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:linear-gradient(top,#f8f8f8,#f1f1f1);border:1px solid #c6c6c6;color:#111}.jfk-button-contrast:active,.jfk-button-contrast.jfk-button-hover:active{-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1);background:#f8f8f8}.jfk-button-contrast.jfk-button-selected,.jfk-button-contrast.jfk-button-clear-outline.jfk-button-selected{background-color:#eee;background-image:-webkit-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-moz-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-ms-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-o-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:linear-gradient(top,#f8f8f8,#f1f1f1);border:1px solid #ccc;color:#333}.jfk-button-contrast.jfk-button-checked,.jfk-button-contrast.jfk-button-clear-outline.jfk-button-checked{-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1);background-color:#eee;background-image:-webkit-linear-gradient(top,#eee,#e0e0e0);background-image:-moz-linear-gradient(top,#eee,#e0e0e0);background-image:-ms-linear-gradient(top,#eee,#e0e0e0);background-image:-o-linear-gradient(top,#eee,#e0e0e0);background-image:linear-gradient(top,#eee,#e0e0e0);border:1px solid #ccc;color:#333}.jfk-button-contrast:focus{border:1px solid #4d90fe;outline:none}.jfk-button-contrast.jfk-button-clear-outline{border:1px solid #dcdcdc;outline:none}.jfk-button-contrast.jfk-button-disabled{background:#fff;border:1px solid #f3f3f3;border:1px solid rgba(0,0,0,0.05);color:#b8b8b8}.jfk-button-contrast .jfk-button-img{opacity:.70}.jfk-button-contrast.jfk-button-checked .jfk-button-img,.jfk-button-contrast.jfk-button-selected .jfk-button-img,.jfk-button-contrast.jfk-button-hover .jfk-button-img{opacity:0.9}.jfk-button-contrast.jfk-button-disabled .jfk-button-img{filter:alpha(opacity=33);opacity:0.333}.jfk-button-default{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;background-color:#3d9400;background-image:-webkit-linear-gradient(top,#3d9400,#398a00);background-image:-moz-linear-gradient(top,#3d9400,#398a00);background-image:-ms-linear-gradient(top,#3d9400,#398a00);background-image:-o-linear-gradient(top,#3d9400,#398a00);background-image:linear-gradient(top,#3d9400,#398a00);border:1px solid #29691d;color:#fff;text-shadow:0px 1px rgba(0,0,0,0.1)}.jfk-button-default.jfk-button-hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;background-color:#368200;background-image:-webkit-linear-gradient(top,#3d9400,#368200);background-image:-moz-linear-gradient(top,#3d9400,#368200);background-image:-ms-linear-gradient(top,#3d9400,#368200);background-image:-o-linear-gradient(top,#3d9400,#368200);background-image:linear-gradient(top,#3d9400,#368200);border:1px solid #2d6200;border-bottom:1px solid #2d6200;text-shadow:0px 1px rgba(0,0,0,0.3)}.jfk-button-default:focus{-webkit-box-shadow:inset 0 0 0 1px #fff;-moz-box-shadow:inset 0 0 0 1px #fff;box-shadow:inset 0 0 0 1px #fff;border:1px solid #fff;border:rgba(0,0,0,0) solid 1px;outline:1px solid #3d9400;outline:rgba(0,0,0,0) 0}.jfk-button-default.jfk-button-clear-outline{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;outline:none}.jfk-button-default:active{-webkit-box-shadow:inset 0px 1px 2px rgba(0,0,0,0.3);-moz-box-shadow:inset 0px 1px 2px rgba(0,0,0,0.3);box-shadow:inset 0px 1px 2px rgba(0,0,0,0.3);background:#368200;border:1px solid #2d6200;border-top:1px solid #2d6200}.jfk-button-default.jfk-button-disabled{background:#3d9400;filter:alpha(opacity=50);opacity:0.5}.jfk-button-primary{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;background-color:#d14836;background-image:-webkit-linear-gradient(top,#dd4b39,#d14836);background-image:-moz-linear-gradient(top,#dd4b39,#d14836);background-image:-ms-linear-gradient(top,#dd4b39,#d14836);background-image:-o-linear-gradient(top,#dd4b39,#d14836);background-image:linear-gradient(top,#dd4b39,#d14836);border:1px solid transparent;color:#fff;text-shadow:0px 1px rgba(0,0,0,0.1);text-transform:uppercase}.jfk-button-primary.jfk-button-hover{-webkit-box-shadow:0px 1px 1px rgba(0,0,0,0.2);-moz-box-shadow:0px 1px 1px rgba(0,0,0,0.2);box-shadow:0px 1px 1px rgba(0,0,0,0.2);background-color:#c53727;background-image:-webkit-linear-gradient(top,#dd4b39,#c53727);background-image:-moz-linear-gradient(top,#dd4b39,#c53727);background-image:-ms-linear-gradient(top,#dd4b39,#c53727);background-image:-o-linear-gradient(top,#dd4b39,#c53727);background-image:linear-gradient(top,#dd4b39,#c53727);border:1px solid #b0281a;border-bottom-color:#af301f}.jfk-button-primary:focus{-webkit-box-shadow:inset 0 0 0 1px #fff;-moz-box-shadow:inset 0 0 0 1px #fff;box-shadow:inset 0 0 0 1px #fff;border:1px solid #fff;border:rgba(0,0,0,0) solid 1px;outline:1px solid #d14836;outline:rgba(0,0,0,0) 0}.jfk-button-primary.jfk-button-clear-outline{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;outline:none}.jfk-button-primary:active{-webkit-box-shadow:inset 0px 1px 2px rgba(0,0,0,0.3);-moz-box-shadow:inset 0px 1px 2px rgba(0,0,0,0.3);box-shadow:inset 0px 1px 2px rgba(0,0,0,0.3);background-color:#b0281a;background-image:-webkit-linear-gradient(top,#dd4b39,#b0281a);background-image:-moz-linear-gradient(top,#dd4b39,#b0281a);background-image:-ms-linear-gradient(top,#dd4b39,#b0281a);background-image:-o-linear-gradient(top,#dd4b39,#b0281a);background-image:linear-gradient(top,#dd4b39,#b0281a);border:1px solid #992a1b;border-top:1px solid #992a1b}.jfk-button-primary.jfk-button-disabled{background:#d14836;filter:alpha(opacity=50);opacity:0.5}.jfk-slideToggle{-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;-webkit-box-shadow:inset 0px 1px 2px 0 rgba(0,0,0,.1);-moz-box-shadow:inset 0px 1px 2px 0 rgba(0,0,0,.1);box-shadow:inset 0px 1px 2px 0 rgba(0,0,0,.1);background-color:#f5f5f5;background-image:-webkit-linear-gradient(top,#eee,#e0e0e0);background-image:-moz-linear-gradient(top,#eee,#e0e0e0);background-image:-ms-linear-gradient(top,#eee,#e0e0e0);background-image:-o-linear-gradient(top,#eee,#e0e0e0);background-image:linear-gradient(top,#eee,#e0e0e0);border:1px solid #ccc;color:#666;font-weight:bold;height:27px;line-height:27px;margin-right:16px;outline:none;overflow:hidden;padding:0;position:relative;width:94px}.jfk-slideToggle-on,.jfk-slideToggle-off,.jfk-slideToggle-thumb{display:inline-block;text-align:center;text-transform:uppercase;width:47px}.jfk-slideToggle-on{-webkit-box-shadow:inset 0 1px 2px 0 rgba(0,0,0,.1);-moz-box-shadow:inset 0 1px 2px 0 rgba(0,0,0,.1);box-shadow:inset 0 1px 2px 0 rgba(0,0,0,.1);background-color:#398bf2;background-image:-webkit-linear-gradient(top,#3b93ff,#3689ee);background-image:-moz-linear-gradient(top,#3b93ff,#3689ee);background-image:-ms-linear-gradient(top,#3b93ff,#3689ee);background-image:-o-linear-gradient(top,#3b93ff,#3689ee);background-image:linear-gradient(top,#3b93ff,#3689ee);color:#fff;height:27px}.jfk-slideToggle-off{-webkit-border-radius:2px 2px 0 0;-moz-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0}.jfk-slideToggle-thumb{-webkit-box-shadow:0px 1px 2px 0 rgba(0,0,0,.1);-moz-box-shadow:0px 1px 2px 0 rgba(0,0,0,.1);box-shadow:0px 1px 2px 0 rgba(0,0,0,.1);background-color:#f5f5f5;background-image:-webkit-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-moz-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-ms-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-o-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:linear-gradient(top,#f8f8f8,#f1f1f1);-webkit-transition:all .130s ease-out;-moz-transition:all .130s ease-out;-o-transition:all .130s ease-out;transition:all .130s ease-out;border:1px solid #ccc;display:block;height:27px;left:-1px;position:absolute;top:-1px}.jfk-slideToggle-thumb::after{content:'';background-image:-webkit-linear-gradient(left,#ccc 50%,transparent 50%),-webkit-linear-gradient(left,#ccc 50%,transparent 50%),-webkit-linear-gradient(left,#ccc 50%,transparent 50%),-webkit-linear-gradient(left,#ccc 50%,transparent 50%),-webkit-linear-gradient(left,#ccc 50%,transparent 50%);background-image:-moz-linear-gradient(left,#ccc 50%,transparent 50%),-moz-linear-gradient(left,#ccc 50%,transparent 50%),-moz-linear-gradient(left,#ccc 50%,transparent 50%),-moz-linear-gradient(left,#ccc 50%,transparent 50%),-moz-linear-gradient(left,#ccc 50%,transparent 50%);background-image:-ms-linear-gradient(left,#ccc 50%,transparent 50%),-ms-linear-gradient(left,#ccc 50%,transparent 50%),-ms-linear-gradient(left,#ccc 50%,transparent 50%),-ms-linear-gradient(left,#ccc 50%,transparent 50%),-ms-linear-gradient(left,#ccc 50%,transparent 50%);background-image:-o-linear-gradient(left,#ccc 50%,transparent 50%),-o-linear-gradient(left,#ccc 50%,transparent 50%),-o-linear-gradient(left,#ccc 50%,transparent 50%),-o-linear-gradient(left,#ccc 50%,transparent 50%),-o-linear-gradient(left,#ccc 50%,transparent 50%);background-image:linear-gradient(left,#ccc 50%,transparent 50%),linear-gradient(left,#ccc 50%,transparent 50%),linear-gradient(left,#ccc 50%,transparent 50%),linear-gradient(left,#ccc 50%,transparent 50%),linear-gradient(left,#ccc 50%,transparent 50%);background-position:0 0,0 2px,0 4px,0 6px,0 8px;background-repeat:repeat-x;background-size:2px 1px;display:block;height:9px;left:15px;position:absolute;top:9px;width:17px}.jfk-slideToggle.jfk-slideToggle-checked .jfk-slideToggle-thumb{left:47px}.jfk-slideToggle:focus{border:1px solid #4d90fe}.jfk-slideToggle.jfk-slideToggle-clearOutline{border:1px solid #ccc}.jfk-button-standard{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;background-color:#f5f5f5;background-image:-webkit-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:-moz-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:-ms-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:-o-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:linear-gradient(top,#f5f5f5,#f1f1f1);color:#333;border:1px solid #dcdcdc;border:1px solid rgba(0,0,0,0.1)}.jfk-button-standard.jfk-button-hover,.jfk-button-standard.jfk-button-clear-outline.jfk-button-hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;background-color:#f8f8f8;background-image:-webkit-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-moz-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-ms-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-o-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:linear-gradient(top,#f8f8f8,#f1f1f1);border:1px solid #c6c6c6;color:#111}.jfk-button-standard:active,.jfk-button-standard.jfk-button-hover:active{-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1);background:#f8f8f8;color:#111}.jfk-button-standard.jfk-button-selected,.jfk-button-standard.jfk-button-clear-outline.jfk-button-selected{background-color:#eee;background-image:-webkit-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-moz-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-ms-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-o-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:linear-gradient(top,#f8f8f8,#f1f1f1);border:1px solid #ccc;color:#333}.jfk-button-standard.jfk-button-checked,.jfk-button-standard.jfk-button-clear-outline.jfk-button-checked{-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1);background-color:#eee;background-image:-webkit-linear-gradient(top,#eee,#e0e0e0);background-image:-moz-linear-gradient(top,#eee,#e0e0e0);background-image:-ms-linear-gradient(top,#eee,#e0e0e0);background-image:-o-linear-gradient(top,#eee,#e0e0e0);background-image:linear-gradient(top,#eee,#e0e0e0);border:1px solid #ccc;color:#333}.jfk-button-standard:focus{border:1px solid #4d90fe;outline:none}.jfk-button-standard.jfk-button-clear-outline{border:1px solid #dcdcdc;border:1px solid rgba(0,0,0,0.1);outline:none}.jfk-button-standard.jfk-button-disabled{background:#fff;border:1px solid #f3f3f3;border:1px solid rgba(0,0,0,0.05);color:#b8b8b8}.jfk-button-standard .jfk-button-img{opacity:.70}.jfk-button-standard.jfk-button-checked .jfk-button-img,.jfk-button-standard.jfk-button-selected .jfk-button-img,.jfk-button-standard.jfk-button-hover .jfk-button-img{opacity:0.9}.jfk-button-standard.jfk-button-disabled .jfk-button-img{filter:alpha(opacity=33);opacity:0.333}.jfk-button-flat{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;border:1px solid transparent;font-size:13px;font-weight:normal;height:21px;line-height:21px;margin-right:1px;min-width:0;padding:0}.jfk-button-flat.jfk-button-hover,.jfk-button-flat.jfk-button-selected,.jfk-button-flat:focus,.jfk-button-flat:active{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.jfk-button-flat .jfk-button-img{height:21px;opacity:.70;width:21px}.jfk-button-flat .jfk-button-label{display:inline-block;margin:0;padding:0 1px}.jfk-button-flat.jfk-button-selected .jfk-button-img,.jfk-button-flat.jfk-button-hover .jfk-button-img{opacity:0.9}.jfk-button-flat.jfk-button-disabled .jfk-button-img{filter:alpha(opacity=33);opacity:0.333}.jfk-button-flat:focus{border:1px solid #4d90fe}.jfk-button-flat.jfk-button-clear-outline{border:1px solid transparent}.jfk-button-mini{background-color:#f5f5f5;background-image:-webkit-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:-moz-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:-ms-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:-o-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:linear-gradient(top,#f5f5f5,#f1f1f1);border:1px solid #dcdcdc;border:1px solid rgba(0,0,0,0.1);color:#333;height:17px;line-height:17px;min-width:22px;text-shadow:0px 1px rgba(0,0,0,0.1)}.jfk-button-mini.jfk-button-hover,.jfk-button-mini.jfk-button-clear-outline.jfk-button-hover{background-color:#f8f8f8;background-image:-webkit-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-moz-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-ms-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-o-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:linear-gradient(top,#f8f8f8,#f1f1f1);border:1px solid #c6c6c6;text-shadow:0px 1px rgba(0,0,0,0.3)}.jfk-button-mini:active{-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.jfk-button-mini.jfk-button-checked,.jfk-button-mini.jfk-button-clear-outline.jfk-button-checked{-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1);background-color:#e0e0e0;background-image:-webkit-linear-gradient(top,#eee,#e0e0e0);background-image:-moz-linear-gradient(top,#eee,#e0e0e0);background-image:-ms-linear-gradient(top,#eee,#e0e0e0);background-image:-o-linear-gradient(top,#eee,#e0e0e0);background-image:linear-gradient(top,#eee,#e0e0e0);border:1px solid #ccc;color:#333}.jfk-button-mini:focus{border:1px solid #4d90fe}.jfk-button-mini.jfk-button-clear-outline{border:1px solid #dcdcdc}.jfk-button-mini.jfk-button-disabled{background:#fff;border:1px solid #f3f3f3;border:1px solid rgba(0,0,0,0.05);color:#b8b8b8}.goog-modalpopup,.modal-dialog{-webkit-box-shadow:0 4px 16px rgba(0,0,0,.2);-moz-box-shadow:0 4px 16px rgba(0,0,0,.2);box-shadow:0 4px 16px rgba(0,0,0,.2);background:#fff;background-clip:padding-box;border:1px solid #acacac;border:1px solid rgba(0,0,0,.333);outline:0;position:absolute}.goog-modalpopup-bg,.modal-dialog-bg{background:#fff;left:0;position:absolute;top:0}div.goog-modalpopup-bg,div.modal-dialog-bg{filter:alpha(opacity=75);-moz-opacity:.75;opacity:.75}.modal-dialog{color:#000;padding:30px 42px}.modal-dialog-title{background-color:#fff;color:#000;cursor:default;font-size:16px;font-weight:normal;line-height:24px;margin:0 0 16px}.modal-dialog-title-close{height:11px;opacity:0.7;padding:17px;position:absolute;right:0px;top:0px;width:11px}.modal-dialog-title-close:after{content:'';background:url(//ssl.gstatic.com/ui/v1/dialog/close-x.png);position:absolute;height:11px;width:11px;right:17px}.modal-dialog-title-close:hover{opacity:1}.modal-dialog-content{background-color:#fff;line-height:1.4em;word-wrap:break-word}.modal-dialog-buttons{margin-top:16px}.modal-dialog-buttons button{-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;background-color:#f5f5f5;background-image:-webkit-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:-moz-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:-ms-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:-o-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:linear-gradient(top,#f5f5f5,#f1f1f1);border:1px solid #dcdcdc;border:1px solid rgba(0,0,0,0.1);color:#333;cursor:default;font-family:inherit;font-size:11px;font-weight:bold;height:29px;line-height:27px;margin:0 16px 0 0;min-width:72px;outline:0;padding:0 8px}.modal-dialog-buttons button:hover,.modal-dialog-buttons button:active{-webkit-box-shadow:0px 1px 1px rgba(0,0,0,0.1);-moz-box-shadow:0px 1px 1px rgba(0,0,0,0.1);box-shadow:0px 1px 1px rgba(0,0,0,0.1);background-color:#f8f8f8;background-image:-webkit-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-moz-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-ms-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-o-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:linear-gradient(top,#f8f8f8,#f1f1f1);border:1px solid #c6c6c6;color:#111}.modal-dialog-buttons button:active{-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.modal-dialog-buttons button:focus{border:1px solid #4d90fe}.modal-dialog-buttons button[disabled]{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;background:#fff;background-image:none;border:1px solid #f3f3f3;border:1px solid rgba(0,0,0,0.05);color:#b8b8b8}.modal-dialog-buttons .goog-buttonset-action{background-color:#4d90fe;background-image:-webkit-linear-gradient(top,#4d90fe,#4787ed);background-image:-moz-linear-gradient(top,#4d90fe,#4787ed);background-image:-ms-linear-gradient(top,#4d90fe,#4787ed);background-image:-o-linear-gradient(top,#4d90fe,#4787ed);background-image:linear-gradient(top,#4d90fe,#4787ed);border:1px solid #3079ed;color:#fff}.modal-dialog-buttons .goog-buttonset-action:hover,.modal-dialog-buttons .goog-buttonset-action:active{background-color:#357ae8;background-image:-webkit-linear-gradient(top,#4d90fe,#357ae8);background-image:-moz-linear-gradient(top,#4d90fe,#357ae8);background-image:-ms-linear-gradient(top,#4d90fe,#357ae8);background-image:-o-linear-gradient(top,#4d90fe,#357ae8);background-image:linear-gradient(top,#4d90fe,#357ae8);border:1px solid #2f5bb7;color:#fff}.modal-dialog-buttons .goog-buttonset-action:active{-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.3);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.3);box-shadow:inset 0 1px 2px rgba(0,0,0,0.3)}.modal-dialog-buttons .goog-buttonset-action:focus{-webkit-box-shadow:inset 0 0 0 1px #fff;-moz-box-shadow:inset 0 0 0 1px #fff;box-shadow:inset 0 0 0 1px #fff;border:1px solid #fff;border:rgba(0,0,0,0) solid 1px;outline:1px solid #4d90fe;outline:rgba(0,0,0,0) 0}.modal-dialog-buttons .goog-buttonset-action[disabled]{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;background:#4d90fe;color:#fff;filter:alpha(opacity=50);opacity:0.5}.jfk-alert,.jfk-confirm,.jfk-prompt{width:512px}.jfk-textinput{-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;border:1px solid #d9d9d9;border-top:1px solid #c0c0c0;font-size:13px;height:25px;padding:1px 8px}.jfk-textinput:focus{-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.3);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.3);box-shadow:inset 0 1px 2px rgba(0,0,0,0.3);border:1px solid #4d90fe;outline:none}.jfk-textinput::-ms-clear{display:none}.apps-action-shortcut-icon{direction:ltr;text-align:left;overflow:hidden;position:relative;vertical-align:middle}.apps-action-shortcut-img:before{content:url(//ssl.gstatic.com/docs/common/shortcut_sprite1.png)}.apps-action-shortcut-img{height:95px;position:absolute;width:21px}.apps-action-shortcut-back{left:0;top:-63px}.apps-action-shortcut-back-white{left:0;top:-21px}.apps-action-shortcut-close-x{left:0;top:-84px}.apps-action-shortcut-search{left:0;top:-42px}.apps-action-shortcut-search-white{left:0;top:0}.apps-ui-material-slide-toggle-container{-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:none;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;height:21px;outline:0;position:relative;width:35px}.apps-ui-material-slide-toggle-thumb{-webkit-transition-duration:0.28s;-moz-transition-duration:0.28s;-o-transition-duration:0.28s;transition-duration:0.28s;-webkit-transition-property:all;-moz-transition-property:all;-o-transition-property:all;transition-property:all;-webkit-transition-timing-function:cubic-bezier(0.4,0.0,0.2,1);-moz-transition-timing-function:cubic-bezier(0.4,0.0,0.2,1);-o-transition-timing-function:cubic-bezier(0.4,0.0,0.2,1);transition-timing-function:cubic-bezier(0.4,0.0,0.2,1);left:0;right:inherit;top:0;will-change:background-color}.apps-ui-material-slide-toggle-container-checked .apps-ui-material-slide-toggle-thumb{left:inherit;right:0}.apps-ui-material-slide-toggle-container-disabled{cursor:not-allowed}.apps-ui-material-slide-toggle-track{background-color:#000;border-radius:7px;height:14px;opacity:0.26;width:35px}.apps-ui-material-slide-toggle-container-checked .apps-ui-material-slide-toggle-track{opacity:0.5}.apps-ui-material-slide-toggle-thumb{background-color:#f1f1f1;border-radius:100%;box-shadow:0 0 2px rgba(0,0,0,.12),0 2px 4px rgba(0,0,0,.24);height:20px;width:20px;position:absolute}.apps-ui-material-slide-toggle-track,.apps-ui-material-slide-toggle-thumb{border:1px solid transparent}.apps-ui-material-slide-toggle-container-focused .apps-ui-material-slide-toggle-thumb{box-shadow:0 0 4px rgba(0,0,0,.14),0 4px 8px rgba(0,0,0,.28)}.apps-ui-material-slide-toggle-container-hover .apps-ui-material-slide-toggle-thumb{box-shadow:0 0 6px rgba(0,0,0,.16),0 6px 12px rgba(0,0,0,.32)}.apps-shortcutshelppopup{top:0;z-index:1002;color:#212121;font-family:roboto,arial,sans-serif;font-size:13px;position:fixed;text-align:center;background:#fafafa none repeat scroll 0;overflow:hidden;box-shadow:rgba(255,255,255,.9) 0px 1px 0px inset,rgba(0,0,0,.03) 0px -1px 0px inset,rgba(0,0,0,.15) 0 15px 10px,rgba(0,0,0,.3) 0 8px 36px;border:1px solid transparent}.apps-shortcutshelppopup input{font-family:roboto,arial,sans-serif}@media print{.apps-shortcutshelppopup{display:none}}.apps-shortcutshelppopup-bg{display:none;left:0;top:0;position:absolute}.apps-shortcutshelppopup-container{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;-moz-box-sizing:border-box;box-sizing:border-box;padding:16px 32px;width:800px;height:600px}.apps-shortcutshelppopup-header,.apps-shortcutshelppopup-content{border-collapse:collapse;width:100%}.apps-shortcutshelppopup-header{-ms-flex:0 0 auto;-webkit-flex:0 0 auto;flex:0 0 auto;border-bottom:1px solid #e5e5e5;text-align:left}.apps-shortcutshelppopup-content{font-size:13px;outline-offset:-1px}.apps-shortcutshelppopup-header-element{display:inline-block;vertical-align:middle;height:48px}.apps-shortcutshelppopup-title-container{white-space:nowrap;text-align:left}.apps-shortcutshelppopup-dialog-title{font-size:16px;color:#212121;display:inline-block;vertical-align:middle}.apps-shortcutshelppopup-input{font-size:13px;margin-left:16px;margin-right:0px;padding:0px 5px;vertical-align:middle;border-right:none;width:250px;height:27px;box-sizing:border-box}.apps-shortcutshelppopup-input-button-img{height:21px;width:21px;display:inline-block}.apps-shortcutshelppopup-input-button{-moz-box-sizing:border-box;box-sizing:border-box;cursor:pointer;display:inline-block;margin-left:0px;vertical-align:middle;border-top-left-radius:0;border-bottom-left-radius:0;line-height:25px}.apps-shortcutshelppopup-tearoff-link{font-size:13px;cursor:pointer;text-decoration:underline;color:#4581ff;vertical-align:middle;display:block;padding:16px 0 13px 0;font-weight:bold}.apps-shortcutshelppopup-close{position:absolute;top:0;right:0;padding-right:30px;padding-top:30px}.apps-shortcutshelppopup-close svg{fill:#5f6368}.apps-shortcutshelppopup-close-nav-widget-enabled{padding-right:18px;padding-top:20px}.apps-shortcutshelppopup-dialog .modal-dialog-title-close{cursor:pointer;position:static;padding:0px;margin:0;margin-left:32px;vertical-align:middle}.apps-shortcutshelppopup-dialog .modal-dialog-title-close:after{background:none;display:none}.apps-shortcutshelppopup-search-banner{-ms-flex:0 0 auto;-webkit-flex:0 0 auto;flex:0 0 auto;text-align:left;height:48px;padding-top:12px;box-sizing:border-box}.apps-shortcutshelppopup-search-banner.apps-shortcutshelppopup-empty-search{position:relative;left:0px;right:0px;text-align:center;top:113px;height:48px}.apps-shortcutshelppopup-reset-search-button{cursor:pointer;text-decoration:underline;position:relative;width:21px;min-width:21px;display:inline-block;margin-right:8px}.apps-shortcutshelppopup-reset-search-button-icon{height:21px;width:21px}.apps-shortcutshelppopup-search-label{margin:0;position:relative;font-size:15px;display:inline-block;vertical-align:middle}.apps-shortcutshelppopup-result-container{-ms-flex:1 1 auto;-webkit-flex:1 1 auto;flex:1 1 auto;overflow:auto}.apps-shortcutshelppopup-content-header{height:48px;padding-top:25px;text-align:left;font-size:13px;color:#212121;white-space:nowrap;margin:0px;-moz-box-sizing:border-box;box-sizing:border-box}.apps-shortcutshelppopup-content-header.apps-shortcutshelppopup-content-header-first{height:32px;padding-top:8px}.apps-shortcutshelppopup-content-element{text-align:left;vertical-align:middle;padding-top:0.15em;border-bottom:1px solid #ececec;height:32px;white-space:nowrap;-moz-box-sizing:border-box;box-sizing:border-box}.apps-shortcutshelppopup-shortcut-desc{color:#757575}.apps-shortcutshelppopup-shortcut-key{font-weight:bold}.apps-shortcutshelppopup-ac-renderer{z-index:1003;font-family:Arial,sans-serif;font-size:13px;position:absolute;background:#fff;border:1px solid #666;box-shadow:2px 2px 2px rgba(102,102,102,.4);width:250px;box-sizing:border-box}.apps-shortcutshelppopup-ac-row{cursor:pointer;padding:.4em}.apps-shortcutshelppopup-ac-renderer .ac-active{background-color:#eee}.apps-shortcutshelpcontentimpl-container{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;background-color:white;height:600px;width:800px}@media screen and (max-width:832px){.apps-shortcutshelpcontentimpl-container{max-width:95vw}}@media screen and (max-height:632px){.apps-shortcutshelpcontentimpl-container{height:95vh}}.apps-shortcutshelpcontentimpl-header{-ms-flex:0 0 auto;-webkit-flex:0 0 auto;flex:0 0 auto;border-bottom:1px solid rgba(0,0,0,0.12);text-align:left;border-collapse:collapse;width:100%;padding:16px 24px;box-sizing:border-box}.apps-shortcutshelpcontentimpl-header-element{display:inline-block;vertical-align:middle}.apps-shortcutshelpcontentimpl-title-container{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;white-space:nowrap;text-align:left}.apps-shortcutshelpcontentimpl-dialog-title{font-size:18px;color:rgba(0,0,0,.87);display:inline-block;vertical-align:middle;padding:16px 0;margin:0;font-weight:500}.apps-shortcutshelpcontentimpl-search{-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;border-radius:4px;margin-left:16px;margin-right:24px;vertical-align:middle;height:48px;padding:0;background-color:rgba(0,0,0,0.05);border:1px solid transparent}.apps-shortcutshelpcontentimpl-search-icon{width:24px;height:24px;margin:12px 8px 0 16px}.apps-shortcutshelpcontentimpl-search-icon svg{fill:#80868b}.apps-shortcutshelpcontentimpl-hc-black .apps-shortcutshelpcontentimpl-search-icon svg{fill:#fff}.apps-shortcutshelpcontentimpl-hc-white .apps-shortcutshelpcontentimpl-search-icon svg{fill:#000}.apps-shortcutshelpcontentimpl-search-focused{box-shadow:0 1px 1px rgba(0,0,0,0.24);background-color:#fff;transition:background-color 75ms}.apps-shortcutshelpcontentimpl-input{border:none;background-color:transparent;padding:0 10px;flex-grow:1;font-size:14px;height:46px;outline:none;box-shadow:none}.apps-shortcutshelpcontentimpl-input:focus{border:none;box-shadow:none}.apps-shortcutshelpcontentimpl-tearoff-link-container{-ms-flex:0 0 auto;-webkit-flex:0 0 auto;flex:0 0 auto;padding:10px;border-top:1px solid rgba(0,0,0,0.12);display:-webkit-inline-box;display:-moz-inline-box;display:-ms-inline-flexbox;display:-webkit-inline-flex;display:inline-flex;justify-content:center;align-items:center}.apps-shortcutshelpcontentimpl-tearoff-link-container-override-enabled{-ms-flex:0 0 50%;-webkit-flex:0 0 50%;flex:0 0 50%;padding:10px 0;display:-webkit-inline-box;display:-moz-inline-box;display:-ms-inline-flexbox;display:-webkit-inline-flex;display:inline-flex;justify-content:center;align-items:center}.apps-shortcutshelpcontentimpl-tearoff-link-container-legacy-enabled{display:-webkit-inline-box;display:-moz-inline-box;display:-ms-inline-flexbox;display:-webkit-inline-flex;display:inline-flex;justify-content:center;align-items:center;padding:10px 20px;text-transform:uppercase}.apps-shortcutshelpcontentimpl-link{font-size:13px;cursor:pointer;padding:9px 16px;border-radius:2px;font-weight:500}.apps-shortcutshelpcontentimpl-link,.apps-shortcutshelpcontentimpl-link:active{color:#1a73e8}.apps-shortcutshelpcontentimpl-link:hover{outline:none}.apps-shortcutshelpcontentimpl-link:focus{text-decoration:underline}.apps-shortcutshelpcontentimpl-link:visited{color:#1a73e8}.apps-shortcutshelpcontentimpl-override-shortcut-link{text-transform:uppercase}.apps-shortcutshelpcontentimpl-legacy-shortcut-link{display:-webkit-inline-box;display:-moz-inline-box;display:-ms-inline-flexbox;display:-webkit-inline-flex;display:inline-flex;justify-content:center;align-items:center}.apps-shortcutshelpcontentimpl-override-shortcut-link-disabled{cursor:inherit;opacity:0.6}.apps-shortcutshelpcontentimpl-link.apps-shortcutshelpcontentimpl-override-shortcut-link-disabled:focus,.apps-shortcutshelpcontentimpl-link.apps-shortcutshelpcontentimpl-override-shortcut-link-disabled:hover{text-decoration:none}.apps-shortcutshelpcontentimpl-search-banner{text-align:left;box-sizing:border-box;border-bottom:1px solid rgba(0,0,0,0.12);padding:26px 0}.apps-shortcutshelpcontentimpl-reset-search-button{cursor:pointer;text-decoration:underline;position:relative;width:21px;min-width:21px;display:inline-block;margin:0 8px;padding:0 8px 0 4px;border-color:transparent;background-color:transparent;background-image:none}.apps-shortcutshelpcontentimpl-override-banner{padding:5px 0 0 20px;line-height:16px;white-space:pre;color:rgba(0,0,0,.87)}.apps-shortcutshelpcontentimpl-override-shortcut-key{font-weight:bold}.apps-shortcutshelpcontentimpl-reset-search-button-icon{display:inline-block;vertical-align:middle;height:22px;width:21px}.apps-shortcutshelpcontentimpl-reset-search-button-img{position:absolute}.apps-shortcutshelpcontentimpl-reset-search-button-img:before{content:url('//ssl.gstatic.com/images/icons/material/system/svg/keyboard_arrow_left_24px.svg')}.apps-shortcutshelpcontentimpl-search-label{margin:0;position:relative;font-size:19px;display:inline-block;vertical-align:middle;color:rgba(0,0,0,.87)}.apps-shortcutshelpcontentimpl-ac-renderer{z-index:1003;font-family:Arial,sans-serif;font-size:13px;font-weight:normal;position:absolute;background:#fff;border:1px solid #666;box-shadow:2px 2px 2px rgba(102,102,102,.4);width:250px;box-sizing:border-box}.apps-shortcutshelpcontentimpl-ac-row{cursor:pointer;padding:.4em}.apps-shortcutshelpcontentimpl-ac-renderer .ac-active{background-color:#eee}.apps-shortcutshelpcontentimpl-content-container{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex:1 1 auto;-webkit-flex:1 1 auto;flex:1 1 auto;overflow:auto}.apps-shortcutshelpcontentimpl-sidebar{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;-ms-flex:0 0 192px;-webkit-flex:0 0 192px;flex:0 0 192px;vertical-align:top;position:relative;border-right:1px solid rgba(0,0,0,0.12);overflow-x:hidden;overflow-y:auto}.apps-shortcutshelpcontentimpl-shortcut-content{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;-ms-flex:1 1 auto;-webkit-flex:1 1 auto;flex:1 1 auto;overflow:auto}.apps-shortcutshelpcontentimpl-bottom-bar{-ms-flex:0 0 auto;-webkit-flex:0 0 auto;flex:0 0 auto;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;border-top:1px solid rgba(0,0,0,0.12)}.apps-shortcutshelpcontentimpl-override-container{-ms-flex:0 0 50%;-webkit-flex:0 0 50%;flex:0 0 50%;display:-webkit-inline-box;display:-moz-inline-box;display:-ms-inline-flexbox;display:-webkit-inline-flex;display:inline-flex;justify-content:center;align-items:center;box-sizing:border-box;border-left:1px solid rgba(0,0,0,0.12);border-collapse:collapse;padding:10px 0}.apps-shortcutshelpcontentimpl-legacy-help-container{display:-webkit-inline-box;display:-moz-inline-box;display:-ms-inline-flexbox;display:-webkit-inline-flex;display:inline-flex;-ms-flex:0 0 50%;-webkit-flex:0 0 50%;flex:0 0 50%;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;justify-content:flex-end}.apps-shortcutshelpcontentimpl-override-button-container{padding-left:16px}.apps-shortcutshelpcontentimpl-override-label{padding:0 5px 0 17px;font-weight:500;color:rgba(0,0,0,.87)}.apps-shortcutshelpcontentimpl-legacy-label{color:rgba(0,0,0,.87);font-weight:500;padding:0 15px 0 17px}.apps-shortcutshelpcontentimpl-legacy-toggle-container{align-items:center;box-sizing:border-box;display:-webkit-inline-box;display:-moz-inline-box;display:-ms-inline-flexbox;display:-webkit-inline-flex;display:inline-flex;-ms-flex:0 0 50%;-webkit-flex:0 0 50%;flex:0 0 50%;justify-content:flex-start;padding:0 5px 0 17px}.apps-actiondatawidget{-ms-flex:1 1 auto;-webkit-flex:1 1 auto;flex:1 1 auto;overflow:auto;position:relative;display:inline-block;outline:none;padding:0 5px 0 16px}.apps-actiondatawidget-key-focused{outline:rgba(0,0,0,.87) solid 1px;outline-offset:-1px}.apps-actiondatawidget-content{font-size:13px;outline-offset:-1px;table-layout:fixed;border-spacing:0}.apps-actiondatawidget-content-header{height:48px;padding-top:25px;text-align:left;font-size:13px;color:rgba(0,0,0,.87);white-space:nowrap;margin:0px;-moz-box-sizing:border-box;box-sizing:border-box}.apps-actiondatawidget-content-element{text-align:left;vertical-align:middle;border-bottom:1px solid rgba(0,0,0,0.12);white-space:nowrap;-moz-box-sizing:border-box;box-sizing:border-box;padding:11px 0}.apps-actiondatawidget-shortcut-desc{font-weight:normal;color:rgba(0,0,0,.87);word-wrap:break-word;white-space:normal;width:240px;vertical-align:top}.apps-actiondatawidget-shortcut-key{color:rgba(0,0,0,.87);width:310px}.apps-actiondatawidget-key-extra-padding{display:block;padding-bottom:11px}.apps-actiondatawidget-override-keys-on{color:rgba(0,0,0,.87);display:block}.apps-actiondatawidget-last-item{margin-bottom:2px}.apps-actiondatawidget-last-item-override-enabled{margin-bottom:2px}.apps-actiondatawidget-last-row{height:100%}.apps-actiondatawidget-override-keys-off{color:#bbbbbb;display:block}.apps-actiondatawidget-override-info-icon{height:17px;width:17px;float:right;display:block}.apps-actiondatawidget-override-info-svg{height:17px;width:17px;fill:#bbbbbb}.apps-shortcutshelpcontentimpl-hc-black .apps-actiondatawidget-override-info-svg{fill:white}.apps-actiondatawidget-override-keys-on .apps-actiondatawidget-override-info-svg{fill:#1a73e8}.jfk-tooltip.apps-actiondatawidget-override-info-icon-tooltip,.jfk-tooltip.apps-actiondatawidget-override-info-icon-tooltip-unsupported,.jfk-tooltip.apps-actiondatawidget-override-info-icon-tooltip-legacy{background-color:#727272;padding:7px 8px}.jfk-tooltip.apps-actiondatawidget-override-info-icon-tooltip{width:230px}.jfk-tooltip.apps-actiondatawidget-override-info-icon-tooltip-unsupported{width:182px}.jfk-tooltip.apps-actiondatawidget-override-info-icon-tooltip-legacy{width:190px}.apps-actiondatawidget-override-tooltip-text{line-height:17px}.apps-actiondatawidget-override-info-icon-tooltip .jfk-tooltip-arrowdown .jfk-tooltip-arrowimplafter{border-color:#727272 transparent}.apps-actiondatawidget-override-browser-behavior-msg{color:#c5dbff}.apps-navigationwidget{-ms-flex:1 1 auto;-webkit-flex:1 1 auto;flex:1 1 auto;display:inline-block;vertical-align:top;text-align:left;padding-top:4px;color:rgba(0,0,0,.87);outline:transparent}.apps-navigationwidget-item{min-height:33px;line-height:24px;padding:12px 1px 1px 24px}.apps-navigationwidget-item-selected{color:#1a73e8;font-weight:500;outline:1px solid transparent;outline-offset:-2px}.apps-navigationwidget-item-hover{cursor:pointer;background-color:#eee;outline:1px dotted transparent;outline-offset:-2px}.apps-navigationwidget-item-disabled{opacity:0.2}.companion-about-panel-button.app-switcher-button{bottom:0;position:absolute}.companion-about-panel-menu-header,.companion-about-panel-menu-text{color:#3c4043}.companion-about-panel-menu-header{font-size:18px;font-weight:500;line-height:24px;padding:6px 24px 2px}.companion-about-panel-menu-separator{border-top:1px solid #f1f3f4;margin:8px 0}.companion-about-panel-menu-item{border:none;cursor:pointer;height:48px;padding:0}.companion-about-panel-menu-item-highlight{background:#f1f3f4}.companion-about-panel-menu-item-icon-container{height:20px;padding:14px 16px 14px 24px;position:absolute;width:20px}.companion-about-panel-menu-item-disabled .companion-about-panel-menu-item-icon{fill:#dadce0}.companion-about-panel-menu-text{font-size:14px;letter-spacing:.2px;line-height:20px;padding:13px 24px 11px 60px}.companion-about-panel-menu-item-disabled .companion-about-panel-menu-text{color:#dadce0;cursor:default}.companion-app-switcher-container{background-color:white;border-left:1px solid #dadce0;box-sizing:border-box;display:flex;flex-direction:column;height:100%;position:relative;width:56px}.companion-app-switcher-guest-container{display:flex;flex:1 0 auto;flex-direction:column;margin-bottom:56px}.companion-app-switcher-add-on-container{display:flex;flex:0 1 100%;flex-direction:column;overflow:hidden;padding-top:16px}.companion-app-switcher-separator,.companion-app-switcher-add-on-container::before{border-top:1px solid #dadce0;content:'';display:block;flex:1 0 auto;margin:0 auto;padding-bottom:16px;width:20px}.companion-app-switcher-separator{margin-top:16px}.companion-theme-dark.companion-app-switcher-container,.companion-theme-light.companion-app-switcher-container{background-color:transparent}.companion-theme-dark.companion-app-switcher-container,.companion-theme-dark .companion-app-switcher-separator,.companion-theme-dark .companion-app-switcher-add-on-container::before{border-color:rgba(255,255,255,.12)}.companion-theme-light.companion-app-switcher-container,.companion-theme-light .companion-app-switcher-separator,.companion-theme-light .companion-app-switcher-add-on-container::before{border-color:rgba(100,121,143,.12)}.companion-guest-app-switcher{flex-grow:1;height:100px;outline:none;overflow:hidden}.companion-app-switcher-loading-indicator{padding:16px 0}.companion-app-switcher-loading-indicator-dot{-webkit-animation:dotLoadingAnimation 1.0s infinite ease-in-out both;animation:dotLoadingAnimation 1.0s infinite ease-in-out both;height:8px;background-color:#757575;border-radius:50%;margin:0 auto 12px;width:8px}.companion-theme-dark .companion-app-switcher-loading-indicator-dot{background-color:#fff}.companion-app-switcher-loading-indicator-dot:last-child{margin-bottom:0}.companion-app-switcher-loading-indicator-dot-1{-webkit-animation-delay:-0.5s;animation-delay:-0.5s}.companion-app-switcher-loading-indicator-dot-2{-webkit-animation-delay:-0.25s;animation-delay:-0.25s}@-webkit-keyframes dotLoadingAnimation{0%,80%,100%{opacity:0.5}40%{opacity:1.0}}@keyframes dotLoadingAnimation{0%,80%,100%{opacity:0.5}40%{opacity:1.0}}.app-switcher-button{cursor:pointer;height:56px;outline:none;pointer-events:none;position:relative;transition:all .3s cubic-bezier(.4,0,.2,1);width:56px}.app-switcher-button-disabled{cursor:default;opacity:.38}.app-switcher-button-focused .app-switcher-button-icon-background,.app-switcher-button-focused.app-switcher-button-hover .app-switcher-button-icon-background,.companion-theme-light .app-switcher-button-hover .app-switcher-button-icon-background,.companion-theme-light .app-switcher-button-open .app-switcher-button-icon-background,.companion-theme-light .app-switcher-button-selected.app-switcher-button-hover .app-switcher-button-icon-background{background-color:#e8eaed}.app-switcher-button-hover .app-switcher-button-icon-background,.app-switcher-button-open .app-switcher-button-icon-background,.companion-theme-light .app-switcher-button-selected .app-switcher-button-icon-background,.companion-theme-light .app-switcher-button-focused .app-switcher-button-icon-background{background-color:#f1f3f4}.companion-theme-dark .app-switcher-button-selected .app-switcher-button-icon-background,.companion-theme-dark .app-switcher-button-focused .app-switcher-button-icon-background{background-color:rgba(255,255,255,.24)}.companion-theme-dark .app-switcher-button-hover .app-switcher-button-icon-background,.companion-theme-dark .app-switcher-button-open .app-switcher-button-icon-background,.companion-theme-dark .app-switcher-button-selected.app-switcher-button-hover .app-switcher-button-icon-background{background-color:rgba(255,255,255,.12)}.app-switcher-button-icon-container{background-color:transparent;background-repeat:no-repeat;background-position:center;background-size:20px 20px;border-radius:50%;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;height:40px;left:8px;pointer-events:auto;position:absolute;top:8px;transition:all .3s cubic-bezier(.4,0,.2,1);width:40px}.app-switcher-button-icon-background{border-radius:50%;display:-webkit-flex;display:flex;height:40px;left:8px;position:absolute;top:8px;transition:all .3s cubic-bezier(.4,0,.2,1);width:40px}.app-switcher-button-icon{display:block;fill:#5f6368;margin:auto;transition:all .3s cubic-bezier(.4,0,.2,1)}.companion-theme-dark .app-switcher-button-icon{fill:#fff}.app-switcher-button-presence .app-switcher-button-icon-background.app-switcher-button-icon-background-inner{-webkit-animation:presence-scale-inner 3s cubic-bezier(0.05,0.69,0.67,1) infinite normal;animation:presence-scale-inner 3s cubic-bezier(0.05,0.69,0.67,1) infinite normal;height:calc(40px - 8px);width:calc(40px - 8px);left:calc((8px/2) + 8px);top:calc((8px/2) + 8px)}.app-switcher-button-presence .app-switcher-button-icon-background.app-switcher-button-icon-background-outer{-webkit-animation:presence-scale-outer 3s cubic-bezier(0.05,0.69,0.67,1) infinite normal;animation:presence-scale-outer 3s cubic-bezier(0.05,0.69,0.67,1) infinite normal;background-color:transparent;border-style:solid;border-width:calc(8px/2);height:40px;width:40px;left:calc(8px - (8px/2));top:calc(8px - (8px/2))}.app-switcher-button-inksplash .app-switcher-button-icon-background.app-switcher-button-icon-background-inner{-webkit-animation:inksplash-scale-background 2s cubic-bezier(0.05,0.69,0.67,1) infinite normal;animation:inksplash-scale-background 2s cubic-bezier(0.05,0.69,0.67,1) infinite normal}.app-switcher-button-inksplash .app-switcher-button-icon-container{-webkit-animation:inksplash-scale-icon 2s cubic-bezier(0.05,0.69,0.67,1) infinite normal;animation:inksplash-scale-icon 2s cubic-bezier(0.05,0.69,0.67,1) infinite normal}@keyframes presence-scale-inner{0%{opacity:0;transform:scale(0.57);visibility:hidden}15%{opacity:0;transform:scale(0.57);visibility:visible}35%{opacity:1;transform:scale(1)}60%{opacity:0;transform:scale(0.57)}100%{opacity:0;transform:scale(0.57);visibility:hidden}}@keyframes presence-scale-outer{0%{opacity:0;transform:scale(0.75);visibility:hidden}34%{opacity:0;transform:scale(0.75);visibility:visible}36%{opacity:0.99}65%{opacity:1}90%{transform:scale(1)}100%{opacity:0;transform:scale(1);visibility:hidden}}@keyframes inksplash-scale-background{0%{opacity:0;transform:scale(0.00)}35%{opacity:0;transform:scale(0.40)}50%{opacity:1}80%{transform:scale(2.05)}100%{opacity:0;transform:scale(0.00)}}@keyframes inksplash-scale-icon{0%{transform:scale(1.00)}20%{transform:scale(1.00)}30%{transform:scale(1.10)}40%{transform:scale(1.00)}100%{transform:scale(1.00)}}.app-switcher-menu{background:#fff;border:1px solid rgba(0,0,0,.2);border-radius:8px;box-shadow:0 1px 2px 0 rgba(60,64,67,.30),0 2px 6px 2px rgba(60,64,67,.15);min-width:180px;outline:none;overflow-y:auto;padding:8px 0;position:absolute;z-index:1202}.companion-collapser-button-container{bottom:0;display:-webkit-flex;display:flex;height:56px;overflow:hidden;pointer-events:none;position:absolute;right:0;width:56px}.companion-collapser-button-container.companion-collapser-button-container-elevated{margin-bottom:24px}.companion-collapser-button{bottom:0}.companion-collapser-button .app-switcher-button-icon-container,.companion-collapser-button .app-switcher-button-icon-background{border-radius:calc(56px - 8px - 10px)}.companion-collapser-button.app-switcher-button-checked .app-switcher-button-icon-background,.companion-theme-light .companion-collapser-button.app-switcher-button-checked .app-switcher-button-icon-background{background-color:#fff}.companion-collapser-button.app-switcher-button-checked.app-switcher-button-hover .app-switcher-button-icon-background,.companion-theme-light .companion-collapser-button.app-switcher-button-checked.app-switcher-button-hover .app-switcher-button-icon-background{background-color:#f1f3f4}.companion-theme-dark .companion-collapser-button.app-switcher-button-checked .app-switcher-button-icon-background{background-color:#595959}.companion-collapser-button.app-switcher-button-checked.app-switcher-button-focused .app-switcher-button-icon-background,.companion-theme-light .companion-collapser-button.app-switcher-button-checked.app-switcher-button-focused .app-switcher-button-icon-background{background-color:#e8eaed}.companion-collapser-button.app-switcher-button-checked{right:-24px}.companion-collapser-button.app-switcher-button-checked .app-switcher-button-icon-container,.companion-collapser-button.app-switcher-button-checked .app-switcher-button-icon-background{border-bottom-right-radius:0;border-top-right-radius:0;height:20px;left:0;margin:8px 0 8px 8px;padding:10px 0 10px 10px;top:0;width:calc(56px - 8px - 10px)}.companion-collapser-button.app-switcher-button-checked .app-switcher-button-icon-background{box-shadow:0 1px 1px 0 rgba(60,64,67,.3),0 1px 3px 1px rgba(60,64,67,.15)}.companion-collapser-button.app-switcher-button-checked.app-switcher-button-hover{right:0}.companion-collapser-button .app-switcher-button-icon{left:10px;position:absolute;top:10px}html[dir="rtl"] .companion-collapser-button .app-switcher-button-icon,body[dir="rtl"] .companion-collapser-button .app-switcher-button-icon{transform:rotate(180deg)}.companion-theme-dark .companion-collapser-button.app-switcher-button-checked.app-switcher-button-focused .app-switcher-button-icon-container,.companion-theme-dark .companion-collapser-button.app-switcher-button-checked.app-switcher-button-hover .app-switcher-button-icon-container{background-color:#414141}.companion-collapser-button.app-switcher-button-checked .app-switcher-button-icon{margin-left:-6px;transform:rotate(180deg)}.companion-collapser-button.app-switcher-button-checked.app-switcher-button-hover .app-switcher-button-icon{margin-left:0}html[dir="rtl"] .companion-collapser-button.app-switcher-button-checked .app-switcher-button-icon,body[dir="rtl"] .companion-collapser-button.app-switcher-button-checked .app-switcher-button-icon{transform:rotate(0deg)}.acdd-draggable-shadow{background-color:white;background-repeat:no-repeat;border:transparent;border-radius:8px;box-sizing:border-box;color:#666;height:56px;outline:none;padding:0 10px;pointer-events:none;position:fixed;z-index:999}.acdd-draggable-shadow.acdd-draggable-shadow-detail-type{background-position:20px center;background-size:24px 24px;height:56px;width:200px}.acdd-draggable-shadow.acdd-draggable-shadow-image-type{background-position:center;background-size:100% auto;height:120px;width:120px}.acdd-draggable-shadow.acdd-draggable-shadow-image-type.acdd-draggable-shadow-image-captioned{height:156px}.acdd-draggable-shadow-text-wrap{box-sizing:border-box;display:table-cell;padding-left:48px;max-width:200px;vertical-align:middle}.acdd-draggable-shadow-text-wrap .acdd-draggable-shadow-title{font-size:1.1em}.acdd-draggable-shadow-text-wrap .acdd-draggable-shadow-text{opacity:.75;padding-top:2px}.acdd-draggable-shadow-image-type .acdd-draggable-shadow-text{background-color:rgba(32,33,36,.71);border-radius:0 0 8px 8px;bottom:0;color:white;height:36px;left:0;padding:8px 10px;position:absolute;width:100%}.acdd-draggable-shadow .acdd-draggable-shadow-title,.acdd-draggable-shadow .acdd-draggable-shadow-text{box-sizing:border-box;margin:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.acdd-draggable-shadow .acdd-draggable-shadow-count-bubble{background-color:#202124;border-radius:20px;box-sizing:border-box;color:white;font-size:16px;height:40px;max-width:75%;min-width:40px;overflow:hidden;padding:9px 8px;position:absolute;right:-15px;text-align:center;text-overflow:ellipsis;top:-15px}.acga-topLevelDiv{height:100%;position:relative;width:100%}.acga-content{height:100%;left:0;position:absolute;top:0;width:100%;z-index:0}.agca-gab-unread-notifications::after{content:"";background-color:#db4437;border-radius:50%;height:8px;position:absolute;right:17px;top:17px;width:8px}.companion-guest-app-switcher .app-switcher-button-icon-background-outer{border-color:#e8f0fe}.companion-theme-light .agca-gab-blue .app-switcher-button-icon-background-outer{border-color:rgba(66,133,244,.24)}.agca-gab-green .app-switcher-button-icon-background-outer{border-color:#e6f4ea}.companion-theme-light .agca-gab-green .app-switcher-button-icon-background-outer{border-color:rgba(52,168,83,.24)}.agca-gab-yellow .app-switcher-button-icon-background-outer{border-color:#fef7e0}.companion-theme-light .agca-gab-yellow .app-switcher-button-icon-background-outer{border-color:rgba(251,188,4,.24)}.companion-theme-dark .agca-gab-button .app-switcher-button-icon-background-outer{border-color:rgba(255,255,255,.24)}.companion-guest-app-switcher .app-switcher-button-inksplash .app-switcher-button-icon-background-inner,.companion-guest-app-switcher .app-switcher-button-presence .app-switcher-button-icon-background-inner,.companion-guest-app-switcher .app-switcher-button-selected .app-switcher-button-icon-background-inner,.app-switcher-button-selected.agca-gab-blue.app-switcher-button-focused .app-switcher-button-icon-background-inner{background-color:#e8f0fe}.app-switcher-button-selected.agca-gab-blue.app-switcher-button-hover .app-switcher-button-icon-background-inner{background-color:#d2e3fc}.companion-theme-light .app-switcher-button-inksplash.agca-gab-blue .app-switcher-button-icon-background-inner,.companion-theme-light .app-switcher-button-presence.agca-gab-blue .app-switcher-button-icon-background-inner,.companion-theme-light .app-switcher-button-selected.agca-gab-blue .app-switcher-button-icon-background-inner,.companion-theme-light .app-switcher-button-selected.agca-gab-blue.app-switcher-button-focused .app-switcher-button-icon-background-inner{background-color:rgba(66,133,244,.24)}.companion-theme-light .agca-gab-blue.app-switcher-button-hover .app-switcher-button-icon-background-inner,.companion-theme-light .agca-gab-blue.app-switcher-button-focused .app-switcher-button-icon-background-inner{background-color:rgba(66,133,244,.12)}.app-switcher-button-inksplash.agca-gab-green .app-switcher-button-icon-background-inner,.app-switcher-button-presence.agca-gab-green .app-switcher-button-icon-background-inner,.app-switcher-button-selected.agca-gab-green .app-switcher-button-icon-background-inner,.app-switcher-button-selected.agca-gab-green.app-switcher-button-focused .app-switcher-button-icon-background-inner{background-color:#e6f4ea}.app-switcher-button-selected.agca-gab-green.app-switcher-button-hover .app-switcher-button-icon-background-inner{background-color:#ceead6}.companion-theme-light .app-switcher-button-inksplash.agca-gab-green .app-switcher-button-icon-background-inner,.companion-theme-light .app-switcher-button-presence.agca-gab-green .app-switcher-button-icon-background-inner,.companion-theme-light .app-switcher-button-selected.agca-gab-green .app-switcher-button-icon-background-inner,.companion-theme-light .app-switcher-button-selected.agca-gab-green.app-switcher-button-focused .app-switcher-button-icon-background-inner{background-color:rgba(52,168,83,.24)}.companion-theme-light .agca-gab-green.app-switcher-button-hover .app-switcher-button-icon-background-inner,.companion-theme-light .agca-gab-green.app-switcher-button-focused .app-switcher-button-icon-background-inner{background-color:rgba(52,168,83,.12)}.app-switcher-button-inksplash.agca-gab-yellow .app-switcher-button-icon-background-inner,.app-switcher-button-presence.agca-gab-yellow .app-switcher-button-icon-background-inner,.app-switcher-button-selected.agca-gab-yellow .app-switcher-button-icon-background-inner,.app-switcher-button-selected.agca-gab-yellow.app-switcher-button-focused .app-switcher-button-icon-background-inner{background-color:#fef7e0}.app-switcher-button-selected.agca-gab-yellow.app-switcher-button-hover .app-switcher-button-icon-background-inner{background-color:#feefc3}.companion-theme-light .app-switcher-button-inksplash.agca-gab-yellow .app-switcher-button-icon-background-inner,.companion-theme-light .app-switcher-button-presence.agca-gab-yellow .app-switcher-button-icon-background-inner,.companion-theme-light .app-switcher-button-selected.agca-gab-yellow .app-switcher-button-icon-background-inner,.companion-theme-light .app-switcher-button-selected.agca-gab-yellow.app-switcher-button-focused .app-switcher-button-icon-background-inner{background-color:rgba(251,188,4,.24)}.companion-theme-light .agca-gab-yellow.app-switcher-button-hover .app-switcher-button-icon-background-inner,.companion-theme-light .agca-gab-yellow.app-switcher-button-focused .app-switcher-button-icon-background-inner{background-color:rgba(251,188,4,.12)}.companion-theme-dark .agca-gab-button.app-switcher-button-inksplash .app-switcher-button-icon-background-inner,.companion-theme-dark .agca-gab-button.app-switcher-button-presence .app-switcher-button-icon-background-inner,.companion-theme-dark .agca-gab-button.app-switcher-button-selected .app-switcher-button-icon-background-inner,.companion-theme-dark .agca-gab-button.app-switcher-button-selected.app-switcher-button-focused .app-switcher-button-icon-background-inner{background-color:rgba(255,255,255,.24)}.companion-theme-dark .agca-gab-button.app-switcher-button-hover .app-switcher-button-icon-background-inner,.companion-theme-dark .agca-gab-button.app-switcher-button-focused .app-switcher-button-icon-background-inner{background-color:rgba(255,255,255,.12)}.agca-gab-icon-selection-indicator{background-color:#d704fb;border-radius:3px 0 0 3px;display:none;height:40px;position:absolute;right:1px;top:8px;width:3px}.agca-gab-button.app-switcher-button-selected .agca-gab-icon-selection-indicator{display:inherit}.agca-gab-blue .agca-gab-icon-selection-indicator{background-color:#4285f4}.agca-gab-green .agca-gab-icon-selection-indicator{background-color:#34a853}.agca-gab-yellow .agca-gab-icon-selection-indicator{background-color:#fbbc04}.companion-theme-dark .companion-overflow-menu-button:not(.app-switcher-button-hover) .app-switcher-button-icon-background{opacity:.7}.companion-shell-content-component{background-color:white;box-sizing:border-box;height:100%;left:0;padding-top:64px;position:absolute;top:0;width:100%}.companion-header-in-iframe .companion-shell-guest{padding-top:0}.companion-shell-loading{overflow:hidden;position:absolute;text-align:center}.companion-shell-offline,.companion-shell-permanent-failure,.companion-shell-timed-out,.companion-shell-unavailable{-webkit-align-items:center;align-items:center;display:-webkit-flex;display:flex;-webkit-flex-direction:column;flex-direction:column;-webkit-justify-content:center;justify-content:center;text-align:center}.companion-shell-offline-description,.companion-shell-offline-title,.companion-shell-unavailable-description,.companion-shell-unavailable-title{color:#5f6368;margin:0 70px}.companion-shell-offline-description,.companion-shell-unavailable-description{font-size:12px;line-height:16px}.companion-shell-offline-title,.companion-shell-unavailable-title{font-size:16px;font-weight:500;margin-bottom:2px;margin-top:34px}.companion-shell-permanent-failure-message,.companion-shell-timed-out-message{margin:10px;max-width:calc(100% - 20px)}.companion-shell-timed-out-retry{color:#4285f4;cursor:pointer;text-transform:uppercase}.companion-shell-iframe{border:0;height:100%;width:100%}.companion-shell-header{align-items:center;background-color:#fff;border-bottom:solid 1px #f1f3f4;box-sizing:border-box;display:-webkit-flex;display:flex;-webkit-flex-direction:row;flex-direction:row;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;height:64px;padding:0 10px;position:relative;z-index:1}.companion-shell-header-element{margin-left:10px;margin-right:10px}.companion-shell-title-container{display:-webkit-flex;display:flex;-webkit-flex-direction:column;flex-direction:column;-webkit-flex-grow:1;flex-grow:1;justify-content:center;width:1px}.companion-shell-title-element{margin:0}.companion-shell-title-text,.companion-shell-subtitle-text,.companion-shell-subtitle-text .goog-menu-button-caption{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.companion-shell-title-text,.companion-shell-subtitle-text{outline:none}.companion-shell-title-text.companion-shell-title-big{font-size:22px}.companion-shell-header-light-background .companion-shell-title-big{color:rgba(0,0,0,.54)}.companion-shell-header-dark-background .companion-shell-title-big{color:#fff}.companion-shell-title-text.companion-shell-title-small{color:#80868b;font-size:10px;font-weight:500;letter-spacing:1.5px;text-transform:uppercase}.companion-shell-title-text.companion-shell-title-small.companion-shell-subview{left:56px}.companion-shell-dropdown-container{font-size:0}.companion-shell-subtitle-text{color:#5f6368;font-size:16px;font-weight:500;line-height:20px}.companion-shell-subtitle-text.goog-menu-button-open{background-color:#f1f3f4}.companion-shell-subtitle-button{padding:0 2px 0 4px}.companion-shell-subtitle-button .companion-shell-subtitle-text,.companion-shell-subtitle-text .goog-menu-button-caption{padding:0}.companion-shell-subtitle-call-out{color:#1a73e8}.companion-shell-dropdown-button{background:none;border-radius:3px;border-width:0;box-sizing:border-box;cursor:pointer;display:inline-block;margin-left:-4px;max-width:100%;outline:none;padding:0 2px 0 4px}.companion-shell-dropdown-button.companion-shell-dropdown-button-hover{background-color:#f1f3f4}.companion-shell-dropdown-button.companion-shell-dropdown-button-focused,.companion-shell-dropdown-button.companion-shell-dropdown-button-open{background-color:#e8eaed}.companion-shell-dropdown-button.companion-shell-dropdown-button-disabled{opacity:.38}.companion-shell-dropdown-button .companion-shell-dropdown-button-outer-box{display:-webkit-flex;display:flex;-webkit-justify-content:flex-start;justify-content:flex-start}.companion-shell-dropdown-button .companion-shell-dropdown-button-inner-box{display:block;-webkit-flex-shrink:1;flex-shrink:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.companion-shell-dropdown-button-outer-box::after{content:'';display:block;background:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPScyNHB4JyBoZWlnaHQ9JzI0cHgnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nIzVmNjM2OCc+PHBhdGggZD0nTTcgMTBsNSA1IDUtNXonPjwvcGF0aD48cGF0aCBkPSdNMCAwaDI0djI0SDB6JyBmaWxsPSdub25lJz48L3BhdGg+PC9zdmc+") center no-repeat;-webkit-flex-shrink:0;flex-shrink:0;height:20px;margin:0 0 0 4px;padding:0;width:20px}.companion-shell-header-buttons{display:-webkit-flex;display:flex;height:24px;-webkit-justify-content:flex-end;justify-content:flex-end;position:absolute;right:8px;top:18px}.companion-shell-header-button{background:no-repeat center center;background-size:20px 20px;cursor:pointer;height:24px;width:24px}.companion-shell-header-light-background .companion-shell-header-svg-icon{fill:#000;opacity:.54}.companion-shell-header-dark-background .companion-shell-header-svg-icon{fill:#fff}html[dir="rtl"] .companion-shell-back-button,body[dir="rtl"] .companion-shell-back-button,html[dir="rtl"] .companion-shell-escape-hatch-button,body[dir="rtl"] .companion-shell-escape-hatch-button{transform:scaleX(-1)}.companion-shell-header-button.companion-shell-title-element{margin:0}.companion-shell-header-button:hover{opacity:.87}.companion-shell-subtitle-button[aria-disabled="true"],.companion-shell-header-button[aria-disabled="true"]{cursor:not-allowed;opacity:.38}.companion-shell-back-button{margin-right:2px}.goog-menu.companion-shell-drop-down-menu{background:#fff;border-width:0;border-radius:0 0 8px 8px;box-shadow:0px -3px 6px -3px rgba(0,0,0,.12),0 4px 8px -2px rgba(0,0,0,.14);box-sizing:border-box;max-height:400px;overflow-x:hidden;overflow-y:auto;padding-bottom:8px;position:absolute;width:100%;z-index:999}.goog-menuitem.companion-shell-drop-down-entry{border:none;height:40px;padding:0;width:300px}.goog-menuitem-highlight.companion-shell-drop-down-entry{background:#f1f3f4}.goog-menu.companion-shell-drop-down-menu .goog-menuseparator{border-top:1px solid rgba(32,33,36,0.06);margin:8px 0;padding:0}.companion-shell-drop-down-check{display:none;height:20px;padding:10px 16px;position:absolute;right:0;width:20px}.goog-option-selected .companion-shell-drop-down-check{display:block}.companion-shell-drop-down-entry.goog-option-selected{background-image:none}.companion-shell-drop-down-entry .goog-menuitem-checkbox,.companion-shell-drop-down-entry.goog-option-selected .goog-menuitem-checkbox{display:none}.companion-shell-drop-down-entry-text{box-sizing:border-box;font-size:14px;color:#202124;padding:10px 20px;letter-spacing:0.2px;line-height:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:300px}.goog-option-selected .companion-shell-drop-down-entry-text{padding-right:60px}.companion-shell-search-container{align-items:center;background-color:#fff;box-sizing:border-box;display:-webkit-flex;display:flex;-webkit-flex-direction:row;flex-direction:row;height:100%;left:0;padding:0 10px;position:absolute;top:0;width:100%}.companion-shell-search-icon,.companion-shell-search-close{margin-left:10px;margin-right:10px}.companion-shell-search-input{background-color:transparent;border:none;color:#5f6368;-webkit-flex-grow:1;flex-grow:1;font-size:16px;line-height:24px;outline:none;width:100px}.companion-shell-search-input::placeholder{color:#bdc1c6}.companion-shell-search-input::-webkit-input-placeholder{color:#bdc1c6}.companion-shell-search-input:-ms-input-placeholder{color:#bdc1c6}.companion-app-switcher-container .jfk-bubble{padding:16px;border-radius:8px;border-color:#e8eaed;border-width:1px;box-shadow:0 2px 6px rgba(60,64,67,0.3)}.companion-app-switcher-container .jfk-bubble-arrowright .jfk-bubble-arrowimplbefore{border-left-color:#e8eaed;border-right-color:#e8eaed}.app-switcher-notification-bubble{display:-webkit-flex;display:flex;-webkit-flex-direction:column;flex-direction:column}.app-switcher-notification-bubble .app-switcher-notification-bubble-header{display:-webkit-flex;display:flex;-webkit-flex-direction:row;flex-direction:row;height:32px}.app-switcher-notification-bubble .app-switcher-notification-bubble-image-container{width:32px;border-radius:50%}.app-switcher-notification-bubble .app-switcher-notification-bubble-image-container .app-switcher-notification-bubble-image{width:32px;height:32px;border-radius:50%;margin-right:8px}.app-switcher-notification-bubble .app-switcher-notification-bubble-text{height:calc(14px*2);width:auto;display:-webkit-flex;display:flex;-webkit-flex-direction:column;flex-direction:column;margin-left:8px;margin-bottom:8px}.app-switcher-notification-bubble .app-switcher-notification-bubble-text:focus{outline:none}.app-switcher-notification-bubble .app-switcher-notification-bubble-title-text{height:14px;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;color:#5f6368}.app-switcher-notification-bubble .app-switcher-notification-bubble-body-text{height:14px;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;color:#3c4043}.app-switcher-notification-bubble .app-switcher-notification-bubble-footer{margin-top:9px;height:32px;display:-webkit-flex;display:flex;-webkit-flex-direction:row;flex-direction:row}.app-switcher-notification-bubble .app-switcher-notification-bubble-footer .jfk-button{text-align:center;font-weight:500;font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;padding-left:8px;padding-right:16px;margin:0;height:30px;line-height:30px;color:#ffffff;max-width:300px;font-size:14px;border-radius:15px;-webkit-align-items:center;align-items:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.app-switcher-notification-bubble .app-switcher-notification-bubble-footer .app-switcher-notification-bubble-button-icon{width:16px;height:16px;padding-right:8px;padding-top:calc((30px - 16px)/2 - 1px);padding-bottom:calc((30px - 16px)/2);vertical-align:middle}.app-switcher-notification-bubble .app-switcher-notification-bubble-footer .app-switcher-notification-bubble-spacer{width:8px}.app-switcher-notification-bubble .app-switcher-notification-bubble-call-to-action-button{background-color:rgb(24,128,56)}.app-switcher-notification-bubble .app-switcher-notification-bubble-call-to-action-button.jfk-button-hover{background-color:#2a8947;box-shadow:0 1px 3px 1px rgba(24,128,56,0.15)}.app-switcher-notification-bubble .app-switcher-notification-bubble-call-to-action-button.jfk-button-focused{background-color:#4f9e67;box-shadow:0 1px 3px 1px rgba(24,128,56,0.15)}.app-switcher-notification-bubble .app-switcher-notification-bubble-call-to-action-button.jfk-button-focused.jfk-button-hover{background-color:#62a877;box-shadow:0 1px 3px 1px rgba(24,128,56,0.15)}.app-switcher-notification-bubble .app-switcher-notification-bubble-dismiss-button{background-color:rgb(217,48,37)}.app-switcher-notification-bubble .app-switcher-notification-bubble-dismiss-button.jfk-button-hover{background-color:#d3443b;box-shadow:0 1px 3px 1px rgba(217,48,37,0.15)}.app-switcher-notification-bubble .app-switcher-notification-bubble-dismiss-button.jfk-button-focused{background-color:#e06c64;box-shadow:0 1px 3px 1px rgba(217,48,37,0.15)}.app-switcher-notification-bubble .app-switcher-notification-bubble-dismiss-button.jfk-button-focused.jfk-button-hover{background-color:#e88a84;box-shadow:0 1px 3px 1px rgba(217,48,37,0.15)}.companion-overflow-menu-item{-webkit-align-items:center;align-items:center;cursor:pointer;display:-webkit-flex;display:flex;padding:8px}.companion-overflow-menu-item-highlight{background-color:#f1f3f4}.companion-overflow-menu-item-icon{background:transparent no-repeat center;background-size:20px 20px;border-radius:50%;height:40px;width:40px}.companion-overflow-menu-item-content{padding:0 6px;white-space:nowrap}.companion-overflow-menu-item-disabled{cursor:default;opacity:.38}.companion-server-render .acga-content{-webkit-animation:companion-server-render-guest-content-fadeout 333ms ease 0s 1 normal both paused;animation:companion-server-render-guest-content-fadeout 333ms ease 0s 1 normal both paused}.companion-server-render .companion-shell-splash-screen-ink-splash-color{display:none}.companion-server-render .companion-shell-splash-screen-app-logo{-webkit-animation:none;animation:none}.companion-server-render .companion-shell-splash-screen-beachball{display:none}@keyframes companion-server-render-guest-content-fadeout{from{opacity:.38}to{opacity:0}}.companion-shell{background-color:white;box-sizing:border-box;height:100%;width:300px}.companion-shell-addon-content-container,.companion-shell-guest-content-container,.companion-shell-native-content-container{height:100%}.companion-shell.companion-shell-overlay-content{border:0;box-shadow:0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12),0px 2px 4px -1px rgba(0,0,0,0.2);opacity:1}.companion-shell-app-switcher{bottom:0px;left:0px;position:absolute}.companion-shell-guest-container{height:100%}.companion-shell-splash-screen-container{height:680px;margin-left:50%;position:relative;top:calc(50% - (340px + 64px));transform:translateX(-50%);width:680px}html[dir="rtl"] .companion-shell-splash-screen-container,body[dir="rtl"] .companion-shell-splash-screen-container{transform:translateX(50%)}.companion-shell-splash-screen-ink-splash-color{-webkit-animation:ink-splash-opacity 1s cubic-bezier(0.08,0.8,0.67,1) 400ms 1 normal both,ink-splash-scale 1s cubic-bezier(0.05,0.69,0.67,1) 400ms 1 normal both;animation:ink-splash-opacity 1s cubic-bezier(0.08,0.8,0.67,1) 400ms 1 normal both,ink-splash-scale 1s cubic-bezier(0.05,0.69,0.67,1) 400ms 1 normal both;border-radius:50%;height:100%;width:100%}@keyframes ink-splash-opacity{from{opacity:1}to{opacity:0}}@keyframes ink-splash-scale{from{transform:scale(0)}to{transform:scale(1)}}.companion-shell-splash-screen-app-logo{-webkit-animation:app-logo-scale 330ms cubic-bezier(0.05,0.62,0.51,1.26) 333ms 1 normal backwards,app-logo-scale-bounce 170ms cubic-bezier(0.29,0,0.73,1) 667ms 1 normal forwards;animation:app-logo-scale 330ms cubic-bezier(0.05,0.62,0.51,1.26) 333ms 1 normal backwards,app-logo-scale-bounce 170ms cubic-bezier(0.29,0,0.73,1) 667ms 1 normal forwards;background-position:center;background-repeat:no-repeat;background-size:128px 128px;bottom:0;height:128px;left:0;margin:auto;position:absolute;right:0;top:0;width:128px}@keyframes app-logo-scale{from{transform:scale(0)}to{transform:scale(1)}}@keyframes app-logo-scale-bounce{0%,100%{transform:scale(1)}20%{transform:scale(0.95)}}.companion-shell-splash-screen-beachball{-webkit-animation:beachball-opacity 330ms linear 1s 1 normal both;animation:beachball-opacity 330ms linear 1s 1 normal both;bottom:0;height:20px;left:0;margin:auto;position:absolute;right:0;top:190px;width:20px}@keyframes beachball-opacity{from{opacity:0}to{opacity:1}}.companion-tooltip{background-color:rgba(60,64,67,.9);border-radius:4px;color:#fff;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;font-weight:500;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;letter-spacing:.3px;line-height:16px;padding:4px 8px;white-space:nowrap;z-index:9999}.request-file-scope-modal-container{align-items:center;background-color:rgb(0,0,0,.5);display:flex;height:100%;position:absolute;top:0;width:300px}.request-file-scope-modal{background:#fff;border-radius:8px;display:flex;margin:8px;min-height:100px;padding:24px 8px;width:100%}.request-file-scope-modal-icon-container{margin-top:-4px;padding-right:8px}.request-file-scope-modal-icon{height:48px;width:48px}.request-file-scope-modal-prompt{font-weight:bold;line-height:16px;padding-bottom:16px}.request-file-scope-modal-description{line-height:16px;padding-bottom:16px;word-break:break-all}.request-file-scope-modal-buttons{text-align:right;text-transform:uppercase}.appsAddonsHostCompanionContentholderEl{height:100%;position:relative;width:100%}.jfk-bubble{-webkit-box-shadow:0 1px 3px rgba(0,0,0,.2);-moz-box-shadow:0 1px 3px rgba(0,0,0,.2);box-shadow:0 1px 3px rgba(0,0,0,.2);background-color:#fff;border:1px solid;border-color:#bbb #bbb #a8a8a8;padding:16px;position:absolute;z-index:1201!important}.jfk-bubble-closebtn{background:url("//ssl.gstatic.com/ui/v1/icons/common/x_8px.png") no-repeat;border:1px solid transparent;height:21px;opacity:.4;outline:0;position:absolute;right:2px;top:2px;width:21px}.jfk-bubble-closebtn:focus{border:1px solid #4d90fe;opacity:.8}.jfk-bubble-arrow{position:absolute}.jfk-bubble-arrow .jfk-bubble-arrowimplbefore,.jfk-bubble-arrow .jfk-bubble-arrowimplafter{display:block;height:0;position:absolute;width:0}.jfk-bubble-arrow .jfk-bubble-arrowimplbefore{border:9px solid}.jfk-bubble-arrow .jfk-bubble-arrowimplafter{border:8px solid}.jfk-bubble-arrowdown{bottom:0}.jfk-bubble-arrowup{top:-9px}.jfk-bubble-arrowleft{left:-9px}.jfk-bubble-arrowright{right:0}.jfk-bubble-arrowdown .jfk-bubble-arrowimplbefore,.jfk-bubble-arrowup .jfk-bubble-arrowimplbefore{border-color:#bbb transparent;left:-9px}.jfk-bubble-arrowdown .jfk-bubble-arrowimplbefore{border-color:#a8a8a8 transparent}.jfk-bubble-arrowdown .jfk-bubble-arrowimplafter,.jfk-bubble-arrowup .jfk-bubble-arrowimplafter{border-color:#fff transparent;left:-8px}.jfk-bubble-arrowdown .jfk-bubble-arrowimplbefore{border-bottom-width:0}.jfk-bubble-arrowdown .jfk-bubble-arrowimplafter{border-bottom-width:0}.jfk-bubble-arrowup .jfk-bubble-arrowimplbefore{border-top-width:0}.jfk-bubble-arrowup .jfk-bubble-arrowimplafter{border-top-width:0;top:1px}.jfk-bubble-arrowleft .jfk-bubble-arrowimplbefore,.jfk-bubble-arrowright .jfk-bubble-arrowimplbefore{border-color:transparent #bbb;top:-9px}.jfk-bubble-arrowleft .jfk-bubble-arrowimplafter,.jfk-bubble-arrowright .jfk-bubble-arrowimplafter{border-color:transparent #fff;top:-8px}.jfk-bubble-arrowleft .jfk-bubble-arrowimplbefore{border-left-width:0}.jfk-bubble-arrowleft .jfk-bubble-arrowimplafter{border-left-width:0;left:1px}.jfk-bubble-arrowright .jfk-bubble-arrowimplbefore{border-right-width:0}.jfk-bubble-arrowright .jfk-bubble-arrowimplafter{border-right-width:0}.appsAddonsHostCompanionPromobubblePromobubblemanagerButton{float:right;margin-top:8px;padding:0}.appsAddonsHostCompanionPromobubblePromobubblemanagerBubble{outline:none}.companion-app-switcher-container .CSS_GSUITE_ADDONS_INSTALLATION_PROMO{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;background-color:#1a73e8;border-radius:8px;border-width:0;box-shadow:0 1px 2px 0 rgba(26,115,232,0.30),0 2px 6px 2px rgba(26,115,232,0.15);font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:.875rem;letter-spacing:.25px;padding:12px 16px 8px;width:288px}.companion-app-switcher-container.companion-app-switcher-container.companion-app-switcher-container .CSS_GSUITE_ADDONS_INSTALLATION_PROMO .jfk-button{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;background:#1a73e8;color:#fff;font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:.875rem;font-weight:500;letter-spacing:.25px;line-height:20px;margin:0 -8px;padding:4px 8px}.CSS_GSUITE_ADDONS_INSTALLATION_PROMO .jfk-button::before{background:#fff;border-radius:4px;content:'';display:block;opacity:0;position:absolute;transform:scale(0);transition-duration:.15s;transition-timing-function:.15s;transition-property:transform,opacity;z-index:-1}.CSS_GSUITE_ADDONS_INSTALLATION_PROMO .jfk-button-disabled{color:rgba(60,64,67,0.38);cursor:default}.CSS_GSUITE_ADDONS_INSTALLATION_PROMO .jfk-button-disabled::before{opacity:0}.CSS_GSUITE_ADDONS_INSTALLATION_PROMO .jfk-button-hover::before{opacity:0.06;transform:scale(1)}.CSS_GSUITE_ADDONS_INSTALLATION_PROMO .jfk-button-focused::before{opacity:0.12}.CSS_GSUITE_ADDONS_INSTALLATION_PROMO .jfk-button-active::before{opacity:0.12}.companion-app-switcher-container .CSS_GSUITE_ADDONS_INSTALLATION_PROMO .jfk-bubble-arrowimplbefore,.companion-app-switcher-container .CSS_GSUITE_ADDONS_INSTALLATION_PROMO .jfk-bubble-arrowimplafter{border-color:transparent #1a73e8}.CSS_GSUITE_ADDONS_TITLE{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;color:#fff;font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:1rem;font-weight:500;line-height:24px;letter-spacing:.25px;margin:0;margin-bottom:4px}.CSS_GSUITE_ADDONS_CONTENT{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;color:rgba(255,255,255,0.902);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:.875rem;letter-spacing:.2px;line-height:20px}.appsAddonsHostGsmAppfindercontainerEl{align-items:center;display:flex;height:100%;justify-content:center;left:0;position:absolute;top:0;width:100%;z-index:6000}.appsAddonsHostGsmAppfindercontainerMask{background:#fff;height:100%;left:0;opacity:0.5;position:absolute;top:0;width:100%}.appsAddonsHostGsmAppfindercontainerContent{border-radius:4px;box-shadow:rgba(0,0,0,0.2) 0px 4px 16px;outline:none;overflow:hidden;position:relative;z-index:0}.appsAddonsHostGsmAppfindercontainerLoadingScreen{align-items:center;background:#fff;display:flex;height:100%;justify-content:center;left:0;position:absolute;top:0;width:100%}.appsAddonsHostGsmAppfindercontainerLoadingScreenCloseBtn{background:transparent;border:0;cursor:pointer;margin:16px;outline:none;padding:0;position:absolute;right:0;top:0}.appsAddonsHostGsmAppfindercontainerLoadingScreenCloseIcon{fill:#000;height:20px;opacity:0.54;width:20px}.CSS_ADD_ONS_SPINNER_CONTAINER{height:44px;overflow:hidden;position:relative;width:100%}.CSS_ADD_ONS_QUANTUM_SPINNER{height:28px;position:absolute;top:8px;width:28px}.CSS_ADD_ONS_QUANTUM_SPINNER.CSS_ADD_ONS_SPINNER_ACTIVE{animation:container-rotate 1568ms linear infinite}.CSS_ADD_ONS_SPINNER_VCENTER{align-self:center}.CSS_ADD_ONS_SPINNER_LAYER{position:absolute;width:100%;height:100%;opacity:0}.CSS_ADD_ONS_SPINNER_BLUE{border-color:#4285f4}.CSS_ADD_ONS_SPINNER_RED{border-color:#db4437}.CSS_ADD_ONS_SPINNER_YELLOW{border-color:#f4b400}.CSS_ADD_ONS_SPINNER_GREEN{border-color:#0f9d58}.CSS_ADD_ONS_SPINNER_ACTIVE .CSS_ADD_ONS_SPINNER_LAYER.CSS_ADD_ONS_SPINNER_BLUE{animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,blue-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both}.CSS_ADD_ONS_SPINNER_ACTIVE .CSS_ADD_ONS_SPINNER_LAYER.CSS_ADD_ONS_SPINNER_RED{animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,red-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both}.CSS_ADD_ONS_SPINNER_ACTIVE .CSS_ADD_ONS_SPINNER_LAYER.CSS_ADD_ONS_SPINNER_YELLOW{animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,yellow-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both}.CSS_ADD_ONS_SPINNER_ACTIVE .CSS_ADD_ONS_SPINNER_LAYER.CSS_ADD_ONS_SPINNER_GREEN{animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,green-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both}.CSS_ADD_ONS_SPINNER_GAP_PATCH{position:absolute;box-sizing:border-box;top:0;width:10%;height:100%;overflow:hidden;border-color:inherit}.CSS_ADD_ONS_SPINNER_GAP_PATCH .CSS_ADD_ONS_SPINNER_CIRCLE{width:1000%}.CSS_ADD_ONS_CIRCLE_CLIPPER{display:inline-block;position:relative;width:50%;height:100%;overflow:hidden;border-color:inherit}.CSS_ADD_ONS_CIRCLE_CLIPPER .CSS_ADD_ONS_SPINNER_CIRCLE{width:200%}.CSS_ADD_ONS_SPINNER_CIRCLE{box-sizing:border-box;height:100%;border-width:3px;border-style:solid;border-color:inherit;border-bottom-color:transparent;border-radius:50%;animation:none}.CSS_ADD_ONS_CIRCLE_CLIPPER.CSS_ADD_ONS_SPINNER_LEFT .CSS_ADD_ONS_SPINNER_CIRCLE{-webkit-transform:rotate(129deg);transform:rotate(129deg)}.CSS_ADD_ONS_CIRCLE_CLIPPER.CSS_ADD_ONS_SPINNER_RIGHT .CSS_ADD_ONS_SPINNER_CIRCLE{-webkit-transform:rotate(-129deg);transform:rotate(-129deg)}.CSS_ADD_ONS_SPINNER_FIT{position:absolute;top:0;bottom:0;right:0;left:0}@keyframes white-fade-in-out{from{opacity:1}25%{opacity:1}26%{opacity:0}89%{opacity:0}90%{opacity:1}100%{opacity:1}}@-webkit-keyframes white-fade-in-out{from{opacity:1}25%{opacity:1}26%{opacity:0}89%{opacity:0}90%{opacity:1}100%{opacity:1}}@keyframes container-rotate{to{transform:rotate(360deg)}}@-webkit-keyframes container-rotate{to{transform:rotate(360deg)}}@keyframes fill-unfill-rotate{12.5%{transform:rotate(135deg)}25%{transform:rotate(270deg)}37.5%{transform:rotate(405deg)}50%{transform:rotate(540deg)}62.5%{transform:rotate(675deg)}75%{transform:rotate(810deg)}87.5%{transform:rotate(945deg)}to{transform:rotate(1080deg)}}@-webkit-keyframes fill-unfill-rotate{12.5%{transform:rotate(135deg)}25%{transform:rotate(270deg)}37.5%{transform:rotate(405deg)}50%{transform:rotate(540deg)}62.5%{transform:rotate(675deg)}75%{transform:rotate(810deg)}87.5%{transform:rotate(945deg)}to{transform:rotate(1080deg)}}@keyframes blue-fade-in-out{from{opacity:1}25%{opacity:1}26%{opacity:0}89%{opacity:0}90%{opacity:1}100%{opacity:1}}@-webkit-keyframes blue-fade-in-out{from{opacity:1}25%{opacity:1}26%{opacity:0}89%{opacity:0}90%{opacity:1}100%{opacity:1}}@keyframes red-fade-in-out{from{opacity:0}15%{opacity:0}25%{opacity:1}50%{opacity:1}51%{opacity:0}}@-webkit-keyframes red-fade-in-out{from{opacity:0}15%{opacity:0}25%{opacity:1}50%{opacity:1}51%{opacity:0}}@keyframes yellow-fade-in-out{from{opacity:0}40%{opacity:0}50%{opacity:1}75%{opacity:1}76%{opacity:0}}@-webkit-keyframes yellow-fade-in-out{from{opacity:0}40%{opacity:0}50%{opacity:1}75%{opacity:1}76%{opacity:0}}@keyframes green-fade-in-out{from{opacity:0}65%{opacity:0}75%{opacity:1}90%{opacity:1}100%{opacity:0}}@-webkit-keyframes green-fade-in-out{from{opacity:0}65%{opacity:0}75%{opacity:1}90%{opacity:1}100%{opacity:0}}.CSS_ADD_ONS_QUANTUM_SPINNER{left:50%;margin-left:-14px}.CSS_ADD_ONS_SPINNER_GAP_PATCH{left:45%}.CSS_ADD_ONS_SPINNER_GAP_PATCH .CSS_ADD_ONS_SPINNER_CIRCLE{left:-450%}.CSS_ADD_ONS_CIRCLE_CLIPPER.CSS_ADD_ONS_SPINNER_LEFT .CSS_ADD_ONS_SPINNER_CIRCLE{border-right-color:transparent}.CSS_ADD_ONS_CIRCLE_CLIPPER.CSS_ADD_ONS_SPINNER_RIGHT .CSS_ADD_ONS_SPINNER_CIRCLE{left:-100%;border-left-color:transparent}.CSS_ADD_ONS_SPINNER_ACTIVE .CSS_ADD_ONS_CIRCLE_CLIPPER.CSS_ADD_ONS_SPINNER_LEFT .CSS_ADD_ONS_SPINNER_CIRCLE{animation:left-spin 1333ms cubic-bezier(0.4,0.0,0.2,1) infinite both}.CSS_ADD_ONS_SPINNER_ACTIVE .CSS_ADD_ONS_CIRCLE_CLIPPER.CSS_ADD_ONS_SPINNER_RIGHT .CSS_ADD_ONS_SPINNER_CIRCLE{animation:right-spin 1333ms cubic-bezier(0.4,0.0,0.2,1) infinite both}@keyframes left-spin{from{transform:rotate(130deg)}50%{transform:rotate(-5deg)}to{transform:rotate(130deg)}}@-webkit-keyframes left-spin{from{transform:rotate(130deg)}50%{transform:rotate(-5deg)}to{transform:rotate(130deg)}}@keyframes right-spin{from{transform:rotate(-130deg)}50%{transform:rotate(5deg)}to{transform:rotate(-130deg)}}@-webkit-keyframes right-spin{from{transform:rotate(-130deg)}50%{transform:rotate(5deg)}to{transform:rotate(-130deg)}}.CSS_ADD_ONS_ELLIPSES{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.add-on-host-container,.add-on-host-content,.add-on-host-failure,.add-on-host-client-not-supported,.add-on-host-loading,.add-on-host-offline{height:100%;width:100%}.add-on-host-container{outline:none;position:relative}.add-on-host-content,.add-on-host-extra-content-container{bottom:0;left:0;outline:none;position:absolute}.add-on-host-content{outline:none;position:absolute}.add-on-host-non-content-wrapper{display:flex;flex-direction:column;height:100%}.add-on-host-non-content-wrapper.isHidden{visibility:hidden}.add-on-host-views-container{flex:1 1 auto;position:relative}.add-on-host-failure,.add-on-host-client-not-supported,.add-on-host-loading,.add-on-host-offline{align-items:center;background:#fff;display:flex;flex-direction:column;justify-content:center;position:absolute;text-align:center}.add-on-host-screen{align-items:center;box-sizing:border-box;display:flex;flex-direction:column;height:100%;justify-content:center;padding:16px;text-align:center;width:100%}.add-on-host-screen-image{width:75px;height:75px}.add-on-host-screen-svg{fill:#5f6368}.add-on-host-screen-primary-message{color:#5f6368;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:16px;font-weight:500;height:48px;letter-spacing:0.2px;line-height:24px;margin:40px 0 0 0}.add-on-host-screen-secondary-message{color:#5f6368;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;height:32px;letter-spacing:0.3px;line-height:16px}.add-on-host-clickable{color:#4285f4;cursor:pointer;font-size:inherit;outline:none;background:transparent;border:none}.add-on-host-retry{bottom:48px;position:absolute;text-transform:uppercase}.add-on-host-loading.add-on-host-loading-hidden{visibility:hidden}.add-on-host-offline-snack-bar{background:#202124;bottom:0;color:#fff;height:112px;position:fixed;transition:transform .218s ease-in-out;width:100%;z-index:99999}.add-on-host-offline-snack-bar.add-on-host-offline-snack-bar-hidden{transform:translate(0,120%)}.add-on-host-offline-snack-bar-content__description{font-family:Roboto,Arial,sans-serif;font-size:14px;letter-spacing:0.2px;line-height:20px;margin:24px 24px 0;vertical-align:top}.add-on-host-offline-snack-bar-content__btn{background:#202124;border:none;color:#fff;cursor:pointer;font-family:Roboto,Arial,sans-serif;font-size:16px;letter-spacing:0.2px;line-height:16px;margin:5px 16px 12px 218px;outline:none;padding:8px;vertical-align:top}.add-on-host-headerbar.companion-shell-header{border:none;height:40px;padding:0 16px}.add-on-host-headerbar .companion-shell-header-element.companion-shell-title-container{line-height:20px}.add-on-host-headerbar .companion-shell-title-text.companion-shell-title-big{font-size:16px}.add-on-host-headerbar .companion-shell-header-element.companion-shell-close-button{align-items:center;display:flex;height:32px;justify-content:center;margin:0;width:32px}.add-on-host-headerbar .companion-shell-header-svg-icon{width:20px;height:20px}.add-on-host-headerbar.companion-shell-header.add-on-host-headerbar-companion-style{height:64px;padding:0 10px}.add-on-host-headerbar.add-on-host-headerbar-companion-style .companion-shell-header-element.companion-shell-close-button{width:40px;height:40px}.docs-material-button{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:box-shadow 0.28s cubic-bezier(0.4,0.0,0.2,1);-moz-transition:box-shadow 0.28s cubic-bezier(0.4,0.0,0.2,1);-o-transition:box-shadow 0.28s cubic-bezier(0.4,0.0,0.2,1);transition:box-shadow 0.28s cubic-bezier(0.4,0.0,0.2,1);border-radius:2px;border:none;cursor:pointer;display:inline-block;font:500 13px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;height:32px;line-height:32px;margin:0 4px;overflow:hidden;outline:none;position:relative;text-align:center;text-transform:uppercase;vertical-align:middle}.docs-material-button-content{position:relative}.docs-material-button-ripple-element{border-radius:50%;left:50%;opacity:0;padding-bottom:200%;position:absolute;top:50%;transition:transform 0s linear 0.2s,opacity 0.2s ease-in;width:200%}.docs-material-button-ripple-effect>.docs-material-button-ripple-element{-webkit-transform:translate(-50%,-50%) scale(1);-moz-transform:translate(-50%,-50%) scale(1);-ms-transform:translate(-50%,-50%) scale(1);-o-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1);opacity:1;transition:transform 0.35s ease-out,opacity 0s linear;visibility:visible}.docs-material-button-disabled{box-shadow:none;cursor:default}.docs-material-button-flat-primary,.docs-material-button-flat-default,.docs-material-button-flat-dark{background-color:transparent;padding:0 8px}.docs-material-button-raised-primary,.docs-material-button-raised-default{padding:0 16px}.docs-material-button-hover.docs-material-button-raised-primary,.docs-material-button-hover.docs-material-button-raised-default{box-shadow:0px 2px 2px 0px rgba(0,0,0,0.14),0px 3px 1px -2px rgba(0,0,0,0.12),0px 1px 5px 0px rgba(0,0,0,0.2)}.docs-material-button-active.docs-material-button-raised-primary,.docs-material-button-active.docs-material-button-raised-default{box-shadow:0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12),0px 2px 4px -1px rgba(0,0,0,0.2)}.docs-material-button-raised-primary{background-color:#4285f4;color:#fff}.docs-material-button-flat-primary{color:#4285f4}.docs-material-button-flat-default{color:rgba(0,0,0,0.54)}.docs-material-button-flat-dark{color:#fff}.docs-material-button-hover.docs-material-button-flat-primary{background-color:rgba(66,133,244,.12)}.docs-material-button-hover.docs-material-button-flat-dark{background-color:rgba(256,256,256,0.1)}.docs-material-button-active.docs-material-button-flat-primary{color:#3367d6}.docs-material-button-raised-primary.docs-material-button-focused{border:1px inset rgba(0,0,0,0.38);background:#3b78e7;line-height:30px;padding:0 15px}.docs-material-button-raised-default.docs-material-button-focused{border:1px solid #4285f4;line-height:30px;padding:0 15px}.docs-material-button-flat-primary.docs-material-button-focused,.docs-material-button-flat-default.docs-material-button-focused{border:1px solid #4285f4;line-height:30px;padding:0 7px}.docs-material-button-flat-dark.docs-material-button-focused{border:1px solid #fff;line-height:30px;padding:0 7px}.docs-material-button.docs-material-button-focused.docs-material-button-no-focus-border{border:none;line-height:32px}.docs-material-button-raised-primary.docs-material-button-focused.docs-material-button-no-focus-border,.docs-material-button-raised-default.docs-material-button-focused.docs-material-button-no-focus-border{padding:0 16px}.docs-material-button-flat-primary.docs-material-button-focused.docs-material-button-no-focus-border,.docs-material-button-flat-default.docs-material-button-focused.docs-material-button-no-focus-border,.docs-material-button-flat-dark.docs-material-button-focused.docs-material-button-no-focus-border{padding:0 8px}.docs-material-button-focused{outline:1px dotted transparent;outline-offset:-4px}.docs-material-button-hover.docs-material-button-flat-default{background-color:rgba(0,0,0,0.12)}.docs-material-button-active.docs-material-button-flat-default{color:rgba(0,0,0,0.87)}.docs-material-button-raised-default{background-color:rgba(0,0,0,.04);color:rgba(0,0,0,0.54)}.docs-material-button-active.docs-material-button-raised-default{color:rgba(0,0,0,0.87)}.docs-material-button-disabled.docs-material-button-flat-primary,.docs-material-button-disabled.docs-material-button-flat-default,.docs-material-button-disabled.docs-material-button-raised-default{background-color:#fff;color:rgba(0,0,0,0.26)}.docs-material-button-disabled.docs-material-button-flat-dark{color:rgba(255,255,255,0.30)}.docs-material-button-disabled.docs-material-button-raised-primary{background-color:rgba(0,0,0,0.12);color:#fff}.docs-material-button-flat-primary>.docs-material-button-ripple-element{background-color:rgba(66,133,244,.32)}.docs-material-button-raised-primary>.docs-material-button-ripple-element{background-color:#3367d6}.docs-material-button-flat-default>.docs-material-button-ripple-element{background-color:rgba(0,0,0,.2)}.docs-material-button-flat-dark>.docs-material-button-ripple-element{background-color:rgba(256,256,256,0.24)}.docs-material-button-raised-default>.docs-material-button-ripple-element{background-color:rgba(0,0,0,0.12)}.docs-material-button-hairline-primary.docs-material-button{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:white;border:1px solid #dadce0!important;color:#188038;text-transform:none}.docs-material-button-hairline-default.docs-material-button{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:white;border:1px solid #dadce0!important;color:#188038;color:#5f6368;text-transform:none}.docs-material-button-hairline-default.docs-material-button-hover,.docs-material-button-hairline-primary.docs-material-button-hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#f8fcf9;border:1px solid #c8e7d1!important}.docs-material-button-hairline-default.docs-material-button-focused,.docs-material-button-hairline-primary.docs-material-button-focused,.docs-material-button-hairline-default.docs-material-button-focused.docs-material-button-no-focus-border,.docs-material-button-hairline-primary.docs-material-button-focused.docs-material-button-no-focus-border{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#e7f5eb;border:1px solid #bbe2c6!important}.docs-material-button-hairline-default.docs-material-button-hover.docs-material-button-focused,.docs-material-button-hairline-primary.docs-material-button-hover.docs-material-button-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#dff2e4;border:1px solid #b5e0c1!important}.docs-material-button-hairline-default.docs-material-button-active,.docs-material-button-hairline-primary.docs-material-button-active{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#dff2e4;border:1px solid transparent!important;box-shadow:0 2px 6px 2px rgba(60,64,67,.15)}.docs-material-button-hairline-default.docs-material-button-disabled,.docs-material-button-hairline-primary.docs-material-button-disabled{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:white;border:1px solid #f1f3f4!important;color:#3c4043;opacity:0.38}.docs-material-button-fill-primary.docs-material-button{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff}.docs-material-button-fill-primary.docs-material-button-hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#2a8947;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15)}.docs-material-button-fill-primary.docs-material-button-focused,.docs-material-button-fill-primary.docs-material-button-focused.docs-material-button-no-focus-border{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#4f9e67;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15)}.docs-material-button-fill-primary.docs-material-button-hover.docs-material-button-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#62a877;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15)}.docs-material-button-fill-primary.docs-material-button-active{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#62a877;box-shadow:0 2px 6px 2px rgba(52,168,83,0.15)}.docs-material-button-fill-primary.docs-material-button-disabled{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#f1f3f4;color:#3c4043;opacity:0.38}div.CSS_SHORTCUTS_HELP_POPUP{left:10%;width:80%;top:10%;z-index:1002;color:#fff;position:fixed;text-align:center;text-shadow:#000 1px 1px 7px;font-weight:bold;background:#000 none repeat scroll 0;overflow:hidden}@media print{div.CSS_SHORTCUTS_HELP_POPUP{display:none!important}}div.CSS_SHORTCUTS_HELP_POPUP_CONTAINER{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;max-height:inherit;overflow:auto;padding:1em}table.CSS_SHORTCUTS_HELP_POPUP_HEADER,table.CSS_SHORTCUTS_HELP_POPUP_CONTENT{width:100%}.CSS_SHORTCUTS_HELP_POPUP_HEADER_TABLE_ELEMENT{padding-bottom:0.8ex}.CSS_SHORTCUTS_HELP_POPUP_TITLE{font-size:15px;white-space:nowrap;text-align:left}.CSS_SHORTCUTS_HELP_POPUP_TEAROFF_LINK_CONTAINER{color:#dd0;text-align:right}.CSS_SHORTCUTS_HELP_POPUP_TEAROFF_LINK_WRAPPER{position:absolute;top:0;right:0;padding-right:32px;padding-top:16px}.CSS_SHORTCUTS_HELP_CLOSE_PLACEHOLDER{height:11px;width:11px;padding:6px;margin:24px}.CSS_SHORTCUTS_HELP_POPUP_TEAROFF_LINK{font-size:15px;cursor:pointer;text-decoration:underline;color:#dd0}table.CSS_SHORTCUTS_HELP_POPUP_CONTENT{border-top:1px solid #999;font-size:13px}.CSS_SHORTCUTS_HELP_POPUP_CONTENT_HEADER{color:#dd0;padding-top:1em;text-align:left}.CSS_SHORTCUTS_HELP_POPUP_CONTENT_ELEMENT{vertical-align:top;padding-top:0.15em}table.CSS_SHORTCUTS_HELP_POPUP_CONTENT td.CSS_SHORTCUTS_HELP_POPUP_KEY{font-weight:bold;padding-right:0.5em;text-align:right;white-space:nowrap}table.CSS_SHORTCUTS_HELP_POPUP_CONTENT td.CSS_SHORTCUTS_HELP_POPUP_DESCRIPTION{font-weight:normal;text-align:left}span.CSS_SHORTCUTS_HELP_POPUP_KEY_MNEMONIC{font-family:"Courier New";color:#dd0}.CSS_SHORTCUTS_HELP_POPUP_PREF_CONTAINER{border-top:1px solid #999;padding:.5em 0}.CSS_SHORTCUTS_HELP_POPUP_PREF_CONTENT{background:#dd0;color:#000;padding:3px 7px;text-align:left;font-size:13px;text-shadow:none}.CSS_SHORTCUTS_HELP_POPUP_PREF_ENABLED .CSS_SHORTCUTS_HELP_POPUP_PREF_CONTENT{background:none;color:#fff}.CSS_SHORTCUTS_HELP_POPUP_PREF_LINK{cursor:pointer;text-decoration:underline}.CSS_SHORTCUTS_HELP_POPUP_PREF_ENABLED .CSS_SHORTCUTS_HELP_POPUP_PREF_LINK{color:#dd0}.shortcuts-modalpopup-bg{display:none;left:0;top:0;position:absolute}.docs-save-indicator:not(:active):not(.docs-titlebar-badge-selected) .docs-icon-sync{opacity:0.63}.docs-gm .docs-save-indicator-caption{font-size:12px;padding-left:3px;padding-right:5px;vertical-align:middle}.docs-save-indicator.docs-titlebar-badge.docs-save-indicator-unsaved-changes,.docs-save-indicator.docs-titlebar-badge.docs-save-indicator-unsaved-changes.docs-titlebar-badge-selected{background-color:#fce8e6;color:#d93025}.docs-save-indicator.docs-titlebar-badge.docs-save-indicator-unsaved-changes:hover{background-color:#fadfdd;color:#d93025}.docs-save-indicator.docs-titlebar-badge.docs-save-indicator-unsaved-changes:active,.docs-save-indicator.docs-titlebar-badge.docs-save-indicator-unsaved-changes.docs-save-indicator-selected{background-color:#f5cfce;color:#d93025}.docs-save-indicator-popup{max-width:420px;min-width:320px}.docs-save-indicator-popup.jfk-bubble{outline:none;padding-left:35px}.docs-save-indicator-popup .jfk-bubble-arrow{display:none}.docs-gm .docs-save-indicator-popup-header{background-color:#e6f4ea;min-height:40px;padding:0}.docs-gm .docs-save-indicator-popup-footer{padding:12px 16px 12px 16px}.docs-gm .docs-save-indicator-popup-title-container{align-items:center;display:flex;min-height:inherit;padding:0 16px}.docs-material .docs-save-indicator-popup-title{color:#188038;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;margin:10px 0;width:fit-content}.docs-gm .docs-save-indicator-popup-subtitle-container{padding:0 0 12px}.docs-gm .docs-material .docs-save-indicator-popup-icon,.docs-gm .docs-material .docs-save-indicator-popup-subtitle-icon{height:24px;margin-right:10px;min-width:24px}.docs-save-indicator-popup-subtitle{color:#3c4043;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:500}.docs-save-indicator-popup-text{color:#3c4043;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;line-height:16px;max-width:fit-content;padding:0 0 12px}.docs-gm .docs-save-indicator-popup.jfk-bubble{border:0;border-radius:4px;overflow:hidden;padding:0;z-index:903!important}.docs-save-indicator-popup .docs-save-indicator-popup-button.docs-material-button-fill-primary.docs-material-button{align-items:center;display:flex;height:24px;margin-bottom:12px;margin-left:0;padding:0 12px;text-transform:none;width:fit-content}.docs-save-indicator-unsaved-changes .docs-save-indicator-popup-header{background-color:#fce8e6}.docs-save-indicator-unsaved-changes .docs-save-indicator-popup-title{color:#d93025}.docs-save-indicator-popup-button-container{align-items:baseline;display:flex}.docs-save-indicator-popup-shortcut{color:#5f6368;font-weight:bold;font-size:12px;padding-left:10px}.docs-save-indicator-popup.docs-save-indicator-unsaved-changes .docs-material-button.docs-save-indicator-popup-button{background-color:#d93025;color:white}.docs-save-indicator-popup.docs-save-indicator-unsaved-changes .docs-material-button.docs-save-indicator-popup-button.docs-material-button-hover,.docs-save-indicator-popup.docs-save-indicator-unsaved-changes .docs-material-button.docs-save-indicator-popup-button.docs-material-button-focused{background-color:#db4036;box-shadow:0 1px 3px 1px rgba(0,0,0,0.05)}.docs-save-indicator-popup.docs-save-indicator-unsaved-changes .docs-material-button.docs-save-indicator-popup-button.docs-material-button-active{background-color:#e5716a}.docs-save-indicator-popup.docs-save-indicator-unsaved-changes .docs-material-button.docs-save-indicator-popup-button.docs-material-button-disabled{background-color:#f1f3f4;color:#3c4043}.jfk-bubble.jfk-bubble-promo.docs-promo-bubble.docs-save-indicator-promo{background-color:#188038;border-radius:8px;box-shadow:0 2px 6px 2px rgba(26,115,232,0.15);margin-top:4px;width:262px}.docs-save-indicator-promo .docs-promo-container{padding:16px}.jfk-bubble.jfk-bubble-promo.docs-promo-bubble.docs-save-indicator-promo .jfk-bubble-arrowup .jfk-bubble-arrowimplbefore{border-color:transparent}.jfk-bubble.jfk-bubble-promo.docs-promo-bubble.docs-save-indicator-promo .jfk-bubble-arrowup .jfk-bubble-arrowimplafter{border-color:#188038 transparent}.docs-save-indicator-promo .docs-promo-text-container{width:auto}.docs-save-indicator-promo .docs-promo-header{color:#fff;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:16px;font-weight:500;opacity:1}.docs-save-indicator-promo .docs-promo-body{color:#fff;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;padding:4px 0}.docs-save-indicator-promo .docs-promo-action-container{color:#fff;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;margin:0 0 0 20px;text-transform:none}.docs-save-indicator-promo .docs-promo-action-container:focus{outline-color:#fff}.docs-save-indicator-promo .docs-promo-action-row{padding:0}.encrypted-doc-toast.docs-ui-toast{min-width:initial}.encrypted-doc-toast.docs-ui-toast .docs-ui-toast-content{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.encrypted-doc-toast.docs-ui-toast .docs-ui-toast-control-bar{display:none}.docs-companion-app-switcher-container{background-color:white;border-top:1px solid #d9d9d9;box-sizing:border-box;height:calc(100% - 60px);position:absolute;right:0;top:60px;width:56px;z-index:1}.docs-companion-app-switcher-container.docs-companion-app-switcher-container-collapsed{width:0;z-index:1001}.docs-material.docs-companion-app-switcher-container{height:calc(100% - 64px);top:64px}.docs-material.docs-companion-app-switcher-container.docs-companion-app-switcher-container-collapsed{width:0}.docs-companion-app-switcher-container.docs-app-switcher-container-hidden{display:none}.docs-companion-sidebar{box-shadow:0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12),0px 2px 4px -1px rgba(0,0,0,0.2);height:100%;outline:none;overflow:hidden;position:absolute;right:0;top:0;width:300px;z-index:901}.goog-custom-button{margin:2px;border:0;padding:0;font-family:Arial,sans-serif;color:#000;background:#ddd url(//ssl.gstatic.com/editor/button-bg.png) repeat-x top left;text-decoration:none;list-style:none;vertical-align:middle;cursor:default;outline:none}.goog-custom-button-outer-box,.goog-custom-button-inner-box{border-style:solid;border-color:#aaa;vertical-align:top}.goog-custom-button-outer-box{margin:0;border-width:1px 0;padding:0}.goog-custom-button-inner-box{margin:0 -1px;border-width:0 1px;padding:3px 4px;white-space:nowrap}* html .goog-custom-button-inner-box{left:-1px}* html .goog-custom-button-rtl .goog-custom-button-outer-box{left:-1px}* html .goog-custom-button-rtl .goog-custom-button-inner-box{right:auto}*:first-child+html .goog-custom-button-inner-box{left:-1px}*:first-child+html .goog-custom-button-rtl .goog-custom-button-inner-box{left:1px}::root .goog-custom-button,::root .goog-custom-button-outer-box{line-height:0}::root .goog-custom-button-inner-box{line-height:normal}.goog-custom-button-disabled{background-image:none!important;opacity:0.3;-moz-opacity:0.3;filter:alpha(opacity=30)}.goog-custom-button-disabled .goog-custom-button-outer-box,.goog-custom-button-disabled .goog-custom-button-inner-box{color:#333!important;border-color:#999!important}* html .goog-custom-button-disabled{margin:2px 1px!important;padding:0 1px!important}*:first-child+html .goog-custom-button-disabled{margin:2px 1px!important;padding:0 1px!important}.goog-custom-button-hover .goog-custom-button-outer-box,.goog-custom-button-hover .goog-custom-button-inner-box{border-color:#9cf #69e #69e #7af!important}.goog-custom-button-active,.goog-custom-button-checked{background-color:#bbb;background-position:bottom left}.goog-custom-button-focused .goog-custom-button-outer-box,.goog-custom-button-focused .goog-custom-button-inner-box{border-color:orange}.goog-custom-button-collapse-right,.goog-custom-button-collapse-right .goog-custom-button-outer-box,.goog-custom-button-collapse-right .goog-custom-button-inner-box{margin-right:0}.goog-custom-button-collapse-left,.goog-custom-button-collapse-left .goog-custom-button-outer-box,.goog-custom-button-collapse-left .goog-custom-button-inner-box{margin-left:0}.goog-custom-button-collapse-left .goog-custom-button-inner-box{border-left:1px solid #fff}.goog-custom-button-collapse-left.goog-custom-button-checked .goog-custom-button-inner-box{border-left:1px solid #ddd}* html .goog-custom-button-collapse-left .goog-custom-button-inner-box{left:0}*:first-child+html .goog-custom-button-collapse-left .goog-custom-button-inner-box{left:0}.goog-flat-button{position:relative;margin:2px;border:1px solid #000;padding:2px 6px;font:normal 13px "Trebuchet MS",Tahoma,Arial,sans-serif;color:#fff;background-color:#8c2425;cursor:pointer;outline:none}.goog-flat-button-disabled{border-color:#888;color:#888;background-color:#ccc;cursor:default}.goog-flat-button-hover{border-color:#8c2425;color:#8c2425;background-color:#eaa4a5}.goog-flat-button-active,.goog-flat-button-selected,.goog-flat-button-checked{border-color:#5b4169;color:#5b4169;background-color:#d1a8ea}.goog-flat-button-focused{border-color:#5b4169}.goog-flat-button-collapse-right{margin-right:0}.goog-flat-button-collapse-left{margin-left:0;border-left:none}.goog-button{color:#036;border-color:#036;background-color:#69c}.goog-button-disabled{border-color:#333;color:#333;background-color:#999}.goog-button-hover{color:#369;border-color:#369;background-color:#9cf}.goog-button-active{color:#69c;border-color:#69c}.goog-clipboard{width:16px;height:16px;background:url(//ssl.gstatic.com/docs/clipboard/icons3.png) no-repeat;vertical-align:middle}.goog-cbi1{background-position:-16px}.goog-cbi2{background-position:-32px}.goog-cbi3{background-position:-48px}.goog-cbi4{background-position:-64px}.goog-cbi5{background-position:-80px}.goog-menu-button{background:#ddd url(//ssl.gstatic.com/editor/button-bg.png) repeat-x top left;border:0;color:#000;cursor:pointer;list-style:none;margin:2px;outline:none;padding:0;text-decoration:none;vertical-align:middle}.goog-menu-button-outer-box,.goog-menu-button-inner-box{border-style:solid;border-color:#aaa;vertical-align:top}.goog-menu-button-outer-box{margin:0;border-width:1px 0;padding:0}.goog-menu-button-inner-box{margin:0 -1px;border-width:0 1px;padding:3px 4px}* html .goog-menu-button-inner-box{left:-1px}* html .goog-menu-button-rtl .goog-menu-button-outer-box{left:-1px;right:auto}* html .goog-menu-button-rtl .goog-menu-button-inner-box{right:auto}*:first-child+html .goog-menu-button-inner-box{left:-1px}*:first-child+html .goog-menu-button-rtl .goog-menu-button-inner-box{left:1px;right:auto}::root .goog-menu-button,::root .goog-menu-button-outer-box,::root .goog-menu-button-inner-box{line-height:0}::root .goog-menu-button-caption,::root .goog-menu-button-dropdown{line-height:normal}.goog-menu-button-disabled{background-image:none!important;opacity:0.3;-moz-opacity:0.3;filter:alpha(opacity=30)}.goog-menu-button-disabled .goog-menu-button-outer-box,.goog-menu-button-disabled .goog-menu-button-inner-box,.goog-menu-button-disabled .goog-menu-button-caption,.goog-menu-button-disabled .goog-menu-button-dropdown{color:#333!important;border-color:#999!important}* html .goog-menu-button-disabled{margin:2px 1px!important;padding:0 1px!important}*:first-child+html .goog-menu-button-disabled{margin:2px 1px!important;padding:0 1px!important}.goog-menu-button-hover .goog-menu-button-outer-box,.goog-menu-button-hover .goog-menu-button-inner-box{border-color:#9cf #69e #69e #7af!important}.goog-menu-button-active,.goog-menu-button-open{background-color:#bbb;background-position:bottom left}.goog-menu-button-focused .goog-menu-button-outer-box,.goog-menu-button-focused .goog-menu-button-inner-box{border-color:orange}.goog-menu-button-caption{padding:0 4px 0 0;vertical-align:top}.goog-menu-button-dropdown{height:15px;width:7px;background:url(//ssl.gstatic.com/editor/editortoolbar.png) no-repeat -388px 0;vertical-align:top}.goog-menu-button-collapse-right,.goog-menu-button-collapse-right .goog-menu-button-outer-box,.goog-menu-button-collapse-right .goog-menu-button-inner-box{margin-right:0}.goog-menu-button-collapse-left,.goog-menu-button-collapse-left .goog-menu-button-outer-box,.goog-menu-button-collapse-left .goog-menu-button-inner-box{margin-left:0}.goog-menu-button-collapse-left .goog-menu-button-inner-box{border-left:1px solid #fff}.goog-menu-button-collapse-left.goog-menu-button-checked .goog-menu-button-inner-box{border-left:1px solid #ddd}.goog-submenu-arrow{color:#000;left:auto;padding-right:6px;position:absolute;right:0;text-align:right}.goog-menuitem-rtl .goog-submenu-arrow{text-align:left;left:0;right:auto;padding-left:6px}.goog-menuitem-disabled .goog-submenu-arrow{color:#ccc}.a11y-settings-dialog{min-width:464px}.a11y-settings-dialog ul,.a11y-settings-dialog li{list-style:none;padding:0;margin:0}.a11y-settings-dialog .a11y-settings-dialog-indent-group{margin-left:30px}.a11y-settings-dialog .a11y-settings-dialog-learn-more{margin-top:8px}.a11y-settings-dialog .a11y-settings-dialog-description-text{margin-right:2px}.a11y-settings-dialog a,.a11y-settings-dialog a:hover,.a11y-settings-dialog a:visited,.a11y-settings-dialog a:focus,.a11y-settings-dialog a:active{color:#1a73e8}.a11y-settings-dialog .docs-material-gm-labeled-checkbox-description a{padding:3px 0}.a11y-settings-dialog a .docs-icon{pointer-events:none}.a11y-settings-dialog .docs-material-gm-dialog-buttons{padding-top:0}.activity-deck,.activity-deck-events-view{height:100%}.activity-list-container{background-color:#fff;font-family:Roboto,arial,sans-serif;font-size:13px;height:100%;position:relative}.activity-list{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;height:100%;overflow-y:scroll;position:relative;z-index:0}.activity-refresh-header{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background-color:#eee;height:0;overflow:hidden;padding-right:16px;position:absolute;top:0;width:100%;z-index:2}.activity-refresh-header .goog-inline-block.goog-flat-button{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 1px rgba(0,0,0,0.1);box-shadow:0 1px 1px rgba(0,0,0,0.1);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background-color:white;color:#15c;cursor:pointer;height:35px;line-height:35px;text-align:center;width:100%}.activity-list-static-header{box-sizing:border-box;left:0;overflow:hidden;padding-bottom:12px;position:absolute;right:16px;top:0;width:auto;z-index:1}.activity-list-loading{font-size:14px;font-weight:normal;margin-top:16px;text-align:center;width:100%}.activity-list-loading .drive-white-circle{display:none}.activity-list-loading-more.activity-list-loading{font-size:12px;font-weight:normal;margin-top:0;padding-bottom:8px}.activity-list-loading-more.activity-list-loading .activity-list-loading-icon,.activity-list-loading-more.activity-list-loading .activity-list-loading-icon img,.activity-list-loading-more.activity-list-loading .activity-list-loading-message{display:inline-block;vertical-align:middle}.activity-list-loading-more.activity-list-loading .activity-list-loading-message{margin-left:8px;padding-left:14px;padding-top:6px}.activity-list-no-activity{font-size:13px;margin-top:16px;text-align:center;width:100%}.activity-event.activity-event-new{background-color:#ffffd6}.activity-event.activity-event-background-transition{-webkit-transition:background-color 1000ms ease-in;-moz-transition:background-color 1000ms ease-in;-o-transition:background-color 1000ms ease-in;transition:background-color 1000ms ease-in}.activity-list-no-more-events-icon{display:inline-block;margin-bottom:10px}.activity-event{background-color:#fff;border-bottom:1px solid #dadce0;margin:0 0 12px;padding:0 0 12px;position:relative;width:100%}.activity-event>div:first-child{line-height:20px;padding:16px 0}.activity-event-action-icon{height:16px;padding:8px 4px;position:absolute;width:16px}.activity-event-available-action{border-top:1px solid #efefef;margin-left:24px;margin-top:16px;padding-top:16px}.activity-event-action-link-active{color:#4a4a4a;padding:0;position:relative}.activity-event-action-link-active svg{fill:#4a4a4a}.activity-event-action-link-active:focus,.activity-event-action-link-active:hover{color:#4285f4;cursor:pointer}.activity-event-action-link-active:focus svg,.activity-event-action-link-active:hover svg{fill:#4285f4}.activity-event-action-link-used{color:#ccc}.activity-event-action-link-used svg{fill:#ccc}.activity-event-action-text{font-weight:500;text-transform:uppercase}.activity-event-action-text-active{margin-left:32px;padding:8px 0}.activity-event-action-text-used{padding:8px 4px}.activity-list-error,.activity-list-no-more-events.activity-list-no-events{margin-bottom:20px;margin-top:10px;text-align:center}.activity-list-error-icon{display:inline-block;height:24px;margin-bottom:-5px;margin-right:20px;position:relative;width:24px}.activity-list-error-icon svg{bottom:0;position:absolute}.activity-list-events{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text}.activity-list-no-more-events{color:#5f6368;padding:0 24px 0 16px;text-align:left}.activity-list-no-more-events-text{color:#5f6368;font-size:13px;font-weight:normal;margin-bottom:0}.activity-list-no-more-events-description,.activity-list-no-more-events-learn-more{line-height:20px;margin:0;padding:14px 0}.activity-decorated-link{color:#15c;cursor:pointer;outline:none;text-decoration:none}.activity-decorated-link:focus,.activity-decorated-link:hover{text-decoration:underline}.activity-decorated-link:active{color:#d14836}.activity-list-error-try-again{color:#15c;cursor:pointer;outline:none;text-decoration:none}.activity-list-error-try-again:focus,.activity-list-error-try-again:hover,.activity-list-error-try-again .goog-flat-button-hover,.activity-list-error-try-again .goog-flat-button-focus{text-decoration:underline}.activity-list-error-try-again:active{color:#d14836}.activity-list-show-more,.activity-paging-footer-show-more .goog-flat-button{display:block;height:0;margin:0 5px;overflow:hidden}.activity-event-focus{outline:1px solid #4d90fe}.activity-hideable-focus-hidden .activity-event.activity-event-focus{outline:none}.activity-event-person{height:40px;left:16px;position:absolute;width:40px}.activity-event-person img{border-radius:50%;height:100%;width:100%}.activity-event-background svg{border-radius:50%;height:40px;width:40px}.activity-event-person-overlay{left:0;position:absolute;right:0;top:0}.activity-event-admin-icon svg{opacity:0.5}.activity-event-person-icon svg{margin-top:9px}.activity-event-admin-icon.activity-event-person-icon svg{margin-top:7px}.activity-event-drive-icon svg{margin-top:8px}.activity-event-person .activity-event-person-icon-container{border-radius:50%;height:40px;overflow:hidden;text-align:center;width:40px}.activity-event-admin-icon-container{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border:2px solid rgba(0,0,0,0.2)}.activity-event-person-icon-text{color:#fff;font-size:16px;line-height:40px;vertical-align:middle}.activity-event-header{margin-left:56px;padding:0 24px 0 16px}.activity-event-details-header{color:#5f6368;font-size:13px;width:auto}.activity-event-details-container{color:#5f6368;font-size:13px;font-weight:500;margin-top:4px}.activity-event-target-list{padding-left:72px}.activity-event-file-approval,.activity-event-people-names{color:#202124;font-weight:500}.activity-event-approval-status{margin-top:4px;font-weight:500}.activity-event-approval-approved{color:#0f9d58}.activity-event-approval-rejected{color:#db4437}.activity-event-action{font-weight:normal}.activity-event-action::before{content:" "}.activity-event-target-number{font-weight:bold}.activity-event-copy-action{font-weight:bold}.activity-event-target-icon{height:16px;position:absolute;width:24px}.activity-event-target.activity-event-target-first{border-top:none}.activity-event-target-icon .drive-shortcut-icon{bottom:2px;left:-4px;position:absolute}.activity-event-target{position:relative}.activity-event-parent{border-bottom:1px solid #efefef;margin-left:72px}.activity-event-target-details{margin-left:32px}.activity-event-target-details.activity-event-locatable-target{margin-right:24px}.activity-event-target-name{font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.activity-list-hidden-text{height:0;overflow:hidden;white-space:nowrap;width:0}.activity-event-target:hover,.activity-event-target:active,.activity-event-target:focus{background-color:#fff}.activity-event-target-name.activity-event-openable-target:hover,.activity-event-target-name.activity-event-openable-target:active,.activity-event-target-name.activity-event-openable-target:focus,.activity-event-target-name .activity-event-openable-target:hover,.activity-event-target-name .activity-event-openable-target:active,.activity-event-target-name .activity-event-openable-target:focus{color:#5f6368;cursor:pointer;outline:none;text-decoration:underline}.activity-event-scopes-show-more-button,.activity-event-scopes-show-less-button{display:flex;margin-left:24px}.activity-event-show-more-button,.activity-event-show-less-button{display:flex;margin-left:6px}.activity-event-toggle-button{border:1px solid transparent;border-radius:4px;box-shadow:none;box-sizing:border-box;color:#4285f4;cursor:pointer;font-family:Google Sans,QUANTUM_FONT_FAMILY;font-size:13px;font-weight:500;height:36px;letter-spacing:0.25px;line-height:16px;outline:none;margin-top:4px;padding:9px 24px 11px 24px}.activity-event-toggle-button-hover{background-color:rgba(66,133,244,.04)}.activity-event-toggle-button-focused{background-color:#e8f0fe}.activity-event-toggle-button-hover.activity-event-toggle-button-focused{background-color:rgba(66,133,244,0.16)}.activity-event-toggle-button-active{background-color:rgba(66,133,244,0.16);box-shadow:0 1px 2px 0 rgba(60,64,67,0.30),0 1px 3px 1px rgba(60,64,67,0.15)}.activity-event-focus .activity-event-toggle-button .activity-event-toggle-button-icon,.activity-event:hover .activity-event-toggle-button .activity-event-toggle-button-icon{visibility:visible}.activity-event:hover .activity-event-toggle-button{cursor:pointer}.activity-event-children{margin-left:24px}.activity-event-target-icon,.activity-event-target-details{padding:7px 0 6px}.activity-event-target-icon-img{max-height:16px;max-width:16px;padding:0 4px}.activity-event-section-title{background-color:#fff;border-bottom:1px solid #dadce0;color:#5f6368;font-size:13px;font-weight:500;line-height:48px;margin:0;padding:0 24px 0 16px;position:relative;transition:box-shadow 267ms cubic-bezier(0.4,0.0,0.2,1)}.activity-event-annotation{color:#5f6368;display:inline;float:right;font-size:12px;font-weight:normal;padding-right:16px;padding-top:0;position:relative}.activity-event-source{display:inline-block;max-width:136px;overflow:hidden;text-overflow:ellipsis;vertical-align:top;white-space:nowrap}.activity-event-info{color:#5f6368;padding-bottom:12px}.activity-event-timestamp{padding:0 16px 0 16px;display:inline}.activity-event-target-parent{color:#bababa;font-size:13px}.activity-event-target-parent.activity-event-openable-target:hover,.activity-event-target-parent.activity-event-openable-target:active,.activity-event-target-parent.activity-event-openable-target:focus{color:#00992c;cursor:pointer;outline:none}.activity-event-locate{height:32px;outline:none;position:absolute;right:3px;top:0;width:24px}.activity-event-locate svg{filter:alpha(opacity=0);opacity:0;margin-left:2px;margin-top:5px}.activity-event-locate:hover,.activity-event-locate:active,.activity-event-locate:focus,.activity-event-target:hover .activity-event-locate:hover,.activity-event-target:active .activity-event-locate:active,.activity-event-target:focus .activity-event-locate:focus{cursor:pointer}.activity-event-locate:hover svg,.activity-event-locate:active svg,.activity-event-locate:focus svg,.activity-event-target:hover .activity-event-locate:hover svg,.activity-event-target:active .activity-event-locate:active svg,.activity-event-target:focus .activity-event-locate:focus svg{filter:alpha(opacity=72);opacity:.72;cursor:pointer}.activity-event-target:hover .activity-event-locate svg,.activity-event-target:active .activity-event-locate svg,.activity-event-target:focus .activity-event-locate svg{filter:alpha(opacity=55);opacity:.55}.activity-event-user-deletion-overlay svg{margin-top:4px}.activity-list .drive-spinner{height:40px}.activity-entry-empty-trash-targets .activity-event-target-name{text-decoration:line-through}.activity-event-rename-old-title{color:#ccc;margin-top:8px;overflow:hidden;text-decoration:line-through;text-overflow:ellipsis;white-space:nowrap}.activity-event-scope-change-detail.activity-event-scope-change-detail-first{border-top:none}.activity-event-scope-change-detail{position:relative;padding:2px 0}.activity-event-scope-icon{border-radius:50%;display:inline-block;overflow:hidden;padding:0;position:relative;vertical-align:middle;z-index:1}.activity-event-scope-icon img{-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;height:24px;vertical-align:middle;width:24px}.activity-event-scope-icon-container .activity-event-scope-svg-icon{left:2px;position:absolute;top:2px}.activity-event-scope-background svg{-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;height:24px;width:24px}.activity-event-scope-icon .activity-event-scope-icon-container{height:24px;text-align:center;width:24px}.activity-event-scope-icon-text{color:#fff;height:24px;left:0;line-height:24px;position:absolute;top:0;width:24px}.activity-event-scope-element{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;font-weight:lighter;padding-left:48px;width:100%}.activity-event-scope-element-access{color:#5f6368;font-size:13px;float:right;padding-left:8px}.activity-event-scope-element-text{color:#5f6368;font-weight:500}.activity-event-scope-detail-unshared .activity-event-scope-element-text,.activity-event-scope-detail-unshared .activity-event-scope-detail-ba-display-name{text-decoration:line-through}.activity-event-scope-detail-icon-container{display:inline-block;line-height:normal;vertical-align:middle;width:0}.activity-event-scope-detail-unshared{filter:alpha(opacity=50);opacity:0.5}.activity-event-scope-detail-content-container{display:inline-block;line-height:normal;vertical-align:middle;width:100%}.activity-event-scopes-list{margin-top:12px;position:relative;padding:0 24px}.activity-event-scope-detail-ba-container{display:inline-block;margin-left:48px;vertical-align:middle}.activity-event-scope-detail-ba-display-name{color:#202124;font-weight:500}.activity-event-scope-detail-ba-subtext{color:#5f6368;font-size:13px}.activity-team-drive-setting-events{padding-top:10px}.activity-team-drive-setting-detail{display:flex;padding-left:35px}.activity-team-drive-setting-detail:not(:last-child){padding-bottom:10px}.activity-team-drive-setting-description{display:inline-block;font-weight:normal;padding-left:20px}.docs-tabbar{clear:left;display:flex;flex-direction:row;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;float:left;-webkit-justify-content:left;justify-content:left;outline:none}.docs-tabbar-tab{-ms-flex-align:center;-moz-box-align:center;-webkit-box-align:center;box-align:center;-webkit-align-items:center;align-items:center;border-bottom:2px solid transparent;border-top:2px solid transparent;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;cursor:pointer;display:flex;height:48px;box-pack:center;-ms-flex-pack:center;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center;max-width:264px;min-width:72px;padding:0px 24px}.docs-tabbar-tab-selected{border-bottom:2px solid #fff}.docs-hc-edge.docs-tabbar-tab.docs-tabbar-tab-selected .docs-tabbar-tablabel,.docs-hc-gecko.docs-tabbar-tab.docs-tabbar-tab-selected .docs-tabbar-tablabel,.docs-hc-ie.docs-tabbar-tab.docs-tabbar-tab-selected .docs-tabbar-tablabel{border-bottom:2px solid #fff;padding-bottom:0px}.docs-hc-edge.docs-tabbar-tab .docs-tabbar-tablabel,.docs-hc-gecko.docs-tabbar-tab .docs-tabbar-tablabel,.docs-hc-ie.docs-tabbar-tab .docs-tabbar-tablabel{padding-bottom:2px}.docs-tabbar-focused .docs-tabbar-tab-selected{background:rgba(255,255,255,0.12)}.docs-tabbar-mouseactive .docs-tabbar-tab{background:transparent}.docs-tabbar .docs-tabbar-tab-active{background:rgba(255,255,255,0.25)}.docs-tabbar-tablabel{color:rgba(255,255,255,0.7);font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;overflow:hidden;text-overflow:ellipsis;text-transform:uppercase;white-space:nowrap}.docs-tabbar-tab-selected .docs-tabbar-tablabel{color:#fff}div.docs-material-gm-checkbox,span.docs-material-gm-checkbox{border:2px solid #5f6368;border-radius:2px;box-sizing:border-box;cursor:pointer;height:18px;margin:1px;outline:none;flex-shrink:0;top:4px;width:18px;display:inline-block;vertical-align:middle}div.docs-material-gm-checkbox-checked,span.docs-material-gm-checkbox-checked,div.docs-material-gm-checkbox-undetermined,span.docs-material-gm-checkbox-undetermined{background-color:#188038;border:2px solid #188038}div.docs-material-gm-checkbox-checked:before,span.docs-material-gm-checkbox-checked:before{content:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmVyc2lvbj0iMS4xIgogICB2aWV3Qm94PSIwIDAgMSAxIgogICBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWluWU1pbiBtZWV0Ij4KICA8cGF0aAogICAgIGQ9Ik0gMC4wNDAzODA1OSwwLjYyNjc3NjcgMC4xNDY0NDY2MSwwLjUyMDcxMDY4IDAuNDI5Mjg5MzIsMC44MDM1NTMzOSAwLjMyMzIyMzMsMC45MDk2MTk0MSB6IE0gMC4yMTcxNTcyOSwwLjgwMzU1MzM5IDAuODUzNTUzMzksMC4xNjcxNTcyOSAwLjk1OTYxOTQxLDAuMjczMjIzMyAwLjMyMzIyMzMsMC45MDk2MTk0MSB6IgogICAgIGlkPSJyZWN0Mzc4MCIKICAgICBzdHlsZT0iZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgo8L3N2Zz4K");display:block;line-height:15px}div.docs-material-gm-checkbox-undetermined:before,span.docs-material-gm-checkbox-undetermined:before{border-top:2px solid white;content:'';display:block;height:0;margin-left:3px;margin-top:6px;width:8px}div.docs-material-gm-checkbox-focused,span.docs-material-gm-checkbox-focused{border:2px solid #188038}div.docs-material-gm-checkbox-disabled,span.docs-material-gm-checkbox-disabled{cursor:default;opacity:.38}div.docs-material-gm-checkbox-disabled.docs-material-gm-checkbox-checked,span.docs-material-gm-checkbox-disabled.docs-material-gm-checkbox-checked{background-clip:padding-box;background-color:#5f6368;border-color:#5f6368;opacity:.38}div.docs-material-gm-checkbox-checked.docs-material-gm-checkbox-focused,span.docs-material-gm-checkbox-checked.docs-material-gm-checkbox-focused{background-color:#188038;border:2px solid #188038}div.docs-material-gm-checkbox-disabled.docs-material-gm-checkbox-undetermined,span.docs-material-gm-checkbox-disabled.docs-material-gm-checkbox-undetermined{background-clip:padding-box;background-color:#5f6368;border-color:#5f6368;opacity:.38}div.docs-material-gm-checkbox-hover,span.docs-material-gm-checkbox-hover,div.docs-material-gm-checkbox-focused,span.docs-material-gm-checkbox-focused{outline:1px dotted transparent;outline-offset:3px}div.docs-material-gm-checkbox-active,span.docs-material-gm-checkbox-active{outline:1px solid transparent;outline-offset:3px}.docs-material-gm-labeled-checkbox{align-items:flex-start;cursor:pointer;display:flex;max-width:672px;outline:none;padding:8px 0;width:100%}.docs-material-gm-labeled-checkbox.docs-material-gm-labeled-checkbox-disabled{cursor:default}.docs-material-gm-labeled-checkbox-content{flex-shrink:1;margin-left:12px}.docs-material-gm-labeled-checkbox-circle{width:40px;height:40px;border-radius:50%;cursor:pointer;margin-left:-10px;margin-top:-10px;position:absolute}.docs-material-gm-labeled-checkbox-disabled .docs-material-gm-labeled-checkbox-circle{cursor:default}.docs-material-gm-labeled-checkbox-checkbox{border:2px solid #5f6368;border-radius:2px;box-sizing:border-box;cursor:pointer;height:18px;margin:1px;outline:none;flex-shrink:0;top:4px;width:18px}.docs-material-gm-labeled-checkbox-checkbox.docs-material-gm-labeled-checkbox-checked,.docs-material-gm-labeled-checkbox-checkbox.docs-material-gm-labeled-checkbox-undetermined{background-color:#188038;border:2px solid #188038}.docs-material-gm-labeled-checkbox-checkbox.docs-material-gm-labeled-checkbox-checked:before{content:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmVyc2lvbj0iMS4xIgogICB2aWV3Qm94PSIwIDAgMSAxIgogICBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWluWU1pbiBtZWV0Ij4KICA8cGF0aAogICAgIGQ9Ik0gMC4wNDAzODA1OSwwLjYyNjc3NjcgMC4xNDY0NDY2MSwwLjUyMDcxMDY4IDAuNDI5Mjg5MzIsMC44MDM1NTMzOSAwLjMyMzIyMzMsMC45MDk2MTk0MSB6IE0gMC4yMTcxNTcyOSwwLjgwMzU1MzM5IDAuODUzNTUzMzksMC4xNjcxNTcyOSAwLjk1OTYxOTQxLDAuMjczMjIzMyAwLjMyMzIyMzMsMC45MDk2MTk0MSB6IgogICAgIGlkPSJyZWN0Mzc4MCIKICAgICBzdHlsZT0iZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgo8L3N2Zz4K");display:block;line-height:15px}.docs-material-gm-labeled-checkbox-checkbox.docs-material-gm-labeled-checkbox-undetermined:before{border-top:2px solid white;content:'';display:block;height:0;margin-left:3px;margin-top:6px;width:8px}.docs-material-gm-labeled-checkbox-disabled .docs-material-gm-labeled-checkbox-checkbox{cursor:default;opacity:.38}.docs-material-gm-labeled-checkbox-hover .docs-material-gm-labeled-checkbox-checkbox,.docs-material-gm-labeled-checkbox-focused .docs-material-gm-labeled-checkbox-checkbox{outline:1px dotted transparent;outline-offset:3px}.docs-material-gm-labeled-checkbox-active .docs-material-gm-labeled-checkbox-checkbox{outline:1px solid transparent;outline-offset:3px}.docs-material-gm-labeled-checkbox-hover .docs-material-gm-labeled-checkbox-circle{background-color:#5f6368;opacity:.04}.docs-material-gm-labeled-checkbox-focused .docs-material-gm-labeled-checkbox-circle{background-color:#5f6368;opacity:.06}.docs-material-gm-labeled-checkbox-active .docs-material-gm-labeled-checkbox-circle{background-color:#5f6368;opacity:.1}.docs-material-gm-labeled-checkbox-disabled .docs-material-gm-labeled-checkbox-checkbox.docs-material-gm-labeled-checkbox-checked{background-clip:padding-box;background-color:#5f6368;border-color:#5f6368;opacity:.38}.docs-material-gm-labeled-checkbox-disabled .docs-material-gm-labeled-checkbox-checkbox.docs-material-gm-labeled-checkbox-undetermined{background-clip:padding-box;background-color:#5f6368;border-color:#5f6368;opacity:.38}.docs-material-gm-labeled-checkbox-hover .docs-material-gm-labeled-checkbox-checked+.docs-material-gm-labeled-checkbox-circle{background-color:#188038;opacity:.04}.docs-material-gm-labeled-checkbox-focused .docs-material-gm-labeled-checkbox-checked+.docs-material-gm-labeled-checkbox-circle{background-color:#188038;opacity:.06}.docs-material-gm-labeled-checkbox-active .docs-material-gm-labeled-checkbox-checked+.docs-material-gm-labeled-checkbox-circle{background-color:#188038;opacity:.1}.docs-material-gm-labeled-checkbox .docs-material-gm-labeled-checkbox-label{color:#3c4043;cursor:pointer;display:block;font:14px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;line-height:16px;overflow-wrap:break-word;padding:3px 0;width:auto;word-wrap:break-word}.docs-material-gm-labeled-checkbox.docs-material-gm-labeled-checkbox-disabled .docs-material-gm-labeled-checkbox-label{cursor:default;opacity:.38}.docs-material-gm-labeled-checkbox .docs-material-gm-labeled-checkbox-description{color:#80868b;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;padding:1px 0;width:100%}.docs-material-gm-labeled-checkbox.docs-material-gm-labeled-checkbox-disabled .docs-material-gm-labeled-checkbox-description{opacity:.38}.docs-material-gm-labeled-checkbox .docs-material-gm-labeled-checkbox-description-hide{display:none}.docs-material-labeled-checkbox-checkbox{outline:none}.docs-material-labeled-checkbox .docs-material-labeled-checkbox-checkbox{border:2px solid rgba(0,0,0,0.38);border-radius:2px;cursor:pointer;float:left;height:12px;margin:1px;position:relative;top:4px;vertical-align:middle;width:12px}.docs-material-labeled-checkbox-checkbox.docs-material-labeled-checkbox-checked:before{content:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmVyc2lvbj0iMS4xIgogICB2aWV3Qm94PSIwIDAgMSAxIgogICBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWluWU1pbiBtZWV0Ij4KICA8cGF0aAogICAgIGQ9Ik0gMC4wNDAzODA1OSwwLjYyNjc3NjcgMC4xNDY0NDY2MSwwLjUyMDcxMDY4IDAuNDI5Mjg5MzIsMC44MDM1NTMzOSAwLjMyMzIyMzMsMC45MDk2MTk0MSB6IE0gMC4yMTcxNTcyOSwwLjgwMzU1MzM5IDAuODUzNTUzMzksMC4xNjcxNTcyOSAwLjk1OTYxOTQxLDAuMjczMjIzMyAwLjMyMzIyMzMsMC45MDk2MTk0MSB6IgogICAgIGlkPSJyZWN0Mzc4MCIKICAgICBzdHlsZT0iZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgo8L3N2Zz4K");display:block;line-height:12px}.docs-material-labeled-checkbox-checkbox.docs-material-labeled-checkbox-checked{background-color:#4285f4;border:2px solid #4285f4}.docs-material-labeled-checkbox-focused .docs-material-labeled-checkbox-checkbox{border:2px solid #4285f4}.docs-material-labeled-checkbox-disabled .docs-material-labeled-checkbox-checkbox{border-color:rgba(0,0,0,0.26);cursor:default}.docs-material-labeled-checkbox-disabled .docs-material-labeled-checkbox-checkbox.docs-material-labeled-checkbox-checked{background-clip:padding-box;background-color:rgba(0,0,0,0.26);border-color:rgba(0,0,0,0.26)}.docs-material-labeled-checkbox-focused .docs-material-labeled-checkbox-checkbox.docs-material-labeled-checkbox-checked{background-color:#2a56c6;border:2px solid #2a56c6}.docs-material-labeled-checkbox .docs-material-labeled-checkbox-label{color:rgba(0,0,0,0.87);display:block;font:13px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;line-height:20px;margin-left:30px;overflow-wrap:break-word;padding:4px 0;vertical-align:middle;width:auto;word-wrap:break-word}.docs-material-labeled-checkbox.docs-material-labeled-checkbox-disabled .docs-material-labeled-checkbox-label{color:rgba(0,0,0,0.54)}.docs-material-labeled-checkbox .docs-material-labeled-checkbox-description-hide{display:none}.goog-menu{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:0 2px 4px rgba(0,0,0,0.2);-moz-box-shadow:0 2px 4px rgba(0,0,0,0.2);box-shadow:0 2px 4px rgba(0,0,0,0.2);-webkit-transition:opacity 0.218s;-moz-transition:opacity 0.218s;-o-transition:opacity 0.218s;transition:opacity 0.218s;background:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);cursor:default;font-size:13px;margin:0;outline:none;padding:6px 0;position:absolute}.goog-flat-menu-button{-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;background-color:#f5f5f5;background-image:-webkit-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:-moz-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:-ms-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:-o-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:linear-gradient(top,#f5f5f5,#f1f1f1);border:1px solid #dcdcdc;color:#333;cursor:default;font-size:11px;font-weight:bold;line-height:27px;list-style:none;margin:0 2px;min-width:46px;outline:none;padding:0 18px 0 6px;text-align:center;text-decoration:none}.goog-flat-menu-button-disabled{background-color:#fff;border-color:#f3f3f3;color:#b8b8b8}.goog-flat-menu-button.goog-flat-menu-button-hover{background-color:#f8f8f8;background-image:-webkit-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-moz-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-ms-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-o-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:linear-gradient(top,#f8f8f8,#f1f1f1);-webkit-box-shadow:0 1px 1px rgba(0,0,0,.1);-moz-box-shadow:0 1px 1px rgba(0,0,0,.1);box-shadow:0 1px 1px rgba(0,0,0,.1);border-color:#c6c6c6;color:#111}.goog-flat-menu-button.goog-flat-menu-button-focused{border-color:#4d90fe}.goog-flat-menu-button.goog-flat-menu-button-open,.goog-flat-menu-button.goog-flat-menu-button-active{-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1);background-color:#eee;background-image:-webkit-linear-gradient(top,#eee,#e0e0e0);background-image:-moz-linear-gradient(top,#eee,#e0e0e0);background-image:-ms-linear-gradient(top,#eee,#e0e0e0);background-image:-o-linear-gradient(top,#eee,#e0e0e0);background-image:linear-gradient(top,#eee,#e0e0e0);border:1px solid #ccc;color:#333;z-index:2}.goog-flat-menu-button-caption{vertical-align:top;white-space:nowrap}.goog-flat-menu-button-dropdown{border-color:#777 transparent;border-style:solid;border-width:4px 4px 0 4px;height:0;width:0;position:absolute;right:5px;top:12px}.goog-flat-menu-button .goog-flat-menu-button-img{margin-top:-3px;opacity:.70;vertical-align:middle}.goog-flat-menu-button-active .goog-flat-menu-button-img,.goog-flat-menu-button-open .goog-flat-menu-button-img,.goog-flat-menu-button-selected .goog-flat-menu-button-img,.goog-flat-menu-button-hover .goog-flat-menu-button-img{opacity:0.9}.goog-flat-menu-button-active .goog-flat-menu-button-dropdown,.goog-flat-menu-button-open .goog-flat-menu-button-dropdown,.goog-flat-menu-button-selected .goog-flat-menu-button-dropdown,.goog-flat-menu-button-hover .goog-flat-menu-button-dropdown{border-color:#595959 transparent}.goog-flat-menu-button-left,.goog-flat-menu-button-right{z-index:1}.goog-flat-menu-button-left.goog-flat-menu-button-disabled{z-index:0}.goog-flat-menu-button-right:focus,.goog-flat-menu-button-hover.goog-flat-menu-button-collapse-right{z-index:2}.goog-flat-menu-button-left:focus,.goog-flat-menu-button-hover.goog-flat-menu-button-collapse-left{z-index:2}.goog-flat-menu-button-collapse-left{margin-left:-1px;-moz-border-radius-bottomleft:0;-moz-border-radius-topleft:0;-webkit-border-bottom-left-radius:0;-webkit-border-top-left-radius:0;border-bottom-left-radius:0;border-top-left-radius:0;min-width:0;padding-left:0;vertical-align:top}.goog-flat-menu-button-collapse-right{margin-right:0px;-moz-border-radius-topright:0;-moz-border-radius-bottomright:0;-webkit-border-top-right-radius:0;-webkit-border-bottom-right-radius:0;border-top-right-radius:0;border-bottom-right-radius:0}.goog-menuitem,.goog-tristatemenuitem,.goog-filterobsmenuitem{position:relative;color:#333;cursor:pointer;list-style:none;margin:0;padding:6px 8em 6px 30px;white-space:nowrap}.goog-menu-nocheckbox .goog-menuitem,.goog-menu-noicon .goog-menuitem{padding-left:16px;vertical-align:middle}.goog-menu-noaccel .goog-menuitem{padding-right:44px}.goog-menuitem-disabled{cursor:default}.goog-menuitem-disabled .goog-menuitem-accel,.goog-menuitem-disabled .goog-menuitem-content{color:#ccc!important}.goog-menuitem-disabled .goog-menuitem-icon{filter:alpha(opacity=30);opacity:0.3}.goog-menuitem-highlight,.goog-menuitem-hover{background-color:#eee;border-color:#eee;border-style:dotted;border-width:1px 0;padding-top:5px;padding-bottom:5px}.goog-menuitem-highlight .goog-menuitem-content,.goog-menuitem-hover .goog-menuitem-content{color:#333}.goog-menuitem-checkbox,.goog-menuitem-icon{background-repeat:no-repeat;height:21px;left:3px;position:absolute;right:auto;top:3px;vertical-align:middle;width:21px}.goog-option-selected{background-image:url(//ssl.gstatic.com/ui/v1/menu/checkmark.png);background-repeat:no-repeat;background-position:left center}.goog-option-selected .goog-menuitem-content{color:#333}.goog-menuitem-accel{color:#777;direction:ltr;left:auto;padding:0 6px;position:absolute;right:0;text-align:right}.goog-menuitem-mnemonic-hint{text-decoration:underline}.goog-menuitem-mnemonic-separator{color:#777;font-size:12px;padding-left:4px}.goog-menuseparator{border-top:1px solid #ebebeb;margin-top:6px;margin-bottom:6px}.goog-submenu-arrow{-webkit-transition:all 0.218s;-moz-transition:all 0.218s;-o-transition:all 0.218s;transition:all 0.218s;font-size:70%;left:auto;right:10px;padding-top:3px;padding-right:0;position:absolute;text-align:right;opacity:.5;filter:alpha(opacity=50)}.goog-menuitem-highlight .goog-submenu-arrow,.goog-menuitem-hover .goog-submenu-arrow{-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none;border-left-color:#999;opacity:1.0}.goog-menuitem-disabled .goog-submenu-arrow{color:inherit;opacity:1.0}.docs-material-gm-labeled-select{color:#3c4043;outline:none;width:100%}.docs-material-gm-labeled-select-outer-box{border:1px solid #dadce0;border-radius:4px;box-sizing:border-box;cursor:pointer;padding:8px 6px 8px 8px;width:100%}.docs-material-gm-labeled-select-focused .docs-material-gm-labeled-select-outer-box{background-color:rgba(60,64,67,0.06);border:1px solid #dadce0}.docs-material-gm-labeled-select-hover .docs-material-gm-labeled-select-outer-box{background-color:rgba(60,64,67,0.04);border:1px solid #dadce0}.docs-material-gm-labeled-select-open .docs-material-gm-labeled-select-outer-box{background-color:rgba(60,64,67,0.04);border:1px solid transparent}.docs-material-gm-select-open.docs-material-gm-select-hover .docs-material-gm-labeled-select-outer-box{background-color:rgba(60,64,67,0.06)}.docs-material-gm-select-open.docs-material-gm-select-focused .docs-material-gm-labeled-select-outer-box{background-color:rgba(60,64,67,0.08)}.docs-material-gm-labeled-select-disabled .docs-material-gm-labeled-select-outer-box{border:1px solid #dadce0;box-shadow:none;cursor:default}.docs-material-gm-labeled-select-inner-box{align-items:center;display:flex;justify-content:space-between;position:relative;width:100%}.docs-material-gm-labeled-select-content{margin-bottom:8px}.docs-material-gm-labeled-select-caption{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;color:#202124;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;height:20px;line-height:20px;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.docs-material-gm-labeled-select-dropdown{align-items:center;display:flex;height:24px;justify-content:center;width:24px}.docs-material-gm-labeled-select-dropdown-icon{background:no-repeat url(//ssl.gstatic.com/docs/common/material_common_sprite222_grey_medium.svg) -40px -732px;height:18px;width:18px}.docs-material-gm-labeled-select-open .docs-material-gm-labeled-select-dropdown-icon{-moz-transform:rotate(180deg);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.docs-material-gm-labeled-select-label{color:#5f6368;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px}.docs-material-gm-select{color:#3c4043;outline:none;width:100%}.docs-material-gm-select-disabled{color:#5f6368;opacity:.38;cursor:default}.docs-material-gm-select-outer-box{border:1px solid #dadce0;border-radius:4px;box-sizing:border-box;cursor:pointer;padding:8px 6px 8px 8px;width:100%}.docs-material-gm-select-outer-box:active{background-color:#fff;border:1px solid transparent;box-shadow:0 2px 6px 2px rgba(60,64,67,.15)}.docs-material-gm-select-hover .docs-material-gm-select-outer-box{background-color:rgba(60,64,67,0.04);border:1px solid #dadce0}.docs-material-gm-select-focused .docs-material-gm-select-outer-box{background-color:rgba(60,64,67,0.06);border:1px solid #dadce0}.docs-material-gm-select-open .docs-material-gm-select-outer-box{background-color:rgba(60,64,67,0.04);border:1px solid transparent}.docs-material-gm-select-open.docs-material-gm-select-hover .docs-material-gm-select-outer-box{background-color:rgba(60,64,67,0.06)}.docs-material-gm-select-open.docs-material-gm-select-focused .docs-material-gm-select-outer-box{background-color:rgba(60,64,67,0.08)}.docs-material-gm-select-disabled .docs-material-gm-select-outer-box{border:1px solid #dadce0;box-shadow:none;cursor:default}.docs-material-gm-select-inner-box{align-items:center;display:flex;justify-content:space-between;position:relative;width:100%}.docs-material-gm-select-caption{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;color:#202124;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;height:20px;line-height:20px;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.docs-material-gm-select-dropdown{align-items:center;display:flex;height:24px;justify-content:center;width:24px}.docs-material-gm-select-dropdown-icon{background:no-repeat url(//ssl.gstatic.com/docs/common/material_common_sprite222_grey_medium.svg) -40px -732px;height:18px;width:18px}.docs-material-gm-select-open .docs-material-gm-select-dropdown-icon{-moz-transform:rotate(180deg);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.docs-material-labeled-select{outline:0;width:100%}.docs-material-labeled-select-outer-box{transition:border-color 300ms ease;border-bottom:1px solid rgba(0,0,0,0.12);cursor:pointer;height:26px;line-height:26px;margin-bottom:1px;width:100%}.docs-material-labeled-select-hover .docs-material-labeled-select-outer-box{border-bottom-color:rgba(0,0,0,0.38)}.docs-material-labeled-select-open .docs-material-labeled-select-outer-box,.docs-material-labeled-select-focused .docs-material-labeled-select-outer-box{border-bottom-width:2px;border-bottom-color:#4285f4;margin-bottom:0px}.docs-material-labeled-select-disabled .docs-material-labeled-select-outer-box{border-bottom:1px dotted rgba(0,0,0,0.12);cursor:default}.docs-material-labeled-select-inner-box{display:flex;justify-content:space-between}.docs-material-labeled-select-caption{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;color:rgba(0,0,0,0.87);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;height:26px;line-height:26px;max-width:100%;overflow:hidden;padding-right:24px;position:relative;text-overflow:ellipsis;white-space:nowrap}.docs-material-labeled-select-disabled .docs-material-labeled-select-caption{color:rgba(0,0,0,0.12)}.docs-material-labeled-select-dropdown{align-items:center;display:flex;height:24px;justify-content:center;width:24px}.docs-material-labeled-select-dropdown-icon{background:no-repeat url(//ssl.gstatic.com/docs/common/material_common_sprite222_grey_medium.svg) -40px -732px;height:18px;width:18px}.docs-material-labeled-select-hover .docs-material-labeled-select-dropdown-icon,.docs-material-labeled-select-focused .docs-material-labeled-select-dropdown-icon{opacity:0.54}.docs-material-labeled-select-disabled .docs-material-labeled-select-dropdown-icon{opacity:0.12}.docs-material-labeled-select-label{color:#616161;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:11px;line-height:16px}.docs-material-labeled-select-disabled .docs-material-labeled-select-label{opacity:0.12}.docs-material-select{color:rgba(0,0,0,0.87);cursor:pointer;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;height:26px;line-height:26px;outline:0;width:100%}.docs-material-select-disabled{color:rgba(0,0,0,0.12);cursor:default}.docs-material-select-outer-box{transition:border-color 300ms ease;border-bottom:1px solid rgba(0,0,0,0.12);height:26px;line-height:26px;margin-bottom:1px;width:100%}.docs-material-select-hover .docs-material-select-outer-box{border-bottom-color:rgba(0,0,0,0.38)}.docs-material-select-focused .docs-material-select-outer-box,.docs-material-select-open .docs-material-select-outer-box{border-bottom-width:2px;border-bottom-color:#4285f4;margin-bottom:0px}.docs-material-select-disabled .docs-material-select-outer-box{border-bottom:1px dotted rgba(0,0,0,0.12)}.docs-material-select-inner-box{position:relative;width:100%}.docs-material-select-caption{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;height:26px;line-height:26px;max-width:100%;overflow:hidden;padding-right:24px;position:relative;text-overflow:ellipsis;white-space:nowrap}.docs-material-select-dropdown{position:absolute;right:7px;top:10.5px}.docs-material-select-dropdown-icon{transition:opacity 0.3s ease;background:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI1IiBoZWlnaHQ9IjMiPjxwb2x5Z29uIHBvaW50cz0iMCwwIDUsMCAyLjUsMyIgZmlsbD0iIzAwMCIvPjwvc3ZnPg==") no-repeat;background-size:contain;height:5px;opacity:0.38;width:9px}.docs-material-select-hover .docs-material-select-dropdown-icon,.docs-material-select-focused .docs-material-select-dropdown-icon{opacity:0.54}.docs-material-select-disabled .docs-material-select-dropdown-icon{opacity:0.12}.docs-material-labeled-text-field{height:40px;line-height:40px;padding-top:5px;position:relative}.docs-material-labeled-text-field-input{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;transition:border-color 200ms cubic-bezier(0.4,0.0,0.2,1);background:none;border:none;border-bottom:1px solid rgba(0,0,0,0.12);color:rgba(0,0,0,0.87);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;height:26px;line-height:26px;outline:none;overflow:hidden;text-overflow:ellipsis;width:100%}.docs-material-labeled-text-field-hover .docs-material-labeled-text-field-input{border-bottom-color:rgba(0,0,0,0.38)}.docs-material-labeled-text-field-focused .docs-material-labeled-text-field-input{border-bottom:2px solid #4285f4}.docs-material-labeled-text-field-disabled .docs-material-labeled-text-field-input{border-bottom:1px dotted rgba(0,0,0,0.12);color:rgba(0,0,0,0.12);cursor:default}.docs-material-labeled-text-field-label{transition:transform 200ms cubic-bezier(0.4,0.0,1,1);color:#616161;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;line-height:45px;position:absolute;transform-origin:left bottom}.docs-material-labeled-text-field-has-text .docs-material-labeled-text-field-label,.docs-material-labeled-text-field-focused .docs-material-labeled-text-field-label{transform:translateY(-22px) scale(.846,.846)}.docs-material-labeled-text-field-focused .docs-material-labeled-text-field-label{color:#4285f4}.docs-material-labeled-text-field-disabled .docs-material-labeled-text-field-label{opacity:0.12}.docs-material-text-area{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;transition:border-color 250ms cubic-bezier(0.4,0.0,0.2,1);background:none;border:none;border-bottom:1px solid rgba(0,0,0,0.12);color:rgba(0,0,0,0.87);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;outline:none;resize:none;width:100%}.docs-material-text-area:hover{border-bottom-color:rgba(0,0,0,0.38)}.docs-material-text-area:focus{border-bottom:2px solid #4285f4}.docs-material-text-area:disabled{border-bottom:1px dotted rgba(0,0,0,0.12);color:rgba(0,0,0,0.12);cursor:default}.docs-material-text-field-input{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;transition:border-color 250ms cubic-bezier(0.4,0.0,0.2,1);background:none;border:none;border-bottom:1px solid rgba(0,0,0,0.12);color:rgba(0,0,0,0.87);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;height:26px;line-height:26px;outline:none;overflow:hidden;text-overflow:ellipsis;width:100%}.docs-material-text-field-hover .docs-material-text-field-input{border-bottom-color:rgba(0,0,0,0.38)}.docs-material-text-field-focused .docs-material-text-field-input{border-bottom:2px solid #4285f4}.docs-material-text-field-disabled .docs-material-text-field-input{border-bottom:1px dotted rgba(0,0,0,0.12);color:rgba(0,0,0,0.12);cursor:default}.drive-spinner{height:44px;overflow:hidden;position:relative}.drive-quantum-spinner{height:28px;left:50%;margin-left:-14px;position:absolute;top:8px;width:28px}.docs-analytics-icon{direction:ltr;text-align:left;overflow:hidden;position:relative;vertical-align:middle}.docs-analytics-img:before{content:url(//ssl.gstatic.com/docs/common/menu_feature_sprite7.svg)}.docs-analytics-img{height:4332px;position:absolute;width:72px}.docs-analytics-hc-edge .docs-analytics-icon,.docs-analytics-hc-gecko .docs-analytics-icon{filter:invert(100%)}.docs-analytics-hc-ie .docs-analytics-icon{-ms-high-contrast-adjust:none;background-color:white}.docs-analytics-arrow-downward-18px{left:0;top:-4296px}.docs-analytics-arrow-drop-down-black-18dp{left:-18px;top:-1944px}.docs-analytics-arrow-right-black-18dp{left:-18px;top:-3658px}.docs-analytics-arrow-upward-18px{left:0;top:-640px}.docs-analytics-close-black-24px{left:-24px;top:-452px}.docs-analytics-close-white-24px{left:-48px;top:-452px}.docs-analytics-info-outline-black-24px{left:-42px;top:-1098px}.docs-analytics-group-in-circle-32px{left:-24px;top:-1748px}.docs-analytics-keyboard-arrow-down-18px{left:-50px;top:-1222px}.docs-analytics-keyboard-arrow-up-18px{left:0;top:-2992px}.docs-analytics-document-icon-kix{left:0;top:-2974px}.docs-analytics-document-icon-punch{left:-24px;top:-1098px}.docs-analytics-document-icon-sketchy{left:-50px;top:-3034px}.docs-analytics-document-icon-ritz{left:-36px;top:-4314px}.docs-analytics-email-icon{left:-24px;top:-4146px}.analytics-dialog{border-radius:8px;height:100%;max-height:586px;max-width:880px;min-width:580px;width:100%}.analytics-dialog.analytics-dialog-collapsed{max-width:684px;width:calc(100% - (2*8px))}.analytics-dialog::before{border:1px solid transparent;border-radius:8px;bottom:-1px;content:'';left:-1px;position:absolute;right:-1px;top:-1px}.analytics-dialog-title{display:none}.analytics-vc-content .docs-material-gm-select-caption{padding-left:8px;width:100%}.analytics-vc-content .docs-material-gm-select-dropdown{padding-right:8px}.analytics-vc-content .docs-material-gm-select-outer-box{padding:0}.analytics-vc-content .goog-menu .goog-menuitem-highlight{border:none}.analytics-btn-fill.jfk-button{cursor:pointer;background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff}.analytics-btn-fill.jfk-button-hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#2a8947;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15)}.analytics-btn-fill.jfk-button-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#4f9e67;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15)}.analytics-btn-fill.jfk-button-focused.jfk-button-hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#62a877;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15)}.analytics-btn-fill.jfk-button-focused.jfk-button-active{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#62a877;box-shadow:0 2px 6px 2px rgba(52,168,83,0.15)}.analytics-btn-fill.jfk-button-disabled{cursor:default;background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#f1f3f4;color:#3c4043;opacity:0.38}.analytics-btn-hairline.jfk-button{cursor:pointer;background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:white;border:1px solid #dadce0!important;color:#188038}.analytics-btn-hairline.jfk-button-hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#f8fcf9;border:1px solid #c8e7d1!important}.analytics-btn-hairline.jfk-button-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#e7f5eb;border:1px solid #bbe2c6!important}.analytics-btn-hairline.jfk-button-focused.jfk-button-hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#dff2e4;border:1px solid #b5e0c1!important}.analytics-btn-hairline.jfk-button-focused.jfk-button-active{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#dff2e4;border:1px solid transparent!important;box-shadow:0 2px 6px 2px rgba(60,64,67,.15)}.analytics-btn-hairline.jfk-button-disabled{cursor:default;background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:white;border:1px solid #f1f3f4!important;color:#3c4043;opacity:0.38}.analytics-btn-text.jfk-button{cursor:pointer;background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:white;color:#188038}.analytics-btn-text.jfk-button-hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#f8fcf9;color:#188038}.analytics-btn-text.jfk-button-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#e7f5eb;color:#188038}.analytics-btn-text.jfk-button-focused.jfk-button-hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#dff2e4;color:#188038}.analytics-btn-text.jfk-button-focused.jfk-button-active{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#dff2e4;color:#188038;box-shadow:0 2px 6px 2px rgba(60,64,67,.15)}.analytics-btn-text.jfk-button-disabled{cursor:default;background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:white;color:#188038;color:#3c4043;opacity:0.38}.analytics-cotc{display:flex;flex-direction:column;-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;overflow-x:hidden;overflow-y:auto}.analytics-cotc-header{-webkit-align-items:center;align-items:center;display:flex;-ms-flex:0 0 auto;-webkit-flex:0 0 auto;flex:0 0 auto;flex-direction:row;justify-content:space-between;margin:18px 24px 0 24px;overflow:hidden}.analytics-cotc-legend{-webkit-align-items:center;align-items:center;color:#202124;display:flex;-ms-flex:0 0;-webkit-flex:0 0;flex:0 0;flex-direction:row;font-size:12px;margin:40px 24px 40px 45px;text-align:center}.analytics-cotc-legend-box{display:flex;margin-right:8px}.analytics-cotc-legend span{margin-right:24px}.analytics-ct-table{-webkit-align-items:flex-start;align-items:flex-start;border-collapse:collapse;display:flex;flex-direction:column;padding:20px;white-space:nowrap}.analytics-ct-table-header{display:flex;flex-direction:row;-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1}.analytics-ct-table-header-container{display:flex;height:11px;width:100%}.analytics-ct-table-date-container{margin:0;position:absolute}.analytics-ct-table-date{font-size:9px;margin-left:-50%}.analytics-ct-table-date-light{opacity:0.6}.analytics-ct-table-container{display:flex;flex:1 1 auto;overflow-y:auto;width:100%}.analytics-ct-table-contributors{border-collapse:collapse;max-height:100%;overflow-y:auto;table-layout:fixed;width:100%}.analytics-ct-contributor-row{align-items:center;border-right:1px solid #e3e3e3}.analytics-ct-contributor-row:last-child .analytics-ct-table-profile{border-bottom:0}.analytics-ct-contributor-row:last-child .analytics-ct-table-activity-cell-div{border-bottom:0}.analytics-ct-table-profile-container{background-color:#f9f9f9;height:38px;padding:0;width:170px}.analytics-ct-table-profile{-webkit-align-items:center;align-items:center;border-bottom:2px solid #fff;display:flex;flex-direction:row;height:100%;padding:3px 5px}.analytics-ct-table-profile .analytics-profile-image{max-height:24px;max-width:24px}.analytics-ct-table-name{color:#3c4043;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;padding-left:12px}.analytics-ct-table-activity-cell{flex-grow:1;height:38px;padding:0;position:relative}.analytics-ct-table-activity-cell-light-border::before,.analytics-ct-table-activity-cell-dark-border::before,.analytics-ct-table-activity-cell-light-border-disabled::before,.analytics-ct-table-activity-cell-dark-border-disabled::before{content:'';height:100%;position:absolute;left:0;top:0}.analytics-ct-table-activity-cell-light-border::before{border-left:1px solid #eeeeee}.analytics-ct-table-activity-cell-dark-border::before{border-left:1px solid #e0e0e0}.analytics-ct-table-activity-cell-light-border-disabled::before{border-left:1px solid #e0e0e0}.analytics-ct-table-activity-cell-dark-border-disabled::before{border-left:1px solid #dbdbdb}.analytics-ct-table-activity-cell-div{background-color:#f9f9f9;border-bottom:2px solid #fff;height:100%}.analytics-ct-table-activity-cell-div-disabled{background-color:#eeeeee;border-bottom:2px solid #f5f5f5}.analytics-ct-activity-edit-small,.analytics-ct-activity-edit-medium,.analytics-ct-activity-edit-large{height:100%;position:relative}.analytics-ct-activity-edit-small{background-color:#c4d9f2}.analytics-ct-activity-edit-medium{background-color:#87b5ea}.analytics-ct-activity-edit-large{background-color:#4a90e2}.analytics-ct-activity-comment-fg{background-color:#fff;border-radius:50%;height:4px;left:50%;margin-left:-2px;position:absolute;top:17px;width:4px;z-index:2}.analytics-ct-activity-comment-bg{background-color:#3c4043;border-radius:50%;height:8px;left:50%;margin-left:-4px;position:absolute;top:15px;width:8px;z-index:1}.analytics-ct{display:flex;flex-direction:column;-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;overflow-x:hidden;overflow-y:auto}.analytics-ct-header{display:flex;flex-direction:row;justify-content:space-between;margin:10px 19px 0}.analytics-ct-header-right{display:flex;flex-direction:row;justify-content:space-around;width:220px}.analytics-ct-header-right .analytics-selector{margin-top:8px;min-width:100px}.analytics-ct-legend{-webkit-align-items:center;align-items:center;-webkit-align-self:flex-end;align-self:flex-end;color:#5f6368;display:flex;-ms-flex:0 0;-webkit-flex:0 0;flex:0 0;flex-direction:row;font-size:12px;margin:0 20px 20px;text-align:center}.analytics-ct-legend-comment,.analytics-ct-legend-edit{display:flex;-webkit-align-items:center;align-items:center}.analytics-ct-legend-comment-disabled{opacity:30%}.analytics-ct-legend-comment-circle{background-color:#fff;border-radius:50%;border:2px solid #3c4043;height:4px;width:4px}.analytics-ct-legend-label{margin-left:4px}.analytics-ct-legend-box{-webkit-align-items:center;align-items:center;display:flex;margin-left:12px}.analytics-ct-legend-edit-bar{height:12px;width:4px}.analytics-drp{align-items:center;display:flex;flex-direction:row;margin-left:16px;max-width:400px}.analytics-drp-left,.analytics-drp-right{border-radius:20px;cursor:pointer;height:auto;padding:8px;right:11px}.analytics-drp-left.jfk-button-hover,.analytics-drp-right.jfk-button-hover{background-color:#f1f3f4}.analytics-drp-left.jfk-button-focused,.analytics-drp-right.jfk-button-focused{background-color:#e8eaed}.analytics-drp-left.jfk-button-disabled,.analytics-drp-right.jfk-button-disabled{opacity:0.6;cursor:default}.analytics-drp-date-range{color:#202124;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:16px}.analytics-drpd{-webkit-align-items:center;align-items:center;display:flex;height:28px;margin:auto 3px;padding:0}.docs-analytics-hc-ie .analytics-drpd{-ms-high-contrast-adjust:none;background-color:white}.analytics-drpd-icon{border-radius:100%;display:inline-block;height:9px;margin-right:8px;width:9px}.analytics-drpd .docs-material-menu-button-flat-default-dropdown{margin:0}.analytics-drpd.docs-material-menu-button-flat-default-hover{background-color:rgba(0,0,0,0.06)}.analytics-drpd.docs-material-menu-button-flat-default-focused{background-color:rgba(0,0,0,0.12);border-color:transparent}.analytics-drp .goog-menu .goog-menuitem{padding:6px 25px 6px 18px}.analytics-dialog-bg,.analytics-od-bg,.analytics-npd-bg{background:rgba(0,0,0,0.6);left:0;position:absolute;top:0}.analytics-dialog-bg,.analytics-od-bg{z-index:1002}.analytics-dialog,.analytics-od,.analytics-npd{background-color:#fff;border:0;border-radius:8px;box-shadow:0 16px 24px 2px rgba(0,0,0,0.14),0 6px 30px 5px rgba(0,0,0,0.12),0 8px 10px -5px rgba(0,0,0,0.14);display:flex;flex-direction:column;outline:0;position:absolute}.analytics-dialog,.analytics-od{z-index:1003}.analytics-dialog-content,.analytics-od-content,.analytics-npd-content{display:flex;flex-direction:column;-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;min-height:0}.analytics-npd-bg{z-index:1004}.analytics-npd{z-index:1005}.analytics-ec-content{-webkit-align-items:center;align-items:center;display:flex;flex-direction:column;box-pack:center;-ms-flex-pack:center;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center;width:100%}.analytics-ec-message-container{width:100%}.analytics-ec-message{color:rgba(0,0,0,0.6);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:16px;font-weight:400;line-height:24px;padding:16px 128px;text-align:center}.analytics-ec-container{-webkit-align-items:center;align-items:center;display:flex;-ms-flex:1;-webkit-flex:1;flex:1;flex-direction:column;-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;box-pack:center;-ms-flex-pack:center;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center;width:100%;height:100%}.analytics-vhc-feedbackcard{color:rgba(0,0,0,0.87);font-size:11px;font-style:italic;margin:0}.analytics-vhc-feedbackcard-button,.analytics-vhc-feedbackcard-button:link,.analytics-vhc-feedbackcard-button:visited{color:#4285f4;cursor:pointer;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:11px;font-style:italic;height:14px;line-height:14px;margin:0 0 0 2px;text-decoration:none}.analytics-vhfc-card{border-bottom-right-radius:8px;border-top:1px solid #e0e0e0;box-shadow:0 2px 12px 2px rgba(60,64,67,.15);-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-top:auto;z-index:1}.analytics-vhfc-settings-container,.analytics-vhfc-feedback-container,.analytics-vhfc-nudge-container{-webkit-align-items:center;align-items:center;display:flex;flex-direction:row}.analytics-vhfc-settings-container{height:56px;box-pack:justify;-ms-flex-pack:justify;-webkit-box-pack:justify;-webkit-justify-content:space-between;justify-content:space-between;padding:0 24px}.analytics-vhfc-label{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;margin-right:24px}.analytics-vhfc-label a:link,.analytics-vhfc-label a:visited{color:#4285f4;text-decoration:none}.analytics-vhfc-feedback-container{background-color:#f5f5f5;border-bottom-right-radius:8px;height:32px;padding:0 24px}.analytics-vhfc-feedback-container .analytics-vhc-feedbackcard{color:rgba(0,0,0,0.54);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400}.analytics-vhfc-feedback-container .analytics-vhc-feedbackcard-button{font-size:12px;font-style:normal}.analytics-vhfc-nudge-container{background-color:#fff;border-bottom-right-radius:8px;box-pack:justify;-ms-flex-pack:justify;-webkit-box-pack:justify;-webkit-justify-content:space-between;justify-content:space-between;height:56px;padding:0 8px 0 32px}.analytics-vhfc-nudge-buttons{align-items:center;display:flex;box-pack:justify;-ms-flex-pack:justify;-webkit-box-pack:justify;-webkit-justify-content:flex-end;justify-content:flex-end}.analytics-vhfc-nudge-cancel-button.jfk-button,.analytics-vhfc-nudge-continue-button.jfk-button{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;color:#188038;cursor:pointer;margin:0 8px;padding-left:8px;padding-right:8px;white-space:normal;word-wrap:break-word}.analytics-vhfc-nudge-cancel-button{color:#80868b}.analytics-vhfc-nudge-cancel-button.jfk-button-hover,.analytics-vhfc-nudge-continue-button.jfk-button-hover{background-color:#f8fcf9}.analytics-vhfc-nudge-cancel-button.jfk-button-focused,.analytics-vhfc-nudge-continue-button.jfk-button-focused{background-color:#e7f5eb}.analytics-vhfc-nudge-cancel-button.jfk-button-focused.jfk-button-hover,.analytics-vhfc-nudge-continue-button.jfk-button-focused.jfk-button-hover{background-color:#dff2e4}.analytics-vhfc-nudge-cancel-button.jfk-button-focused.jfk-button-active,.analytics-vhfc-nudge-continue-button.jfk-button-focused.jfk-button-active{background-color:#dff2e4;box-shadow:0 1px 3px 1px rgba(60,64,67,.15)}.analytics-vhfc-nudge-label{color:#3c4043;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;max-width:300px}.analytics-vhc-groupcard-root{border-bottom:0;position:relative}.analytics-vhc-groupcard-root::after{border-bottom:1px solid #e0e0e0;bottom:0;content:'';display:block;height:0;left:72px;position:absolute;width:calc(100% - 72px)}.analytics-vhc-groupcard-members .analytics-vhc-groupcard-root::after{left:48px;width:calc(100% - 48px)}.analytics-vhc-rowcard-root:last-child::after{display:none}.analytics-vhc-groupcard-root>.analytics-vhc-rowcard-row{border-bottom:1px solid transparent}.analytics-vhc-groupcard-root>.analytics-vhc-rowcard-row::after{border-bottom:0}.analytics-vhc-groupcard-root>.analytics-vhc-rowcard-row>.jfk-button{cursor:pointer;height:calc(48px - 2px);width:calc(100% - 2px)}.analytics-vhc-groupcard-root>.analytics-vhc-rowcard-row>.jfk-button-disabled{cursor:default}.analytics-vhc-groupcard-groupimg{height:32px;margin:0 16px 0 23px;vertical-align:middle;width:32px}.analytics-vhc-groupcard-message{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;padding:0 0 12px 72px}.analytics-vhc-groupcard-message-warning{color:rgba(0,0,0,0.6);font-style:italic}.analytics-vhc-groupcard-message-error{color:#dd4330}.analytics-vhc-groupcard-members{margin-left:72px}.analytics-vhc-groupcard-members .analytics-vhc-groupcard-members{margin-left:48px}.analytics-vhc-groupcard-members .analytics-vhc-groupcard-message{padding-left:48px}.analytics-vhc-groupcard-members .analytics-vhc-viewcardlist{border-top:0}.analytics-vhc-groupcard-members .analytics-vhc-viewcardlist>div:last-child,.analytics-vhc-groupcard-members .analytics-vhc-viewcardlist>.analytics-vhc-viewercard-root:last-child>.analytics-vhc-rowcard-row{border-bottom:0}.analytics-vhc-groupcard-members .analytics-vhc-rowcard-profile .analytics-profile-image,.analytics-vhc-groupcard-members .analytics-vhc-rowcard-profile .analytics-vhc-groupcard-groupimg{margin-left:0}.analytics-vhc-groupcard-root>.analytics-vhc-rowcard-row .analytics-vhc-rowcard-profile{border:0;box-shadow:none;font-weight:400;margin:0;min-width:0;padding:0}.analytics-vhc-groupcard-expand-icon{margin-top:-2px}.analytics-vhc-groupcard-contracted .analytics-vhc-groupcard-expand-icon{margin-left:-7px;margin-right:6px}.analytics-vhc-groupcard-expanded .analytics-vhc-groupcard-expand-icon{margin-left:-4px;margin-right:3px}.analytics-vhc-groupcard-expanded>.analytics-vhc-rowcard-row .analytics-vhc-rowcard-time{visibility:hidden}.analytics-vhc-groupcard-expanded>.analytics-vhc-rowcard-row .analytics-vhc-rowcard-tooltip-icon{visibility:hidden}.analytics-lmec-link,.analytics-lmec-link:active,.analytics-lmec-link:hover,.analytics-lmec-link:link,.analytics-lmec-link:visited{color:#4285f4;cursor:pointer;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:16px;font-weight:400;text-decoration:none}.analytics-vhc-listsortbutton{-webkit-align-items:center;align-items:center;cursor:pointer;display:flex;flex-direction:row;margin:auto 24px auto 24px}.analytics-vhc-listsortbutton-mouse-focus{outline:0}.analytics-vhc-listsortbutton:last-child{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin:auto -10px auto 0;width:107px}.analytics-vhc-checkboxes-visible .analytics-vhc-listsortbutton:last-child{margin:auto 72px auto 0;width:107px}.analytics-vhc-listsortbutton-name{color:#5f6368;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;margin:0 8px 0 0}.analytics-vhc-listsortbutton-arrow{height:18px;width:18px}.analytics-vhc-listsortbutton-uwsa .analytics-vhc-listsortbutton-arrow,.analytics-vhc-listsortbutton-uwsd .analytics-vhc-listsortbutton-arrow{visibility:hidden}.analytics-vhc-listsortbutton-ascending .analytics-vhc-listsortbutton-arrow,.analytics-vhc-listsortbutton-descending .analytics-vhc-listsortbutton-arrow{opacity:0.87}.analytics-low-data-treatment-title{color:#25272b;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:28px;padding:0 48px 8px 48px}.analytics-low-data-treatment-description{color:#414549;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:16px;line-height:24px;padding:0 48px 16px 48px}.analytics-dialog .analytics-low-data-treatment-sharebutton .docs-icon{margin-top:0;margin-bottom:0;margin-right:3px}.analytics-low-data-treatment-sharebutton.jfk-button{align-items:center;align-self:center;display:flex;flex-direction:row;box-pack:justify;-ms-flex-pack:justify;-webkit-box-pack:justify;-webkit-justify-content:center;justify-content:center;margin:0;padding-bottom:9px!important;padding-left:12px!important;padding-right:16px!important}.analytics-nc-container{display:flex;-ms-flex:1;-webkit-flex:1;flex:1;flex-direction:column;-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;min-height:0}.analytics-nc-navigationarea{display:flex;-ms-flex:1;-webkit-flex:1;flex:1;flex-direction:row;-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;min-height:0}.analytics-nc-tabbar{background-color:#fff;border-bottom-left-radius:8px;border-right:1px solid #e0e0e0;position:relative;width:256px;z-index:2}.analytics-nc-tabbar-collapsed{width:64px}.analytics-nc-content{display:flex;-ms-flex:1;-webkit-flex:1;flex:1;flex-direction:column;-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;min-height:0;overflow-x:hidden;width:623px}.analytics-nc-navigationbar{background-color:#fff;border-bottom:1px solid #e0e0e0;border-top-left-radius:8px;border-top-right-radius:8px;z-index:2}.analytics-npd{border-radius:8px;width:490px}.analytics-npd::before{border:1px solid transparent;border-radius:8px;bottom:-1px;content:'';left:-1px;position:absolute;right:-1px;top:-1px}.analytics-npd-title{color:#202124;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:22px;margin:24px 24px 0 24px}.analytics-npd-paragraph{color:rgba(0,0,0,0.6);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:16px;line-height:24px;margin:24px 24px 0 24px}.analytics-npd-buttons{display:flex;flex-direction:row;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;box-pack:justify;-ms-flex-pack:justify;-webkit-box-pack:justify;-webkit-justify-content:flex-end;justify-content:flex-end;margin:40px 0 24px 24px}.analytics-npd-cancelbutton{margin:0 8px}.analytics-npd-continuebutton{margin:0 24px 0 8px}.analytics-ntb-container .goog-tab-bar{background-color:#fff;margin-top:20px;width:100%}.analytics-ntb-container .goog-tab{-webkit-align-items:center;align-items:center;background-color:#fff!important;border:0;border-top-right-radius:20px;border-bottom-right-radius:20px;color:#3c4043;cursor:pointer;display:flex;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;-ms-flex:1;-webkit-flex:1;flex:1;flex-direction:row;-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;height:44px;margin:0 10px 0 0!important;padding:0!important;text-decoration:none}.analytics-nc-tabbar-collapsed .analytics-ntb-container .goog-tab{border-radius:22px;margin:0 10px!important}.analytics-ntb-container .goog-tab.goog-tab-hover{background-color:#f1f3f4!important}.analytics-ntb-container .goog-tab.goog-tab-selected{background-color:#e6f4ea!important;color:#188038;left:0}.analytics-ntb-container .goog-tab.goog-tab-selected::before,.analytics-ntb-container .goog-tab-hover::before{border-bottom:1px solid transparent;border-right:1px solid transparent;border-top:1px solid transparent;border-top-right-radius:20px;border-bottom-right-radius:20px;bottom:-1px;content:'';left:0;position:absolute;right:-1px;top:-1px;z-index:1}.analytics-ntb-container .goog-tab.goog-tab-selected.goog-tab-hover{background-color:#ceead6!important}.analytics-ntb-tab-icon{height:24px;margin:0 16px 0 24px;width:24px}.analytics-nc-tabbar-collapsed .analytics-ntb-tab-icon{margin:0 10px}.analytics-ntb-tab-text{max-width:180px}.analytics-ntb-tab-content{-webkit-align-items:center;align-items:center;display:flex;-ms-flex:1;-webkit-flex:1;flex:1;flex-direction:row;-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1}.analytics-nsc,.analytics-nsc-content{color:#202124;display:flex;flex-direction:column;-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;overflow-x:hidden;overflow-y:auto}.analytics-nsc-content{margin:24px 32px 0 32px}.analytics-nsc-offline,.analytics-nsc-save-failed{-webkit-align-items:center;align-items:center;background-color:#eeeeee;border-bottom:1px solid #e0e0e0;color:#dd4330;display:flex;flex-direction:row;font-size:13px;height:48px;padding:0 24px 0 24px}.analytics-nsc-heading,.analytics-nsc-subheading{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;line-height:26px;margin:0 0 16px 0}.analytics-nsc-heading{font-size:18px}.analytics-nsc-subheading{font-size:14px}.analytics-nsc-edit-digest-section{-webkit-align-items:center;align-items:center;display:flex;flex-direction:row;font-size:14px;height:48px;box-pack:justify;-ms-flex-pack:justify;-webkit-box-pack:justify;-webkit-justify-content:space-between;justify-content:space-between}.analytics-nsc-edit-digest-select{min-width:240px;width:auto}.analytics-nsc-edit-section,.analytics-nsc-form-section{margin-bottom:16px}.analytics-nsc-switches{display:flex;flex-direction:row}.analytics-nsc-switches .docs-material-gm-labeled-checkbox,.analytics-nsc-switches .docs-material-gm-labeled-checkbox-label{cursor:pointer}.analytics-nsc-switch{margin-right:32px}.analytics-nsc-footer{-webkit-align-items:center;align-items:center;display:flex;flex-direction:row;height:80px;box-pack:end;-ms-flex-pack:end;-webkit-box-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end;margin:0 32px}.analytics-nsc-cancel-button{margin-right:16px}.analytics-nvtt-content{display:flex;flex-direction:row;padding:9px 7px}.analytics-nvtt-text{color:#fff}.analytics-nvtt-learnmore,.analytics-nvtt-learnmore:visited,.analytics-nvtt-learnmore:link,.analytics-nvtt-learnmore:hover{color:#7baaf7;margin-left:14px;text-decoration:none}.analytics-ndch{-webkit-align-items:center;align-items:center;background-color:#fff;border:1px solid #dadce0;box-sizing:border-box;-webkit-border-radius:16px;-moz-border-radius:16px;border-radius:16px;display:flex;flex-direction:row;height:24px;margin:0 8px 4px 0}.analytics-ndch-viewer-icon,.analytics-ndch-group-icon{-webkit-border-radius:50%;-moz-border-radius:50%;border-radius:50%;height:20px;margin-left:1px;overflow:hidden;width:20px}.analytics-ndch-text{color:#5f6368;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:500;padding-left:8px}.analytics-ndch-remove-button{-webkit-align-items:center;align-items:center;cursor:pointer;display:flex;box-pack:center;-ms-flex-pack:center;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center;padding:0 4px 0 3px}.analytics-ndch-remove-button .docs-analytics-icon{opacity:0.87}.analytics-ndch:only-child .analytics-ndch-remove-button{display:none}.analytics-ndch:only-child .analytics-ndch-text{padding-right:8px}.analytics-ndc,.analytics-ndc-body{-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1}.analytics-ndc-body{display:flex;flex-direction:column;overflow-y:auto;padding:32px 32px 0 32px}.analytics-ndc-send-email-title{color:#202124;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:18px;margin-bottom:16px}.analytics-ndc-chip-title{color:rgba(0,0,0,0.54);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;margin-bottom:8px}.analytics-ndc-chip-container{display:flex;flex-direction:row;-moz-flex-wrap:wrap;-ms-flex-wrap:wrap;-webkit-flex-wrap:wrap;flex-wrap:wrap;max-height:71px;min-height:28px;overflow-y:auto}.analytics-ndc-subject-container{height:36px;margin-top:20px}.analytics-ndc-subject-container input::-ms-clear{display:none}.analytics-ndc-subject-container .docs-material-labeled-text-field{background-color:#fff;border:1px solid #dadce0;border-radius:4px;box-sizing:border-box;display:flex;flex-direction:column;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;height:initial;line-height:initial;padding:0}.analytics-ndc-subject-container .docs-material-labeled-text-field-hover{border:1px solid #bdc1c6;box-sizing:border-box}.analytics-ndc-subject-container .docs-material-labeled-text-field-focused{border:2px solid #1a73e8;box-sizing:border-box;margin:-1px 0 0 -1px}.analytics-ndc-subject-container .docs-material-labeled-text-field-content{padding:0 7px}.analytics-ndc-subject-container .docs-material-labeled-text-field-input{padding:0 8px}.analytics-ndc-subject-container .docs-material-labeled-text-field-input{color:#3c4043;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;height:100%;line-height:normal;padding:9px}.analytics-ndc-subject-container .docs-material-labeled-text-field-label{background-color:#fff;color:#5f6368;font-size:12px;line-height:13px;padding:0 3px;transform:translateY(-7px) scale(1,1)}.analytics-ndc-subject-container .docs-material-labeled-text-field:not(.docs-material-labeled-text-field-focused) .docs-material-labeled-text-field-input{border-bottom-color:transparent}.analytics-ndc-subject-container .docs-material-labeled-text-field-input{border-bottom:0}.analytics-ndc-message-container{background-color:#fff;margin-top:16px;max-height:108px}.analytics-ndc-message-container .docs-material-text-area{border:1px solid #dadce0;border-radius:4px;box-sizing:border-box;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;max-height:108px;min-height:108px;overflow-y:auto!important;padding:7px 9px}.analytics-ndc-message-container .docs-material-text-area:hover{border:1px solid #bdc1c6;box-sizing:border-box}.analytics-ndc-message-container .docs-material-text-area:focus{border:2px solid #1a73e8;box-sizing:border-box;margin:-1px 0 0 -1px}.analytics-ndc-document-info-container{-webkit-align-items:center;align-items:center;background-color:#fff;display:flex;-ms-flex:0 0 auto;-webkit-flex:0 0 auto;flex:0 0 auto;flex-direction:row;margin-top:16px;max-width:100%;outline:none}.analytics-ndc-document-info{-webkit-align-items:center;align-items:center;border-radius:100px;display:flex;flex-direction:row}.analytics-ndc-document-icon-container{outline:none;margin:0 0 0 4px}.analytics-ndc-document-title{color:rgb(60,64,67);display:block;flex-direction:column;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;line-height:16px;overflow:hidden;padding:0 8px;text-overflow:ellipsis;overflow:hidden;text-overflow:ellipsis;-webkit-box-orient:vertical;-webkit-line-clamp:3;display:-webkit-box;max-height:45px}.analytics-ndc-document-title a{color:#4285f4!important}.analytics-ndc-send-to-myself-container{-webkit-align-items:center;align-items:center;display:flex;flex-direction:row;box-pack:justify;-ms-flex-pack:justify;-webkit-box-pack:justify;-webkit-justify-content:flex-start;justify-content:flex-start;margin-left:-1px;margin-top:12px}.analytics-ndc-send-to-myself-container .docs-material-gm-labeled-checkbox{cursor:pointer}.analytics-ndc-send-to-myself-container .docs-material-gm-labeled-checkbox-label{color:#5f6368;cursor:pointer;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:400}.analytics-ndc-buttons{-webkit-align-items:start;align-items:start;bottom:0;display:flex;flex-direction:row;box-pack:justify;-ms-flex-pack:justify;-webkit-box-pack:justify;-webkit-justify-content:flex-end;justify-content:flex-end;min-height:60px;width:100%}.analytics-ndc-cancel-button{margin:0 8px}.analytics-ndc-send-email-button{margin:0 32px 0 8px}.analytics-ndc-chip-button{-webkit-align-items:center;align-items:center;border:1px solid #dadce0;border-radius:100px;cursor:pointer;display:flex;line-height:normal;margin-right:0;padding:8px}.analytics-ndc-chip-button.jfk-button-focused{background-color:rgba(60,64,67,0.06);border:1px solid #dadce0!important}.analytics-ndc-chip-button.jfk-button-hover{background-color:rgba(60,64,67,0.04)}.analytics-ndc-chip-button.jfk-button-hover.jfk-button-focused{background-color:rgba(60,64,67,0.06)}.analytics-ndc-chip-button.jfk-button-active{background-color:rgba(60,64,67,0.06);box-shadow:0 2px 6px 2px rgba(60,64,67,.15)}.analytics-ndc-toast.docs-ui-toast{border:1px inset;border-color:rgba(255,255,255,0.2) rgba(255,255,255,0.1) rgba(255,255,255,0) rgba(255,255,255,0);box-shadow:0 6px 6px rgba(0,0,0,0.15);padding:14px 24px;z-index:1003}.analytics-ndc-toast.docs-ui-toast .docs-ui-toast-content{color:#fff;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:400}.analytics-vhc-nudgeselectdropdown-container .analytics-ndsd{-webkit-align-items:center;align-items:center;display:flex;margin:auto 0;padding-left:2px;visibility:hidden}.analytics-vhc-nudgeselectdropdown-container .goog-menu{position:fixed}.analytics-vhc-checkboxes-visible .analytics-ndsd{visibility:visible}.docs-analytics-hc-ie .analytics-ndsd{-ms-high-contrast-adjust:none;background-color:white}.analytics-ndsd-icon-container{height:24px;opacity:0.56;width:24px}.analytics-od{width:384px}.analytics-od,.analytics-od-content{border-radius:8px}.analytics-od-title{display:none}.analytics-od-picture{border-top-left-radius:8px;border-top-right-radius:8px;height:216px}.analytics-od-header{color:rgba(0,0,0,0.87);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:18px;font-weight:500;margin:26px 24px 18px 24px}.analytics-od-body{color:rgba(0,0,0,0.7);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;font-weight:400;margin:0 24px 0 24px}.analytics-od-paragraph{line-height:20px;margin:0 0 18px 0}.analytics-od-learnmorebutton,.analytics-od-learnmorebutton:active,.analytics-od-learnmorebutton:hover,.analytics-od-learnmorebutton:link,.analytics-od-learnmorebutton:visited{align-self:left;color:#4285f4;cursor:pointer;text-decoration:none}.analytics-od-settingsbutton,.analytics-od-settingsbutton:focus,.analytics-od-settingsbutton:hover,.analytics-od-okbutton,.analytics-od-okbutton:focus,.analytics-od-okbutton:hover{margin:4px;white-space:normal}.analytics-od-buttons{display:flex;flex-direction:row;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-moz-flex-wrap:wrap;-ms-flex-wrap:wrap;-webkit-flex-wrap:wrap;flex-wrap:wrap;box-pack:justify;-ms-flex-pack:justify;-webkit-box-pack:justify;-webkit-justify-content:center;justify-content:center;margin:18px 24px 24px 24px}.analytics-od-okbutton{min-width:155px;width:auto;width:unset}.analytics-profile-image{-webkit-border-radius:50%;-moz-border-radius:50%;border-radius:50%;height:32px;max-height:36px;max-width:36px;width:32px}.analytics-rec-buttons{-webkit-align-items:center;align-items:center;display:flex;flex-direction:row;height:48px}.analytics-vhc-rowcard-root{width:100%}.analytics-vhc-rowcard-row,.analytics-vhc-rowcard-row-button{-webkit-align-items:center;align-items:center;display:flex;flex-direction:row;height:48px;text-align:left;width:100%}.analytics-vhc-rowcard-row{position:relative}.analytics-vhc-rowcard-row::after{border-bottom:1px solid #e0e0e0;bottom:0;content:'';display:block;height:0;left:72px;position:absolute;width:calc(100% - 72px)}.analytics-vhc-groupcard-members .analytics-vhc-rowcard-row::after{left:48px;width:calc(100% - 48px)}.analytics-vhc-rowcard-root:last-child>.analytics-vhc-rowcard-row::after{display:none}.analytics-vhc-rowcard-profile{-webkit-align-items:center;align-items:center;display:flex;flex-direction:row;-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1}.analytics-vhc-rowcard-name{color:#202124;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;margin-right:24px;white-space:normal}.analytics-vhc-rowcard-time{color:#202124;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;margin-right:36px;width:110px}.analytics-vhc-rowcard-row-button>.analytics-vhc-rowcard-time{width:108px}.analytics-vhc-rowcard-time-container{-webkit-align-items:center;align-items:center;display:flex;flex-direction:row}.analytics-vhc-rowcard-timenever .analytics-vhc-rowcard-time{font-style:italic}.analytics-vhc-rowcard-timeabsent .analytics-vhc-rowcard-time,.analytics-vhc-rowcard-iconabsent .analytics-vhc-rowcard-tooltip-icon{visibility:hidden}.analytics-vhc-rowcard-tooltip-icon{opacity:0.56;padding:5px 0 5px 0}.analytics-vhc-rowcard-checkbox-container{display:none;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.analytics-vhc-checkboxes-visible .analytics-vhc-rowcard-checkboxvisible .analytics-vhc-rowcard-checkbox-container,.analytics-vhc-checkboxes-visible .analytics-vhc-rowcard-checkboxinvisible .analytics-vhc-rowcard-checkbox-container{display:inherit;margin:7px 32px 7px 30px;padding:1px}.analytics-vhc-rowcard-checkboxinvisible .analytics-vhc-rowcard-checkbox-container{visibility:hidden}.analytics-vhc-rowcard-spacing{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.analytics-selector{height:30px;min-width:140px}.docs-analytics-hc-ie .analytics-selector .docs-material-select-dropdown{-ms-high-contrast-adjust:none;background-color:white}.analytics-selector-menu.goog-menu .goog-menuitem{font-size:14px;padding-right:30px}.analytics-sc,.analytics-sc-settings{-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1}.analytics-sc-settings{overflow-y:auto}.analytics-sc-settings-loading{visibility:hidden}.analytics-sc-disabled-by-admin-explanation,.analytics-sc-view-visibility-explanation{color:rgba(0,0,0,0.87);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;line-height:18px;margin:24px 24px 0 24px;padding:0 100px 0 0}.analytics-sc-view-visibility-explanation{border-bottom:1px solid rgba(0,0,0,0.4);padding-bottom:24px}.analytics-sc-disabled-by-admin-explanation-link,.analytics-sc-disabled-by-admin-explanation-link:active,.analytics-sc-disabled-by-admin-explanation-link:hover,.analytics-sc-disabled-by-admin-explanation-link:link,.analytics-sc-disabled-by-admin-explanation-link:visited{color:#4285f4;cursor:pointer;text-decoration:none}.analytics-sc-account-setting,.analytics-sc-document-setting{margin:0 0 0 32px;padding:24px 0}.analytics-sc-document-setting{border-top:1px solid #e0e0e0}.analytics-sc-account-itemlabel,.analytics-sc-document-itemlabel{color:#202124;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:18px;line-height:24px}.analytics-sc-section-label{color:#3c4043;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;line-height:20px}.analytics-sc-section{-webkit-align-items:center;align-items:center;display:flex;flex-direction:row;justify-content:space-between;margin:16px 32px 0 0}.analytics-sc .analytics-sc-account-show-setting-button{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;color:#188038;cursor:pointer;margin-right:0;max-width:200px;white-space:normal;word-wrap:break-word}.analytics-sc-account-show-setting-button.jfk-button-hover{background-color:#f8fcf9}.analytics-sc-account-show-setting-button.jfk-button-focused{background-color:#e7f5eb}.analytics-sc-account-show-setting-button.jfk-button-focused.jfk-button-hover{background-color:#dff2e4}.analytics-sc-account-show-setting-button.jfk-button-focused.jfk-button-active{background-color:#dff2e4;box-shadow:0 1px 3px 1px rgba(60,64,67,.15)}.analytics-sc-account-switch,.analytics-sc-document-switch{margin-left:5px}.analytics-sc-account-explanation,.analytics-sc-document-explanation{color:#25272b;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;line-height:20px;margin:11px 110px 0 0;width:auto}.analytics-sc-account-explanation a:link,.analytics-sc-account-explanation a:visited{color:#4285f4;text-decoration:none}.analytics-sc-buttons{-webkit-align-items:center;align-items:center;bottom:0;display:flex;flex-direction:row;height:84px;box-pack:justify;-ms-flex-pack:justify;-webkit-box-pack:justify;-webkit-justify-content:flex-end;justify-content:flex-end;width:100%}.analytics-sc-cancel-button{margin:0 8px}.analytics-sc-done-button,.analytics-sc-save-button{margin:0 32px 0 8px}.analytics-sc-section .apps-ui-material-slide-toggle-container{cursor:pointer;margin-right:2px}.analytics-sc-section .apps-ui-material-slide-toggle-container.apps-ui-material-slide-toggle-container-disabled{cursor:default}.analytics-sc-section .apps-ui-material-slide-toggle-container-checked .apps-ui-material-slide-toggle-track{background-color:#ceead6;opacity:1}.analytics-sc-section .apps-ui-material-slide-toggle-container-checked .apps-ui-material-slide-toggle-thumb{background-color:#188038}.analytics-sc-section .apps-ui-material-slide-toggle-container-checked.apps-ui-material-slide-toggle-container-disabled .apps-ui-material-slide-toggle-track{opacity:0.07}.analytics-sc-section .apps-ui-material-slide-toggle-container-checked.apps-ui-material-slide-toggle-container-disabled .apps-ui-material-slide-toggle-thumb{opacity:0.26}.analytics-sc-section .apps-ui-material-slide-toggle-thumb{opacity:1.0}.analytics-sc-section .apps-ui-material-slide-toggle-container-focused .apps-ui-material-slide-toggle-thumb{box-shadow:0 0 6px rgba(0,0,0,.16),0 6px 12px rgba(0,0,0,.32);opacity:1.0}.analytics-sc-section .apps-ui-material-slide-toggle-container-hover .apps-ui-material-slide-toggle-thumb{opacity:1.0}.analytics-sc .analytics-ec-container{margin-bottom:72px;margin-top:56px}.analytics-sfc-card{-webkit-align-items:center;align-items:center;background-color:#eeeeee;border-bottom:1px solid #e0e0e0;display:flex;flex-direction:row;height:48px}.analytics-sfc-label{color:#dd4330;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;font-weight:400;margin:0 24px 0 24px}.analytics-sic{background-color:#fff;box-shadow:0 1px 0 0 #dadce0;display:flex;-ms-flex:1;-webkit-flex:1;flex:1;flex-direction:column;-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1}.analytics-sic-content{-webkit-align-items:center;align-items:center;color:#414549;display:flex;-ms-flex:1;-webkit-flex:1;flex:1;-webkit-flex-basis:auto;-ms-flex-basis:auto;flex-basis:auto;flex-direction:row;-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;box-pack:justify;-ms-flex-pack:justify;-webkit-box-pack:justify;-webkit-justify-content:flex-start;justify-content:flex-start;line-height:18px;margin:10px 0;min-height:38px}.analytics-sic-icon{height:20px;margin:0 10px 0 30px;min-width:20px;width:20px}.analytics-sic-text{margin-right:32px}.analytics-shc{overflow:hidden}.analytics-shc .activity-deck{display:flex;-ms-flex:1;-webkit-flex:1;flex:1;min-height:0;position:relative}.analytics-shc .activity-deck-events-view,.analytics-shc .activity-deck-empty-view{display:flex;-ms-flex:1;-webkit-flex:1;flex:1;height:auto;min-height:0;overflow:hidden;width:100%}.analytics-shc .activity-deck-empty-view{-webkit-align-items:center;align-items:center;box-pack:center;-ms-flex-pack:center;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center}.analytics-shc .activity-list{-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;height:auto;width:100%}.analytics-shc .activity-event-target-list{display:none}.analytics-shc .activity-event-header{-webkit-align-items:center;align-items:center;display:flex;height:40px}.analytics-shc .activity-event-scopes-list{margin-top:0;padding-left:72px}.analytics-shc .activity-event>div:first-child{padding-bottom:0}.analytics-shc .activity-event-scopes-container{padding:8px 0}.analytics-shc .activity-event-scope-change-detail{padding-top:8px}.analytics-shc .activity-event-scope-change-detail.activity-event-scope-change-detail-first{padding-top:2px}.analytics-ssc{-webkit-align-items:center;align-items:center;border-bottom:1px solid #e0e0e0;color:#5f6368;display:flex;flex-direction:row;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;justify-content:space-between;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:500;overflow:hidden;padding:8px 12px 8px 16px}.analytics-ssc-summary{margin-right:12px}.analytics-ssc-manage-settings-button.analytics-btn-text.jfk-button{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;font-size:13px}.analytics-ssc-summary{-webkit-align-items:center;align-items:center;display:flex;flex-direction:row}.analytics-ssc-icon{margin-right:8px}.analytics-trc{-webkit-align-items:center;align-items:center;color:rgba(0,0,0,0.87);display:flex;-ms-flex:none;-webkit-flex:none;flex:none;flex-direction:row;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:16px;font-weight:500;margin:24px 24px 18px 24px}.analytics-tb-container{-webkit-align-items:center;align-items:center;display:flex;flex-direction:row;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;height:72px;box-pack:justify;-ms-flex-pack:justify;-webkit-box-pack:justify;-webkit-justify-content:space-between;justify-content:space-between}.analytics-tb-title-text{color:rgba(0,0,0,0.87);font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:22px;margin:0 0 0 24px}.analytics-tb-close{border:0!important;border-radius:20px;cursor:pointer;display:inline-flex;height:auto;margin:0;opacity:0.54;padding:8px;position:absolute;right:11px;top:16px;z-index:2}.analytics-tb-close.jfk-button-hover{background-color:#f1f3f4;border:0}.analytics-tb-close.jfk-button-focused{background-color:#e8eaed;border:0}.analytics-ttmw{line-height:13px}.analytics-tt-content{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:11px;font-weight:500}.analytics-appbar-tt-content{line-height:15px;max-width:320px;padding:0;word-break:normal}.analytics-tpec-total-unique-viewers,.analytics-tpec-explanation{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:400;padding:0 128px}.analytics-tpec-total-unique-viewers{color:#212121;font-size:16px;line-height:24px;padding-bottom:8px}.analytics-tpec-explanation{color:#757575;font-size:13px}.analytics-tpec-container{-webkit-align-items:center;align-items:center;display:flex;-ms-flex:1;-webkit-flex:1;flex:1;flex-direction:column;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;min-height:132px;text-align:center;width:100%}.analytics-tpec-heading{color:#25272b;font-size:28px;height:36px}.analytics-tpec-paragraph{color:#414549;font-size:16px;margin:8px 0 16px 0;width:400px}.analytics-tpec-viewer-trend-button.jfk-button{-webkit-align-items:center;align-items:center;font-weight:500}.analytics-tc{-webkit-align-items:center;align-items:center;color:rgba(0,0,0,0.87);display:flex;-ms-flex:1 1 auto;-webkit-flex:1 1 auto;flex:1 1 auto;flex-direction:row;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;font-weight:400;min-height:30px}.analytics-tc-message{display:inline}.analytics-tc-comments-count{display:inline;font-weight:500}.analytics-tc-tooltip-icon{margin:0 24px 0 6px;opacity:0.56}.analytics-tuvc{-webkit-align-items:center;align-items:center;color:rgba(0,0,0,0.87);display:flex;-ms-flex:1 1 auto;-webkit-flex:1 1 auto;flex:1 1 auto;flex-direction:row;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;font-weight:400;min-height:30px}.analytics-tuvc-message{display:inline}.analytics-tuvc-viewers-count{display:inline;font-weight:500}.analytics-tuvc-tooltip-icon{margin:0 24px 0 6px;opacity:0.56}.analytics-tcc,.analytics-tcc-chart-container,.analytics-tcc-chart{display:flex;flex-direction:column;-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;min-height:120px;overflow:hidden}.analytics-tcc-chart .google-visualization-tooltip{pointer-events:none}.analytics-tcc-data-table{position:absolute;overflow:hidden;height:1px;left:-10000px;top:auto;width:1px}.analytics-trend-sparkline-graph{-ms-flex:0 0 auto;-webkit-flex:0 0 auto;flex:0 0 auto;height:60px;position:relative}.analytics-trend-sparkline-chart{height:32px;left:24px;position:absolute;right:24px;top:8px;z-index:3}.analytics-trend-sparkline-chart.analytics-trend-sparkline-dragging{cursor:col-resize}.analytics-trend-sparkline-slider{left:14.5px;position:absolute;right:14.5px;top:8px;z-index:4}.analytics-trend-sparkline-left-bg,.analytics-trend-sparkline-right-bg{border-color:#979797;border-width:1px;position:absolute;bottom:20px;top:8px;background-color:#efefef;z-index:1}.analytics-trend-previous-active-bg{z-index:2}.analytics-trend-bg-selected.analytics-trend-sparkline-left-bg,.analytics-trend-bg-selected.analytics-trend-sparkline-right-bg{border-color:#185abc;border-width:2px}.analytics-trend-sparkline-left-bg{border-style:none dashed none none;left:24px}.analytics-trend-sparkline-right-bg{border-style:none none none dashed;right:24px}.analytics-trend-bg-selected.analytics-trend-sparkline-left-bg{left:23.5px}.analytics-trend-bg-selected.analytics-trend-sparkline-right-bg{right:23.5px}.analytics-slider-thumbimpl{background-color:transparent;cursor:col-resize;height:32px;width:20px}.analytics-trend-sparkline-graph .analytics-twothumbslider{height:32px}.analytics-twothumbslider:focus,.analytics-twothumbslider .goog-twothumbslider-value-thumb:focus,.analytics-twothumbslider .goog-twothumbslider-extent-thumb:focus{outline:none}.analytics-twothumbslider.goog-slider-dragging{cursor:col-resize}.analytics-trend-sparkline-graph .analytics-twothumbslider .goog-twothumbslider-rangehighlight{height:0}.analytics-trend-sparkline-graph .analytics-twothumbslider .goog-twothumbslider-value-thumb,.analytics-trend-sparkline-graph .analytics-twothumbslider .goog-twothumbslider-extent-thumb{height:32px;position:absolute;width:20px;z-index:1}.analytics-trend-sparkline-graph .analytics-twothumbslider .analytics-previous-active-thumb{z-index:2}.analytics-tst{background-color:#8f8f8f;border:0;border-radius:2px;height:10px;padding:4px 5px;position:absolute}.analytics-tst-content{color:#fff;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:9px;font-weight:400;white-space:nowrap}.analytics-tst-arrow{position:absolute}.analytics-tst-arrowup{top:-5px}.analytics-tst-arrowimplbefore,.analytics-tst-arrowimplafter{display:block;height:0;position:absolute;width:0}.analytics-tst-arrowimplbefore{border:5px solid;border-color:#8f8f8f transparent;border-top-width:0;left:-5px}.analytics-tst-arrowimplafter{border:4px solid;border-color:#8f8f8f transparent;border-top-width:0;left:-4px;top:1px}.analytics-vhc-viewcardlist{width:100%}.analytics-vhc-viewcardlist-scrollable{overflow-y:auto}.analytics-vc-root,.analytics-vc-content,.analytics-vc-low-data-content{display:flex;flex-direction:column;-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;min-height:1px;position:relative;z-index:1}.analytics-vc-spinner .docs-quantum-spinner{left:0;margin-left:0}.analytics-vc-spinner .docs-spinner{height:28px}.analytics-vc-spinner{height:28px;left:50%;position:absolute;top:50%;-webkit-transform:translate(-50%,-50%);-moz-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);-o-transform:translate(-50%,-50%);transform:translate(-50%,-50%);width:28px}.analytics-lowdatatreatment{display:flex;flex-direction:column;text-align:center;width:100%}.analytics-vc-low-data-content{align-items:center;justify-content:center}.analytics-vhc-rowcard-root .analytics-profile-image{margin:0 16px 0 24px;vertical-align:middle}.analytics-votc{display:flex;flex-direction:column;-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;margin-bottom:24px;overflow-x:hidden;overflow-y:auto}.analytics-votc-header{-webkit-align-items:center;align-items:center;display:flex;-ms-flex:0 0 auto;-webkit-flex:0 0 auto;flex:0 0 auto;flex-direction:row;justify-content:space-between;margin:18px 24px 0 24px;overflow:hidden}.analytics-votc-threshold-legend{-webkit-align-items:center;align-items:center;color:#25272b;display:flex;flex-direction:row;font-size:12px;margin:16px 24px 0 45px;text-align:center}.analytics-votc-threshold-legend-box{border-top:1px solid #669df6;height:1px;margin-right:12px;width:20px}.analytics-votc-threshold-tooltip-icon{margin-left:8px;opacity:0.56}.analytics-vhc-container{display:flex;-ms-flex:1;-webkit-flex:1;flex:1;flex-direction:column;-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;min-height:0}.analytics-vhc-viewhistory{display:flex;-ms-flex:1;-webkit-flex:1;flex:1;flex-direction:column;-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;min-height:0}.analytics-vhc-button-container{-webkit-align-items:flex-start;align-items:flex-start;display:flex;flex-direction:row;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;height:58px;box-pack:justify;-ms-flex-pack:justify;-webkit-box-pack:justify;-webkit-justify-content:space-between;justify-content:space-between}.analytics-vhc-listsortbutton-container{display:flex;flex-direction:row;-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;box-pack:justify;-ms-flex-pack:justify;-webkit-box-pack:justify;-webkit-justify-content:space-between;justify-content:space-between;margin-top:28px}.analytics-vhc-nudgeselectdropdown-container{-webkit-align-items:center;align-items:center;display:flex;margin-right:13px;margin-top:22px;width:60px}.analytics-vhc-nudgeselectdropdown-container .goog-menuitem{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif}.analytics-vhc-nudgeselectdropdown-container .goog-menuitem.goog-menuitem-highlight{padding-bottom:6px;padding-top:6px}.analytics-vhc-tabbarholder{border-bottom:1px solid #e0e0e0;box-shadow:0 2px 12px 2px rgba(60,64,67,.15)}.analytics-vhc-tabbarholder .docs-tabbar{background-color:#fff;max-width:100%}.analytics-vhc-tabbarholder .docs-tabbar-tab{border-bottom:4px solid transparent;border-top:4px solid transparent}.analytics-vhc-tabbarholder .docs-tabbar-tab-selected{border-bottom:4px solid #2196f3}.analytics-vhc-tabbarholder .docs-tabbar-focused .docs-tabbar-tab-selected{background:#fff}.analytics-vhc-tabbarholder .docs-tabbar-mouseactive .docs-tabbar-tab{background:transparent}.analytics-vhc-tabbarholder .docs-tabbar .docs-tabbar-tab-active{background:transparent}.analytics-vhc-tabbarholder .docs-tabbar-tablabel{color:rgba(0,0,0,0.54);font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;font-weight:500}.analytics-vhc-tabbarholder .docs-tabbar-tab-selected .docs-tabbar-tablabel{color:rgba(0,0,0,0.87)}.analytics-vhc-tabbarholder .docs-tabbar .docs-tabbar-tab{align-items:flex-end;height:48px;padding:0 16px;position:relative;max-width:300px;border:0}.analytics-vhc-tabbarholder .docs-tabbar .docs-tabbar-tab:first-child{margin-left:8px}.analytics-vhc-tabbarholder .docs-tabbar-tab .docs-tabbar-tablabel{color:#5f6368;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;text-transform:none;margin-bottom:8px;text-transform:none}.analytics-vhc-tabbarholder .docs-tabbar-tab-hover .docs-tabbar-tablabel{color:#3c4043}.analytics-vhc-tabbarholder .docs-tabbar-focused .docs-tabbar-tab-hover .docs-tabbar-tablabel{color:#202124}.analytics-vhc-tabbarholder .docs-tabbar-mouseactive .docs-tabbar-tab-hover .docs-tabbar-tablabel{color:#188038}.analytics-vhc-tabbarholder .docs-tabbar-tab-selected .docs-tabbar-tablabel{color:#188038}.analytics-vhc-tabbarholder .docs-tabbar-tab-selected.docs-tabbar-tab-hover .docs-tabbar-tablabel{color:#188038}.analytics-vhc-tabbarholder .docs-tabbar-focused .docs-tabbar-tab-selected.docs-tabbar-tab-hover .docs-tabbar-tablabel{color:#137333}.analytics-vhc-tabbarholder .docs-tabbar-mouseactive .docs-tabbar-tab-selected.docs-tabbar-tab-hover .docs-tabbar-tablabel{color:#137333}.analytics-vhc-tabbarholder .docs-tabbar-tab-selected::before{border-bottom:3px solid #188038;border-radius:3px 3px 0 0;bottom:0;content:'';display:block;height:0;left:12px;position:absolute;width:calc(100% + -24px)}.analytics-vhc-tabbarholder .docs-tabbar-tab-selected.docs-tabbar-tab-hover::before{border-bottom-color:#188038}.analytics-vhc-tabbarholder .docs-tabbar-focused .docs-tabbar-tab-selected.docs-tabbar-tab-hover::before{border-bottom-color:#137333}.analytics-vhc-tabbarholder .docs-tabbar .docs-tabbar-tab-active{background:transparent}.analytics-vhc-tabbarholder .analytics-vhc .analytics-vc-spinner{top:325px}.analytics-vhc-tablabel-domain-name{font-weight:400;text-transform:none}.driveLockingUnlockcontent-text{color:#616161;display:block;font-family:Roboto,Arial,sans-serif;font-size:1rem;font-weight:400;letter-spacing:0.00625em;line-height:1.5rem}.driveLockingUnlockdetails-link{margin-left:4px}#docs-approvals-toast-unlock{cursor:pointer}#docs-approvals-toast-unlock.jfk-button-disabled{display:none}.docs-blameview{display:block;background:#ffffff;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;outline:none;overflow:hidden;width:240px}.docs-blameview-title-container{align-items:center;background:#f8f8f8;display:flex;flex-direction:row;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;justify-content:space-between}.docs-blameview-title{display:block;background:#f8f8f8;color:#3c4043;font-weight:500;font-size:14px;padding:16px;white-space:nowrap}.docs-blameview-nav-container{margin:2px 8px 0 8px}.docs-blameview-previous-edit-button,.docs-blameview-next-edit-button{cursor:pointer;background:transparent;border-radius:2px;height:24px;outline:none}.docs-blameview-nav-container .docs-blameview-previous-edit-button .docs-blameview-button-icon .docs-icon-img:before,.docs-blameview-nav-container .docs-blameview-next-edit-button .docs-blameview-button-icon .docs-icon-img:before,.docs-blameview-nav-container .docs-blameview-previous-edit-button .docs-blameview-button-icon .docs-icon-img,.docs-blameview-nav-container .docs-blameview-next-edit-button .docs-blameview-button-icon .docs-icon-img{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_green.svg)}.docs-blameview-previous-edit-button.jfk-button-hover,.docs-blameview-next-edit-button.jfk-button-hover,.docs-blameview-previous-edit-button.jfk-button-focused,.docs-blameview-next-edit-button.jfk-button-focused{cursor:pointer;background:#f1f3f4;border-color:transparent}.docs-blameview-previous-edit-button.jfk-button-active,.docs-blameview-next-edit-button.jfk-button-active{cursor:pointer;background:#e6f4ea}.docs-blameview-previous-edit-button.jfk-button-disabled,.docs-blameview-next-edit-button.jfk-button-disabled{cursor:default}.docs-blameview-nav-container .docs-blameview-previous-edit-button.jfk-button-disabled .docs-icon-img:before,.docs-blameview-nav-container .docs-blameview-next-edit-button.jfk-button-disabled .docs-icon-img:before,.docs-blameview-nav-container .docs-blameview-previous-edit-button.jfk-button-disabled .docs-icon-img,.docs-blameview-nav-container .docs-blameview-next-edit-button.jfk-button-disabled .docs-icon-img{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_grey_dark.svg);opacity:.38}.docs-blameview-button-icon{overflow:hidden;position:relative}.docs-blameview-message{background:#fff;border-bottom-left-radius:4px;border-bottom-right-radius:4px;color:#3c4043;display:block;font-size:14px;line-height:20px;overflow:hidden;overflow-wrap:break-word;padding:13px 16px 13px 16px;text-overflow:ellipsis;white-space:normal}.docs-blameview-header{background:#f8f8f8;display:flex;flex-direction:row;padding:0 16px 10px 16px;white-space:nowrap}.docs-blameview-avatar-holder{display:inline-block;max-width:32px}.docs-blameview-avatar{border-radius:50%;height:32px;width:32px}.docs-blameview-authortimestamp{color:#3c4043;display:inline-block;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;overflow:hidden;padding:0 10px;text-overflow:ellipsis;white-space:nowrap;-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1}.docs-blameview-timestamp{display:block;font-size:12px;margin:0}.docs-blameview-author{display:block;font-size:14px;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;height:18px;margin-bottom:1px;max-width:167px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.docs-blameview-valuecontainer{background:#ffffff;display:flex;flex:1 1 auto;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;justify-content:space-between;line-height:20px;max-height:160px;overflow:hidden;overflow-wrap:break-word;white-space:normal;width:100%}.docs-blame-bold-text{font-style:normal;font-weight:500}.docs-blameview-value-content{color:#3c4043;display:inline;font-style:italic;overflow-x:hidden;overflow-y:auto;overflow-wrap:break-word;padding:10px 16px;word-wrap:break-word}.docs-blameview-value-content-indirect-edit{margin-right:0}.overlay-container-rtl .docs-blameview-value-content-indirect-edit{margin-left:0}.docs-blameview-spinner{background:#fff;overflow:hidden;padding:30px 16px 13px 16px}.docs-blameview-spinner-holder{float:left;height:32px;margin:0 0 0 16px;position:relative}.overlay-container-rtl .docs-blameview-spinner-holder{float:right;margin:0 16px 0 0}.docs-blameview-icon:before{content:url(//ssl.gstatic.com/docs/common/menu_feature_sprite7.svg)}.docs-blameview-icon{height:4332px;position:absolute;width:72px}.docs-blameview-footer{border-top:1px solid #dadce0;display:flex;flex-direction:column;padding:12px 16px 0 16px}.docs-blameview-warning,.docs-blameview-indirect-edit{color:#3c4043;display:block;font-size:12px;line-height:16px;padding-bottom:12px;white-space:normal}a.docs-blameview-warning-info,.docs-blameview-indirect-edit-learnmore a{color:#1a73e8;text-decoration:underline}.docs-blameview-feedback{align-items:center;background:#ffffff;border-top:1px solid #dadce0;display:block;padding-left:16px;padding-right:9px;padding-top:10px;line-height:20px}.docs-blameview-short-feedback{display:none}.docs-blameview-useful-text{color:#3c4043;float:left;font-size:14px;font-style:italic}.docs-blameview-give-thumbs-up{float:right;padding-right:12px}.docs-blameview-thumbs-up-button{float:left;opacity:0.6;padding-right:10px;width:18px}.docs-blameview-thumbs-down-button{float:right;opacity:0.6;width:18px}.docs-blameview-thumbs-up-button:hover,.docs-blameview-thumbs-down-button:hover{cursor:pointer;opacity:1}.docs-blameview-long-feedback{display:none;font-size:14px;font-style:italic}.docs-blameview-long-feedback a,.docs-blameview-long-feedback a:link,.docs-blameview-long-feedback a:visited{color:#1a73e8}.docs-blameview-long-feedback-text{color:#3c4043}.docs-blameview-nav-container .docs-hc-edge.docs-blameview-previous-edit-button .docs-icon-img,.docs-blameview-nav-container .docs-hc-edge.docs-blameview-next-edit-button .docs-icon-img,.docs-blameview-nav-container .docs-hc-gecko.docs-blameview-previous-edit-button .docs-icon-img,.docs-blameview-nav-container .docs-hc-gecko.docs-blameview-next-edit-button .docs-icon-img{filter:brightness(1.5)}.docs-blameview-nav-container .docs-hc-edge.docs-blameview-previous-edit-button.jfk-button-disabled .docs-icon-img,.docs-blameview-nav-container .docs-hc-edge.docs-blameview-next-edit-button.jfk-button-disabled .docs-icon-img,.docs-blameview-nav-container .docs-hc-gecko.docs-blameview-previous-edit-button.jfk-button-disabled .docs-icon-img,.docs-blameview-nav-container .docs-hc-gecko.docs-blameview-next-edit-button.jfk-button-disabled .docs-icon-img{filter:brightness(10);opacity:1}.docs-blameview-nav-container .docs-hc-ie.docs-blameview-previous-edit-button .docs-icon-img,.docs-blameview-nav-container .docs-hc-ie.docs-blameview-next-edit-button .docs-icon-img{-ms-high-contrast-adjust:none;background-color:white}.jfk-butterBar.docs-autopurge-butter,.docs-gm .jfk-butterBar.docs-autopurge-butter{background-color:#e6f4ea;box-shadow:0 4px 8px rgba(60,64,67,0.15),0 1px 3px rgba(60,64,67,0.3),0 6px 11px rgba(128,134,139,0.06),0 -3px 11px rgba(128,134,139,0.09);display:table;left:162px;padding-right:0;position:absolute;top:17px}.docs-autopurge-butter-link{margin-left:24px;padding-right:6px;white-space:nowrap}.docs-butterbar-dismiss.docs-autopurge-butter-dismiss,.docs-gm .docs-butterbar-dismiss.docs-autopurge-butter-dismiss{display:table-cell;padding:0 12px;vertical-align:middle}.docs-butterbar-link.docs-autopurge-butter-link,.docs-butterbar-dismiss.docs-autopurge-butter-dismiss,.docs-gm .docs-butterbar-link.docs-autopurge-butter-link,.docs-gm .docs-butterbar-dismiss.docs-autopurge-butter-dismiss{color:#188038;font-size:14px;letter-spacing:0.25px;text-decoration:none}.docs-butterbar-link.docs-autopurge-butter-link:hover,.docs-gm .docs-butterbar-link.docs-autopurge-butter-link:hover{border:1px solid #4d90fe;border-radius:4px;color:#0d652d;margin-left:23px;margin-right:-1px}.docs-butterbar-dismiss.docs-autopurge-butter-dismiss:hover,.docs-gm .docs-butterbar-dismiss.docs-autopurge-butter-dismiss:hover{border:1px solid rgb(77,144,254);border-radius:4px;color:#0d652d;padding:11px}.docs-autopurge-butter-text{color:#188038;font-family:Roboto;letter-spacing:0.2px}.docs-autopurge-butter-text-span{display:table-cell;padding:12px 12px 12px 0;text-align:left}.docs-gm .docs-gm-sidebar-icon{display:flex;align-items:center;margin-right:12px;height:24px;width:24px}.docs-gm .docs-gm-sidebar-icon .docs-gm-sidebar-icon-24{height:24px;margin:0;width:24px}.docs-gm .docs-gm-sidebar-icon-path{fill:#188038}.docs-sidebar-titlebar-icon-button{cursor:pointer;position:absolute;right:10px}.docs-sidebar-gm-titlebar-icon-button{background-color:transparent;border:none!important;border-radius:50%;cursor:pointer;height:26px;margin-left:auto;margin-right:0;padding:6px 0 0 0;position:relative;right:-5px;text-align:center;top:0;width:32px}.docs-sidebar-gm-titlebar-icon-button:hover{background-color:#f1f3f4}.docs-sidebar-gm-titlebar-icon-button:focus{background-color:#e8eaed;outline:none}.docs-clipboard-clearall{font-weight:500}.docs-clipboard-preview{position:absolute;background-color:#fff;color:black;visibility:hidden;width:260px;height:195px;overflow:hidden;font-size:80%;border:1px solid #888;outline:0;padding:2px;top:0;z-index:9999}.docs-clipboard-preview iframe{border:0;padding:0;margin:0;width:100%;height:100%;vertical-align:top}.docs-textcolormenubutton .goog-toolbar-menu-button-outer-box .goog-toolbar-menu-button-inner-box .goog-toolbar-menu-button-caption .goog-color-menu-button-indicator{height:20px;width:22px;bottom:1px}.docs-text-color-state-change-button{margin-right:0;padding:0 18px}.jfk-button-standard.docs-c-u-colormenutogglebutton-base.docs-c-u-colormenutogglebutton-extra-visible-border.jfk-button-hover,.jfk-button-standard.docs-c-u-colormenutogglebutton-base.docs-c-u-colormenutogglebutton-extra-visible-border.jfk-button-hover.jfk-button-checked{border:1px solid #000}.docs-text-color-omnibox-icon{float:left;width:16px;height:16px;margin:2px}.docs-docos-activitybox{background:#fff;border:solid 1px #cbcbcb;-moz-box-shadow:-1px 1px 1px rgba(0,0,0,.2);-webkit-box-shadow:0 2px 4px rgba(0,0,0,.2);box-shadow:0 2px 4px rgba(0,0,0,.2);padding:12px 0;position:absolute;outline:none;right:20px;top:46px;z-index:900}.docos-streampanesize{height:420px;width:385px}.docos-streampanesize-legacy{height:550px;width:434px}.docs-docos-activitybox-inner{height:100%;overflow:auto}.docs-docos-activitybox.docos-enable-new-header{padding:0!important;height:auto!important}.docs-docos-activitybox.docos-enable-new-header>.docs-docos-activitybox-inner{overflow:visible!important}.docs-docos-caret-inner,.docs-docos-caret-outer{border:9px solid;border-top-width:0;display:block;height:0;margin:0 auto;position:relative;width:0;z-index:901}.docs-docos-caret-inner{border-color:#fff transparent;top:1px}.docs-docos-caret-outer{border-color:#cbcbcb transparent;top:9px}.docos-enable-new-header>.docs-docos-caret-inner{border-color:#f1f1f1 transparent!important}.docos-shelly-icon{background-image:url(//ssl.gstatic.com/docs/common/d-icons30.png);background-repeat:no-repeat;height:14px;width:14px}.docos-icon-close-pane{background-position:0 -21px}.docos-icon-close-pane:hover{background-position:-38px -45px}.docos-icon-grippy{background-position:-38px -94px;width:16px;height:4px}.docos-icon-discussion-button{background-position:-22px -66px;width:14px;height:15px;vertical-align:text-bottom;margin-right:5px}.post-limit-error-dialog{max-width:512px;box-sizing:border-box}.post-limit-error-dialog .docs-material-gm-dialog-content{color:#3c4043;font-size:14px}#docs-docos-subscriptionbutton .jfk-button,#docs-docos-subscriptionbutton .jfk-freestanding-menu-button{background-image:none;border:1px solid transparent;border-radius:4px;box-shadow:none;box-sizing:border-box;cursor:pointer;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;height:36px;letter-spacing:0.25px;line-height:calc(36px - 1px);outline:none;padding:9px 12px 10px 12px;text-align:center;text-transform:capitalize}#docs-docos-subscriptionbutton .goog-menu{text-align:left;transform:translateX(12px)}#docs-docos-subscriptionbutton .goog-menuitem{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;padding-left:15px}#docs-docos-subscriptionbutton .jfk-button.jfk-button-disabled,#docs-docos-subscriptionbutton .jfk-freestanding-menu-button.jfk-freestanding-menu-button-disabled{background-color:#f1f3f4;color:#3c4043;cursor:inherit;opacity:0.38}#docs-docos-subscriptionbutton .jfk-button.jfk-button-disabled{border-right-color:#dadce0}#docs-docos-subscriptionbutton .jfk-freestanding-menu-button.jfk-freestanding-menu-button-disabled .docs-docos-sb-menu-icon{border-bottom-color:#3c4043;border-top-color:#3c4043}#docs-docos-subscriptionbutton.docs-docos-sb-muted .jfk-button:not(.jfk-button-disabled),#docs-docos-subscriptionbutton.docs-docos-sb-muted .jfk-freestanding-menu-button:not(.jfk-freestanding-menu-button-disabled){background-color:white;border-color:#9aa0a6;color:#9aa0a6}#docs-docos-subscriptionbutton.docs-docos-sb-muted .jfk-freestanding-menu-button:not(.jfk-freestanding-menu-button-disabled) .docs-docos-sb-menu-icon{border-bottom-color:#9aa0a6;border-top-color:#9aa0a6}#docs-docos-subscriptionbutton.docs-docos-sb-muted .jfk-button.jfk-button-hover,#docs-docos-subscriptionbutton.docs-docos-sb-muted .jfk-button.jfk-button-hover+.jfk-freestanding-menu-button,#docs-docos-subscriptionbutton.docs-docos-sb-muted .jfk-button.jfk-button-focused,#docs-docos-subscriptionbutton.docs-docos-sb-muted .jfk-button.jfk-button-focused+.jfk-freestanding-menu-button,#docs-docos-subscriptionbutton.docs-docos-sb-muted .jfk-freestanding-menu-button.jfk-freestanding-menu-button-hover,#docs-docos-subscriptionbutton.docs-docos-sb-muted .jfk-freestanding-menu-button.jfk-freestanding-menu-button-focused{background-color:#f1f3f4}#docs-docos-subscriptionbutton.docs-docos-sb-follow .jfk-button:not(.jfk-button-disabled),#docs-docos-subscriptionbutton.docs-docos-sb-follow .jfk-freestanding-menu-button:not(.jfk-freestanding-menu-button-disabled){background-color:white;border-color:#669df6;color:#1a73e8}#docs-docos-subscriptionbutton.docs-docos-sb-follow .jfk-freestanding-menu-button:not(.jfk-freestanding-menu-button-disabled) .docs-docos-sb-menu-icon{border-bottom-color:#1a73e8;border-top-color:#1a73e8}#docs-docos-subscriptionbutton.docs-docos-sb-follow .jfk-button.jfk-button-hover,#docs-docos-subscriptionbutton.docs-docos-sb-follow .jfk-button.jfk-button-hover+.jfk-freestanding-menu-button,#docs-docos-subscriptionbutton.docs-docos-sb-follow .jfk-button.jfk-button-focused,#docs-docos-subscriptionbutton.docs-docos-sb-follow .jfk-button.jfk-button-focused+.jfk-freestanding-menu-button,#docs-docos-subscriptionbutton.docs-docos-sb-follow .jfk-freestanding-menu-button.jfk-freestanding-menu-button-hover,#docs-docos-subscriptionbutton.docs-docos-sb-follow .jfk-freestanding-menu-button.jfk-freestanding-menu-button-focused{background-color:#e8f0fe}#docs-docos-subscriptionbutton.docs-docos-sb-following .jfk-button:not(.jfk-button-disabled),#docs-docos-subscriptionbutton.docs-docos-sb-following .jfk-freestanding-menu-button:not(.jfk-freestanding-menu-button-disabled){background-color:#1a73e8;border-color:#1a73e8;color:white}#docs-docos-subscriptionbutton.docs-docos-sb-following .jfk-freestanding-menu-button:not(.jfk-freestanding-menu-button-disabled) .docs-docos-sb-menu-icon{border-bottom-color:white;border-top-color:white}#docs-docos-subscriptionbutton.docs-docos-sb-following .jfk-button.jfk-button-focused,#docs-docos-subscriptionbutton.docs-docos-sb-following .jfk-button.jfk-button-focused+.jfk-freestanding-menu-button,#docs-docos-subscriptionbutton.docs-docos-sb-following .jfk-freestanding-menu-button.jfk-freestanding-menu-button-hover,#docs-docos-subscriptionbutton.docs-docos-sb-following .jfk-freestanding-menu-button.jfk-freestanding-menu-button-focused{background-color:#185abc;border-color:#185abc}#docs-docos-subscriptionbutton.docs-docos-sb-following .jfk-button.jfk-button-hover,#docs-docos-subscriptionbutton.docs-docos-sb-following .jfk-button.jfk-button-hover+.jfk-freestanding-menu-button{background-color:#ea4335;border-color:#ea4335}#docs-docos-subscriptionbutton.docs-docos-sb-following .jfk-button:not(.jfk-button-disabled){border-right-color:white}#docs-docos-subscriptionbutton .docs-docos-sb-main.jfk-button{border-bottom-right-radius:0;border-top-right-radius:0;margin-right:0;-webkit-tap-highlight-color:transparent}.docs-docos-sb-muted-text,.docs-docos-sb-muted-hover-text,.docs-docos-sb-follow-text,.docs-docos-sb-following-text,.docs-docos-sb-following-hover-text{bottom:0;left:0;position:absolute;right:0;text-align:center;top:0}.docs-docos-sb-muted-text,.docs-docos-sb-muted-hover-text,.docs-docos-sb-muted-measuring-text,.docs-docos-sb-follow-text,.docs-docos-sb-follow-measuring-text,.docs-docos-sb-following-text,.docs-docos-sb-following-hover-text,.docs-docos-sb-following-measuring-text{display:none}.docs-docos-sb-muted .docs-docos-sb-muted-text,.docs-docos-sb-follow .docs-docos-sb-follow-text,.docs-docos-sb-following .docs-docos-sb-following-text{display:inline}.docs-docos-sb-muted .docs-docos-sb-muted-measuring-text,.docs-docos-sb-follow .docs-docos-sb-follow-measuring-text,.docs-docos-sb-following .docs-docos-sb-following-measuring-text{display:inline-block;visibility:hidden;height:0;overflow:hidden;white-space:nowrap}.docs-docos-sb-muted .jfk-button.jfk-button-hover .docs-docos-sb-muted-text,.docs-docos-sb-following .jfk-button.jfk-button-hover .docs-docos-sb-following-text{display:none}.docs-docos-sb-muted .jfk-button.jfk-button-hover .docs-docos-sb-muted-hover-text,.docs-docos-sb-following .jfk-button.jfk-button-hover .docs-docos-sb-following-hover-text{display:inline}#docs-docos-subscriptionbutton .jfk-freestanding-menu-button{-webkit-align-items:center;align-items:center;border-bottom-left-radius:0;border-left:none!important;border-top-left-radius:0;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;-webkit-justify-content:center;justify-content:center;margin-right:12px;width:19px}.docs-docos-sb-menu-icon{border-left-color:transparent;border-right-color:transparent;border-style:solid;border-width:4px 4px 0;height:0;width:0}.instant-button{height:24px;width:24px;outline:none;padding:8px}.instant-button:hover{background:#f1f3f4}.multi-button .first-button{padding-top:15px}.multi-button .last-button{padding-bottom:15px}.superfab-icon-container{position:absolute;transition:opacity .15s ease-in-out}.docs-material .docs-icon.superfab-icon-size{height:24px;width:24px}.superfab-icon{display:inline-block;opacity:0.9;transition:opacity .15s ease-in-out}#docs-instant-bubble:hover .superfab-icon,#docs-instant-bubble .superfab-icon:hover{opacity:1}.send-to-email-toast.docs-ui-toast{max-width:323px;padding:14px 16px 14px 16px!important}.send-to-email-toast.docs-ui-toast .docs-ui-toast-content{color:#8ab4f8;font-family:"Google Sans";font-size:14px;min-width:323px;line-height:20px;align-items:center;letter-spacing:0.25px;margin:0 8px}.office-editing-export-error-bubble-close-button{float:right}.office-editing-export-error-bubble{background-color:#fff;border:1px solid transparent;border-radius:8px;box-shadow:0 4px 8px 3px rgba(60,64,67,.15);position:absolute;z-index:1003;color:#5f6368;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;outline:none;padding:24px;white-space:pre-line;width:400px}.office-editing-export-error-bubble-title{color:#202124;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:22px;font-weight:400;line-height:28px;font-size:16px;line-height:24px}.office-editing-export-error-bubble-description{line-height:20px;margin-top:16px}.office-editing-export-error-bubble-retry-text{font-size:12px;line-height:16px;margin-top:12px}.office-editing-export-error-bubble-learn-more,.office-editing-export-error-bubble-learn-more:visited{color:#1a73e8;margin-left:8px}.office-editing-onboarding-promo-bubble-dotted-progressbar-dot{background:#ceead6;border-radius:50%;display:inline-block;height:8px;margin-right:8px;width:8px}.office-editing-onboarding-promo-bubble-dotted-progressbar-dot-highlighted{background:#188038}.office-editing-onboarding-dialog{width:480px}.office-editing-onboarding-dialog-logo{height:256px;width:480px;content:url("//ssl.gstatic.com/docs/common/promo/ritz_shadow_docs_promo_ltr.gif");border-top-left-radius:8px;border-top-right-radius:8px}.office-editing-onboarding-dialog-heading{color:#202124;font-size:24px;line-height:32px;padding-top:24px;padding-bottom:12px;padding-left:24px;padding-right:24px}.office-editing-onboarding-dialog-description{color:#5f6368;font-size:18px;line-height:28px;text-align:center;padding-left:24px;padding-right:24px}.office-editing-onboarding-dialog-logo-container,.office-editing-onboarding-dialog-heading,.office-editing-onboarding-dialog-description,.office-editing-onboarding-dialog .docs-material-gm-dialog-buttons{display:flex;justify-content:center}.office-editing-onboarding-dialog .docs-material-gm-dialog-title{padding:0}.office-editing-onboarding-dialog .docs-material-gm-dialog-title-close{cursor:pointer;top:18px;right:18px}.office-editing-onboarding-dialog .docs-material-gm-dialog-content{padding-left:0;padding-right:0;padding-bottom:16px}.office-editing-onboarding-dialog .docs-material-gm-dialog-buttons{padding-top:0}.office-editing-onboarding-promo-bubble{padding:16px 16px 16px 20px;width:324px}.office-editing-onboarding-promo-bubble-title{color:#202124;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:18px;line-height:24px;padding-bottom:8px}.office-editing-onboarding-promo-bubble-description{color:#3c4043;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;padding-right:24px}.office-editing-onboarding-promo-bubble .docs-material-promo-walkthrough-bubble-buttons{display:block;padding:24px 0 0 0;justify-content:normal}.office-editing-onboarding-promo-bubble .docs-material-promo-walkthrough-bubble-buttons .docs-material-button-fill-primary.docs-material-button{display:inline-block;float:right;height:24px;padding:3px 18px 3px}.office-editing-onboarding-promo-bubble .office-editing-promo-bubble-dotted-progressbar{display:inline-block;float:left}.docs-material .docs-icon,.docs-material .goog-color-menu-button-indicator .docs-icon,.docs-material .sketchy-toolbar-color-menu-button .goog-toolbar-menu-button-caption .docs-icon{height:18px;width:18px;margin:1px 2px 2px 1px}.docs-material .docs-icon-img:before{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222.svg)}.docs-gm .docs-material .docs-icon-img:before{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_grey_medium.svg)}.docs-material .docs-icon-img{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222.svg)}.docs-gm .docs-material .docs-icon-img{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_grey_medium.svg)}.docs-material .docs-icon-img-container{height:6179px;position:absolute;width:74px}.docs-material .goog-menuitem-icon .docs-icon-img-container{opacity:0.54}.docs-gm .docs-material .goog-menuitem-icon .docs-icon-img-container{opacity:1}.docs-material .goog-menuitem-icon .docs-icon-document,.docs-material .goog-menuitem-icon .docs-icon-punch,.docs-material .goog-menuitem-icon .docs-icon-presentation,.docs-material .goog-menuitem-icon .docs-icon-spreadsheet,.docs-material .goog-menuitem-icon .docs-icon-form,.docs-material .goog-menuitem-icon .docs-icon-drawing,.docs-material .goog-menuitem-icon .docs-icon-script,.docs-material .goog-menuitem-icon .docs-icon-site{opacity:1}.docs-material .goog-toolbar-button-inner-box .docs-icon,.docs-material .goog-toolbar-menu-button-caption .docs-icon,.docs-material .goog-toolbar-menu-button-caption .goog-color-menu-button-indicator .docs-icon{margin-top:0px}.docs-gm .docs-material .goog-toolbar-button-active .docs-icon-img:before,.docs-gm .docs-material .goog-toolbar-button-checked .docs-icon-img:before,.docs-gm .docs-material .goog-toolbar-button-selected .docs-icon-img:before,.docs-gm .docs-material .goog-toolbar-combo-button-open .docs-icon-img:before,.docs-gm .docs-material .goog-toolbar-menu-button-open .docs-icon-img:before,.docs-gm .docs-material .docs-toolbar-split-create-button.goog-toolbar-button-active .docs-icon-img:before,.docs-gm .docs-material .docs-toolbar-split-create-button.goog-toolbar-menu-button-active .docs-icon-img:before,.docs-gm .docs-material .docs-toolbar-split-create-button.goog-toolbar-menu-button-open .docs-icon-img:before,.docs-gm .docs-material .docs-appbar-circle-button.jfk-button-active .docs-icon-img:before,.docs-gm .docs-material .docs-appbar-circle-button.jfk-button-checked .docs-icon-img:before,.docs-gm .docs-material .docs-analytics-sidebar-tab-selected .docs-icon-img:before,.docs-gm .docs-material.docs-sheet-active-tab .docs-icon-img:before,.docs-gm .docs-material .docs-sheet-button-active .docs-icon-img:before,.docs-gm .docs-material .docs-sheet-button-open .docs-icon-img:before,.docs-gm .docs-material .punch-start-presentation-container .docs-icon-img:before,.docs-gm .docs-material .waffle-named-ranges-promo-title .docs-icon-img:before,.docs-gm .docs-material.goog-flat-menu-button-open .docs-icon-img:before,.docs-gm .docs-material.trix-palette .goog-palette-cell-selected .docs-icon-img:before,.docs-bubble .docs-bubble-button.jfk-button:hover:active .docs-icon-img:before,.docs-material .docs-save-indicator-popup-icon .docs-icon-img:before,.docs-material .docs-titlebar-badge:active .docs-icon-img:before,.docs-material .docs-titlebar-badge.docs-titlebar-badge-selected .docs-icon-img:before{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_green.svg)}.docs-gm .docs-material .goog-toolbar-button-active .docs-icon-img,.docs-gm .docs-material .goog-toolbar-button-checked .docs-icon-img,.docs-gm .docs-material .goog-toolbar-button-selected .docs-icon-img,.docs-gm .docs-material .goog-toolbar-combo-button-open .docs-icon-img,.docs-gm .docs-material .goog-toolbar-menu-button-open .docs-icon-img,.docs-gm .docs-material .docs-toolbar-split-create-button.goog-toolbar-button-active .docs-icon-img,.docs-gm .docs-material .docs-toolbar-split-create-button.goog-toolbar-menu-button-active .docs-icon-img,.docs-gm .docs-material .docs-toolbar-split-create-button.goog-toolbar-menu-button-open .docs-icon-img,.docs-gm .docs-material .docs-appbar-circle-button.jfk-button-active .docs-icon-img,.docs-gm .docs-material .docs-appbar-circle-button.jfk-button-checked .docs-icon-img,.docs-gm .docs-material .docs-analytics-sidebar-tab-selected .docs-icon-img,.docs-gm .docs-material.docs-sheet-active-tab .docs-icon-img,.docs-gm .docs-material .docs-sheet-button-active .docs-icon-img,.docs-gm .docs-material .docs-sheet-button-open .docs-icon-img,.docs-gm .docs-material .punch-start-presentation-container .docs-icon-img,.docs-gm .docs-material .waffle-named-ranges-promo-title .docs-icon-img,.docs-gm .docs-material.goog-flat-menu-button-open .docs-icon-img,.docs-gm .docs-material.trix-palette .goog-palette-cell-selected .docs-icon-img,.docs-bubble .docs-bubble-button.jfk-button:hover:active .docs-icon-img,.docs-material .docs-save-indicator-popup-icon .docs-icon-img,.docs-material .docs-titlebar-badge:active .docs-icon-img,.docs-material .docs-titlebar-badge.docs-titlebar-badge-selected .docs-icon-img{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_green.svg)}.docs-material.clean-palette .docs-icon{margin:4px}.docs-material .docs-omnibox-row-icon .shape-icon{margin:-1px 0 0 -1px}.docs-material .docs-icon-save{left:-20px;top:-534px}.docs-material .docs-icon-print{left:0;top:-4424px}.docs-material .docs-icon-undo,.docs-material .docs-icon-redo-rtl{left:-20px;top:-2072px}.docs-material .docs-icon-redo,.docs-material .docs-icon-undo-rtl{left:0;top:-2978px}.docs-material .docs-icon-copy{left:0;top:-2898px}.docs-material .docs-icon-cut{left:-20px;top:-3990px}.docs-material .docs-icon-paste{left:0;top:-2878px}.docs-material .docs-icon-document{left:-20px;top:-3498px}.docs-material .docs-icon-presentation,.docs-material .docs-icon-punch{left:-40px;top:-3638px}.docs-material .docs-icon-presentation-grey900{left:-42px;top:-1736px}.docs-material .docs-icon-spreadsheet{left:-20px;top:-5899px}.docs-material .docs-icon-form{left:0;top:-5085px}.docs-material .docs-icon-form-black{left:0;top:-2252px}.docs-material .docs-icon-drawing{left:-40px;top:-2032px}.docs-material .docs-icon-site{left:-40px;top:-1972px}.docs-material .docs-icon-drawing-black{left:-52px;top:-3104px}.docs-material .docs-icon-excel{left:0;top:-5313px}.docs-material .docs-icon-powerpoint{left:0;top:-3350px}.docs-material .docs-icon-word{left:0;top:-5559px}.docs-material .docs-icon-script{left:-46px;top:-66px}.docs-material .docs-icon-insert-script{left:-40px;top:-3950px}.docs-material .docs-icon-gadget{left:0;top:-614px}.docs-material .docs-icon-image{left:-20px;top:-3418px}.docs-material .docs-icon-clipboard{left:0;top:-940px}.docs-material .docs-icon-bold{left:-40px;top:-4150px}.docs-material .docs-icon-italic{left:0;top:-352px}.docs-material .docs-icon-text-color{left:-40px;top:-1992px}.docs-material .docs-icon-align-left{left:-40px;top:-474px}.docs-material .docs-icon-align-center{left:0;top:-3498px}.docs-material .docs-icon-align-right{left:-20px;top:-3764px}.docs-material .docs-icon-align-justify{left:0;top:-4192px}.docs-material .docs-icon-align-shapes-left{left:0;top:-3024px}.docs-material .docs-icon-align-shapes-center{left:-46px;top:-1122px}.docs-material .docs-icon-align-shapes-right{left:0;top:-2938px}.docs-material .docs-icon-align-shapes-top{left:0;top:-1890px}.docs-material .docs-icon-align-shapes-middle{left:-26px;top:-3898px}.docs-material .docs-icon-align-shapes-bottom{left:0;top:-2858px}.docs-material .docs-icon-distribute-shapes-horizontally{left:0;top:-5455px}.docs-material .docs-icon-distribute-shapes-vertically{left:-20px;top:-2858px}.docs-material .docs-icon-valign-top{left:-40px;top:-2232px}.docs-material .docs-icon-valign-middle{left:0;top:-2626px}.docs-material .docs-icon-valign-bottom{left:-46px;top:-5231px}.docs-material .docs-icon-list-number{left:0;top:-4813px}.docs-material .docs-icon-list-bullet{left:-26px;top:-5211px}.docs-material .docs-icon-indent{left:0;top:-1062px}.docs-material .docs-icon-outdent{left:-20px;top:-814px}.docs-material .docs-icon-line-spacing{left:-20px;top:-2032px}.docs-material .docs-icon-columns{left:0;top:-5645px}.docs-material .docs-icon-underline{left:0;top:-3418px}.docs-material .docs-icon-text-bgcolor{left:-26px;top:-86px}.docs-material .docs-icon-textbox{left:-20px;top:-3598px}.docs-material .docs-icon-shapes{left:-22px;top:-1736px}.docs-material .docs-icon-line-width{left:-20px;top:-5105px}.docs-material .docs-icon-add-trendline{left:-20px;top:-5271px}.docs-material .docs-icon-data-label{left:0;top:-252px}.docs-material .docs-icon-next{left:0;top:-634px}.docs-material .docs-icon-previous{left:-20px;top:-1636px}.docs-material .docs-icon-no-color{left:0;top:-5859px}.docs-material .docs-icon-fill-color{left:-40px;top:-494px}.docs-material .docs-icon-line-color{left:0;top:-5333px}.docs-material .docs-icon-line-type{left:-52px;top:-5665px}.docs-material .docs-icon-table{left:-40px;top:-1248px}.docs-material .docs-icon-comment{left:-20px;top:-732px}.docs-material .docs-icon-comment-blank{left:0;top:-4681px}.docs-material .docs-icon-comment-blank-highlighted{left:-40px;top:-2626px}.docs-material .docs-icon-comment-blank-grey600{left:-20px;top:-5619px}.docs-material .docs-icon-insert-comment{left:-20px;top:-2192px}.docs-material .docs-icon-insert-comment-24{left:0;top:-2686px}.docs-material .docs-icon-trending-up-24{left:-46px;top:-3244px}.docs-material .docs-icon-trending-up-18{left:-20px;top:-3224px}.docs-material .docs-icon-trending-down-18{left:-40px;top:-206px}.docs-material .docs-icon-chart{left:0;top:-5727px}.docs-material .docs-icon-list-number-rtl{left:-20px;top:-1890px}.docs-material .docs-icon-list-bullet-rtl{left:-20px;top:-3578px}.docs-material .docs-icon-indent-rtl{left:-40px;top:-2878px}.docs-material .docs-icon-outdent-rtl{left:0;top:-1000px}.docs-material .docs-icon-line-spacing-rtl{left:-52px;top:-5685px}.docs-material .docs-icon-text-ltr{left:-40px;top:-5085px}.docs-material .docs-icon-text-rtl{left:0;top:-4010px}.docs-material .docs-icon-sheet-rtl{left:-22px;top:-1756px}.docs-material .docs-icon-share{left:-52px;top:-4278px}.docs-material .docs-icon-subscript{left:-20px;top:-3538px}.docs-material .docs-icon-superscript{left:-40px;top:-5999px}.docs-material .docs-icon-strikethrough{left:-46px;top:-4871px}.docs-material .docs-icon-clear-formatting{left:0;top:-1040px}.docs-material .docs-icon-link{left:0;top:-1268px}.docs-material .docs-icon-special-character{left:0;top:-6019px}.docs-material .docs-icon-close-white{left:0;top:-2192px}.docs-material .docs-icon-close-small{left:-20px;top:-4232px}.docs-material .docs-icon-close-thin{left:-20px;top:-514px}.docs-material .docs-icon-paint-format{left:-20px;top:-1082px}.docs-material .docs-icon-video{left:0;top:-166px}.docs-material .docs-icon-reload{left:-26px;top:-4767px}.docs-material .docs-icon-reload-rtl{left:0;top:-2092px}.docs-material .docs-icon-insert-page-break{left:-20px;top:-2898px}.docs-material .docs-icon-close{left:-40px;top:-5191px}.docs-material .docs-icon-check{left:-40px;top:-614px}.docs-material .docs-icon-up{left:-26px;top:-1168px}.docs-material .docs-icon-down{left:-20px;top:-186px}.docs-material .docs-icon-add-page{left:0;top:-3004px}.docs-material .docs-icon-email{left:0;top:-3878px}.docs-material .docs-icon-insert-equation{left:-20px;top:-712px}.docs-material .docs-icon-insert-horizontal-line{left:0;top:-672px}.docs-material .docs-icon-tabstop-center-blue500{left:-42px;top:-6103px}.docs-material .docs-icon-tabstop-center-bottom-blue500{left:-20px;top:-454px}.docs-material .docs-icon-tabstop-left-blue500{left:0;top:-554px}.docs-material .docs-icon-tabstop-right-blue500{left:0;top:-106px}.docs-material .docs-icon-ruler-first-indent-drag-blue500{left:-20px;top:-5959px}.docs-material .docs-icon-border-all{left:-40px;top:-4192px}.docs-material .docs-icon-border-right{left:-26px;top:-2132px}.docs-material .docs-icon-border-left{left:0;top:-692px}.docs-material .docs-icon-border-top{left:0;top:-2646px}.docs-material .docs-icon-border-bottom{left:-20px;top:-5333px}.docs-material .docs-icon-border-outside{left:-40px;top:-5859px}.docs-material .docs-icon-border-inside{left:-40px;top:-2792px}.docs-material .docs-icon-border-none{left:0;top:-6039px}.docs-material .docs-icon-border-horizontal{left:-40px;top:-3438px}.docs-material .docs-icon-border-vertical{left:-42px;top:-1288px}.docs-material .docs-icon-merge{left:-52px;top:-3920px}.docs-material .docs-icon-wrap{left:-20px;top:-146px}.docs-material .docs-icon-autofilter{left:0;top:-5475px}.docs-material .docs-icon-autofilter-filled{left:0;top:-3990px}.docs-material .docs-icon-insert-function{left:0;top:-2172px}.docs-material .docs-icon-insert-formula{left:-20px;top:-1452px}.docs-material .docs-icon-folder-shared{left:0;top:-1142px}.docs-material .docs-icon-folder-shared-outline{left:0;top:-146px}.docs-material .docs-icon-folder-outline{left:0;top:-4965px}.docs-material .docs-icon-folder-outline-hover{left:-20px;top:-2052px}.docs-material .docs-icon-folder-outline-pressed{left:0;top:-2072px}.docs-material .docs-icon-folder-solid{left:-46px;top:-4721px}.docs-material .docs-icon-drive{left:0;top:-3224px}.docs-material .docs-icon-drive-hover{left:-40px;top:-854px}.docs-material .docs-icon-drive-pressed{left:-26px;top:-4905px}.docs-material .docs-icon-drive-large{left:-26px;top:-4807px}.docs-material .docs-icon-drive-large-wrapper{width:36px;height:36px}.docs-material .docs-icon-back{left:0;top:-5395px}.docs-material .docs-icon-back-rtl{left:-40px;top:-834px}.docs-material .docs-icon-arrow-more{left:0;top:-186px}.docs-material .docs-icon-arrow-more-rtl{left:0;top:-1952px}.docs-material .docs-icon-search-this-document{left:0;top:-3478px}.docs-material .docs-icon-arrow-dropdown{left:-40px;top:-732px}.docs-material .docs-icon-arrow-dropdown-grey600{left:-52px;top:-3064px}.docs-material .docs-icon-expand-all{left:0;top:-3598px}.docs-material .docs-icon-word-art{left:-20px;top:-3558px}.docs-material .docs-icon-delete-x{left:-46px;top:-4701px}.docs-material .docs-icon-settings{left:-20px;top:-2092px}.docs-material .docs-icon-plus{left:-40px;top:-5333px}.docs-material .docs-icon-plus-white{left:0;top:-5579px}.docs-material .docs-icon-alert{left:-26px;top:-3064px}.docs-material .docs-icon-alert-error-24-orange600{left:-20px;top:-554px}.docs-material .docs-icon-trash{left:0;top:-2032px}.docs-material .docs-icon-locked{left:0;top:-4464px}.docs-material .docs-icon-locked-grey600{left:0;top:-5415px}.docs-material .docs-icon-unlocked{left:-26px;top:-4787px}.docs-material .docs-icon-add-fonts{left:0;top:-3638px}.docs-material .docs-icon-enter-compact{left:0;top:-5353px}.docs-material .docs-icon-exit-compact{left:-20px;top:-4424px}.docs-material .docs-icon-mode-edit{left:-20px;top:-1248px}.docs-material .docs-icon-mode-view{left:-20px;top:-5085px}.docs-material .docs-icon-chat{left:0;top:-4444px}.docs-material .docs-icon-chat-bubble-grey900{left:0;top:-3330px}.docs-material .docs-icon-chat-bubble-white{left:0;top:-5435px}.docs-material .docs-icon-chat-person-grey900{left:-40px;top:-1952px}.docs-material .docs-icon-chat-person-wide-grey900{left:0;top:-4859px}.docs-material .docs-icon-person-add-white{left:0;top:-5899px}.docs-material .docs-icon-star{left:-22px;top:-1716px}.docs-material .docs-icon-duplicate{left:-40px;top:-3310px}.docs-material .docs-icon-file{left:-20px;top:-4464px}.docs-material .docs-icon-opacity{left:0;top:-1616px}.docs-material .docs-icon-label-slant{left:-40px;top:-5879px}.docs-material .docs-icon-point-size{left:-42px;top:-6039px}.docs-material .docs-icon-question{left:0;top:-312px}.docs-material .docs-icon-quote{left:-52px;top:-3124px}.docs-material .docs-icon-vertical-gridlines{left:0;top:-3578px}.docs-material .docs-icon-left-axis{left:-40px;top:-3518px}.docs-material .docs-icon-right-axis{left:-26px;top:-5231px}.docs-material .docs-icon-left-axis-gridlines{left:0;top:-894px}.docs-material .docs-icon-right-axis-gridlines{left:0;top:-4793px}.docs-material .docs-icon-reset{left:-40px;top:-2838px}.docs-material .docs-icon-drag-move{left:-20px;top:-4567px}.docs-material .docs-icon-col-dragger{left:-40px;top:-5559px}.docs-material .docs-icon-chrome-store{left:0;top:-514px}.docs-material .docs-icon-fit-area{left:-26px;top:-1102px}.docs-material .docs-icon-zoom-out{left:0;top:-792px}.docs-material .docs-icon-zoom-tool{left:-40px;top:-186px}.docs-material .docs-icon-download{left:0;top:-3458px}.docs-material .docs-icon-fusion-table{left:0;top:-3044px}.docs-material .docs-icon-spreadsheet-sink{left:0;top:-414px}.docs-material .docs-icon-send-responses{left:-46px;top:-5211px}.docs-material .docs-icon-liveform{left:0;top:-5959px}.docs-material .docs-icon-ellipsis{left:0;top:-5517px}.docs-material .docs-icon-html-preview{left:-20px;top:-1676px}.docs-material .docs-icon-grid{left:-20px;top:-3950px}.docs-material .docs-icon-add-animation{left:-26px;top:-2384px}.docs-material .docs-icon-play-filled-24{left:-26px;top:-3924px}.docs-material .docs-icon-play-filled-error-36{left:-20px;top:-634px}.docs-material .docs-icon-playhead{left:-40px;top:-5455px}.docs-material .docs-icon-playhead-rtl{left:-46px;top:-2272px}.docs-material .docs-icon-unsupported{left:0;top:-474px}.docs-material .docs-icon-calendar{left:-40px;top:-594px}.docs-material .docs-icon-calendar-busy-yellow900{left:0;top:-454px}.docs-material .docs-zippy-closed{left:-20px;top:-5025px}.docs-material .docs-zippy-open{left:0;top:-1736px}.docs-material .docs-icon-bookmark{left:-40px;top:-4378px}.docs-material .docs-icon-heading{left:-42px;top:-5599px}.docs-material .docs-icon-file-blue{left:-34px;top:-1310px}.docs-material .docs-icon-web-result{left:0;top:-4378px}.docs-material .docs-icon-mic{left:-20px;top:-5939px}.docs-material .docs-icon-paragraph{left:-26px;top:-4865px}.docs-material .docs-icon-bookmark-black{left:-22px;top:-5537px}.docs-material .docs-icon-web-result-blue{left:0;top:-3970px}.docs-material .docs-icon-popout{left:0;top:-6059px}.docs-material .docs-icon-checkbox{left:-20px;top:-4484px}.docs-material .docs-icon-checkbox-type{left:0;top:-3558px}.docs-material .docs-icon-dropdown-type{left:0;top:-5271px}.docs-material .docs-icon-grid-type{left:-20px;top:-3438px}.docs-material .docs-icon-image-type{left:-40px;top:-672px}.docs-material .docs-icon-radio-type{left:0;top:-2232px}.docs-material .docs-icon-scale-type{left:-20px;top:-1188px}.docs-material .docs-icon-text-type{left:-20px;top:-2918px}.docs-material .docs-icon-time-type{left:-20px;top:-3290px}.docs-material .docs-icon-insert-text-block{left:-42px;top:-1890px}.docs-material .docs-icon-accepting-responses-on{left:0;top:-594px}.docs-material .docs-icon-accepting-responses-off{left:0;top:-40px}.docs-material .docs-icon-decimal-increase{left:-20px;top:-1616px}.docs-material .docs-icon-decimal-decrease{left:-40px;top:-5005px}.docs-material .docs-icon-settings-white{left:-20px;top:-106px}.docs-material .docs-icon-no-symbol{left:-40px;top:-2772px}.docs-material .docs-icon-crop{left:-42px;top:-1910px}.docs-material .docs-icon-green-check{left:0;top:-1756px}.docs-material .docs-icon-font-size{left:0;top:-494px}.docs-material .docs-icon-reset-image{left:-42px;top:-1716px}.docs-material .docs-icon-r-squared{left:0;top:-4316px}.docs-material .docs-icon-graph-legend{left:0;top:-1228px}.docs-material .docs-icon-cast{left:-46px;top:-1102px}.docs-material .docs-icon-wrap-overflow{left:0;top:-4899px}.docs-material .docs-icon-wrap-wrap{left:-26px;top:-3244px}.docs-material .docs-icon-wrap-clip{left:-22px;top:-1288px}.docs-material .docs-icon-highlights{left:-40px;top:-3290px}.docs-material .docs-icon-green-back{left:0;top:-4747px}.docs-material .docs-icon-arrow-back-white{left:0;top:-4833px}.docs-material .docs-icon-arrow-back-white-rtl{left:-46px;top:-5145px}.docs-material .docs-icon-help{left:0;top:-2838px}.docs-material .docs-icon-highlight-green{left:0;top:-772px}.docs-material .docs-icon-equalizer{left:-26px;top:-3678px}.docs-material .docs-icon-explore-24{left:-46px;top:-894px}.docs-material .docs-icon-explore-black{left:-46px;top:-5125px}.docs-material .docs-icon-explore-black-padded{left:-40px;top:-2606px}.docs-material .docs-icon-explore-green{left:-40px;top:-4661px}.docs-material .docs-icon-explore-white{left:0;top:-1572px}.docs-material .docs-icon-insert-autovis-chart{left:-20px;top:-414px}.docs-material .docs-icon-insert-autovis-chart-white{left:-20px;top:-672px}.docs-material .docs-icon-zoom-in{left:-20px;top:-5979px}.docs-material .docs-icon-thumb-up{left:0;top:-752px}.docs-material .docs-icon-thumb-down{left:-26px;top:-3744px}.docs-material .docs-icon-dlp-warning{left:-40px;top:-3330px}.docs-material .docs-icon-dogfood{left:-26px;top:-3084px}.docs-material .docs-icon-add-to-drive{left:0;top:-1248px}.docs-material .docs-icon-add-shortcut-to-drive{left:0;top:-4985px}.docs-material .docs-icon-paste-without-formatting{left:-20px;top:-3638px}.docs-material .docs-icon-qanda{left:-20px;top:-5999px}.docs-material .docs-icon-update-chart{left:-46px;top:-3458px}.docs-material .docs-icon-arrow-back-dark{left:-20px;top:-3458px}.docs-material .docs-icon-arrow-back-dark-rtl{left:0;top:-3186px}.docs-material .docs-icon-open-in-external{left:-20px;top:-20px}.docs-material .docs-icon-close-20{left:0;top:-5537px}.docs-material .docs-icon-close-24{left:-46px;top:-3678px}.docs-material .docs-icon-unlink{left:-40px;top:-2858px}.docs-material .docs-icon-bar-chart{left:-20px;top:-4444px}.docs-material .docs-icon-column-chart{left:0;top:-3310px}.docs-material .docs-icon-line-chart{left:0;top:-5879px}.docs-material .docs-icon-pie-chart{left:-46px;top:-2338px}.docs-material .docs-icon-pie-chart-outline{height:18px;left:-46px;top:-86px;width:18px}.docs-material .docs-icon-named-range{left:0;top:-372px}.docs-material .docs-icon-clock{left:-20px;top:-3310px}.docs-material .docs-icon-cancel{left:0;top:-3658px}.docs-material .docs-icon-cancel-24{left:-46px;top:-3370px}.docs-material .docs-icon-arrow-line-tool{left:-26px;top:-3724px}.docs-material .docs-icon-arrow-tilted{left:0;top:-2138px}.docs-material .docs-icon-unsupported-black{left:-20px;top:-2272px}.docs-material .docs-icon-text-rotation-up{left:-20px;top:-5455px}.docs-material .docs-icon-text-rotation-down{left:0;top:-4484px}.docs-material .docs-icon-text-rotation-angleup{left:-20px;top:-166px}.docs-material .docs-icon-text-rotation-angledown{left:0;top:-3678px}.docs-material .docs-icon-text-rotation-vertical{left:-46px;top:-3724px}.docs-material .docs-icon-text-rotation-none{left:-26px;top:-4741px}.docs-material .docs-icon-keep-lightbulb{left:-40px;top:-2092px}.docs-material .docs-icon-update-table{left:-40px;top:-4212px}.docs-material .docs-icon-update-slide{left:-40px;top:-5045px}.docs-material .docs-icon-overflow-three-dots{left:-40px;top:-2212px}.docs-material .docs-icon-restore{left:-20px;top:-5313px}.docs-material .docs-icon-paragraph-border-between{left:-26px;top:-2686px}.docs-material .docs-icon-paragraph-border-bottom{left:-26px;top:-3390px}.docs-material .docs-icon-paragraph-border-left{left:0;top:-4252px}.docs-material .docs-icon-paragraph-border-right{left:0;top:-332px}.docs-material .docs-icon-paragraph-border-top{left:-26px;top:-286px}.docs-material .docs-icon-diagram-white{left:-20px;top:-352px}.docs-material .docs-icon-drive-black{left:-40px;top:-3270px}.docs-material .docs-icon-file-upload{left:0;top:-226px}.docs-material .docs-icon-photos{left:-40px;top:-5919px}.docs-material .docs-icon-keyboard{left:0;top:-2778px}.docs-material .docs-icon-dogfood-white{left:0;top:-6121px}.docs-material .docs-icon-hierarchy{left:0;top:-4939px}.docs-material .docs-icon-transition{left:-26px;top:-4925px}.docs-material .docs-icon-mask{left:0;top:-5211px}.docs-material .docs-icon-visibility-off{left:0;top:-1796px}.docs-material .docs-icon-volume-up{left:-52px;top:-1164px}.docs-material .docs-icon-volume-up-filled-36{left:0;top:-6141px}.docs-material .docs-icon-camera{left:0;top:-834px}.docs-material .docs-icon-pivot-table{left:-20px;top:-5435px}.docs-material .docs-icon-insert-pivot-table{left:-26px;top:-4885px}.docs-material .docs-icon-avatar-anonymous-white-32{left:-40px;top:-3598px}.docs-material .docs-icon-code{left:-40px;top:-2752px}.docs-material .docs-icon-play{left:0;top:-1716px}.docs-material .docs-icon-record{left:-40px;top:-5105px}.docs-material .docs-icon-flip-horizontal{left:0;top:-1102px}.docs-material .docs-icon-flip-vertical{left:-46px;top:-40px}.docs-material .docs-icon-rotate-cw{left:0;top:-3244px}.docs-material .docs-icon-database{left:0;top:-2726px}.docs-material .docs-icon-database-grey600{left:0;top:-2404px}.docs-material .docs-icon-plx{left:0;top:-2666px}.docs-material .docs-icon-bigquery{left:-20px;top:-614px}.docs-material .docs-icon-insert-dashboard{left:0;top:-20px}.docs-material .docs-icon-filter-control{left:-40px;top:-3538px}.docs-material .docs-icon-drag-handle-20{left:-20px;top:-5639px}.docs-material .docs-icon-drag-handle-24{left:0;top:-3898px}.docs-material .docs-icon-comment-outline-20{left:-52px;top:-3898px}.docs-material .docs-icon-comment-outline-24{left:0;top:-4278px}.docs-material .docs-icon-edit-outline-20{left:-26px;top:-2358px}.docs-material .docs-icon-edit-outline-24{left:-42px;top:-6123px}.docs-material .docs-icon-error-outline-20{left:0;top:-1836px}.docs-material .docs-icon-error-filled-24-red600{left:-46px;top:-2138px}.docs-material .docs-icon-settings-outline-20{left:-46px;top:-3396px}.docs-material .docs-icon-settings-outline-24{left:-46px;top:-4845px}.docs-material .docs-icon-share-outline-20{left:-40px;top:-372px}.docs-material .docs-icon-share-outline-24{left:-20px;top:-2292px}.docs-material .docs-icon-time-outline-20{left:0;top:-1288px}.docs-material .docs-icon-trend-outline-20{left:0;top:-4545px}.docs-material .docs-icon-accessibility{left:0;top:-5939px}.docs-material .docs-icon-people-24{left:0;top:-5125px}.docs-material .docs-icon-reload-white{left:-20px;top:-4150px}.docs-material .docs-icon-present{left:0;top:-574px}.docs-material .docs-icon-present-to-all{left:-26px;top:-5251px}.docs-material .docs-icon-present-to-all-24{left:0;top:-3718px}.docs-material .docs-icon-present-to-all-24-white{left:-40px;top:-4050px}.docs-material .docs-icon-chevron-left-24{left:0;top:-2338px}.docs-material .docs-icon-chevron-right-24{left:-40px;top:-1188px}.docs-material .docs-icon-chevron-down-24{left:-46px;top:-2112px}.docs-material .docs-icon-delete-grey600-24{left:0;top:-286px}.docs-material .docs-icon-palette{left:0;top:-4661px}.docs-material .docs-icon-sheets-table-24{left:0;top:-3390px}.docs-material .docs-icon-notifications-24{left:0;top:-4398px}.docs-material .docs-icon-notifications-20{left:-52px;top:-1142px}.docs-material .docs-icon-spellcheck{left:0;top:-1310px}.docs-material .docs-icon-add-item{left:0;top:-1532px}.docs-material .docs-icon-info-outline-grey{left:-20px;top:-2626px}.docs-material .docs-icon-datasheet-24-grey800{left:-20px;top:-226px}.docs-material .docs-icon-undo-autocorrect{left:-40px;top:-312px}.docs-material .docs-icon-spellbubble-feedback-16{left:0;top:-5841px}.docs-material .docs-icon-spellbubble-ignore-16{left:-52px;top:-1370px}.docs-material .docs-icon-spellbubble-overflow-three-dots-16{left:-52px;top:-4298px}.docs-material .docs-icon-list-24{left:0;top:-2752px}.docs-material .docs-icon-audio{left:-20px;top:-394px}.docs-material .docs-icon-drive-folder{left:-20px;top:-2212px}.docs-material .docs-icon-loading-circle-grey200{left:0;top:-1082px}.docs-material .docs-icon-pdf{left:-20px;top:-692px}.docs-material .docs-icon-web{left:-46px;top:-2292px}.docs-material .docs-icon-offline-pin-20{left:0;top:-5291px}.docs-material .docs-icon-sync-20{left:-20px;top:-4170px}.docs-material .docs-icon-sync-problem-20{left:0;top:-1858px}.docs-material .docs-icon-acl-view-only{left:-26px;top:-4845px}.docs-material .docs-icon-acl-view-only-on-brand-color-background{left:-20px;top:-1952px}.docs-material .docs-icon-acl-comment-only{left:0;top:-3618px}.docs-material .docs-icon-acl-comment-only-on-brand-color-background{left:-40px;top:-126px}.docs-material .docs-icon-approvals-lock{left:0;top:-814px}.docs-material .docs-icon-approvals-lock-open{left:0;top:-5065px}.docs-material .docs-icon-approvals-stamp{left:-20px;top:-5005px}.docs-material .docs-icon-recall-24{left:0;top:-4519px}.docs-material .docs-icon-feedback{left:-20px;top:-4050px}.docs-material .docs-icon-offline-cloud-24{left:-20px;top:-40px}.docs-material .docs-icon-arrow-down{left:0;top:-712px}.docs-material .docs-icon-arrow-up{left:-40px;top:-1676px}.docs-material .docs-icon-avatar-grey600{left:0;top:-4567px}.docs-material .docs-icon-description-grey600{left:0;top:-3518px}.docs-material .docs-icon-popout-below{left:0;top:-126px}.docs-material .docs-icon-group{left:-26px;top:-3044px}.docs-material .docs-icon-revisions-grey600{left:0;top:-2492px}.docs-material .docs-icon-popout-viewer-24-white{left:-40px;top:-394px}.docs-material .docs-icon-maximize-viewer{left:-40px;top:-2192px}.docs-material .docs-icon-maximize-viewer-24-white{left:-22px;top:-1776px}.docs-material .docs-icon-open-in-external-24-white{left:-46px;top:-1330px}.docs-material .docs-icon-copy-24-white{left:-26px;top:-4278px}.docs-material .docs-icon-sync{left:0;top:-3290px}.docs-material .docs-icon-search-insights{left:0;top:-1972px}.docs-material .docs-icon-logo-docs-40px{left:0;top:-6079px}.docs-material .docs-icon-logo-sheets-40px{left:0;top:-1910px}.docs-material .docs-icon-logo-slides-40px{left:-20px;top:-5475px}.docs-material .docs-icon-text-wrapping-wrap-72{left:0;top:-2512px}.docs-material .docs-icon-text-wrapping-break-72{left:0;top:-3784px}.docs-material .docs-icon-text-wrapping-inline-72{left:0;top:-4587px}.docs-material .docs-icon-text-wrapping-above-72{left:0;top:-5747px}.docs-material .docs-icon-text-wrapping-behind-72{left:0;top:-4076px}.docs-material .docs-icon-text-wrapping-wrap-text{left:-26px;top:-4504px}.docs-material .goog-toolbar-button-checked .docs-icon-text-wrapping-wrap-text{left:0;top:-4212px}.docs-material .docs-icon-text-wrapping-break-text{left:-20px;top:-854px}.docs-material .goog-toolbar-button-checked .docs-icon-text-wrapping-break-text{left:-46px;top:-554px}.docs-material .docs-icon-text-wrapping-inline-with-text{left:0;top:-4150px}.docs-material .goog-toolbar-button-checked .docs-icon-text-wrapping-inline-with-text{left:0;top:-5821px}.docs-material .docs-icon-text-wrapping-above-text{left:-40px;top:-2586px}.docs-material .goog-toolbar-button-checked .docs-icon-text-wrapping-above-text{left:-22px;top:-5291px}.docs-material .docs-icon-text-wrapping-behind-text{left:-20px;top:-5191px}.docs-material .goog-toolbar-button-checked .docs-icon-text-wrapping-behind-text{left:-26px;top:-4945px}.docs-material .docs-icon-quick-layout-top-left-50{left:-20px;top:-1000px}.docs-material .docs-icon-quick-layout-top-center-50{left:-20px;top:-1472px}.docs-material .docs-icon-quick-layout-top-right-50{left:0;top:-5665px}.docs-material .docs-icon-quick-layout-center-left-50{left:0;top:-1370px}.docs-material .docs-icon-quick-layout-center-50{left:0;top:-3104px}.docs-material .docs-icon-quick-layout-center-right-50{left:-20px;top:-1534px}.docs-material .docs-icon-quick-layout-bottom-left-50{left:-20px;top:-2404px}.docs-material .docs-icon-quick-layout-bottom-center-50{left:-20px;top:-752px}.docs-material .docs-icon-quick-layout-bottom-right-50{left:-22px;top:-1802px}.docs-material .docs-icon-encryption-shield{left:-40px;top:-5979px}.docs-material .docs-icon-cloud-check{left:-26px;top:-2706px}.docs-material .docs-icon-sync-no-connection{left:-40px;top:-4464px}.docs-material .docs-icon-sync-problem-red500{left:0;top:-1636px}.docs-material .docs-icon-sync-saved-locally{left:-20px;top:-5599px}.docs-material .docs-icon-sync-disabled{left:-40px;top:-3558px}.docs-material .docs-icon-sync-disabled-red600{left:-20px;top:-3350px}.docs-material .docs-icon-cloud-check-24{left:-40px;top:-2812px}.docs-material .docs-icon-sync-no-connection-24{left:-20px;top:-4252px}.docs-material .docs-icon-sync-problem-24-red500{left:-46px;top:-4741px}.docs-material .docs-icon-sync-saved-locally-24{left:-20px;top:-2978px}.docs-material .docs-icon-sync-disabled-24{left:-46px;top:-2978px}.docs-material .docs-icon-sync-disabled-24-red600{left:0;top:-1162px}.docs-material .docs-icon-auto-awesome{left:0;top:-1020px}.docs-material .docs-icon-warning-24{left:-40px;top:-1636px}.docs-material .docs-icon-info{left:-46px;top:-4252px}.docs-material .docs-icon-search-24{left:0;top:-4767px}.docs-material .docs-icon-sync-24{left:0;top:-4721px}.docs-material .docs-icon-add{left:-20px;top:-4212px}.docs-material .docs-icon-folder{left:-20px;top:-4661px}.docs-material .docs-icon-star-border{left:-20px;top:-6039px}.docs-material .docs-icon-star-filled{left:0;top:-4701px}.docs-material .docs-icon-link-24{left:-48px;top:-2358px}.docs-material .docs-icon-link-no-24{left:-22px;top:-1864px}.docs-material .docs-icon-paste-source-24{left:0;top:-3924px}.docs-material .docs-icon-paste-destination-24{left:0;top:-66px}.docs-material .docs-preview{left:0;top:-2586px}.docs-material .docs-icon-increase-22{left:-40px;top:-4418px}.docs-material .docs-icon-decrease-22{left:-42px;top:-6079px}.docs-material .docs-icon-gear-grey400-13{left:0;top:-4504px}.docs-material .docs-icon-gear-grey700-13{left:-40px;top:-5271px}.docs-material .docs-icon-gmail{left:-46px;top:-3990px}.docs-material .docs-icon-folder-move{left:-40px;top:-5395px}.docs-material .docs-icon-drag-top-left{left:0;top:-1356px}.docs-material .docs-icon-drag-top-right{left:-20px;top:-1310px}.docs-material .docs-icon-sync-pending{left:0;top:-4356px}.docs-material .docs-icon-sync-pending-24{left:-20px;top:-894px}.docs-material .docs-icon-check-24{left:-20px;top:-1330px}.docs-material .docs-icon-check-24-white{left:0;top:-5231px}.docs-material .docs-icon-instant-comment-24{left:-20px;top:-2726px}.docs-material .docs-icon-instant-comment-blue600-24{left:0;top:-2466px}.docs-material .docs-icon-instant-suggest-24{left:0;top:-3064px}.docs-material .docs-icon-instant-suggest-green600-24{left:-40px;top:-2466px}.docs-material .docs-icon-docos-continue-the-conversation-24{left:0;top:-2112px}.docs-material .docs-icon-locked-white{left:-46px;top:-4905px}.docs-material .docs-icon-youtube-red{left:-26px;top:-4524px}.docs-material .docs-icon-unarchive-24{left:-26px;top:-1142px}.docs-material .docs-icon-paintbrush{left:-26px;top:-2338px}.docs-material .docs-icon-videocam{left:-26px;top:-66px}.docs-material .docs-icon-send-to-email-24-red600{left:-20px;top:-4010px}.docs-material .docs-icon-sort_az{left:0;top:-534px}.docs-material .docs-icon-sort_za{left:-20px;top:-474px}.docs-material .docs-icon-insights{left:0;top:-1676px}.docs-material .docs-icon-appsheet{left:0;top:-1816px}.docs-material .docs-icon-tv{left:0;top:-5979px}.docs-material .docs-icon-laptop{left:-20px;top:-4192px}.docs-material .docs-icon-autofit-none{left:-20px;top:-434px}.docs-material .docs-icon-autofit-resize-shape{left:0;top:-394px}.docs-material .docs-icon-autofit-shrink-text{left:-20px;top:-834px}.docs-material .docs-icon-avatar{left:-40px;top:-4398px}.docs-material .docs-icon-sheets-ia-accessibility-person{left:-42px;top:-1930px}.docs-material .docs-icon-sheets-ia-add-box{left:0;top:-3950px}.docs-material .docs-icon-sheets-ia-add-comment{left:0;top:-2606px}.docs-material .docs-icon-sheets-ia-add-file-note{left:-52px;top:-3144px}.docs-material .docs-icon-sheets-ia-add-ons{left:-20px;top:-2606px}.docs-material .docs-icon-sheets-ia-add-person{left:-20px;top:-3878px}.docs-material .docs-icon-sheets-ia-add-shortcut-to-drive{left:0;top:-980px}.docs-material .docs-icon-sheets-ia-align-bottom{left:-46px;top:-266px}.docs-material .docs-icon-sheets-ia-align-center{left:0;top:-1552px}.docs-material .docs-icon-sheets-ia-align-left{left:0;top:-3764px}.docs-material .docs-icon-sheets-ia-align-middle{left:-20px;top:-6121px}.docs-material .docs-icon-sheets-ia-align-right{left:-46px;top:-2686px}.docs-material .docs-icon-sheets-ia-align-top{left:-26px;top:-2152px}.docs-material .docs-icon-sheets-ia-antenna-update{left:0;top:-854px}.docs-material .docs-icon-sheets-ia-approvals-stamp{left:-20px;top:-1696px}.docs-material .docs-icon-sheets-ia-apps-script{left:0;top:-2444px}.docs-material .docs-icon-sheets-ia-article-document{left:-40px;top:-3878px}.docs-material .docs-icon-sheets-ia-auto-complete-draw{left:0;top:-3698px}.docs-material .docs-icon-sheets-ia-auto-fix-wand{left:0;top:-3370px}.docs-material .docs-icon-sheets-ia-bigquery{left:-46px;top:-286px}.docs-material .docs-icon-sheets-ia-bold{left:-52px;top:-3204px}.docs-material .docs-icon-sheets-ia-chart{left:-46px;top:-4504px}.docs-material .docs-icon-sheets-ia-checkbox{left:-20px;top:-3618px}.docs-material .docs-icon-sheets-ia-clear-format{left:0;top:-5999px}.docs-material .docs-icon-sheets-ia-cloud-check-green{left:0;top:-1452px}.docs-material .docs-icon-sheets-ia-comment-feedback-warning{left:0;top:-434px}.docs-material .docs-icon-sheets-ia-comment-lines{left:-40px;top:-1616px}.docs-material .docs-icon-sheets-ia-conditional-format-gradient{left:-26px;top:-3186px}.docs-material .docs-icon-sheets-ia-content-copy{left:-40px;top:-3498px}.docs-material .docs-icon-sheets-ia-cut{left:0;top:-4232px}.docs-material .docs-icon-sheets-ia-database{left:-42px;top:-5537px}.docs-material .docs-icon-sheets-ia-delete-trash{left:-40px;top:-2252px}.docs-material .docs-icon-sheets-ia-dollar{left:-42px;top:-6149px}.docs-material .docs-icon-sheets-ia-download{left:-20px;top:-594px}.docs-material .docs-icon-sheets-ia-drag-move{left:0;top:-3270px}.docs-material .docs-icon-sheets-ia-drawings{left:-46px;top:-2726px}.docs-material .docs-icon-sheets-ia-dropdown-arrow-in-circle{left:0;top:-1656px}.docs-material .docs-icon-sheets-ia-ear-hear{left:-40px;top:-434px}.docs-material .docs-icon-sheets-ia-edit-pen{left:0;top:-5105px}.docs-material .docs-icon-sheets-ia-extract-sheet-copy{left:0;top:-5171px}.docs-material .docs-icon-sheets-ia-file{left:0;top:-1512px}.docs-material .docs-icon-sheets-ia-file-copy{left:-42px;top:-6059px}.docs-material .docs-icon-sheets-ia-filter-bars{left:-20px;top:-5171px}.docs-material .docs-icon-sheets-ia-filter-funnel{left:-20px;top:-4681px}.docs-material .docs-icon-sheets-ia-filter-table-view{left:-52px;top:-3184px}.docs-material .docs-icon-sheets-ia-find-replace{left:-46px;top:-3478px}.docs-material .docs-icon-sheets-ia-folder{left:-52px;top:-3044px}.docs-material .docs-icon-sheets-ia-folder-move{left:0;top:-2424px}.docs-material .docs-icon-sheets-ia-font-text-size{left:-40px;top:-814px}.docs-material .docs-icon-sheets-ia-fullscreen{left:0;top:-5045px}.docs-material .docs-icon-sheets-ia-fullscreen-exit{left:0;top:-3538px}.docs-material .docs-icon-sheets-ia-globe{left:-20px;top:-1268px}.docs-material .docs-icon-sheets-ia-gmail{left:0;top:-2958px}.docs-material .docs-icon-sheets-ia-grid-range{left:-20px;top:-2798px}.docs-material .docs-icon-sheets-ia-help{left:-26px;top:-2112px}.docs-material .docs-icon-sheets-ia-history-restore{left:-20px;top:-4316px}.docs-material .docs-icon-sheets-ia-horizontal-rows{left:-40px;top:-2052px}.docs-material .docs-icon-sheets-ia-info{left:-40px;top:-1696px}.docs-material .docs-icon-sheets-ia-italic{left:-46px;top:-3704px}.docs-material .docs-icon-sheets-ia-keyboard{left:-40px;top:-534px}.docs-material .docs-icon-sheets-ia-label{left:0;top:-2918px}.docs-material .docs-icon-sheets-ia-lightbulb{left:0;top:-1330px}.docs-material .docs-icon-sheets-ia-line-graph{left:-20px;top:-2818px}.docs-material .docs-icon-sheets-ia-link{left:-20px;top:-5517px}.docs-material .docs-icon-sheets-ia-link-off{left:0;top:-1492px}.docs-material .docs-icon-sheets-ia-lock-close{left:0;top:-1208px}.docs-material .docs-icon-sheets-ia-lock-open{left:-40px;top:-3418px}.docs-material .docs-icon-sheets-ia-logo-forms{left:0;top:-5619px}.docs-material .docs-icon-sheets-ia-logo-sheets{left:0;top:-3166px}.docs-material .docs-icon-sheets-ia-minus{left:0;top:-4170px}.docs-material .docs-icon-sheets-ia-minus-box{left:-20px;top:-5395px}.docs-material .docs-icon-sheets-ia-notification-bell{left:-40px;top:-5517px}.docs-material .docs-icon-sheets-ia-numbers-123{left:-20px;top:-2232px}.docs-material .docs-icon-sheets-ia-offline-pin{left:-40px;top:-4965px}.docs-material .docs-icon-sheets-ia-offline-pin-green{left:0;top:-3858px}.docs-material .docs-icon-sheets-ia-open-new-window{left:0;top:-2318px}.docs-material .docs-icon-sheets-ia-paint-palette-theme{left:-40px;top:-20px}.docs-material .docs-icon-sheets-ia-paintbrush{left:0;top:-960px}.docs-material .docs-icon-sheets-ia-paper-airplane-blue{left:-52px;top:-1388px}.docs-material .docs-icon-sheets-ia-paperclip{left:-52px;top:-3164px}.docs-material .docs-icon-sheets-ia-paragraph-right-to-left{left:0;top:-1472px}.docs-material .docs-icon-sheets-ia-paste{left:0;top:-2212px}.docs-material .docs-icon-sheets-ia-photo-image{left:0;top:-1432px}.docs-material .docs-icon-sheets-ia-pivot-table{left:0;top:-2818px}.docs-material .docs-icon-sheets-ia-play-circle{left:-20px;top:-5879px}.docs-material .docs-icon-sheets-ia-plus{left:-20px;top:-5579px}.docs-material .docs-icon-sheets-ia-plx{left:0;top:-2364px}.docs-material .docs-icon-sheets-ia-print{left:0;top:-2292px}.docs-material .docs-icon-sheets-ia-redo{left:0;top:-4050px}.docs-material .docs-icon-sheets-ia-refresh{left:-20px;top:-2012px}.docs-material .docs-icon-sheets-ia-rename{left:-40px;top:-1452px}.docs-material .docs-icon-sheets-ia-resize-horizontal{left:0;top:-5025px}.docs-material .docs-icon-sheets-ia-rotate-box{left:0;top:-2798px}.docs-material .docs-icon-sheets-ia-school-graduation{left:0;top:-5005px}.docs-material .docs-icon-sheets-ia-settings-gear{left:-20px;top:-5559px}.docs-material .docs-icon-sheets-ia-sheets-tab{left:-20px;top:-1208px}.docs-material .docs-icon-sheets-ia-shuffle-swap{left:-20px;top:-2318px}.docs-material .docs-icon-sheets-ia-sigma-function{left:0;top:-4879px}.docs-material .docs-icon-sheets-ia-sort{left:0;top:-1776px}.docs-material .docs-icon-sheets-ia-spellcheck{left:-40px;top:-4567px}.docs-material .docs-icon-sheets-ia-spreadsheet-black{left:-42px;top:-5619px}.docs-material .docs-icon-sheets-ia-spreadsheet-green{left:-46px;top:-3004px}.docs-material .docs-icon-sheets-ia-square-box-selection{left:0;top:-2052px}.docs-material .docs-icon-sheets-ia-square-rounded{left:-20px;top:-5645px}.docs-material .docs-icon-sheets-ia-strikethrough{left:0;top:-3744px}.docs-material .docs-icon-sheets-ia-sync{left:-26px;top:-3166px}.docs-material .docs-icon-sheets-ia-sync-problem{left:-40px;top:-4316px}.docs-material .docs-icon-sheets-ia-table{left:0;top:-1696px}.docs-material .docs-icon-sheets-ia-table-check{left:0;top:-2272px}.docs-material .docs-icon-sheets-ia-table-tab{left:0;top:-5599px}.docs-material .docs-icon-sheets-ia-text-rotate-angle-down{left:-54px;top:-1310px}.docs-material .docs-icon-sheets-ia-text-rotate-angle-up{left:-20px;top:-1992px}.docs-material .docs-icon-sheets-ia-text-rotate-down{left:0;top:-3438px}.docs-material .docs-icon-sheets-ia-text-rotate-none{left:-20px;top:-5919px}.docs-material .docs-icon-sheets-ia-text-rotate-up{left:0;top:-5495px}.docs-material .docs-icon-sheets-ia-text-rotate-vertical-stack{left:-20px;top:-5859px}.docs-material .docs-icon-sheets-ia-text-wrap{left:0;top:-874px}.docs-material .docs-icon-sheets-ia-trending-up-arrow{left:0;top:-920px}.docs-material .docs-icon-sheets-ia-triangle-problem-warning{left:-46px;top:-246px}.docs-material .docs-icon-sheets-ia-underline{left:0;top:-4336px}.docs-material .docs-icon-sheets-ia-undo{left:-20px;top:-2172px}.docs-material .docs-icon-sheets-ia-user-edit-history{left:-52px;top:-3084px}.docs-material .docs-icon-sheets-ia-user-preference-settings{left:-20px;top:-940px}.docs-material .docs-icon-sheets-ia-vertical-columns{left:-26px;top:-4701px}.docs-material .docs-icon-sheets-ia-view-show{left:-26px;top:-5125px}.docs-material .docs-icon-sheets-ia-zoom-in{left:0;top:-1596px}.docs-gm .docs-circle-promo-base{height:210px;width:210px;background-color:#188038!important;border-color:#188038!important}.docs-circle-promo-base{border-style:solid;border-width:400px;border-radius:800px;font-size:16px;height:136px;position:absolute;width:136px;z-index:9000}.docs-gm .docs-circle-promo-content{color:white;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:16px;line-height:22px;margin-left:80px;position:relative;width:350px}.docs-circle-promo-content{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;width:280px}.docs-gm .docs-circle-promo-header{font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:20px;font-size:var(--docs-material-font-size-22,20px)}.docs-circle-promo-header{font-size:20px;line-height:27px;margin-bottom:16px}.docs-circle-promo-buttons{margin-top:16px}.docs-circle-promo-button{cursor:pointer;font-size:14px;font-weight:500;text-transform:uppercase}.docs-circle-promo-button:hover,.docs-circle-promo-button:focus{opacity:0.87}.docs-circle-promo-continue-button{margin-right:20px}.docs-material-promo-walkthrough-bubble{background-color:#fff;border:1px solid transparent;border-radius:8px;box-shadow:0 4px 8px 3px rgba(60,64,67,.15);position:absolute;z-index:1003}.docs-material-promo-walkthrough-bubble:focus{outline:none}.docs-material-promo-walkthrough-bubble .jfk-bubble-content{min-width:312px;padding:0px 24px 24px}.docs-material-promo-walkthrough-bubble-buttons{display:flex;justify-content:flex-end;padding:24px}.docs-material-promo-walkthrough-bubble .docs-material-button-fill-primary.docs-material-button{margin-left:12px;text-transform:none}.docs-material-promo-walkthrough-bubble-close-button{background-color:transparent;border:none;border-radius:50%;cursor:pointer;margin:0px;outline:0;padding:7px;position:absolute;right:8px;top:8px}.docs-material-promo-walkthrough-bubble-close-button.goog-flat-button-hover{background-color:#f1f3f4}.docs-material-promo-walkthrough-bubble-close-button.goog-flat-button-focused{background-color:#e8eaed;outline:none}.docs-material-promo-walkthrough-bubble .jfk-bubble-arrowdown .jfk-bubble-arrowimplbefore,.docs-material-promo-walkthrough-bubble .jfk-bubble-arrowup .jfk-bubble-arrowimplbefore{border-color:rgba(60,64,67,0.1) transparent}.docs-material-promo-walkthrough-bubble .jfk-bubble-arrowleft .jfk-bubble-arrowimplbefore,.docs-material-promo-walkthrough-bubble .jfk-bubble-arrowright .jfk-bubble-arrowimplbefore{border-color:transparent rgba(60,64,67,0.1)}.docs-binaryupsavewarning{width:512px}.docs-binaryupsavewarning-content-text{color:#5f6368;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:16px}a.docs-binaryupsavewarning-learn-more,a.docs-binaryupsavewarning-learn-more:visited{align-self:center;color:#188038;font-family:var(--docs-material-header-font-family,Roboto,RobotoDraft,Helvetica,Arial,sans-serif);font-size:14px;font-weight:var(--docs-material-font-weight-bold,700);margin-right:auto}.office-editing-survey-feedback{background-color:#188038;border-radius:4px;color:#fff;display:inline-block;height:40px;left:0;margin:0 auto;position:absolute;right:0;top:16px;width:348px;z-index:1}.office-editing-survey-feedback-title{float:left;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;line-height:40px;padding:0 32px 0 24px}.office-editing-survey-feedback-take-survey-button{color:#fff;cursor:pointer;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:40px;line-height:40px}.office-editing-survey-feedback-close-button{cursor:pointer;float:right;height:40px;line-height:40px;margin-right:12px;opacity:0.5}.docs-unsupportedofficefeatureswarning{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;width:512px}.docs-unsupportedofficefeatureswarning-content-restorefiletext{border-bottom:1px solid #bdc1c6;color:#5f6368;font-size:16px;line-height:24px;margin-bottom:23px;margin-top:-8px;padding-bottom:16px}.docs-unsupportedofficefeatureswarning-content-features-list{font-size:14px;max-height:128px;overflow-y:auto}.docs-unsupportedofficefeatureswarning-content-feature{color:#3c4043;margin-bottom:12px}a.docs-unsupportedofficefeatureswarning-learn-more,a.docs-unsupportedofficefeatureswarning-learn-more:visited{align-self:center;color:#188038;font-family:var(--docs-material-header-font-family,Roboto,RobotoDraft,Helvetica,Arial,sans-serif);font-size:14px;font-weight:var(--docs-material-font-weight-bold,700);margin-right:auto}.docs-image-picker-upload{font-family:Roboto,Arial,sans-serif}.docs-image-picker-upload.modal-dialog{padding:0}.docs-image-picker-upload .modal-dialog-title{padding:17px 20px 0}.docs-image-picker-upload .modal-dialog-title-text{font-size:20px}.docs-image-picker-upload .modal-dialog-content{line-height:normal;padding:0 20px}.docs-image-picker-upload .modal-dialog-buttons{border-top:1px solid #e5e5e5;margin-top:20px;padding:17px 20px}.docs-image-picker-upload-container{min-height:300px;min-width:450px}.docs-image-picker-upload-msg-bar{color:#ccc;font-size:16px;font-style:italic;padding:0 0 10px}.docs-image-picker-upload-dropzone-parent{height:100%;width:100%}.docs-image-picker-upload-dropzone-cell{border:#ddd 4px dashed;border-radius:2px;height:100%}.docs-image-picker-upload-dropzone-cell .jfk-button{margin:0}.docs-image-picker-upload-dropzone{height:100%;text-align:center;width:100%}.docs-image-picker-upload-drop-here{color:#ccc;font-size:20pt;padding:0 10px}.docs-image-picker-upload-drop-alt{color:#ccc;font-size:13px;font-weight:500;padding:15px 0 5px}.docs-image-picker-upload-warning{color:#aaa;display:inline-block;font-size:13px;padding:0 20px 0 30px;vertical-align:middle}.docs-odp-sidebar{overflow:hidden;box-shadow:-3px 0px 6px -3px rgba(60,64,67,.15),3px 0px 6px -3px rgba(60,64,67,.15);border-top:1px solid #dadce0;display:flex;flex-direction:column;position:absolute;right:0;top:0;width:300px}.docs-odp-iframe{flex:1 0;border:0}.pub-dialog-disabled-text{color:#afafaf}.pub-dialog-wrap{font-size:13px;font-size:var(--docs-material-font-size-normal,13px);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;width:500px}.pub-dialog-content-div{padding:0 0 10px 30px}.pub-dialog-input-div{padding-bottom:15px}.pub-dialog-option-vspacer{height:5px}.pub-dialog-info{color:#999;font-size:11px;padding-bottom:2px}.docs-gm .pub-dialog-info{color:#80868b}.docs-gm .pub-dialog-state-published.pub-dialog-info{color:#1a73e8}.pub-dialog-tab{font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif}.goog-tab-bar.pub-dialog-tab-bar{background:none;border-bottom-color:silver!important;margin-top:20px;padding-left:0!important}.docs-gm .goog-tab-bar.pub-dialog-tab-bar{margin-top:21px;padding-top:0}.goog-tab-bar.pub-dialog-tab-bar .goog-tab.pub-dialog-tab{color:#bdbdbd;cursor:pointer;font-weight:500;margin:1px 15px 0 0;padding:4px 8px;text-decoration:none;top:1px}.docs-gm .goog-tab-bar.pub-dialog-tab-bar .goog-tab.pub-dialog-tab{color:#5f6368;font-size:14px;text-align:center;width:120px}.goog-tab-bar.pub-dialog-tab-bar .goog-tab.pub-dialog-tab.goog-tab-selected,.goog-tab-bar.pub-dialog-tab-bar .goog-tab.pub-dialog-tab.goog-tab-hover{background:none;border-bottom:3px solid #4d90fe;border-left:none;border-right:none;border-top:none;color:black}.docs-gm .goog-tab-bar.pub-dialog-tab-bar .goog-tab.pub-dialog-tab.goog-tab-selected,.docs-gm .goog-tab-bar.pub-dialog-tab-bar .goog-tab.pub-dialog-tab.goog-tab-hover{border-bottom:2px solid #1a73e8}.pub-dialog-document-link,.pub-dialog-embed-code{margin-top:20px;width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.pub-dialog-link-content-div{margin-top:10px}.docs-gm .pub-dialog-link-options-container{display:flex}.pub-dialog-embed-code{font-size:13px;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;height:65px}.docs-gm .pub-dialog-embed-code{height:82px!important}.docs-gm .pub-dialog-link-options-document-part-menu-button{margin-right:15px}.pub-dialog-sep-div{padding:20px 0}#pub-dialog-publish-link-button{margin-top:20px}#pub-dialog-dom-signin-req-dropdown-container{margin-left:30px}.pub-dialog-sep{border-top-color:#e1e1e1;border-top-style:solid;border-width:1px 0 0 0;color:#bfbfbf;height:0}.goog-zippy-header.pub-dialog-zippy-header{cursor:pointer;display:inline-block;margin:0}.docs-gm .goog-zippy-header.pub-dialog-zippy-header{color:#3c4043}.pub-dialog-zippy-content{margin-left:22px}.docs-gm #pub-dialog-publish-button{color:#5f6368}.goog-zippy-collapsed .pub-dialog-settings-zippy-icon{-webkit-transform:rotate(0);-moz-transform:rotate(0);-ms-transform:rotate(0);-o-transform:rotate(0);transform:rotate(0)}.goog-zippy-expanded .pub-dialog-settings-zippy-icon{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}#pub-dialog-publish-button{margin-top:10px}.pub-dialog-checkbox-container{line-height:22px;margin-top:10px}.docs-link-infilelinksuggestiongroup-cb .docs-link-infilelinksuggestiongroup-cb-openarrow{display:none}.docs-link-infilelinksuggestiongroup-cb.docs-link-infilelinksuggestiongroup-cb-open .docs-link-infilelinksuggestiongroup-cb-openarrow{display:inline-block}.docs-link-infilelinksuggestiongroup-cb.docs-link-infilelinksuggestiongroup-cb-closearrow{display:inline-block}.docs-link-infilelinksuggestiongroup-cb.docs-link-infilelinksuggestiongroup-cb-open .docs-link-infilelinksuggestiongroup-cb-closearrow{display:none}.docs-link-infilelinksuggestiongroup-cb .docs-icon{margin:0 6px}.docs-link-infilelinksuggestiongroup-cb-title{display:inline-block;padding:8px 0}.docs-link-infilelinksuggestiongroup-cb{margin:6px 0;outline:none}.docs-link-infilelinksuggestiongroup-cb:hover,.docs-link-infilelinksuggestiongroup-cb-keyboardfocus{background-color:#eee;cursor:default;outline:none}.goog-zippy-content .docs-link-linksuggestion{padding-left:27px}.docs-linkbubble-link-preview .docs-link-bubble-mime-icon .docs-icon{vertical-align:baseline;width:18px;height:18px;margin:0px}.docs-linkbubble-link-preview #docs-linkbubble-link-text{font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;opacity:1;padding-left:6px;padding-right:6px;text-decoration:none!important;vertical-align:baseline;width:180px}.docs-linkbubble-link-preview .link-previews-broken-link#docs-linkbubble-link-text{color:#80868b!important;cursor:default;font-style:italic;pointer-events:none}.link-previews-before-transition{opacity:.5!important}.link-previews-animate-on-display{animation:fade .15s}@keyframes fade{from{opacity:.5}}.link-previews-fadeable{transition:opacity .15s!important}.docs-linkbubble-link-preview.docs-linkbubble-bubble{border:0;padding:6px 0}.docs-linkbubble-link-preview .link-bubble-header{align-items:center;display:flex;padding:0 6px}.docs-gm .docs-linkbubble-bubble,.docs-gm .docs-multi-linkbubble-bubble{background-color:#fff;border-color:#dadce0;border-radius:8px;box-shadow:0 1px 3px 1px rgba(60,64,67,.15);color:#3c4043;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px}.docs-linkbubble-link-preview .docs-link-bubble-mime-icon{height:18px;padding:6px;vertical-align:baseline;width:18px;opacity:1}.docs-linkbubble-link-preview .docs-link-bubble-card-component.docs-link-bubble-action-card-component,.docs-linkbubble-link-preview .docs-link-bubble-card-component.docs-link-bubble-warning-card-component{margin-top:4px;padding:10px 12px 4px}.docs-linkbubble-link-preview .docs-link-bubble-card-component.docs-link-bubble-action-card-component,.docs-linkbubble-link-preview .docs-link-bubble-action-card-component:before{background-color:#1a73e8}.docs-linkbubble-link-preview .docs-link-bubble-card-component.docs-link-bubble-warning-card-component,.docs-linkbubble-link-preview .docs-link-bubble-warning-card-component:before{background-color:#fef7e0}.docs-linkbubble-link-preview .docs-link-bubble-text-card-component.docs-link-bubble-warning-card-component span{color:#202124!important}.docs-linkbubble-link-preview .docs-link-bubble-favicon{border-radius:2px;height:18px;opacity:1;padding:6px;vertical-align:baseline;width:18px}.docs-linkbubble-link-preview .docs-link-bubble-favicon img{border-radius:2px;height:18px;width:18px}.docs-linkbubble-link-preview .docs-link-bubble-action-card-component:before,.docs-linkbubble-link-preview .docs-link-bubble-warning-card-component:before{content:'';height:7px;left:0;bottom:0;position:absolute;width:100%;border-radius:0 0 8px 8px;z-index:-1}.docs-linkbubble-link-preview .docs-link-bubble-card-component .docs-link-bubble-mime-icon{padding:0px}.docs-linkbubble-link-preview .docs-link-bubble-card-component{align-items:center;display:flex;padding:6px 12px}.linkbubble-card-collapsed .docs-link-bubble-card-component{display:none!important}.linkbubble-card-collapsed .docs-link-bubble-card-component.linkbubble-card-non-collapsible{display:flex}.docs-linkbubble-link-preview .docs-link-bubble-title-card-component a{color:#202124!important;flex-grow:1;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;height:18px;overflow:hidden;padding-left:12px;text-overflow:ellipsis;white-space:nowrap;width:0}.docs-linkbubble-link-preview .docs-link-bubble-title-card-component a:hover{text-decoration:none!important}.docs-linkbubble-link-preview .docs-link-bubble-text-card-component span,.docs-linkbubble-link-preview .docs-link-bubble-action-card-component span,.docs-linkbubble-link-preview .docs-link-bubble-warning-card-component span{flex-direction:column;flex-grow:1;font-size:12px;justify-content:center;line-height:1.3;overflow-wrap:break-word;white-space:normal;width:0;word-wrap:break-word}.docs-linkbubble-link-preview .docs-link-bubble-text-card-component span{color:#80868b!important;cursor:text}.docs-linkbubble-link-preview .docs-link-bubble-action-card-component span{color:#fff!important}.docs-linkbubble-link-preview .docs-link-bubble-thumbnail-container{background-color:#e8eaed;border-radius:4px;display:flex;flex-grow:1;height:141px;overflow:hidden;position:relative;width:0}.docs-linkbubble-link-preview .docs-link-bubble-thumbnail-container a{display:flex;flex-direction:column;flex-grow:1;justify-content:center;align-items:center}.docs-linkbubble-link-preview .drive-image-thumbnail-component .docs-link-bubble-thumbnail-container a{display:block!important}.drive-image-thumbnail-component .docs-link-bubble-thumbnail-container{border:1px solid #e8eaed}#link-bubble-thumbnail-image{background-position:center;background-repeat:no-repeat;height:100%;width:100%}.default-image-card-component #link-bubble-thumbnail-image,.vertical-image-card-component #link-bubble-thumbnail-image{background-size:contain}.horizontal-image-card-component #link-bubble-thumbnail-image{background-size:cover}.vertical-image-card-component img.link-bubble-drive-thumbnail-image{display:block;height:100%;margin:auto}.default-image-card-component img.link-bubble-drive-thumbnail-image,.horizontal-image-card-component img.link-bubble-drive-thumbnail-image{width:100%}.docs-link-bubble-high-contrast .docs-link-bubble-thumbnail-container a{height:120%;transform:translateY(-10%)}#high-contrast-link-bubble-thumbnail-image{height:100%}.framed-image-card-component img.link-bubble-drive-thumbnail-image{box-shadow:0 0 6px 0 rgba(0,0,0,0.12);margin:6% 7% 0 7%;width:86%}.docs-link-bubble-thumbnail-card-component .link-bubble-youtube-preview-video{position:absolute;transition:opacity .75s cubic-bezier(.4,0,.2,1);width:100%}.link-bubble-youtube-preview-video.preview-video-transparent{opacity:0}.link-bubble-youtube-preview-video.preview-video-hidden{display:none}.link-bubble-youtube-preview-video.preview-video-opaque{opacity:1}.link-bubble-youtube-preview-video.preview-video-visible{display:block}.docs-link-bubble-thumbnail-card-component #link-bubble-youtube-video-duration-indicator{-webkit-align-items:center;align-items:center;background-color:rgba(0,0,0,0.8);border-radius:2px;bottom:8px;color:#fff;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;font-size:12px;font-weight:500;height:16px;-webkit-justify-content:center;justify-content:center;opacity:1;padding:0 4px;position:absolute;right:8px;transition:opacity .1s ease-in-out}.link-bubble-hovered .docs-link-bubble-youtube-thumbnail-container.link-bubble-thumbnail-can-open-in-mole #link-bubble-youtube-video-duration-indicator{opacity:0}.docs-linkbubble-link-preview .docs-link-bubble-card-component .docs-link-bubble-text-with-icon{padding-left:12px}.docs-linkbubble-link-preview .docs-link-bubble-text-card-component.indented-card-component .text-card-component-text{padding-left:30px}.docs-linkbubble-link-preview .docs-link-bubble-card-component.shrink-vertical-padding-card-component{padding-top:0px}.docs-linkbubble-link-preview .docs-link-bubble-text-card-component.single-line-text-card-component .text-card-component-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.docs-linkbubble-link-preview .docs-link-bubble-separator{background-color:#e8eaed;height:1px;margin:6px}.docs-linkbubble-link-preview.docs-hc-gecko,.docs-linkbubble-link-preview.docs-hc-ie,.docs-hc-gecko .doc-previews-indicator-container,.docs-hc-ie .doc-previews-indicator-container,.docs-hc-gecko .doc-previews-indicator-popover,.docs-hc-ie .doc-previews-indicator-popover{border:1px solid transparent}.docs-hc-gecko .doc-previews-indicator-popover .docs-link-bubble-mime-icon{filter:invert(100%)}.docs-hc-gecko .docs-link-bubble-separator,.docs-hc-ie .docs-link-bubble-separator{height:0px;border:1px solid transparent}.docs-link-bubble-action-container .goog-menuitem{white-space:nowrap}.docs-linkbubble-bubble .goog-menu .goog-option-selected{background-position:8px 50%}.docs-link-bubble-request-access-card-component.docs-link-bubble-card-component{display:flex;flex-direction:column}.docs-link-bubble-request-access-card-component .link-bubble-text-button{display:flex;padding-top:6px;width:100%}.docs-link-bubble-request-access-card-component .link-bubble-text-button .link-bubble-text-button-container{align-items:center;display:flex;flex-grow:1;justify-content:flex-end;white-space:normal;word-break:break-word;width:0}.docs-link-bubble-request-access-card-component .link-bubble-text-button .link-bubble-text-button-info-icon{display:flex;padding:4px}.docs-link-bubble-request-access-card-component .link-bubble-text-button .link-bubble-text-button-info-icon:hover{background-color:rgba(0,0,0,.06);border-radius:50%}.docs-link-bubble-request-access-card-component .request-access-header{display:flex;justify-content:flex-start;width:100%}.docs-link-bubble-request-access-card-component .request-access-header span{color:#80868b;display:flex;flex-grow:1;font-size:12px;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;white-space:normal;width:0}.docs-link-bubble-request-access-card-component .requested-access-text{display:flex;width:100%}.docs-link-bubble-request-access-card-component .requested-access-text span{color:#80868b;display:flex;flex-grow:1;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-style:italic;justify-content:flex-end;padding-top:6px;white-space:normal;width:0}.docs-link-bubble-acl-fixer-card-component{justify-content:space-between;transition:all .2s cubic-bezier(.4,0,.2,1)}.docs-link-bubble-acl-fixer-card-component.link-bubble-acl-fixer-hidden,.docs-link-bubble-card-component.docs-link-bubble-action-card-component.link-bubble-acl-fixer-hidden{visibility:hidden;height:0;padding-top:0;padding-bottom:0;opacity:0}.docs-link-bubble-acl-fixer-card-component #acl-fixer-descriptor{color:#80868b;flex-grow:1;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;overflow-wrap:break-word;white-space:normal;width:0;word-wrap:break-word}.docs-link-bubble-card-component .link-bubble-text-button-text{color:#188038;cursor:pointer;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px!important;font-weight:500;margin-left:4px;padding:4px 8px}.docs-link-bubble-card-component.docs-link-bubble-action-card-component.link-bubble-acl-fixer-ui-variant{transition:all .2s cubic-bezier(.4,0,.2,1)}.docs-link-bubble-acl-fixer-card-component .link-bubble-text-button-text.link-bubble-text-button-text-disabled,.docs-link-bubble-action-card-component.link-bubble-acl-fixer-ui-variant .link-bubble-text-button-text.link-bubble-text-button-text-disabled{color:#80868b;cursor:default;outline:none}.docs-link-bubble-card-component .link-bubble-text-button-text:hover{background-color:#e6f4ea;border-radius:4px}.docs-link-bubble-acl-fixer-card-component .link-bubble-text-button-text.link-bubble-text-button-text-disabled:hover{background-color:transparent}.docs-link-bubble-card-component.docs-link-bubble-action-card-component .link-bubble-text-button-text{color:#fff!important}.docs-link-bubble-card-component.docs-link-bubble-action-card-component .link-bubble-text-button-text:hover{background-color:#1967d2!important}.doc-previews-indicator-container{align-items:flex-end;display:flex;height:100%;justify-content:flex-end;left:0;pointer-events:none;position:absolute;transition:background-color .1s cubic-bezier(.4,0,.2,1);width:100%}.docs-link-bubble-youtube-thumbnail-container .doc-previews-indicator-container{opacity:0}.link-bubble-hovered .docs-link-bubble-youtube-thumbnail-container .doc-previews-indicator-container{opacity:1}.docs-hc-gecko .doc-previews-indicator-container.hovered-card-component,.docs-hc-ie .doc-previews-indicator-container.hovered-card-component{background-color:transparent}.docs-link-bubble-thumbnail-container:not(.docs-link-bubble-youtube-thumbnail-container) .doc-previews-indicator-container.hovered-card-component{background-color:rgba(32,33,36,0.1)}.doc-previews-indicator-text{color:#fff;display:inline-block;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;max-width:0;opacity:0;overflow:hidden;padding:0;transition:all .2s cubic-bezier(.4,0,.2,1)}.link-bubble-hovered .doc-previews-indicator-text{max-width:4000px;opacity:1;padding-left:8px;padding-right:4px}.doc-previews-indicator-popover{align-items:center;background-color:rgba(32,33,36,.6);border-radius:16px;display:flex;margin-bottom:12px;margin-right:12px;padding:6px}.docs-linkbubble-link-preview .docs-link-bubble-card-component .doc-previews-indicator-popover .docs-link-bubble-mime-icon{transition:all .3s cubic-bezier(.4,0,.2,1)}.docs-linkbubble-link-preview.link-bubble-hovered .docs-link-bubble-card-component .doc-previews-indicator-popover .docs-link-bubble-mime-icon{padding-left:4px}.jfk-bubble.jfk-bubble-promo.docs-promo-bubble.docs-link-previews-details-promo .jfk-bubble-arrowleft .jfk-bubble-arrowimplafter,.jfk-bubble.jfk-bubble-promo.docs-promo-bubble.docs-link-previews-details-promo .jfk-bubble-arrowright .jfk-bubble-arrowimplafter{border-color:transparent #1a73e8}.jfk-bubble.docs-promo-bubble.docs-link-previews-details-promo .docs-promo-text-container{width:auto}.jfk-bubble.docs-promo-bubble.docs-link-previews-details-promo .docs-promo-body{color:#f1f3f4;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;letter-spacing:.2px;padding:4px 0}.jfk-bubble.docs-promo-bubble.docs-link-previews-details-promo .docs-promo-action-container{color:#fff;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;margin:12px 0 0 20px;text-transform:none}.jfk-bubble.docs-promo-bubble.docs-link-previews-details-promo .docs-promo-header{color:#fff;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:16px;font-weight:500;opacity:1}.jfk-bubble.docs-promo-bubble.docs-link-previews-details-promo .docs-promo-action-row{display:flex;flex-direction:row-reverse;padding:0}.jfk-bubble.docs-promo-bubble.docs-link-previews-details-promo .docs-promo-container{padding:16px}.jfk-bubble.docs-promo-bubble.docs-link-previews-details-promo{box-shadow:0px 2px 6px 2px rgba(26,115,232,0.15);background-color:#1a73e8;border-radius:8px;width:251px}.docs-gm .docs-linkbubble-link-preview .docs-link-bubble-mime-icon .docs-icon .docs-icon-grid{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_green.svg)}.docs-gm .docs-multi-linkbubble-bubble{padding:8px 4px}.docs-multi-linkbubble-bubble .docs-linkbubble-bubble{border:0;border-radius:0;box-shadow:none;padding:0px;position:relative}.docs-gm .docs-linkbubble-multi-link-scrollable-container{background-color:#fff;border-color:#dadce0;color:#3c4043;display:flex;flex-direction:column;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;height:auto;max-height:150px;overflow-y:auto}.docs-link-insertlinkbubble{margin:-1px;min-width:306px;outline:none;padding:1px}.docs-gm .docs-link-insertlinkbubble ::selection{background:#d2e3fc}.docs-link-insertlinkbubble-url-label,.docs-link-insertlinkbubble-text-label{display:block;height:13px;padding:8px 0}.docs-link-insertlinkbubble-text{display:block;width:244px}.docs-gm .docs-material-bubble .docs-link-insertlinkbubble .docs-link-insertlinkbubble-text{box-sizing:content-box;color:#5f6368;height:32px;margin:0;width:294px}.docs-gm .docs-material-bubble .docs-link-insertlinkbubble-text:focus{color:#3c4043}.docs-link-insertlinkbubble-text-label,.docs-link-insertlinkbubble-text{margin-bottom:5px}.docs-gm .docs-link-insertlinkbubble-url-label,.docs-gm .docs-link-insertlinkbubble-text-label{background-color:white;box-shadow:5px 0 0 white,-5px 0 0 white;color:#5f6368;display:inline;font-size:12px;left:12px;margin-bottom:0;max-width:300px;padding:0;position:absolute;top:-8px;word-wrap:break-word}.docs-link-insertlinkbubble-urlholder{float:left;outline:none}.docs-link-insertlinkbubble-suggestionholder{background-color:white;border:1px solid #e5e5e5;border-top:none;-webkit-box-shadow:0 2px 4px rgba(0,0,0,0.2);-moz-box-shadow:0 2px 4px rgba(0,0,0,.2);box-shadow:0 2px 4px rgba(0,0,0,0.2);max-height:207px;overflow-x:hidden;outline:none;position:absolute;width:260px;z-index:1}.docs-gm .docs-link-insertlinkbubble-suggestionholder{border-radius:0 0 8px 8px;color:#3c4043;margin:1px 0px;width:310px}.docs-link-insertlinkbubble-linkchip{width:312px}.docs-link-insertlinkbubble-buttonbar .jfk-button{margin-right:0}.docs-gm .docs-link-insertlinkbubble-buttonbar .jfk-button{margin-left:12px;min-width:87px}.docs-link-insertlinkbubble-error{color:#c5221f;padding:12px 0 0 0}@media print{.docs-link-insertlinkbubble{display:none!important}}.jfk-bubble.docs-calloutbubble-bubble.docs-linkbubble-bubble{z-index:503!important}.docs-gm .docs-link-insertlinkbubble-toppane,.docs-gm .docs-link-insertlinkbubble-bottompane{margin:24px}.docs-gm .docs-link-insertlinkbubble-bottompane{display:flex}.docs-gm .docs-link-insertlinkbubble-toppane,.docs-gm .docs-link-insertlinkbubble-urlcomponent{position:relative}.docs-link-linksuggestion:last-child{margin-bottom:6px}.docs-link-linksuggestion:first-child{margin-top:6px}.docs-link-linksuggestion,.docs-link-chipselectedlinksuggestion{border:none;border-collapse:separate;border-spacing:0 6px;display:table;font-size:90%;height:26px;max-height:26px;outline:none;width:100%}.docs-link-linksuggestion:hover,.docs-link-linksuggestion:focus{background-color:#f1f3f4}.docs-link-linksuggestion-icon{display:table-cell;height:21px;padding:0 6px;vertical-align:middle;width:21px}.docs-link-linksuggestion-url,.docs-link-linksuggestion-title{cursor:default;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:190px}.docs-link-linksuggestion-title:last-child{margin-top:2px}.docs-link-linksuggestion-url{color:#093;font-size:11px}.docs-link-linksuggestiongroup{border-color:#efefef;border-style:solid;border-width:0 0 1px}.docs-link-linksuggestion-testlink,.docs-link-chipselectedlinksuggestion-hide{display:table-cell;height:21px;vertical-align:middle;width:21px}.docs-link-linksuggestion-testlink{opacity:0}.docs-link-chipselectedlinksuggestion-hide{opacity:0.7}.docs-link-chipselectedlinksuggestion-hide:hover{opacity:1}.docs-link-linksuggestion:hover .docs-link-linksuggestion-testlink,.docs-link-linksuggestion:focus .docs-link-linksuggestion-testlink,.docs-link-linksuggestion-testlink:focus{opacity:1}.docs-link-linksuggestion-text{display:table-cell}.docs-link-linksuggestion-link-text{font-size:90%}.docs-link-linksuggestion-action-text{font-size:100%}.docs-link-linksuggestion.docs-link-chipselectedlinksuggestion{background-color:#fff;border-spacing:0 4px;margin:0}.docs-link-linksuggestioncontentbox-statusmessage{color:#222;margin-left:33px;padding:5px 0}.docs-link-linksuggestioncontentbox-explore{color:#333;font-size:90%;margin:6px 0;padding:6px}.docs-link-linksuggestioncontentbox-explore:hover,.docs-link-linksuggestioncontentbox-explore:focus{background-color:#eee;cursor:default;outline:none}.docs-link-linksuggestioncontentbox-exploretext{display:inline-block;overflow:hidden;padding-left:5px;text-overflow:ellipsis;vertical-align:middle;white-space:nowrap;width:196px}.docs-link-linksuggestioncontentbox-statusbar{border-bottom:1px solid #f5f5f5;padding:10px 0;position:relative}.docs-link-linksuggestioncontentbox-statusindicator{bottom:12px;float:left;left:17px;position:relative}.docs-link-linksuggestioncontentbox-offlinenotice{font-style:italic;margin-left:5px;padding:5px 0}.docs-link-urlinput-url{background:transparent!important;border:none!important;box-sizing:border-box;box-shadow:none;display:inline-block;flex-grow:1;height:27px;margin:0;outline:none!important;padding:1px 8px!important}.docs-gm .docs-link-urlinput-url{border-color:#dadce0;border-radius:4px;color:#5f6368;display:block;font-size:14px;height:34px;width:312px}.docs-gm .docs-link-urlinput-url:focus{height:32px;padding:0px 7px!important}.docs-gm .docs-link-urlinput-url::placeholder{color:#9aa0a6}.docs-link-urlinput-action-icon-container{float:right;overflow:hidden;padding:0 0 0 8px;text-align:right;width:21px}.docs-link-urlinput-action-icon{background:transparent!important;border:transparent!important;cursor:pointer;margin:0 0 0 -13px;opacity:.70;white-space:nowrap}.docs-link-urlinput-action-icon:hover,.docs-link-urlinput-action-icon:focus{opacity:0.9}.docs-link-urlinput-url-container{background:#fff;border:1px solid #d9d9d9;border-top:1px solid #c0c0c0;min-width:20px;width:260px;display:flex}.docs-gm .docs-link-urlinput-url-container{border-color:#dadce0;border-radius:4px;box-sizing:border-box;width:312px}.docs-link-urlinput-url-container-focus{border:1px solid #4d90fe!important;box-shadow:inset 0 1px 2px rgba(0,0,0,0.3);outline:none}.docs-gm .docs-link-urlinput-url-container-focus{border:2px solid #4d90fe!important;box-shadow:none;color:#3c4043;padding:0}.docs-link-urlinput-url-error,.docs-link-urlinput-url-error:focus{border-color:#dd4b39}.MEET_IN_EDITORS_PIP_FRAME{border:none;border-radius:8px;pointer-events:none;position:absolute;visibility:hidden;z-index:1008}.MEET_IN_EDITORS_DIALOG_FRAME{border:none;height:100vh;left:0;overflow:auto;position:absolute;top:0;width:100vw;z-index:1009}.MEET_IN_EDITORS_MENU_FRAME{border:none;height:375px;width:330px}#docs-meet-in-editors-entrypointbutton{background:#fff;border-radius:33px;box-sizing:border-box;cursor:pointer;height:36px;margin-right:12px;width:54px}#docs-meet-in-editors-entrypointbutton.goog-flat-menu-button-disabled{cursor:default}#docs-meet-in-editors-entrypointbutton.goog-flat-menu-button-hover,#docs-meet-in-editors-entrypointbutton.goog-flat-menu-button-focused,#docs-meet-in-editors-entrypointbutton.goog-flat-menu-button-open{-webkit-box-shadow:none}#docs-meet-in-editors-entrypointbutton.goog-flat-menu-button-hover,#docs-meet-in-editors-entrypointbutton.goog-flat-menu-button-focused{background:#f1f3f4;border-color:#f1f3f4}#docs-meet-in-editors-entrypointbutton.goog-flat-menu-button-open{background:#e8f0fe;border-color:#e8f0fe}#docs-meet-in-editors-entrypointbutton.goog-flat-menu-button .docs-icon{height:24px;width:24px;margin:5px 4px 0 4px}#docs-meet-in-editors-entrypointbutton.goog-flat-menu-button .docs-icon-present-to-all-24{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_blue.svg)}#docs-meet-in-editors-entrypointbutton.goog-flat-menu-button-disabled .docs-icon-present-to-all-24{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_grey_medium.svg)}#docs-meet-in-editors-entrypointbutton.goog-flat-menu-button .goog-flat-menu-button-dropdown{border-color:#1a73e8 transparent;right:6px;top:15px}#docs-meet-in-editors-entrypointbutton.goog-flat-menu-button-disabled .goog-flat-menu-button-dropdown{border-color:#202124 transparent}#docs-meet-in-editors-entrypointbutton.docs-meet-in-editors-active-call.goog-flat-menu-button{background:#1a73e8;border-color:#1a73e8}#docs-meet-in-editors-entrypointbutton.docs-meet-in-editors-active-call .goog-flat-menu-button-dropdown{border-color:#fff transparent}.goog-menu.docs-meet-in-editors-menu{background:#fff;border-radius:8px;border:0;box-shadow:0px 1px 3px 0px rgba(60,64,67,.30),0px 4px 8px 3px rgba(60,64,67,.15);padding:0;width:330px}#docs-meet-in-editors-loading.hidden{display:none}#docs-meet-in-editors-loading{height:270px;display:flex;align-items:center;justify-content:center}#docs-meet-in-editors-loading .docs-spinner{align-items:center;display:flex;overflow:visible}#docs-meet-in-editors-loading .docs-quantum-spinner{top:auto}#docs-meet-in-editors-error{color:#5f6368;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;line-height:18px;padding:16px;text-align:center}#docs-meet-in-editors-error>svg{display:block;margin-left:auto;margin-right:auto}#docs-meet-in-editors-error>div{margin:22px 34px 22px}.picker-frame{width:100%;height:100%;border:0;overflow:hidden}.picker.modal-dialog-bg{position:absolute;top:0;left:0;background-color:#fff}.picker.modal-dialog{position:absolute;top:0;left:0;background-color:#fff;border:1px solid #acacac;width:auto;padding:0;z-index:1001;overflow:auto;-moz-box-shadow:rgba(0,0,0,.2) 0 4px 16px;-webkit-box-shadow:rgba(0,0,0,.2) 0 4px 16px;box-shadow:rgba(0,0,0,.2) 0 4px 16px;-webkit-transition:top .5s ease-in-out;-moz-transition:top .5s ease-in-out;-o-transition:top .5s ease-in-out;transition:top .5s ease-in-out}.picker-min{position:absolute;z-index:1002}.picker.modal-dialog-content{font-size:0;padding:0}.picker.modal-dialog-title{height:0;margin:0}.picker.modal-dialog-title-text{display:none}.picker.modal-dialog-buttons{display:none}.picker.modal-dialog{z-index:1201}div.docs-spell-content-box{overflow:auto;width:425px;height:130px;background-color:#e6e6e6;border:none;padding:5px;cursor:default}.docs-spell-content-message{color:#666}.docs-spell-error{border-bottom:1px solid red;cursor:pointer}.docs-spell-error-fixed{border-bottom:1px dotted green;cursor:pointer}.docs-spell-button-set{width:435px;height:30px;margin:20px 0 0 0}div.docs-spell-buttons-left{float:left}div.docs-spell-buttons-right{float:right}div.docs-spell-right-button{margin-right:0}.docs-spell-content-box::-webkit-scrollbar-thumb{border:solid #e6e6e6}#docs-spellcheckslidingdialog-button-change-menu{box-shadow:none;background-color:#4d90fe;background-image:-webkit-linear-gradient(top,#4d90fe,#4787ed);background-image:-moz-linear-gradient(top,#4d90fe,#4787ed);background-image:-ms-linear-gradient(top,#4d90fe,#4787ed);background-image:-o-linear-gradient(top,#4d90fe,#4787ed);background-image:linear-gradient(top,#4d90fe,#4787ed);border:1px solid #3079ed;color:#fff}#docs-spellcheckslidingdialog-button-change-menu:hover{background-color:#357ae8;background-color:#357ae8;background-image:-webkit-linear-gradient(top,#4d90fe,#357ae8);background-image:-moz-linear-gradient(top,#4d90fe,#357ae8);background-image:-ms-linear-gradient(top,#4d90fe,#357ae8);background-image:-o-linear-gradient(top,#4d90fe,#357ae8);background-image:linear-gradient(top,#4d90fe,#357ae8);border:1px solid #2f5bb7;border-bottom-color:#2f5bb7}#docs-spellcheckslidingdialog-button-change-menu.goog-flat-menu-button-focused{-webkit-box-shadow:inset 0 0 0 1px #fff;-moz-box-shadow:inset 0 0 0 1px #fff;box-shadow:inset 0 0 0 1px #fff;border:1px solid #fff;border:rgba(0,0,0,0) solid 1px;outline:1px solid #4d90fe;outline:rgba(0,0,0,0) 0}#docs-spellcheckslidingdialog-button-change-menu .goog-flat-menu-button-dropdown{border-color:white transparent;color:white}#docs-spellcheckslidingdialog-button-change-menu.goog-flat-menu-button-open{box-shadow:inset 0 1px 2px rgba(0,0,0,0.3);background:#357ae8;border:1px solid #2f5bb7;border-top:1px solid #2f5bb7}#docs-spellcheckslidingdialog-button-change-menu.goog-flat-menu-button-disabled{background:#4d90fe;filter:alpha(opacity=50);opacity:0.5}#docs-spellcheckslidingdialog-button-ignore-all{margin-left:10px}.docs-spellcheckslidingdialog-buttons-white-menu.goog-flat-menu-button-disabled,.docs-spellcheckslidingdialog-buttons-white-menu.goog-flat-menu-button-disabled:hover{background:#fff;border:1px solid #dcdcdc!important;filter:alpha(opacity=50);opacity:0.5}.docs-spellcheckslidingdialog-buttons-white-menu.goog-flat-menu-button-focus,.docs-spellcheckslidingdialog-buttons-white-menu:hover{border:1px solid #c6c6c6}.docs-spellcheckslidingdialog-buttons-white-menu:focus{z-index:2}#docs-spellcheckslidingdialog-button-ignore,#docs-spellcheckslidingdialog-button-ignore-menu{margin-bottom:1px}#docs-spellcheckslidingdialog-button-dictionary,#docs-spellcheckslidingdialog-button-dictionary-menu{margin-top:7px}.docs-spellcheckslidingdialog-buttons-action{margin-left:9px;overflow:hidden;text-overflow:ellipsis;width:110px}.docs-spellcheckslidingdialog-count{color:#6a6a6a;padding-left:4px}.goog-menuitem-disabled .docs-spellcheckslidingdialog-count{color:#ccc}#docs-spellcheckslidingdialog-id .docs-slidingdialog-close-container{position:absolute;right:14px;top:10px}#docs-spellcheckslidingdialog-ignore-buttons{padding-top:7px;vertical-align:top}.docs-spellcheckslidingdialog-replacement-input,.docs-spellcheckslidingdialog-replacement-input:focus{background:transparent;border:none;box-shadow:none;font-size:13px;height:25px;margin:0;outline:none;padding:1px 0px;width:100%}.docs-spellcheckslidingdialog-replacement-input-container{background:#fff;border:1px solid #d9d9d9;border-top:1px solid #c0c0c0;min-width:20px;padding:0 8px}.docs-spellcheckslidingdialog-replacement-input-container-focus{border:1px solid #4d90fe;box-shadow:inset 0 1px 2px rgba(0,0,0,0.3);outline:none}.docs-spellcheckslidingdialog-title-text{margin-top:2px;margin-bottom:10px;color:#222;cursor:default}#docs-spellcheckslidingdialog-original-word{font-weight:500}.docs-spellcheckslidingdialog-title-text.docs-spellcheckslidingdialog-no-misspellings{margin-bottom:0;padding-right:33px}#docs-spellcheckslidingdialog-no-misspellings:focus{outline:none}#docs-spellcheckslidingdialog-suggestion-list{box-shadow:none;margin-left:-1px;margin-top:-1px;height:91px;overflow-y:auto;position:relative;width:100%}.docs-spellcheckslidingdialog-container .goog-flat-menu-button{margin:0;height:27px}.docs-spellcheckslidingdialog-container .goog-flat-menu-button-collapse-left{margin-left:-1px}.docs-spellcheckslidingdialog-container .goog-flat-menu-button-collapse-right{min-width:0px;padding-left:0;margin-left:0px;border-radius:0 2px 2px 0}#docs-spellcheckslidingdialog-suggestion-list .goog-menuitem{padding-left:8px}#docs-spellcheckslidingdialog-suggestion-list .goog-menuitem-checkbox{position:inherit}.docs-spellcheckslidingdialog-container table{width:100%}.docs-spellcheckslidingdialog .docs-slidingdialog-holder{min-width:250px}.docs-spellcheckslidingdialog-loading-spinner,.docs-spellcheckslidingdialog-loading-text{display:inline-block;position:relative;transition:left 300ms ease-out;transition:width 300ms ease-out;vertical-align:middle}.docs-gm #docs-spellcheckslidingdialog-id .docs-slidingdialog{padding:16px}.docs-gm #docs-spellcheckslidingdialog-id td{padding:0;vertical-align:top}.docs-gm .docs-spellcheckslidingdialog-title-text{font-size:14px;height:24px;margin:0 0 16px 0;line-height:24px;vertical-align:middle}.docs-gm #docs-spellcheckslidingdialog-button-change,.docs-gm #docs-spellcheckslidingdialog-button-change-menu{background:#188038;background-image:none;border:1px solid transparent;border-radius:4px;box-shadow:none;box-sizing:border-box;color:#fff;font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;height:36px;letter-spacing:0.25px;line-height:16px}.docs-gm #docs-spellcheckslidingdialog-button-change.jfk-button-hover,.docs-gm #docs-spellcheckslidingdialog-button-change-menu.goog-flat-menu-button-hover{background:#2a8947;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15)}.docs-gm #docs-spellcheckslidingdialog-button-change.jfk-button-focused,.docs-gm #docs-spellcheckslidingdialog-button-change-menu.goog-flat-menu-button-focused{background:#4f9e67;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15)}.docs-gm #docs-spellcheckslidingdialog-button-change.jfk-button-focused.jfk-button-hover,.docs-gm #docs-spellcheckslidingdialog-button-change-menu.goog-flat-menu-button-focused.goog-flat-menu-button-hover{background:#62a877;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15)}.docs-gm #docs-spellcheckslidingdialog-button-change.jfk-button-active,.docs-gm #docs-spellcheckslidingdialog-button-change-menu.goog-flat-menu-button-active{background:#62a877;box-shadow:0 2px 6px 2px rgba(52,168,83,0.15)}.docs-gm #docs-spellcheckslidingdialog-button-change.jfk-button-disabled,.docs-gm #docs-spellcheckslidingdialog-button-change-menu.goog-flat-menu-button-disabled{background:#f1f3f4;color:#3c4043;opacity:0.38}.docs-gm #docs-spellcheckslidingdialog-button-ignore,.docs-gm #docs-spellcheckslidingdialog-button-ignore-menu,.docs-gm #docs-spellcheckslidingdialog-button-dictionary,.docs-gm #docs-spellcheckslidingdialog-button-dictionary-menu{background:#fff;background-image:none;border:1px solid #dadce0;border-radius:4px;box-shadow:none;box-sizing:border-box;color:#188038;font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;height:36px;letter-spacing:0.25px;line-height:16px;margin-bottom:0;margin-top:8px}.docs-gm #docs-spellcheckslidingdialog-button-ignore.jfk-button-hover,.docs-gm #docs-spellcheckslidingdialog-button-ignore-menu.goog-flat-menu-button-hover,.docs-gm #docs-spellcheckslidingdialog-button-dictionary.jfk-button-hover,.docs-gm #docs-spellcheckslidingdialog-button-dictionary-menu.goog-flat-menu-button-hover{background:#f8fcf9;border:1px solid #c8e7d1}.docs-gm #docs-spellcheckslidingdialog-button-ignore.jfk-button-focused,.docs-gm #docs-spellcheckslidingdialog-button-ignore-menu.goog-flat-menu-button-focused,.docs-gm #docs-spellcheckslidingdialog-button-dictionary.jfk-button-focused,.docs-gm #docs-spellcheckslidingdialog-button-dictionary-menu.goog-flat-menu-button-focused{background:#e7f5eb;border:1px solid #bbe2c6}.docs-gm #docs-spellcheckslidingdialog-button-ignore.jfk-button-focused.jfk-button-hover,.docs-gm #docs-spellcheckslidingdialog-button-ignore-menu.goog-flat-menu-button-focused.goog-flat-menu-button-hover,.docs-gm #docs-spellcheckslidingdialog-button-dictionary.jfk-button-focused.jfk-button-hover,.docs-gm #docs-spellcheckslidingdialog-button-dictionary-menu.goog-flat-menu-button-focused.goog-flat-menu-button-hover{background:#dff2e4;border:1px solid #b5e0c1}.docs-gm #docs-spellcheckslidingdialog-button-ignore.jfk-button-active,.docs-gm #docs-spellcheckslidingdialog-button-ignore-menu.goog-flat-menu-button-active,.docs-gm #docs-spellcheckslidingdialog-button-dictionary.jfk-button-active,.docs-gm #docs-spellcheckslidingdialog-button-dictionary-menu.goog-flat-menu-button-active{background:#dff2e4;border:1px solid transparent;box-shadow:0 2px 6px 2px rgba(60,64,67,.15)}.docs-gm #docs-spellcheckslidingdialog-button-ignore.jfk-button-disabled,.docs-gm #docs-spellcheckslidingdialog-button-ignore-menu.goog-flat-menu-button-disabled,.docs-gm #docs-spellcheckslidingdialog-button-dictionary.jfk-button-disabled,.docs-gm #docs-spellcheckslidingdialog-button-dictionary-menu.goog-flat-menu-button-disabled{background:#fff;border:1px solid #f1f3f4;color:#3c4043;opacity:0.38}.docs-gm #docs-spellcheckslidingdialog-button-change,.docs-gm #docs-spellcheckslidingdialog-button-ignore,.docs-gm #docs-spellcheckslidingdialog-button-dictionary{border-radius:4px 0 0 4px;margin-left:16px;padding:9px 8px 11px 8px;width:156px}.docs-gm #docs-spellcheckslidingdialog-button-change,.docs-gm #docs-spellcheckslidingdialog-button-change.jfk-button-focused,.docs-gm #docs-spellcheckslidingdialog-button-change.jfk-button-hover,.docs-gm #docs-spellcheckslidingdialog-button-change.jfk-button-hover.jfk-button-focused,.docs-gm #docs-spellcheckslidingdialog-button-change.jfk-button-active,.docs-gm #docs-spellcheckslidingdialog-button-change.jfk-button-disabled{border-right:1px solid #ceead6}.docs-gm #docs-spellcheckslidingdialog-button-change-menu,.docs-gm #docs-spellcheckslidingdialog-button-change-menu.goog-flat-menu-button-focused,.docs-gm #docs-spellcheckslidingdialog-button-change-menu.goog-flat-menu-button-hover,.docs-gm #docs-spellcheckslidingdialog-button-change-menu.goog-flat-menu-button-hover.goog-flat-menu-button-focused,.docs-gm #docs-spellcheckslidingdialog-button-change-menu.goog-flat-menu-button-active,.docs-gm #docs-spellcheckslidingdialog-button-change-menu.goog-flat-menu-button-disabled{border-left:1px solid #ceead6}.docs-gm #docs-spellcheckslidingdialog-button-change-menu,.docs-gm #docs-spellcheckslidingdialog-button-ignore-menu,.docs-gm #docs-spellcheckslidingdialog-button-dictionary-menu{border-radius:0 4px 4px 0;padding:8px;width:41px}.docs-gm #docs-spellcheckslidingdialog-button-change-menu .goog-flat-menu-button-dropdown,.docs-gm #docs-spellcheckslidingdialog-button-ignore-menu .goog-flat-menu-button-dropdown,.docs-gm #docs-spellcheckslidingdialog-button-dictionary-menu .goog-flat-menu-button-dropdown{right:15px;top:15px}.docs-gm #docs-spellcheckslidingdialog-replacement-input{border:1px solid #dadce0;border-radius:4px;box-sizing:border-box;color:#3c4043;padding:1px 8px;font-size:14px;height:36px;margin:8px 0;margin:0}.docs-gm #docs-spellcheckslidingdialog-replacement-input:focus{border:2px solid #1a73e8;box-shadow:none;padding:0px 7px}.docs-gm .docs-spellcheckslidingdialog-replacement-input-container{background:transparent;border:none;padding:0;width:156px}.docs-gm .docs-spellcheckslidingdialog-replacement-input-container-focus{border:none;box-shadow:none;outline:none}.docs-gm #docs-spellcheckslidingdialog-suggestion-list{box-shadow:0 1px 3px 1px rgba(60,64,67,.15);height:auto;margin:0;width:156px}.docs-gm #docs-spellcheckslidingdialog-id .docs-slidingdialog-close-container{height:24px;right:16px;top:16px;width:24px}.docs-gm #docs-spellcheckslidingdialog-id .docs-slidingdialog-button-close{opacity:0.54}.docs-gm #docs-spellcheckslidingdialog-id .docs-slidingdialog-button-close.goog-flat-button-hover,.docs-gm #docs-spellcheckslidingdialog-id .docs-slidingdialog-button-close.goog-flat-button-focused,.docs-gm #docs-spellcheckslidingdialog-id .docs-slidingdialog-button-close.goog-flat-button-active{opacity:0.87}.docs-gm #docs-spellcheckslidingdialog-id .docs-slidingdialog-button-close.goog-flat-button-focused{outline:none}.docs-gm #docs-spellcheckslidingdialog-no-misspellings-footer .jfk-button{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff}.docs-gm #docs-spellcheckslidingdialog-no-misspellings-footer .jfk-button:last-child{margin-right:0}.docs-gm #docs-spellcheckslidingdialog-no-misspellings-footer .jfk-button.jfk-button-hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#2a8947;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15)}.docs-gm #docs-spellcheckslidingdialog-no-misspellings-footer .jfk-button.jfk-button-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#4f9e67;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15)}.docs-gm #docs-spellcheckslidingdialog-no-misspellings-footer .jfk-button.jfk-button-focused.jfk-button-hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#62a877;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15)}.docs-gm #docs-spellcheckslidingdialog-no-misspellings-footer .jfk-button.jfk-button-active,.docs-gm #docs-spellcheckslidingdialog-no-misspellings-footer .jfk-button.jfk-button-active.jfk-button-focused.jfk-button-hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#62a877;box-shadow:0 2px 6px 2px rgba(52,168,83,0.15)}.docs-userdictionary-butterbar-item{font-weight:normal}.docs-userdictionarydialog-button-add{margin-left:0px;margin-right:0px;padding:0px;width:100%}.docs-userdictionarydialog-list-container{background-color:#fff;border:1px solid #ececec;height:415px;margin-top:16px;overflow-y:auto;position:relative;width:315px}.docs-gm .docs-userdictionarydialog-list-container{height:232px;min-width:464px;width:auto;width:unset}.docs-userdictionarydialog-list-container:focus{outline:none}.docs-userdictionarydialog-button-add-container{border-left:30px solid white;max-width:125px}.docs-gm .docs-userdictionarydialog-button-add-container{border-left:0;margin-left:16px}.docs-userdictionarydialog-input{margin-left:0px;margin-right:19px!important;vertical-align:middle;width:100%}.docs-gm .docs-userdictionarydialog-input{width:364px}.docs-userdictionarydialog-row-container{border-bottom:1px solid #ececec;padding:10px;min-width:275px}.docs-gm .docs-userdictionarydialog-row-container{border-bottom:1px solid #dadce0;padding:10px 16px;width:432px}.docs-gm .docs-userdictionarydialog-list-container-ie .docs-userdictionarydialog-row-container{padding-left:20px;padding-right:20px;width:424px}.docs-userdictionarydialog-row-container-hover{background-color:#eee}.docs-gm .docs-userdictionarydialog-row-container-hover{background-color:#f1f3f4}.docs-userdictionarydialog-row-content{display:inline-block;width:250px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:middle}.docs-gm .docs-userdictionarydialog-row-content{color:#3c4043}.docs-userdictionarydialog-list-remove-button{background-color:transparent;border:none;margin:0;padding:0;position:absolute;right:3px}.docs-gm .docs-userdictionarydialog-list-remove-button{left:424px}.docs-gm .docs-userdictionarydialog-list-container-ie .docs-userdictionarydialog-list-remove-button{left:420px}.docs-gm .docs-material.docs-userdictionarydialog-list-remove-button .docs-icon{height:24px;margin:0;width:24px}.docs-userdictionarydialog-top-container{border-collapse:separate;display:table;width:100%}.docs-userdictionarydialog-top-container>div{display:table-cell}.docs-templatestoast.docs-ui-toast{z-index:1003}.docs-calloutbubble-anchor{position:absolute}.docs-calloutbubble-bubble.jfk-bubble{padding:0px;z-index:99!important}@media print{.docs-calloutbubble-anchor{display:none!important}}.docs-dismissible-bar{margin-top:0;position:absolute;width:500px}.docs-dismissible-bar .docs-dismissible-bar-content{background:rgba(0,0,0,0.8);-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;color:#fff;left:-50%;overflow:hidden;position:relative;z-index:1001}.docs-dismissible-bar .docs-dismissible-bar-header{border-bottom:1px solid #000;float:left;width:100%}.docs-dismissible-bar .docs-dismissible-bar-title{float:left;font-size:15px;font-weight:500;margin:16px 15px}.docs-dismissible-bar .docs-dismissible-bar-description{border-top:1px solid #444;box-sizing:border-box;color:#bbb;float:left;padding:10px 15px 15px;text-align:left;width:100%}.docs-dismissible-bar .docs-dismissible-bar-dismiss-button{float:right;margin:10px 10px 10px 0}.docs-dismissible-bar .docs-dismissible-bar-black-button{background-color:#454545;background-repeat:repeat-x;border:solid 1px #111;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;box-shadow:0px 1px 1px 0px rgba(0,0,0,0.05),inset 0px 1px 0px 0px rgba(255,255,255,0.2);color:#ddd;cursor:pointer;background-color:#4b4b4b;background-image:-webkit-linear-gradient(top,#4b4b4b,#3b3b3b);background-image:-moz-linear-gradient(top,#4b4b4b,#3b3b3b);background-image:-ms-linear-gradient(top,#4b4b4b,#3b3b3b);background-image:-o-linear-gradient(top,#4b4b4b,#3b3b3b);background-image:linear-gradient(top,#4b4b4b,#3b3b3b);text-shadow:0 1px 0 rgba(0,0,0,0.8)}.docs-dismissible-bar .docs-dismissible-bar-black-button.jfk-button-hover{background:rgba(255,255,255,0.1);border:1px solid #141414;box-shadow:0 0 0 transparent inset;color:#fff}.docs-dismissible-bar .docs-dismissible-bar-black-button.jfk-button-active,.docs-dismissible-bar .docs-dismissible-bar-black-button.jfk-button-focused{border-color:#fff}.docs-indeterminate-loading-bar{background:#c6dafc;height:100%;position:relative;width:100%}.docs-indeterminate-loading-bar>div{-webkit-animation:docs-indeterminate-loading-animation 2s linear infinite;-moz-animation:docs-indeterminate-loading-animation 2s linear infinite;-o-animation:docs-indeterminate-loading-animation 2s linear infinite;animation:docs-indeterminate-loading-animation 2s linear infinite;background:#4285f4;height:100%;position:absolute;transition:width .2s cubic-bezier(.4,0,.2,1)}@keyframes docs-indeterminate-loading-animation{0%{left:0%;width:0}50%{left:25%;width:75%}75%{left:100%;width:0%}}.docs-loading-indicator{height:48px;left:50%;margin:-24px 0 0 -24px;position:absolute;top:50%;width:48px}.docs-loading-indicator-small{height:20px;left:50%;margin:-10px 0 0 -10px;position:absolute;top:50%;width:20px}.docs-sidebar-toggle-tabs-jfk .jfk-button.docs-sidebar-toggle-tab{width:50%;border:none;color:#646464;cursor:pointer;font-size:13px;height:40px;line-height:42px;margin:0;text-align:center}.docs-sidebar-toggle-tabs-jfk .jfk-button.docs-sidebar-toggle-tab-inactive{font-weight:normal}.docs-sidebar-toggle-tabs-jfk .jfk-button.docs-sidebar-toggle-tab-active{font-weight:500;border-bottom:3px solid #3367d6}.docs-sidebar-toggle-tabs-jfk .jfk-button-focused.docs-sidebar-toggle-tab-inactive{border-bottom:3px solid #4d90fe}.docs-sidebar-toggle-tabs-material .jfk-button.docs-sidebar-toggle-tab{width:50%;border:none;cursor:pointer;font-size:13px;font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;text-transform:uppercase;height:41px;line-height:43px;margin:0;text-align:center}.docs-sidebar-toggle-tabs-material .jfk-button.docs-sidebar-toggle-tab-inactive{color:rgba(0,0,0,0.54)}.docs-sidebar-toggle-tabs-material .jfk-button.docs-sidebar-toggle-tab-active{color:rgba(0,0,0,0.87);border-bottom:2px solid #4285f4}.docs-sidebar-toggle-tabs-material .jfk-button-focused.docs-sidebar-toggle-tab-inactive{border-bottom:2px dotted #4285f4}.docs-sidebar-toggle-tabs-material .jfk-button-active.jfk-button-focused.docs-sidebar-toggle-tab-inactive{border-bottom:none}.docs-spinner{height:44px;overflow:hidden;position:relative}.docs-quantum-spinner{height:28px;left:50%;margin-left:-14px;position:absolute;top:0;width:28px}.docs-loading-indicator-small .docs-quantum-spinner{height:20px;margin-left:-10px;top:0;width:20px}.docs-white-circle{background:white;border-radius:50%;box-shadow:0 2px 6px rgba(0,0,0,0.4);-moz-box-shadow:0 2px 6px rgba(0,0,0,0.4);-webkit-box-shadow:0 2px 6px rgba(0,0,0,0.4);height:44px;left:50%;margin-left:-22px;position:absolute;width:44px}.docs-quantum-spinner.active{-webkit-animation:container-rotate 1568ms linear infinite;animation:container-rotate 1568ms linear infinite}@-webkit-keyframes container-rotate{to{-webkit-transform:rotate(360deg)}}@keyframes container-rotate{to{transform:rotate(360deg)}}.spinner-layer{position:absolute;width:100%;height:100%;opacity:0}.spinner-blue{border-color:#4285f4}.spinner-red{border-color:#db4437}.spinner-yellow{border-color:#f4b400}.spinner-green{border-color:#0f9d58}.active .spinner-layer.spinner-blue{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,blue-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,blue-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both}.active .spinner-layer.spinner-red{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,red-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,red-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both}.active .spinner-layer.spinner-yellow{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,yellow-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,yellow-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both}.active .spinner-layer.spinner-green{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,green-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,green-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both}@-webkit-keyframes fill-unfill-rotate{12.5%{-webkit-transform:rotate(135deg)}25%{-webkit-transform:rotate(270deg)}37.5%{-webkit-transform:rotate(405deg)}50%{-webkit-transform:rotate(540deg)}62.5%{-webkit-transform:rotate(675deg)}75%{-webkit-transform:rotate(810deg)}87.5%{-webkit-transform:rotate(945deg)}to{-webkit-transform:rotate(1080deg)}}@keyframes fill-unfill-rotate{12.5%{transform:rotate(135deg)}25%{transform:rotate(270deg)}37.5%{transform:rotate(405deg)}50%{transform:rotate(540deg)}62.5%{transform:rotate(675deg)}75%{transform:rotate(810deg)}87.5%{transform:rotate(945deg)}to{transform:rotate(1080deg)}}@-webkit-keyframes blue-fade-in-out{from{opacity:1}25%{opacity:1}26%{opacity:0}89%{opacity:0}90%{opacity:1}100%{opacity:1}}@keyframes blue-fade-in-out{from{opacity:1}25%{opacity:1}26%{opacity:0}89%{opacity:0}90%{opacity:1}100%{opacity:1}}@-webkit-keyframes red-fade-in-out{from{opacity:0}15%{opacity:0}25%{opacity:1}50%{opacity:1}51%{opacity:0}}@keyframes red-fade-in-out{from{opacity:0}15%{opacity:0}25%{opacity:1}50%{opacity:1}51%{opacity:0}}@-webkit-keyframes yellow-fade-in-out{from{opacity:0}40%{opacity:0}50%{opacity:1}75%{opacity:1}76%{opacity:0}}@keyframes yellow-fade-in-out{from{opacity:0}40%{opacity:0}50%{opacity:1}75%{opacity:1}76%{opacity:0}}@-webkit-keyframes green-fade-in-out{from{opacity:0}65%{opacity:0}75%{opacity:1}90%{opacity:1}100%{opacity:0}}@keyframes green-fade-in-out{from{opacity:0}65%{opacity:0}75%{opacity:1}90%{opacity:1}100%{opacity:0}}.spinner-gap-patch{position:absolute;box-sizing:border-box;top:0;left:45%;width:10%;height:100%;overflow:hidden;border-color:inherit}.spinner-gap-patch .spinner-circle{width:1000%;left:-450%}.spinner-circle-clipper{display:inline-block;position:relative;width:50%;height:100%;overflow:hidden;border-color:inherit}.spinner-circle-clipper .spinner-circle{width:200%}.spinner-circle{box-sizing:border-box;height:100%;border-width:3px;border-style:solid;border-color:inherit;border-bottom-color:transparent!important;border-radius:50%;-webkit-animation:none;animation:none}.spinner-circle-clipper.spinner-left .spinner-circle{border-right-color:transparent!important;-webkit-transform:rotate(129deg);transform:rotate(129deg)}.spinner-circle-clipper.spinner-right .spinner-circle{left:-100%;border-left-color:transparent!important;-webkit-transform:rotate(-129deg);transform:rotate(-129deg)}.active .spinner-circle-clipper.spinner-left .spinner-circle{-webkit-animation:left-spin 1333ms cubic-bezier(0.4,0.0,0.2,1) infinite both;animation:left-spin 1333ms cubic-bezier(0.4,0.0,0.2,1) infinite both}.active .spinner-circle-clipper.spinner-right .spinner-circle{-webkit-animation:right-spin 1333ms cubic-bezier(0.4,0.0,0.2,1) infinite both;animation:right-spin 1333ms cubic-bezier(0.4,0.0,0.2,1) infinite both}@-webkit-keyframes left-spin{from{-webkit-transform:rotate(130deg)}50%{-webkit-transform:rotate(-5deg)}to{-webkit-transform:rotate(130deg)}}@keyframes left-spin{from{transform:rotate(130deg)}50%{transform:rotate(-5deg)}to{transform:rotate(130deg)}}@-webkit-keyframes right-spin{from{-webkit-transform:rotate(-130deg)}50%{-webkit-transform:rotate(5deg)}to{-webkit-transform:rotate(-130deg)}}@keyframes right-spin{from{transform:rotate(-130deg)}50%{transform:rotate(5deg)}to{transform:rotate(-130deg)}}.spinner-fit{position:absolute;top:0;bottom:0;right:0;left:0}.docs-working-bar{color:#222;display:none;font:13px/1.4 arial,sans-serif;margin-top:0;min-width:124px;position:absolute;z-index:1001;transition:218ms ease-in}.docs-working-bar-slideup{-webkit-transform:translateY(-60px);-moz-transform:translateY(-60px);-ms-transform:translateY(-60px);-o-transform:translateY(-60px);transform:translateY(-60px)}.docs-working-bar-display{display:block}.docs-working-bar .message{background:rgba(0,0,0,.8);border-radius:3px;color:#fff;left:-50%;padding:16px;position:relative}.docs-working-bar .message *{vertical-align:middle}.docs-working-bar .message .icon{margin-right:16px}.docs-working-bar .spinner{display:inline-block}.docs-working-bar .label{font-weight:normal}@keyframes script-working-bar-spin{from{transform:rotate(0deg);-ms-transform:rotate(0deg)}to{transform:rotate(360deg);-ms-transform:rotate(360deg)}}@-webkit-keyframes script-working-bar-spin{from{-webkit-transform:rotate(0deg)}to{-webkit-transform:rotate(360deg)}}.docs-working-bar .spinner .icon{animation:script-working-bar-spin 1.5s infinite linear;-webkit-animation:script-working-bar-spin 1.5s infinite linear}.docs-material-colorpalette{outline:none}.docs-material-colorpalette-cell{border-radius:50%}.docs-material-colorpalette-colorswatch{border-radius:50%;box-sizing:border-box;cursor:pointer;height:20px;margin:1px 1px 0 0;width:20px}.docs-material-colorpalette-table{border-spacing:1px;padding:1px 0}.docs-material-colorpalette-cell.docs-material-colorpalette-cell-hover .docs-material-colorpalette-colorswatch{box-shadow:0 0 3px 1px #bdc1c6}.docs-material-colorpalette-colorswatch.docs-material-colorpalette-colorswatch-border{border:1px solid #dadce0}.docs-customcolorpalette-add-custom-color-button:hover{background-color:#e8eaed;border-radius:4px;cursor:pointer}.docs-material-colorpalette-cell.docs-material-colorpalette-cell-selected .docs-material-colorpalette-colorswatch{background:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNnB4IiBoZWlnaHQ9IjE2cHgiIHZpZXdCb3g9IjAgMCA0OCA0OCIgZmlsbD0iIzAwMDAwMCI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMSwgMCwgMCwgMSkiPjxwYXRoIGQ9Ik0wIDBoNDh2NDhIMHoiIGZpbGw9Im5vbmUiLz48cGF0aCBkPSJNMTggMzIuMzRMOS42NiAyNGwtMi44MyAyLjgzTDE4IDM4bDI0LTI0LTIuODMtMi44M3oiLz48L2c+PC9zdmc+);background-position:center;background-repeat:no-repeat}.docs-material-colorpalette-cell.docs-material-colorpalette-cell-selected .docs-material-colorpalette-colorswatch.docs-material-colorpalette-colorswatch-dark{background:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNnB4IiBoZWlnaHQ9IjE2cHgiIHZpZXdCb3g9IjAgMCA0OCA0OCIgZmlsbD0iI0ZGRkZGRiI+PHBhdGggZD0iTTAgMGg0OHY0OEgweiIgZmlsbD0ibm9uZSIvPjxwYXRoIGQ9Ik0xOCAzMi4zNEw5LjY2IDI0bC0yLjgzIDIuODNMMTggMzhsMjQtMjQtMi44My0yLjgzeiIvPjwvc3ZnPg==);background-position:center;background-repeat:no-repeat}.docs-hc-gecko .docs-material-colorpalette-colorswatch,.docs-hc-ie .docs-material-colorpalette-colorswatch{border:1px solid #dadce0}.docs-material-color-picker-dragger{border:2px solid white;border-radius:50%;box-shadow:0 0 3px 1px #bdc1c6;cursor:pointer;position:absolute;z-index:3}.docs-color-picker{color:#3c4043;outline:none;width:100%}.docs-color-picker-outer-box{border:1px solid #dadce0;border-radius:4px;box-sizing:border-box;cursor:pointer;padding:8px 6px 8px 8px;width:100%}.docs-color-picker .docs-color-picker-outer-box{width:auto}.docs-color-picker-hover .docs-color-picker-outer-box{background-color:rgba(60,64,67,0.04);border:1px solid #dadce0}.docs-color-picker-open .docs-color-picker-outer-box{background-color:rgba(60,64,67,0.04);border:1px solid transparent}.docs-material-gm-select-open.docs-material-gm-select-hover .docs-color-picker-outer-box{background-color:rgba(60,64,67,0.06)}.docs-material-gm-select-open.docs-material-gm-select-focused .docs-color-picker-outer-box{background-color:rgba(60,64,67,0.08)}.docs-color-picker-disabled{color:#5f6368;opacity:.38;cursor:default}.docs-color-picker-disabled .docs-color-picker-outer-box{border:1px solid #dadce0;box-shadow:none;cursor:default}.docs-color-picker-inner-box{align-items:center;display:flex;justify-content:space-between;position:relative;width:100%}.docs-color-picker-inner-box{align-items:center;display:flex;justify-content:space-between;position:relative;width:100%}.docs-color-picker-caption{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;color:#202124;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;height:20px;line-height:20px;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;height:22px;width:22px;border-radius:50%;border:1px solid #dadce0;margin:0;outline:none}.docs-color-picker-dropdown{align-items:center;display:flex;height:24px;justify-content:center;width:24px}.docs-color-picker-dropdown-icon{background:no-repeat url(//ssl.gstatic.com/docs/common/material_common_sprite222_grey_medium.svg) -40px -732px;height:18px;width:18px}.docs-color-picker-open .docs-color-picker-dropdown-icon{-moz-transform:rotate(180deg);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.docs-material-color-swatch-wrapper{border-radius:50%;display:inline-block;position:relative;vertical-align:middle}.docs-material-color-swatch-color{box-shadow:0 0 0 1px transparent}.docs-material-color-swatch-element{border-radius:50%;height:100%;position:absolute;width:100%}.docs-material-color-swatch-wrapper-hover{box-shadow:0 0 0 1px #c8e7d1}.docs-material-color-swatch-wrapper-focused{box-shadow:0 0 0 1px #bbe2c6;outline:none}.docs-material-color-swatch-border{box-shadow:0 0 0 1px #e8eaed}.docs-material-color-swatch-checkbox-background{background-image:url(https://ssl.gstatic.com/docs/common/checkboard.png);background-size:10px}.docs-hc-ie .docs-material-color-swatch-color,.docs-hc-gecko .docs-material-color-swatch-color{border:1px solid #dadce0}.docs-gm-labeled-color-picker{color:#3c4043;outline:none;width:100%}.docs-gm-labeled-color-picker-outer-box{border:1px solid #dadce0;border-radius:4px;box-sizing:border-box;cursor:pointer;padding:8px 6px 8px 8px;width:100%}.docs-gm-labeled-color-picker-focused .docs-gm-labeled-color-picker-outer-box{background-color:rgba(60,64,67,0.06);border:1px solid #dadce0}.docs-gm-labeled-color-picker .docs-gm-labeled-color-picker-outer-box{width:auto}.docs-gm-labeled-color-picker-hover .docs-gm-labeled-color-picker-outer-box{background-color:rgba(60,64,67,0.04);border:1px solid #dadce0}.docs-gm-labeled-color-picker-open .docs-gm-labeled-color-picker-outer-box{background-color:rgba(60,64,67,0.04);border:1px solid transparent}.docs-material-gm-select-open.docs-material-gm-select-hover .docs-gm-labeled-color-picker-outer-box{background-color:rgba(60,64,67,0.06)}.docs-material-gm-select-open.docs-material-gm-select-focused .docs-gm-labeled-color-picker-outer-box{background-color:rgba(60,64,67,0.08)}.docs-gm-labeled-color-picker-disabled{color:#5f6368;opacity:.38;cursor:default}.docs-gm-labeled-color-picker-disabled .docs-gm-labeled-color-picker-outer-box{border:1px solid #dadce0;box-shadow:none;cursor:default}.docs-gm-labeled-color-picker-inner-box{align-items:center;display:flex;justify-content:space-between;position:relative;width:100%}.docs-gm-labeled-color-picker-inner-box{align-items:center;display:flex;justify-content:space-between;position:relative;width:100%}.docs-gm-labeled-color-picker-caption{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;color:#202124;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;height:20px;line-height:20px;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;height:22px;width:22px;border-radius:50%;border:1px solid #dadce0;margin:0;outline:none}.docs-gm-labeled-color-picker-dropdown{align-items:center;display:flex;height:24px;justify-content:center;width:24px}.docs-gm-labeled-color-picker-dropdown-icon{background:no-repeat url(//ssl.gstatic.com/docs/common/material_common_sprite222_grey_medium.svg) -40px -732px;height:18px;width:18px}.docs-gm-labeled-color-picker-open .docs-gm-labeled-color-picker-dropdown-icon{-moz-transform:rotate(180deg);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.docs-gm-labeled-color-picker-label{color:#5f6368;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;margin-bottom:8px;display:inline-block}.docs-material-hsv-color-picker{padding-bottom:15px}.docs-material-hsv-color-picker-information{padding:0 0 15px 0;width:100%}.docs-material-hsv-color-picker-input{border:1px solid #dadce0;border-radius:4px;box-sizing:border-box;color:#3c4043;padding:1px 8px;font-size:14px;height:36px;margin:8px 0;width:90px}.docs-material-hsv-color-picker-input:focus{border:2px solid #1a73e8;box-shadow:none;padding:0px 7px}.docs-material-info-element{display:inline-block;margin-right:15px}.docs-material-hsv-color-picker-title{text-transform:uppercase}.docs-material-hsv-color-picker-text{color:#5f6368;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:11px;font-weight:500;padding:10px 0 0 0}.docs-material-hue-slider-background{background:linear-gradient(to right,hsl(0,100%,50%),hsl(60,100%,50%),hsl(120,100%,50%),hsl(180,100%,50%),hsl(240,100%,50%),hsl(300,100%,50%),hsl(360,100%,50%))}.docs-material-opacity-slider-checkbox-background{background-image:url(https://ssl.gstatic.com/docs/common/checkboard.png);background-size:10px}.docs-material-color-picker-saturation-value-background{border:1px solid white;box-sizing:border-box}.docs-material-color-picker-saturation-value{height:150px;outline:none;position:relative;width:100%}.docs-material-color-picker-overlay{border-radius:4px;height:100%;left:0;position:absolute;top:0px;width:100%}.docs-material-color-picker-saturation-overlay{background:linear-gradient(to right,#fff 0%,rgba(255,255,255,0) 100%);z-index:1}.docs-material-color-picker-value-overlay{background:linear-gradient(to bottom,transparent 0%,#000 100%);z-index:2}.docs-material-color-slider{box-sizing:border-box;outline:0;padding:8px 0;position:relative}.docs-material-color-slider-background{border-radius:4px;display:inline-block;height:10px;position:absolute;width:100%}.docs-material-color-slider-wrapper{position:relative;width:100%}.docs-material-color-slider-thumb{height:16px;pointer-events:inherit;top:-5px;width:16px}.docs-material-color-slider-track{left:0;position:absolute;top:0}.docs-material-color-slider-checkbox-background{background-image:url(https://ssl.gstatic.com/docs/common/checkboard.png);background-size:10px}.docs-material-slider{box-sizing:border-box;padding:8px;position:relative;outline:0}.docs-material-slider-horizontal{height:calc(30px + 2*8px);min-width:128px}.docs-material-slider-vertical{width:calc(30px + 2*8px);min-height:128px}.docs-material-slider-wrapper{position:absolute}.docs-material-slider-horizontal .docs-material-slider-wrapper{left:8px;height:2px;right:8px;top:23px}.docs-material-slider-vertical .docs-material-slider-wrapper{bottom:8px;left:23px;top:8px;width:2px}.docs-material-slider-thumb{pointer-events:inherit;position:absolute}.docs-material-slider-horizontal .docs-material-slider-thumb{top:50%;width:calc(2*8px)}.docs-material-slider-vertical .docs-material-slider-thumb{left:50%;height:calc(2*8px)}.docs-material-slider-focus-ring{background-color:rgba(66,133,244,0.38);border-radius:50%;left:calc(-0.5*30px);height:30px;opacity:0;pointer-events:inherit;position:absolute;top:calc(-0.5*30px);transform:scale(0);transition:transform .4s cubic-bezier(.25,.8,.25,1),opacity .4s cubic-bezier(.25,.8,.25,1);width:30px}.docs-material-slider-rtl .docs-material-slider-focus-ring{left:inherit;right:calc(-0.5*30px)}.docs-material-slider-thumb-grabber{background-color:#4285f4;border-color:#4285f4;border-radius:50%;border-style:solid;box-sizing:border-box;cursor:pointer;height:20px;position:absolute;transform:scale(0.7);transition:transform .4s cubic-bezier(.25,.8,.25,1);width:20px}.docs-material-slider-horizontal.docs-material-slider-ltr .docs-material-slider-thumb-grabber{bottom:calc(-0.5*20px);left:calc(-0.5*20px)}.docs-material-slider-horizontal.docs-material-slider-rtl .docs-material-slider-thumb-grabber{bottom:calc(-0.5*20px);right:calc(-0.5*20px)}.docs-material-slider-vertical .docs-material-slider-thumb-grabber{left:calc(-0.5*20px);top:calc(-0.5*20px)}.docs-material-slider-track-wrapper{left:0px;position:absolute;top:0px}.docs-material-slider-horizontal .docs-material-slider-track-wrapper{height:2px;width:100%}.docs-material-slider-vertical .docs-material-slider-track-wrapper{height:100%;width:2px}.docs-material-slider-track{position:absolute}.docs-material-slider-horizontal .docs-material-slider-track{height:2px}.docs-material-slider-vertical .docs-material-slider-track{width:2px}.docs-material-slider.docs-material-slider-horizontal.docs-hc-edge .docs-material-slider-track,.docs-material-slider.docs-material-slider-horizontal.docs-hc-ie .docs-material-slider-track,.docs-material-slider.docs-material-slider-horizontal.docs-hc-gecko .docs-material-slider-track{height:0;outline:solid 2px}.docs-material-slider.docs-material-slider-vertical.docs-hc-edge .docs-material-slider-track,.docs-material-slider.docs-material-slider-vertical.docs-hc-ie .docs-material-slider-track,.docs-material-slider.docs-material-slider-vertical.docs-hc-gecko .docs-material-slider-track{width:0;outline:solid 2px}.docs-material-slider-track-on{background-color:#4285f4}.docs-material-slider-track-off{background-color:#bdbdbd}.docs-material-slider.goog-slider-disabled .docs-material-slider-thumb-grabber,.docs-material-slider.goog-slider-disabled .docs-material-slider-track-on{background-color:#bdbdbd;border-color:#bdbdbd;cursor:default}.docs-material-slider:not(.docs-material-slider-mouse-focused):not(.goog-slider-disabled):focus .docs-material-slider-focus-ring{opacity:1;transform:scale(1)}.docs-material-slider.docs-material-slider-mouse-focused:not(.goog-slider-disabled) .docs-material-slider-thumb-grabber{transform:scale(1)}.docs-material-slider-ltr.docs-material-slider-horizontal .docs-material-slider-track-on,.docs-material-slider-rtl.docs-material-slider-horizontal .docs-material-slider-track-off{left:0px}.docs-material-slider-ltr.docs-material-slider-horizontal .docs-material-slider-track-off,.docs-material-slider-rtl.docs-material-slider-horizontal .docs-material-slider-track-on{right:0px}.docs-material-slider-vertical .docs-material-slider-track-on{bottom:0px}.docs-material-slider-vertical .docs-material-slider-track-off{top:0px}.docs-material-menu-button-flat-primary,.docs-material-menu-button-flat-default,.docs-material-menu-button-raised-primary,.docs-material-menu-button-raised-default{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border-radius:2px;border:1px solid transparent;cursor:pointer;display:inline-block;font:500 13px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;height:32px;line-height:30px;margin:0 4px;text-transform:uppercase;vertical-align:middle}.docs-material-menu-button-raised-primary,.docs-material-menu-button-raised-default{padding:0 6px 0 16px}.docs-material-menu-button-flat-primary,.docs-material-menu-button-flat-default{padding:0 0 0 8px}.docs-material-menu-button-flat-primary{color:#4285f4}.docs-material-menu-button-flat-primary-hover{background-color:rgba(66,133,244,.12)}.docs-material-menu-button-flat-primary-active{background-color:rgba(66,133,244,.32);color:#3387d6}.docs-material-menu-button-flat-primary-focused{border:1px solid #4285f4;outline:none}.docs-material-menu-button-flat-default{background-color:#fff;color:rgba(0,0,0,0.54)}.docs-material-menu-button-flat-default-hover{background-color:rgba(102,102,102,.2)}.docs-material-menu-button-flat-default-active{background-color:rgba(0,0,0,.2);color:rgba(0,0,0,0.87)}.docs-material-menu-button-flat-default-focused{border:1px solid #4285f4;outline:none}.docs-material-menu-button-raised-primary{background-color:#4285f4;color:#fff}.docs-material-menu-button-raised-primary-hover,.docs-material-menu-button-raised-default-hover{box-shadow:0px 2px 2px 0px rgba(0,0,0,0.14),0px 3px 1px -2px rgba(0,0,0,0.12),0px 1px 5px 0px rgba(0,0,0,0.2)}.docs-material-menu-button-raised-primary-active,.docs-material-menu-button-raised-default-active{box-shadow:0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12),0px 2px 4px -1px rgba(0,0,0,0.2)}.docs-material-menu-button-raised-primary-active{background-color:#3387d6}.docs-material-menu-button-raised-primary-focused{background-color:#4285f4;border:1px inset rgba(0,0,0,0.38);outline:none}.docs-material-menu-button-raised-default{background-color:rgba(0,0,0,.04);color:rgba(0,0,0,0.54)}.docs-material-menu-button-raised-default-active{background-color:rgba(0,0,0,0.12);color:rgba(0,0,0,0.87)}.docs-material-menu-button-raised-default-focused{border:1px solid #4285f4;color:rgba(0,0,0,0.54);outline:none}.docs-material-menu-button-flat-primary-disabled,.docs-material-menu-button-flat-default-disabled,.docs-material-menu-button-raised-default-disabled{background-color:#fff;color:rgba(0,0,0,0.26);cursor:auto}.docs-material-menu-button-raised-primary-disabled{background-color:rgba(0,0,0,0.12);color:#fff;cursor:auto}.docs-material-menu-button-flat-primary-disabled,.docs-material-menu-button-flat-default-disabled,.docs-material-menu-button-raised-default-disabled,.docs-material-menu-button-raised-primary-disabled{box-shadow:none}.docs-material-menu-button-flat-default-caption,.docs-material-menu-button-flat-primary-caption,.docs-material-menu-button-raised-default-caption,.docs-material-menu-button-raised-primary-caption{float:left;vertical-align:middle}.docs-material-menu-button-flat-default-dropdown,.docs-material-menu-button-flat-primary-dropdown{height:24px;margin:3px 0 3px 2px}.docs-material-menu-button-raised-default-dropdown,.docs-material-menu-button-raised-primary-dropdown{height:24px;margin:3px 0 3px 8px}.docs-material-menu-button-raised-primary-dropdown-icon{fill:#fff}.docs-material-menu-button-flat-default-dropdown-icon,.docs-material-menu-button-raised-default-dropdown-icon{fill:rgba(0,0,0,0.54)}.docs-material-menu-button-flat-primary-dropdown-icon{fill:#4285f4;opacity:0.54}.docs-material-menu-button-raised-default-disabled .docs-material-menu-button-raised-default-dropdown-icon,.docs-material-menu-button-flat-default-disabled .docs-material-menu-button-flat-default-dropdown-icon,.docs-material-menu-button-flat-primary-disabled .docs-material-menu-button-flat-primary-dropdown-icon{fill:rgba(0,0,0,0.26);opacity:1.0}.addon-sidebar-card{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;border-bottom:1px solid rgba(0,0,0,.12);outline:none;padding:14px 16px 8px 16px}.addon-sidebar-card-header{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;padding-bottom:8px}.addon-sidebar-card-header-content{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;width:100%}.addon-sidebar-card-icon{height:24px;padding-right:16px;padding-top:2px;width:24px}.addon-sidebar-card-icon img{height:24px;width:24px}.addon-sidebar-card-title{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;width:100%}.addon-sidebar-card-title-caption.goog-control-focused{outline:none;text-decoration:underline}.addon-sidebar-card-title-caption.goog-control-hover{text-decoration:underline}.addon-sidebar-card-title-caption{color:rgba(0,0,0,0.87);cursor:pointer;font-size:15px;font-weight:500;line-height:20px;margin-right:9px;max-height:38px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.addon-sidebar-card-two-line-title-caption{display:-webkit-box;visibility:visible;-webkit-line-clamp:2;-webkit-box-orient:vertical;white-space:normal;word-break:break-word;word-wrap:break-word}.addon-sidebar-card-check{color:#455a64;height:18px;margin:1px 0 0 auto;width:18px}.addon-sidebar-card-category{color:rgba(0,0,0,0.54);font-size:13px;font-weight:400;line-height:20px}.addon-sidebar-card-summary{color:rgba(0,0,0,0.54);font-size:13px;font-weight:400;line-height:20px;overflow:hidden;padding:0 0 8px 40px;text-overflow:ellipsis}.addon-sidebar-with-banner .addon-sidebar-card{border-bottom:none;padding-top:16px}.addon-sidebar-with-banner .addon-sidebar-card-header{padding-bottom:16px}.addon-sidebar-with-banner .addon-sidebar-card-title-caption{max-width:194px}.addon-sidebar-with-banner .addon-sidebar-card-icon{height:40px;padding-top:0px;width:40px}.addon-sidebar-with-banner .addon-sidebar-card-icon img{height:40px;width:40px}.addon-sidebar-with-banner .addon-sidebar-card-title{font-size:16px}.addon-sidebar-with-banner .addon-sidebar-card-summary{font-size:14px;padding:0 0 24px 0}.addon-sidebar-card-button.docs-material-button-flat-primary,.addon-sidebar-card-menu-button.docs-material-menu-button-flat-primary{margin-left:32px}.addon-sidebar-card-button.docs-material-button-raised-primary,.addon-sidebar-card-menu-button.docs-material-menu-button-raised-primary{margin-left:0px}.addon-sidebar-card-button.docs-material-button-flat-primary,.addon-sidebar-card-button.docs-material-button-raised-primary{height:32px;line-height:32px}.addon-sidebar-card-button.docs-material-button-flat-primary{padding:0 8px}.addon-sidebar-card-menu-button.docs-material-menu-button-flat-primary,.addon-sidebar-card-menu-button.docs-material-menu-button-raised-primary{height:32px;line-height:32px}.addon-sidebar-card-menu-button.docs-material-menu-button-flat-primary{padding:0 2px 0 8px}.addon-sidebar-card-menu-button .docs-material-menu-button-flat-primary-caption,.addon-sidebar-card-menu-button .docs-material-menu-button-raised-primary-caption{line-height:32px}.addon-sidebar-card-menu-button .docs-material-menu-button-flat-primary-dropdown,.addon-sidebar-card-menu-button .docs-material-menu-button-raised-primary-dropdown{margin-top:3px}.goog-menuitem.addon-sidebar-menu-item-with-flat,.goog-menuitem.addon-sidebar-menu-item-with-raised{padding-right:30px}.addon-sidebar-menu-item-with-flat .goog-menuitem-content{max-width:174px;overflow:hidden;text-overflow:ellipsis}.addon-sidebar-menu-item-with-raised .goog-menuitem-content{max-width:206px;overflow:hidden;text-overflow:ellipsis}.addon-sidebar{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;background:#fff;border-left:1px solid #d9d9d9;color:#222;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;outline:none;position:absolute;right:0;width:300px}.addon-sidebar-header{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;background:#616161;color:#fff;font-size:15px;font-weight:500;padding:10px 16px 9px 16px;position:relative}.addon-sidebar-close{cursor:pointer;height:21px;position:absolute;right:13px;top:7px;width:21px}.addon-sidebar-content{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;height:100%;width:300px;overflow-y:overlay}.addon-sidebar-introduction{border-bottom:1px solid rgba(0,0,0,.12);color:rgba(0,0,0,.54);font-size:11px;font-weight:500;line-height:15px;padding:10px 16px 10px 16px}.addon-sidebar-banner{display:inline-grid;position:relative}.addon-sidebar-banner-image{display:block;height:auto;width:300px}.addon-sidebar-banner-image-overlay{background-image:linear-gradient(-180deg,rgba(0,0,0,0.00) 0%,rgba(0,0,0,0.01) 30%,rgba(0,0,0,0.03) 50%,rgba(0,0,0,0.06) 70%,rgba(0,0,0,0.09) 90%,rgba(0,0,0,0.11) 96%,rgba(0,0,0,0.13) 100%);bottom:0;position:absolute;width:300px;height:80px}.addon-sidebar-spinner{position:fixed;top:50%;width:300px}.addon-sidebar-empty-caption{position:fixed;text-align:center;top:50%;width:300px}.addon-sidebar-empty-title{color:rgba(0,0,0,0.87);font-size:15px;font-weight:700;line-height:18px;padding-bottom:8px}.addon-sidebar-empty-description{color:rgba(0,0,0,0.50);font-size:13px;font-weight:500;line-height:18px}.script-application-sidebar{background:#fff;border-left:1px solid #d9d9d9;color:#222;position:absolute;right:0;width:300px}.script-application-sidebar-header{background:#616161;border:1px solid #616161;color:#fff;font-size:13px;font-weight:bold;height:15px;padding:10px 0 10px 12px;position:relative}.script-application-sidebar-close{cursor:pointer;position:absolute;right:6px;top:8px}.script-application-sidebar-content{bottom:0;position:absolute;top:37px;width:100%}#docs-script-button-bar .jfk-button{margin-right:9px}.docs-script-button-bar-text{color:#777;display:inline-block;margin-left:10px;margin-right:20px;max-width:55px;outline:none;overflow:hidden;text-overflow:ellipsis;vertical-align:text-bottom;white-space:nowrap}.docs-script-button-bar-text:hover{cursor:pointer;text-decoration:underline}.docs-script-button-bar-bubble{width:175px}.docs-script-button-bar-bubble-content{text-align:left;white-space:normal}.script-errorfield{border-color:#dd4b39!important}.script-errormsg{color:#dd4b39!important}.script-promo-menu-item{border:0px;min-height:90px;max-width:354px;padding:0px!important}.script-promo-menu-item-content{vertical-align:middle;padding:10px 20px}.script-promo-menu-item-description{color:#4a4a4a;font-size:13px}.script-promo-menu-item-icon{display:inline-block;height:75px;vertical-align:middle;width:75px}.script-promo-menu-item-text{display:inline-block;max-width:170px;padding-left:10px;vertical-align:middle;white-space:pre-line}.script-promo-menu-item-title{color:#222222;font-weight:bold;font-size:18px}.func-entry{border-top:1px solid #ffffff;border-left:1px solid #ffffff;border-right:1px solid #ffffff;border-bottom:1px solid #e5e5e5;cursor:default;outline:none}.func-entry:focus{border:1px solid #4d90fe!important}.func-entry-checked{border-top:1px solid #ffc;border-left:1px solid #ffc;border-right:1px solid #ffc;border-bottom:1px solid #e5e5e5;background-color:#ffc}.func-entry-func,.func-entry-lib{width:305px;margin-left:5px;padding-top:4px;padding-bottom:4px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.func-entry-rb{float:left;padding-left:8px;width:18px;height:26px}.func-entry-rb{background-image:url(//ssl.gstatic.com/ui/v1/radiobutton/unchecked.png);background-position:center center;background-repeat:no-repeat}.func-entry-checked .func-entry-rb{background-image:url(//ssl.gstatic.com/ui/v1/radiobutton/checked.png)}.modal-dialog.docs-dialog.gsm-widget{border:0;border-radius:0;box-shadow:none;padding:0}.modal-dialog.docs-dialog.gsm-widget .modal-dialog-title{display:none;height:0;margin:0}.gsm-widget .modal-dialog-buttons{display:none}.gsm-widget .modal-dialog-content{background-color:transparent}.script-help-dialog{min-width:392px}.script-help-dialog-content-left{border:1px solid #e5e5e5;height:160px;overflow-y:auto;vertical-align:top;width:254px}.script-help-dialog-content-section{padding:16px}.script-help-dialog-content-left-gsm-onhold{background-color:#fad2cf}.script-help-dialog-content-title{display:flex;font-weight:700;padding-bottom:8px}.script-help-dialog-content-title-caution-icon{padding-right:4px}.script-help-dialog-buttons{min-width:102px;max-width:200px;padding-left:16px;vertical-align:top}.script-help-dialog-buttons .jfk-button{display:block;margin-right:0px;margin-bottom:16px;padding:0px 8px 0px 8px;width:100%}.script-manager-box{border:none;height:450px;width:700px}.script-prompt-contents DIV{min-width:300px;max-width:700px;max-height:350px;overflow:auto}.script-prompt-contents INPUT{width:100%}.script-app-dialog{z-index:1003}.script-app-contents{padding:0px}.script-error-message{display:inline-block;overflow:hidden;text-overflow:ellipsis;vertical-align:text-bottom;white-space:nowrap}.script-error-dialog-content{max-height:400px;max-width:600px;overflow:auto}.script-reportissue-dialog-content{width:456px}.script-reportissue-dialog-description{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;font-family:arial,sans-serif;height:100px;resize:none;vertical-align:top;width:100%}.script-reportissue-dialog-nonanonymous-control{vertical-align:top;width:20px}.script-reportissue-dialog-nonanonymous-label{vertical-align:top;width:436px}.script-reportissue-dialog-nonanonymous-optional-text{color:#777}.script-explorer-contents{height:350px;width:700px;overflow:hidden}.func-header{width:100%;border-top:1px solid #e5e5e5;color:#555;cursor:default;font-weight:bold;text-transform:uppercase}.func-actions{margin-bottom:14px}#func-action-new{margin-right:22px!important}#func-action-reload{position:absolute;right:26px;width:45px}#func-action-reload .docs-icon{opacity:0.7}.func-header-func,.func-header-lib{width:307px;margin-left:5px;padding-top:4px;padding-bottom:4px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.func-header-rb{width:26px}.func-entries{max-height:272px;border-top:1px solid #e5e5e5;overflow-x:hidden;overflow-y:auto}.func-entries:focus{outline:none}.func-none,.func-loading{width:640px;cursor:default;padding-top:4px;padding-bottom:4px}.func-none{margin-left:30px}.func-loading{background:transparent url(//ssl.gstatic.com/docs/script/images/spin-wait.gif) no-repeat 0 4px;padding-left:20px;margin-left:12px}.webstore-widget{padding:0}.webstore-widget .modal-dialog-title{border-bottom:1px solid #acacac;margin:0;padding:16px 12px}.encrypted-create-dialog.modal-dialog{height:242px;width:390px}.encrypted-create-dialog.modal-dialog:focus{outline:0}.encrypted-create-dialog .modal-dialog-content{font-size:14px;height:100px;letter-spacing:0.2px;line-height:20px;width:392px}.encrypted-create-dialog .modal-dialog-title-close{visibility:hidden}.drive-encrypted-create-dialog-bg.modal-dialog-bg{opacity:0.5!important}.encrypted-create-dialog .modal-dialog-buttons{bottom:24px;position:absolute;right:24px}.encrypted-create-dialog .docsshared-cb-wrapper{font-size:14px;line-height:20px;letter-spacing:0.2px;margin-top:15px}.encrypted-create-dialog .docs-encrypted-create-dialog-cb .jfk-checkbox{padding:2px}.encrypted-create-dialog .docs-encrypted-create-dialog-cb .jfk-checkbox-checkmark{left:-1px;top:-1px}.encrypted-create-dialog .docs-encrypted-create-dialog-cb .docsshared-cb-label{padding-left:8px}.encrypted-create-dialog .drive-encrypted-create-dialog-cb .jfk-checkbox-checkmark{top:1px}.encrypted-create-dialog .drive-encrypted-create-dialog-cb .jfk-checkbox{height:19px;width:19px}.active-account-dialog-email{font-weight:500;word-break:break-all}.active-account-dialog .modal-dialog-content{display:flex}.active-account-dialog-display-name{font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;line-height:12px;padding:8px;display:flex;align-items:center}.active-account-dialog-avatar{background-color:#9aa0a6;border-radius:50%;object-fit:cover;height:32px;width:32px}.active-account-dialog .modal-dialog-buttons{margin-top:32px}.modal-dialog.active-account-dialog{display:table;max-width:464px;table-layout:fixed}.goog-checkbox{border:1px solid #1c5180;display:-moz-inline-box;display:inline-block;font-size:1px;height:11px;margin:0 4px 0 1px;vertical-align:text-bottom;width:11px}.goog-checkbox-checked{background:#fff url(//ssl.gstatic.com/closure/check-sprite.gif) no-repeat 2px center}.goog-checkbox-undetermined{background:#bbb url(//ssl.gstatic.com/closure/check-sprite.gif) no-repeat 2px center}.goog-checkbox-unchecked{background:#fff}.goog-checkbox-disabled{border:1px solid lightgray;background-position:-7px}.jfk-checkbox{-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;background-color:rgba(255,255,255,.05);border:1px solid #c6c6c6;border:1px solid rgba(155,155,155,.57);font-size:1px;height:11px;margin:0px 4px 0px 1px;outline:0;vertical-align:text-bottom;width:11px}.jfk-checkbox-undetermined{background-color:#fff;background-color:rgba(255,255,255,.65)}.jfk-checkbox-checked{background-color:#fff;background-color:rgba(255,255,255,.65)}.jfk-checkbox-hover{-webkit-box-shadow:inset 0px 1px 1px rgba(0,0,0,.1);-moz-box-shadow:inset 0px 1px 1px rgba(0,0,0,.1);box-shadow:inset 0px 1px 1px rgba(0,0,0,.1);border:1px solid #b2b2b2}.jfk-checkbox-active{background-color:#ebebeb}.jfk-checkbox-focused{border:1px solid #4d90fe}.jfk-checkbox-clearOutline.jfk-checkbox-focused{border:1px solid #c6c6c6;border:1px solid rgba(155,155,155,.57)}.jfk-checkbox-disabled,.jfk-checkbox-clearOutline.jfk-checkbox-disabled{background-color:#fff;border:1px solid #f1f1f1;cursor:default}.jfk-checkbox-checkmark{height:15px;outline:0;width:15px;left:0;position:relative;top:-3px}.jfk-checkbox-undetermined .jfk-checkbox-checkmark{background:url(//ssl.gstatic.com/ui/v1/menu/checkmark-partial.png) no-repeat -5px -3px;background-image:-webkit-image-set(url(//ssl.gstatic.com/ui/v1/menu/checkmark-partial.png) 1x,url(//ssl.gstatic.com/ui/v1/menu/checkmark-partial_2x.png) 2x)}.jfk-checkbox-checked .jfk-checkbox-checkmark{background:url(//ssl.gstatic.com/ui/v1/menu/checkmark.png) no-repeat -5px -3px;background-image:-webkit-image-set(url(//ssl.gstatic.com/ui/v1/menu/checkmark.png) 1x,url(//ssl.gstatic.com/ui/v1/menu/checkmark_2x.png) 2x)}.jfk-colormenu.goog-menu{padding:0}.jfk-palette{cursor:default;outline:none}.jfk-palette-table{empty-cells:show;margin:16px}.jfk-palette-cell{border:1px solid transparent;cursor:pointer;margin:0;position:relative}.jfk-palette-cell-hover{border:1px solid #000}.jfk-palette-cell-selected{outline:1px solid #000}.jfk-palette-colorswatch{height:16px;width:16px}.jfk-palette-cell-selected>.jfk-palette-colorswatch{background:url(//ssl.gstatic.com/ui/v1/colorpicker/checkmark.png) no-repeat 50% 50%}.jfk-colorwell{border:1px solid #d9d9d9}.jfk-butterBar{-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;-webkit-box-shadow:0px 2px 4px rgba(0,0,0,0.2);-moz-box-shadow:0px 2px 4px rgba(0,0,0,0.2);box-shadow:0px 2px 4px rgba(0,0,0,0.2);-webkit-transition:all 0s linear 1s,opacity 1s;-moz-transition:all 0s linear 1s,opacity 1s;-o-transition:all 0s linear 1s,opacity 1s;transition:all 0s linear 1s,opacity 1s;border-style:solid;border-width:0;font-size:11px;height:0;opacity:0;visibility:hidden;overflow:hidden;padding:0;text-align:center}.jfk-butterBar-info{background-color:#f9edbe;border-color:#f0c36d;color:#333}.jfk-butterBar-error{background-color:#484848;border-color:#202020;color:#fff}.jfk-butterBar-promo{background-color:#d6e9f8;border-color:#4d90f0;color:#333}.jfk-butterBar-warning{background-color:#dd4b39;border-color:#602019;color:#fff}.jfk-butterBar-shown{-webkit-transition:opacity 0.218s;-moz-transition:opacity 0.218s;-o-transition:opacity 0.218s;transition:opacity 0.218s;border-width:1px;min-height:14px;height:auto;opacity:1;visibility:visible;padding:6px 16px}.jfk-butterBar-mini.jfk-butterBar-shown{padding:2px 16px}.goog-link-button{position:relative;color:#15c;text-decoration:underline;cursor:pointer}.goog-link-button-disabled{color:#ccc;text-decoration:none;cursor:default}.goog-toolbar{background:#f5f5f5;border-top:1px solid #e5e5e5;border-bottom:1px solid #ebebeb;outline:0;padding:8px 0 4px 0;position:relative;zoom:1}.jfk-freestanding-menu-button{-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;background:url(//ssl.gstatic.com/ui/v1/disclosure/light-grey-disclosure-arrow-down.png) center no-repeat;border:1px solid #e5e5e5;height:11px;width:11px;cursor:pointer}.jfk-freestanding-menu-button-hover,.jfk-freestanding-menu-button-active,.jfk-freestanding-menu-button-open{background:url(//ssl.gstatic.com/ui/v1/disclosure/dark-grey-disclosure-arrow-down.png) center no-repeat #eee;border-color:#c6c6c6}.jfk-select .goog-flat-menu-button-caption{overflow:hidden;width:100%}.jfk-select .goog-flat-menu-button-dropdown{background:url(//ssl.gstatic.com/ui/v1/disclosure/grey-disclosure-arrow-up-down.png) center no-repeat;border:none;height:11px;margin-top:-4px;width:7px}.jfk-progressStatus{color:#202020}.jfk-progressText{color:#999}.jfk-progressStatus,.jfk-progressText{line-height:18px}.jfk-progressBar-blocking .progress-bar-horizontal,.jfk-progressBar-nonBlocking .progress-bar-horizontal{border:1px solid #999;padding:1px;width:320px}.jfk-progressBar-blocking .progress-bar-thumb{background-color:#6188f5;height:5px}.jfk-progressBar-nonBlocking .progress-bar-thumb{background-color:#ccc;height:5px}.jfk-progressBar-blocking.jfk-progressBar-tall .progress-bar-thumb,.jfk-progressBar-nonBlocking.jfk-progressBar-tall .progress-bar-thumb{height:8px}.jfk-progressBar-blocking .progress-bar-thumb{-webkit-animation:jfk-progressBar-bg 0.8s linear 0s infinite;-moz-animation:jfk-progressBar-bg 0.8s linear 0s infinite;-o-animation:jfk-progressBar-bg 0.8s linear 0s infinite;animation:jfk-progressBar-bg 0.8s linear 0s infinite;background-position:0 0;background-repeat:repeat-x;background-size:16px 8px;background-color:#6188f5;background-image:-webkit-linear-gradient(315deg,transparent,transparent 33%,rgba(0,0,0,.12) 33%,rgba(0,0,0,.12) 66%,transparent 66%,transparent);background-image:-moz-linear-gradient(315deg,transparent,transparent 33%,rgba(0,0,0,.12) 33%,rgba(0,0,0,.12) 66%,transparent 66%,transparent);background-image:-ms-linear-gradient(315deg,transparent,transparent 33%,rgba(0,0,0,.12) 33%,rgba(0,0,0,.12) 66%,transparent 66%,transparent);background-image:-o-linear-gradient(315deg,transparent,transparent 33%,rgba(0,0,0,.12) 33%,rgba(0,0,0,.12) 66%,transparent 66%,transparent);background-image:linear-gradient(315deg,transparent,transparent 33%,rgba(0,0,0,.12) 33%,rgba(0,0,0,.12) 66%,transparent 66%,transparent)}.jfk-progressBar-blocking.jfk-progressBar-tall .progress-bar-thumb{-webkit-animation:jfk-progressBar-bg-tall 0.8s linear 0s infinite;-moz-animation:jfk-progressBar-bg-tall 0.8s linear 0s infinite;-o-animation:jfk-progressBar-bg-tall 0.8s linear 0s infinite;animation:jfk-progressBar-bg-tall 0.8s linear 0s infinite;background-size:20px 10px}@-webkit-keyframes jfk-progressBar-bg{0%{background-position:0 0}100%{background-position:-16px 0}}@-moz-keyframes jfk-progressBar-bg{0%{background-position:0 0}100%{background-position:-16px 0}}@-o-keyframes jfk-progressBar-bg{0%{background-position:0 0}100%{background-position:-16px 0}}@keyframes jfk-progressBar-bg{0%{background-position:0 0}100%{background-position:-16px 0}}@-webkit-keyframes jfk-progressBar-bg-tall{0%{background-position:0 0}100%{background-position:-20px 0}}@-moz-keyframes jfk-progressBar-bg-tall{0%{background-position:0 0}100%{background-position:-20px 0}}@-o-keyframes jfk-progressBar-bg-tall{0%{background-position:0 0}100%{background-position:-20px 0}}@keyframes jfk-progressBar-bg-tall{0%{background-position:0 0}100%{background-position:-20px 0}}.jfk-progressbar .progress-bar-horizontal,.jfk-progressbar .progress-bar-vertical{border-color:#999}.jfk-progressbar .progress-bar-thumb{background-color:#ccc}.jfk-radiobutton{display:inline-block;outline:none;padding:5px 7px;position:relative}.jfk-radiobutton-radio{-webkit-border-radius:50%;-moz-border-radius:50%;border-radius:50%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:url(//ssl.gstatic.com/ui/v1/radiobutton/unchecked.png) -3px -3px;background:rgba(255,255,255,0);border:1px solid rgba(198,198,198,1);height:15px;left:7px;margin:0;outline:none;position:absolute;text-align:left;top:6px;width:15px}.jfk-radiobutton:active .jfk-radiobutton-radio{background:rgba(235,235,235,1);border-color:rgba(182,182,182,1)}.jfk-radiobutton:hover .jfk-radiobutton-radio{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.1);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.1);box-shadow:inset 0 1px 1px rgba(0,0,0,.1);border-color:rgba(182,182,182,1)}.jfk-radiobutton:focus .jfk-radiobutton-radio{border-color:rgba(77,144,254,1)}.jfk-radiobutton-checked .jfk-radiobutton-radio{background:url(//ssl.gstatic.com/ui/v1/radiobutton/checked.png) -3px -3px;background:rgba(255,255,255,0)}.jfk-radiobutton.jfk-radiobutton:focus .jfk-radiobutton-radio{background:url(//ssl.gstatic.com/ui/v1/radiobutton/unchecked_focused.png) -3px -3px;background:rgba(255,255,255,0)}.jfk-radiobutton-checked.jfk-radiobutton:focus .jfk-radiobutton-radio{background:url(//ssl.gstatic.com/ui/v1/radiobutton/checked_focused.png) -3px -3px;background:rgba(255,255,255,0)}.jfk-radiobutton-checked .jfk-radiobutton-radio::after{-webkit-border-radius:50%;-moz-border-radius:50%;border-radius:50%;background:rgba(96,96,96,1);border:2px solid #606060;box-sizing:border-box;content:'';display:block;height:7px;left:3px;position:relative;top:3px;width:7px}.jfk-radiobutton .jfk-radiobutton-label{display:block;cursor:default;margin-left:22px}.jfk-radiobutton-disabled .jfk-radiobutton-radio{background:url(//ssl.gstatic.com/ui/v1/radiobutton/unchecked-disabled.png) -3px -3px;background:rgba(255,255,255,0);border-color:rgba(241,241,241,1)}.jfk-radiobutton-disabled.jfk-radiobutton-checked .jfk-radiobutton-radio{background:url(//ssl.gstatic.com/ui/v1/radiobutton/checked-disabled.png) -3px -3px;background:rgba(255,255,255,0)}.jfk-radiobutton-disabled.jfk-radiobutton-checked .jfk-radiobutton-radio::after{background:rgba(184,184,184,1)}.jfk-radiobutton-disabled .jfk-radiobutton-label{color:rgb(184,184,184)}.jfk-radiobutton-disabled:active .jfk-radiobutton-radio,.jfk-radiobutton-disabled:hover .jfk-radiobutton-radio{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;background:rgba(255,255,255,1);border-color:rgba(241,241,241,1)}::-webkit-scrollbar{height:16px;overflow:visible;width:16px}::-webkit-scrollbar-button{height:0;width:0}::-webkit-scrollbar-track{background-clip:padding-box;border:solid transparent;border-width:0 0 0 4px}::-webkit-scrollbar-track:horizontal{border-width:4px 0 0}::-webkit-scrollbar-track:hover{background-color:rgba(0,0,0,.05);box-shadow:inset 1px 0 0 rgba(0,0,0,.1)}::-webkit-scrollbar-track:horizontal:hover{box-shadow:inset 0 1px 0 rgba(0,0,0,.1)}::-webkit-scrollbar-track:active{background-color:rgba(0,0,0,.05);box-shadow:inset 1px 0 0 rgba(0,0,0,.14),inset -1px 0 0 rgba(0,0,0,.07)}::-webkit-scrollbar-track:horizontal:active{box-shadow:inset 0 1px 0 rgba(0,0,0,.14),inset 0 -1px 0 rgba(0,0,0,.07)}.jfk-scrollbar-dark::-webkit-scrollbar-track:hover{background-color:rgba(255,255,255,.1);box-shadow:inset 1px 0 0 rgba(255,255,255,.2)}.jfk-scrollbar-dark::-webkit-scrollbar-track:horizontal:hover{box-shadow:inset 0 1px 0 rgba(255,255,255,.2)}.jfk-scrollbar-dark::-webkit-scrollbar-track:active{background-color:rgba(255,255,255,.1);box-shadow:inset 1px 0 0 rgba(255,255,255,.25),inset -1px 0 0 rgba(255,255,255,.15)}.jfk-scrollbar-dark::-webkit-scrollbar-track:horizontal:active{box-shadow:inset 0 1px 0 rgba(255,255,255,.25),inset 0 -1px 0 rgba(255,255,255,.15)}::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.2);background-clip:padding-box;border:solid transparent;border-width:1px 1px 1px 6px;min-height:28px;padding:100px 0 0;box-shadow:inset 1px 1px 0 rgba(0,0,0,.1),inset 0 -1px 0 rgba(0,0,0,.07)}::-webkit-scrollbar-thumb:horizontal{border-width:6px 1px 1px;padding:0 0 0 100px;box-shadow:inset 1px 1px 0 rgba(0,0,0,.1),inset -1px 0 0 rgba(0,0,0,.07)}::-webkit-scrollbar-thumb:hover{background-color:rgba(0,0,0,.4);box-shadow:inset 1px 1px 1px rgba(0,0,0,.25)}::-webkit-scrollbar-thumb:active{background-color:rgba(0,0,0,0.5);box-shadow:inset 1px 1px 3px rgba(0,0,0,0.35)}.jfk-scrollbar-dark::-webkit-scrollbar-thumb{background-color:rgba(255,255,255,.3);box-shadow:inset 1px 1px 0 rgba(255,255,255,.15),inset 0 -1px 0 rgba(255,255,255,.1)}.jfk-scrollbar-dark::-webkit-scrollbar-thumb:horizontal{box-shadow:inset 1px 1px 0 rgba(255,255,255,.15),inset -1px 0 0 rgba(255,255,255,.1)}.jfk-scrollbar-dark::-webkit-scrollbar-thumb:hover{background-color:rgba(255,255,255,.6);box-shadow:inset 1px 1px 1px rgba(255,255,255,.37)}.jfk-scrollbar-dark::-webkit-scrollbar-thumb:active{background-color:rgba(255,255,255,.75);box-shadow:inset 1px 1px 3px rgba(255,255,255,.5)}.jfk-scrollbar-borderless::-webkit-scrollbar-track{border-width:0 1px 0 6px}.jfk-scrollbar-borderless::-webkit-scrollbar-track:horizontal{border-width:6px 0 1px}.jfk-scrollbar-borderless::-webkit-scrollbar-track:hover{background-color:rgba(0,0,0,.035);box-shadow:inset 1px 1px 0 rgba(0,0,0,.14),inset -1px -1px 0 rgba(0,0,0,.07)}.jfk-scrollbar-borderless.jfk-scrollbar-dark::-webkit-scrollbar-track:hover{background-color:rgba(255,255,255,.07);box-shadow:inset 1px 1px 0 rgba(255,255,255,.25),inset -1px -1px 0 rgba(255,255,255,.15)}.jfk-scrollbar-borderless::-webkit-scrollbar-thumb{border-width:0 1px 0 6px}.jfk-scrollbar-borderless::-webkit-scrollbar-thumb:horizontal{border-width:6px 0 1px}::-webkit-scrollbar-corner{background:transparent}body::-webkit-scrollbar-track-piece{background-clip:padding-box;background-color:#f5f5f5;border:solid #fff;border-width:0 0 0 3px;box-shadow:inset 1px 0 0 rgba(0,0,0,.14),inset -1px 0 0 rgba(0,0,0,.07)}body::-webkit-scrollbar-track-piece:horizontal{border-width:3px 0 0;box-shadow:inset 0 1px 0 rgba(0,0,0,.14),inset 0 -1px 0 rgba(0,0,0,.07)}body::-webkit-scrollbar-thumb{border-width:1px 1px 1px 5px}body::-webkit-scrollbar-thumb:horizontal{border-width:5px 1px 1px}body::-webkit-scrollbar-corner{background-clip:padding-box;background-color:#f5f5f5;border:solid #fff;border-width:3px 0 0 3px;box-shadow:inset 1px 1px 0 rgba(0,0,0,.14)}.goog-slider{position:relative;outline:0}.goog-slider-horizontal{height:18px}.goog-slider-vertical{width:18px}.goog-slider-thumb{background-color:#f5f5f5;background-image:-webkit-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:-moz-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:-ms-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:-o-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:linear-gradient(top,#f5f5f5,#f1f1f1);-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;-webkit-transition:background-color 0.218s,border-color 0.218s,background-image 0.218s;-moz-transition:background-color 0.218s,border-color 0.218s,background-image 0.218s;-o-transition:background-color 0.218s,border-color 0.218s,background-image 0.218s;transition:background-color 0.218s,border-color 0.218s,background-image 0.218s;border:1px solid #dcdcdc;height:16px;position:absolute;width:16px}.goog-slider-thumb:hover{background-color:#f8f8f8;background-image:-webkit-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-moz-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-ms-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-o-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:linear-gradient(top,#f8f8f8,#f1f1f1);border-color:#c6c6c6}.goog-slider-scale{position:absolute}.goog-slider-horizontal .goog-slider-scale{border-top:1px solid #ccc;top:8px;width:100%}.goog-slider-vertical .goog-slider-scale{border-left:1px solid #ccc;height:100%;left:8px}.jfk-twothumbslider{position:relative;outline:0}.goog-twothumbslider-horizontal{height:18px}.goog-twothumbslider-vertical{width:18px}.goog-twothumbslider-horizontal .goog-twothumbslider-value-thumb,.goog-twothumbslider-horizontal .goog-twothumbslider-extent-thumb{position:absolute;height:0;width:16px}.goog-twothumbslider-vertical .goog-twothumbslider-value-thumb,.goog-twothumbslider-vertical .goog-twothumbslider-extent-thumb{position:absolute;height:16px;width:0}.jfk-slider-thumbimpl{background-color:#999;border:1px solid #999;-webkit-transition:background-color 0.218s,border-color 0.218s,background-image 0.218s;-moz-transition:background-color 0.218s,border-color 0.218s,background-image 0.218s;-o-transition:background-color 0.218s,border-color 0.218s,background-image 0.218s;transition:background-color 0.218s,border-color 0.218s,background-image 0.218s}.jfk-twothumbslider:hover .jfk-slider-thumbimpl,.jfk-twothumbslider.goog-slider-dragging .jfk-slider-thumbimpl{background-color:#fff}.jfk-twothumbslider.goog-slider-dragging .goog-slider-thumb-dragging .jfk-slider-thumbimpl{background-color:#535252;border-color:#535252}.goog-twothumbslider-horizontal .jfk-slider-thumbimpl{height:16px;width:8px}.goog-twothumbslider-horizontal .goog-twothumbslider-value-thumb .jfk-slider-thumbimpl{-webkit-border-radius:8px 0 0 8px;-moz-border-radius:8px 0 0 8px;border-radius:8px 0 0 8px}.goog-twothumbslider-horizontal .goog-twothumbslider-extent-thumb .jfk-slider-thumbimpl{-webkit-border-radius:0 8px 8px 0;-moz-border-radius:0 8px 8px 0;border-radius:0 8px 8px 0;margin-left:8px}.goog-twothumbslider-vertical .jfk-slider-thumbimpl{height:8px;width:16px}.goog-twothumbslider-vertical .goog-twothumbslider-value-thumb .jfk-slider-thumbimpl{margin-top:8px;-webkit-border-radius:0 0 8px 8px;-moz-border-radius:0 0 8px 8px;border-radius:0 0 8px 8px}.goog-twothumbslider-vertical .goog-twothumbslider-extent-thumb .jfk-slider-thumbimpl{-webkit-border-radius:8px 8px 0 0;-moz-border-radius:8px 8px 0 0;border-radius:8px 8px 0 0}.jfk-slider-scale{background-color:#e5e5e5;position:absolute;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.goog-twothumbslider-horizontal .jfk-slider-scale{height:6px;top:6px;width:100%}.goog-twothumbslider-vertical .jfk-slider-scale{height:100%;left:6px;width:6px}.goog-twothumbslider-rangehighlight{background-color:#c6c6c6;position:absolute;-webkit-transition:background-color 0.218s,border-color 0.218s,background-image 0.218s;-moz-transition:background-color 0.218s,border-color 0.218s,background-image 0.218s;-o-transition:background-color 0.218s,border-color 0.218s,background-image 0.218s;transition:background-color 0.218s,border-color 0.218s,background-image 0.218s}.jfk-twothumbslider:hover .goog-twothumbslider-rangehighlight,.jfk-twothumbslider.goog-slider-dragging .goog-twothumbslider-rangehighlight{background-color:#535252}.jfk-twothumbslider.goog-slider-dragging .goog-twothumbslider-rangehighlight{background-image:url(//ssl.gstatic.com/ui/v1/slider/rangehighlight-active-gray.png)}.goog-twothumbslider-horizontal .goog-twothumbslider-rangehighlight{height:6px;top:6px}.goog-twothumbslider-vertical .goog-twothumbslider-rangehighlight{left:6px;width:6px}.jfk-tooltip{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;-webkit-transition:visibility 0,opacity .13s ease-in;-moz-transition:visibility 0,opacity .13s ease-in;-o-transition:visibility 0,opacity .13s ease-in;transition:visibility 0,opacity .13s ease-in;background-color:#2a2a2a;border:1px solid #fff;color:#fff;cursor:default;display:block;font-size:11px;font-weight:bold;margin-left:-1px;opacity:1;padding:7px 9px;position:absolute;visibility:visible;white-space:pre-wrap;word-break:break-all;word-break:break-word}.jfk-tooltip-hide{-webkit-transition:visibility .13s,opacity .13s ease-out,left 0 linear .13s,top 0 linear .13s;-moz-transition:visibility .13s,opacity .13s ease-out,left 0 linear .13s,top 0 linear .13s;-o-transition:visibility .13s,opacity .13s ease-out,left 0 linear .13s,top 0 linear .13s;transition:visibility .13s,opacity .13s ease-out,left 0 linear .13s,top 0 linear .13s;opacity:0;left:20px!important;top:20px!important;visibility:hidden}.jfk-tooltip-data{display:none}.jfk-tooltip-arrow{pointer-events:none;position:absolute}.jfk-tooltip-arrow .jfk-tooltip-arrowimplbefore,.jfk-tooltip-arrow .jfk-tooltip-arrowimplafter{content:'';display:block;height:0;position:absolute;width:0}.jfk-tooltip-arrow .jfk-tooltip-arrowimplbefore{border:6px solid}.jfk-tooltip-arrow .jfk-tooltip-arrowimplafter{border:5px solid}.jfk-tooltip-arrowdown{bottom:0}.jfk-tooltip-arrowup{top:-6px}.jfk-tooltip-arrowleft{left:-6px}.jfk-tooltip-arrowright{right:0}.jfk-tooltip-arrowdown .jfk-tooltip-arrowimplbefore,.jfk-tooltip-arrowup .jfk-tooltip-arrowimplbefore{border-color:#fff transparent;left:-6px}.jfk-tooltip-arrowdown .jfk-tooltip-arrowimplafter,.jfk-tooltip-arrowup .jfk-tooltip-arrowimplafter{border-color:#2a2a2a transparent;left:-5px}.jfk-tooltip-arrowdown .jfk-tooltip-arrowimplbefore{border-bottom-width:0}.jfk-tooltip-arrowdown .jfk-tooltip-arrowimplafter{border-bottom-width:0}.jfk-tooltip-arrowup .jfk-tooltip-arrowimplbefore{border-top-width:0}.jfk-tooltip-arrowup .jfk-tooltip-arrowimplafter{border-top-width:0;top:1px}.jfk-tooltip-arrowleft .jfk-tooltip-arrowimplbefore,.jfk-tooltip-arrowright .jfk-tooltip-arrowimplbefore{border-color:transparent #fff;top:-6px}.jfk-tooltip-arrowleft .jfk-tooltip-arrowimplafter,.jfk-tooltip-arrowright .jfk-tooltip-arrowimplafter{border-color:transparent #2a2a2a;top:-5px}.jfk-tooltip-arrowleft .jfk-tooltip-arrowimplbefore{border-left-width:0}.jfk-tooltip-arrowleft .jfk-tooltip-arrowimplafter{border-left-width:0;left:1px}.jfk-tooltip-arrowright .jfk-tooltip-arrowimplbefore{border-right-width:0}.jfk-tooltip-arrowright .jfk-tooltip-arrowimplafter{border-right-width:0}.docs-butterbar-container{font-weight:500;height:0;position:absolute;text-align:center;top:23px;width:100%;z-index:999}.docs-hub-butterbar{top:57px}.docs-gm .docs-butterbar-container{font-weight:normal;font-weight:var(--docs-material-font-weight-normal,normal)}.docs-butterbar-container.docs-butterbar-container-compact{top:50px}.docs-butterbar-wrap{display:inline-block;padding-bottom:8px}.docs-gm .jfk-butterBar{align-items:center;border-radius:4px;border-style:none;display:flex;flex-wrap:wrap;font-size:13px;font-size:var(--docs-material-font-size-normal,13px);height:fit-content;min-height:40px;padding:0px 24px}.docs-gm .jfk-butterBar-info{background-color:#e6f4ea;color:#202124;white-space:normal}.docs-gm .jfk-butterBar-warning{background-color:#d93025}.docs-gm .jfk-butterBar-error{background-color:#202124;color:#dadce0}.docs-butterbar-dismiss,.docs-butterbar-link,a.docs-butterbar-link:link,a.docs-butterbar-link:visited,.docs-butterbar-link-no-pad,a.docs-butterbar-link-no-pad:link,a.docs-butterbar-link-no-pad:visited{color:#666;cursor:pointer;text-decoration:underline}.docs-butterbar-dismiss,.docs-butterbar-link,a.docs-butterbar-link:link,a.docs-butterbar-link:visited{padding-left:6px}.docs-gm .docs-butterbar-dismiss{font-size:16px;margin-left:80px;padding:0;text-decoration:none;flex:1;text-align:end}.jfk-butterBar-warning .docs-butterbar-dismiss,.jfk-butterBar-warning .docs-butterbar-link,.jfk-butterBar-warning a.docs-butterbar-link:link,.jfk-butterBar-warning a.docs-butterbar-link:visited,.jfk-butterBar-warning .docs-butterbar-link-no-pad,.jfk-butterBar-warning a.docs-butterbar-link-no-pad:link,.jfk-butterBar-warning a.docs-butterbar-link-no-pad:visited{color:#111}.jfk-butterBar-error .docs-butterbar-dismiss,.jfk-butterBar-error .docs-butterbar-link,.jfk-butterBar-error a.docs-butterbar-link:link,.jfk-butterBar-error a.docs-butterbar-link:visited,.jfk-butterBar-error .docs-butterbar-link-no-pad,.jfk-butterBar-error a.docs-butterbar-link-no-pad:link,.jfk-butterBar-error a.docs-butterbar-link-no-pad:visited{color:#add8e6}.docs-gm .docs-butterbar-dismiss,.docs-gm .docs-butterbar-link,.docs-gm a.docs-butterbar-link:link,.docs-gm a.docs-butterbar-link:visited,.docs-gm .docs-butterbar-link-no-pad,.docs-gm a.docs-butterbar-link-no-pad:link,.docs-gm a.docs-butterbar-link-no-pad:visited{font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-family:var(--docs-material-header-font-family,"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif)}.docs-gm .jfk-butterBar-info .docs-butterbar-dismiss,.docs-gm .jfk-butterBar-info .docs-butterbar-link,.docs-gm .jfk-butterBar-info a.docs-butterbar-link:link,.docs-gm .jfk-butterBar-info a.docs-butterbar-link:visited,.docs-gm .jfk-butterBar-info .docs-butterbar-link-no-pad,.docs-gm .jfk-butterBar-info a.docs-butterbar-link-no-pad:link,.docs-gm .jfk-butterBar-info a.docs-butterbar-link-no-pad:visited{color:#188038}.docs-gm .jfk-butterBar-warning .docs-butterbar-dismiss,.docs-gm .jfk-butterBar-warning .docs-butterbar-link,.docs-gm .jfk-butterBar-warning a.docs-butterbar-link:link,.docs-gm .jfk-butterBar-warning a.docs-butterbar-link:visited,.docs-gm .jfk-butterBar-warning .docs-butterbar-link-no-pad,.docs-gm .jfk-butterBar-warning a.docs-butterbar-link-no-pad:link,.docs-gm .jfk-butterBar-warning a.docs-butterbar-link-no-pad:visited{color:#fff}.docs-gm .jfk-butterBar-error .docs-butterbar-dismiss,.docs-gm .jfk-butterBar-error .docs-butterbar-link,.docs-gm .jfk-butterBar-error a.docs-butterbar-link:link,.docs-gm .jfk-butterBar-error a.docs-butterbar-link:visited,.docs-gm .jfk-butterBar-error .docs-butterbar-link-no-pad,.docs-gm .jfk-butterBar-error a.docs-butterbar-link-no-pad:link,.docs-gm .jfk-butterBar-error a.docs-butterbar-link-no-pad:visited{color:#34a853}.docs-gm .jfk-butterBar-info .docs-butterbar-dismiss:hover,.docs-gm .jfk-butterBar-info .docs-butterbar-link:hover,.docs-gm .jfk-butterBar-info .docs-butterbar-link-no-pad:hover{color:#0d652d}.docs-gm .jfk-butterBar-warning .docs-butterbar-dismiss:hover,.docs-gm .jfk-butterBar-warning .docs-butterbar-link:hover,.docs-gm .jfk-butterBar-warning .docs-butterbar-link-no-pad:hover{color:#fad2cf}.docs-gm .jfk-butterBar-error .docs-butterbar-dismiss:hover,.docs-gm .jfk-butterBar-error .docs-butterbar-link:hover,.docs-gm .jfk-butterBar-error .docs-butterbar-link-no-pad:hover{color:#81c995}.docs-ml-noselect{-webkit-touch-callout:none;-webkit-user-drag:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}#docs-chrome{background:white;outline:none}#docs-chrome.docs-hub-chrome{border-bottom:1px solid #d9d9d9;min-height:56px}#docs-header{position:relative;-ms-flex:1 1 auto;-webkit-flex:1 1 auto;flex:1 1 auto}#docs-header.docs-hub-appbar{height:49px}#docs-header.docs-og-minibar{max-height:31px}#docs-header-container{display:flex;-webkit-justify-content:flex-end;justify-content:flex-end}#docs-banner-container{display:flex;-webkit-justify-content:flex-end;justify-content:flex-end}.docs-incompatibility-banner{background-color:#e6f4ea;border:0;color:#188038;display:flex;font-size:13px;height:32px;justify-content:center;white-space:nowrap;width:100%;-ms-flex:1 1;-webkit-flex:1 1;flex:1 1}.docs-hc-ie.docs-incompatibility-banner .docs-incompatibility-banner-view-details-button,.docs-hc-edge.docs-incompatibility-banner .docs-incompatibility-banner-view-details-button,.docs-hc-gecko.docs-incompatibility-banner .docs-incompatibility-banner-view-details-button{border:1px solid transparent}.docs-incompatibility-banner-text{line-height:32px;max-width:calc(100% - 140px);overflow:hidden;text-overflow:ellipsis}.docs-incompatibility-banner-view-details-button{align-self:center;background-color:inherit;border:none;color:#188038;cursor:pointer;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;line-height:24px;margin-left:32px;min-width:42px;overflow:hidden}.docs-full-height-sidebar-placeholder{-ms-flex:0 0 0px;-webkit-flex:0 0 0px;flex:0 0 0px}.docs-full-height-sidebar-placeholder.expanded{-webkit-flex-basis:300px;-ms-flex-basis:300px;flex-basis:300px}.docs-sidebar-header-text{font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;left:20px;position:absolute;font-size:13px;font-size:var(--docs-material-font-size-normal,13px)}#docs-bars{position:relative;overflow:hidden}#docs-titlebar-container{margin-left:40px;position:relative}#docs-branding-container{height:60px;margin-top:26px;position:absolute;width:40px;z-index:1}#docs-branding-container a{display:inline-block;height:60px;width:40px}.docs-og-minibar #docs-branding-container{margin-top:0}#docs-titlebar{clear:both;font-size:18px;height:24px;padding:0;padding-top:7px;width:100%}.docs-hub-appbar #docs-titlebar{font-size:16px}#docs-header.docs-og-minibar #docs-titlebar{height:24px;padding-top:0}#docs-header.docs-og-minibar #docs-titlebar-container{top:-21px}#docs-header.docs-hub-appbar #docs-titlebar-container{height:100%}#docs-header.docs-og-minibar .docs-titlebar-buttons{top:19px}.docs-exp{border-radius:6px;border:1px solid #800;color:#800;float:left;font-size:11px;margin-right:8px;padding:0 5px;text-align:center;white-space:nowrap}#docs-drive-logo{height:60px;position:absolute;width:40px;opacity:0;transition:all 125ms linear}#docs-branding-logo{height:60px;position:absolute;width:40px;transition:all 125ms linear}#docs-branding-container.docs-branding-default{background-color:#d1d1d1}#docs-branding-container.docs-branding-documents{background-color:#4285f4}#docs-branding-container.docs-branding-spreadsheets{background-color:#0f9d58}#docs-branding-container.docs-branding-presentations{background-color:#f4b400}#docs-branding-container.docs-branding-drawings{background-color:#db4437}#docs-branding-container.docs-branding-forms{background-color:#673ab7}#docs-branding-container.docs-branding-scripts{background-color:#4285f4}#docs-branding-container:not(.docs-branding-crossfade-transition-disabled):hover #docs-drive-logo{opacity:1}#docs-branding-container:not(.docs-branding-crossfade-transition-disabled):hover #docs-branding-logo{opacity:0}#docs-branding-container.docs-branding-default:hover #docs-drive-logo{opacity:0}#docs-branding-container.docs-branding-default:hover #docs-branding-logo{opacity:1}.docs-butter{text-align:center}.docs-butter-inner{border-radius:3px;font-size:13px;font-weight:500;margin:0 auto 5px;padding:5px 7px}.docs-butter-info{background:#f6bc5d;color:#222}.docs-butter-info-link{color:#0658b5}.docs-butter-warning{background:#c00;color:#fff}.docs-butter-warning-link{color:#c3d9ff}#docs-chrome-cover-container{width:100%;z-index:990}#docs-chrome-cover{height:60px}#docs-transient-bar-container{left:50%;position:absolute;top:100%;width:0}.docs-fading-toolbar-message{background-color:#fff;border:#999 solid;border-width:0px 0px 1px 0px;color:#999;font-size:28px;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;position:absolute;text-align:center}.docs-title-outer{margin-left:17px;white-space:nowrap}.docs-title-outer.docs-title-inline-rename{margin-left:12px}.docs-title{display:inline-block;outline:none}.docs-title-input{border:1px solid transparent;border-radius:2px!important;color:#fff;font-size:18px;font-variant-ligatures:no-contextual;height:20px;line-height:22px;margin:0;min-width:1px;padding:2px 7px;visibility:hidden}#docs-header.docs-hub-appbar .docs-title-input{font-size:16px}.docs-title-input-label{font-size:18px;font-variant-ligatures:no-contextual;line-height:22px;margin:0;overflow:hidden;padding:2px 8px;pointer-events:none;position:absolute;text-overflow:ellipsis;top:0;white-space:pre;z-index:1}#docs-header.docs-hub-appbar .docs-title-input-label{font-size:16px}.docs-title-input-label-inner{display:inline;line-height:22px}.docs-title-input:hover{border-color:#e5e5e5}.docs-title-input:focus{-webkit-appearance:none;-moz-appearance:none;border:1px solid #4d90fe!important;box-shadow:inset 0px 1px 2px rgba(0,0,0,0.1);color:#000;outline:none}.docs-title-input::-ms-clear{display:none}.docs-title-inner{color:#333;font-size:18px;max-width:600px;margin:2px 4px 1px 3px;overflow:hidden;text-overflow:ellipsis;white-space:pre}.docs-title .docs-title-untitled,.docs-title-input-label.docs-title-untitled{color:#777;font-style:italic}.docs-title-widget{font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;height:27px;width:auto}#docs-header.docs-hub-appbar .docs-title-widget{padding-left:6px}.docs-title-widget-enabled:hover .docs-title{background-color:#eee;cursor:pointer}.docs-title-widget .docs-back-container a{display:none}.docs-title-widget:hover .docs-back-container a{display:inline-block}.docs-back-container{height:21px;opacity:0.6;padding-right:9px;margin-top:1px;vertical-align:top;width:21px}.docs-back-container:hover{opacity:0.9}.docs-titlebar-badges{vertical-align:top}.docs-hub-appbar .docs-titlebar-badges>:not(.docs-save-indicator-container){display:none}.docs-titlebar-badge-container{margin-top:1px;padding:0 3px;vertical-align:top}.docs-titlebar-badge .docs-icon{display:block;height:18px;margin:3px}.docs-titlebar-badge-container .goog-control,.docs-titlebar-badge-container .goog-flat-button{outline:none}.docs-titlebar-badge{align-items:center;border-radius:4px;color:#5f6368;cursor:pointer;display:flex;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;height:24px}.docs-gm .docs-titlebar-badge#docs-encrypted-doc-indicator-badge,.docs-gm .docs-titlebar-badge#docs-encrypted-doc-indicator-badge:hover,.docs-gm .docs-titlebar-badge#docs-encrypted-doc-indicator-badge:active{background-color:transparent;cursor:default;outline:none}.docs-gm .docs-titlebar-badge:hover,.docs-titlebar-badge.goog-flat-button-focused,.docs-titlebar-badge.goog-control-focused,.goog-control-focused .docs-titlebar-badge{background-color:#f1f3f4;outline:none}.docs-gm .docs-titlebar-badge:active,.docs-gm .docs-titlebar-badge.docs-titlebar-badge-selected{background-color:#e6f4ea;color:#188038}.docs-titlebar-badge.goog-control-disabled{cursor:default;opacity:0.38;background:none!important}.docs-titlebar-badge.goog-control-disabled .docs-icon-img{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_grey_medium.svg)!important}.docs-titlebar-badges.docs-badges-hidden-with-width{width:0;overflow:hidden}.docs-parent-collections-container-outer{outline:none;vertical-align:top}.docs-activity-indicator-container{height:29px;margin-top:2px;vertical-align:top;padding-right:2px}.office-editing-file-extension{background-color:#188038;border:1px solid transparent;border-radius:4px;box-sizing:border-box;color:#fff;cursor:default;font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:13px;height:21px;line-height:21px;margin:0 8px 0 0;padding:0 5px 0 4px;text-transform:uppercase;-webkit-font-smoothing:antialiased}.docs-classification-badge{border:1px solid transparent;border-radius:4px;box-sizing:border-box;color:#fff;cursor:pointer;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:500;height:20px;line-height:15px;padding:2px 8px;letter-spacing:0.03em}.docs-templates-badge-container{vertical-align:middle}.docs-templates-badge{background-color:#5a5a5a;border-radius:16px;color:white;font-size:13px;padding:0 11px;height:24px;line-height:24px}#docs-dlp,#docs-activity-indicator,.docs-title-save-label{margin-left:4px;outline:none}#docs-star.docs-titlebar-badge:active{background-color:#e8eaed}#docs-star.docs-titlebar-badge:active .docs-icon-img{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_grey_medium.svg)}#docs-activity-indicator{padding-left:4px;padding-top:2px}#docs-dlp .docs-icon-img{opacity:0.45}#docs-dlp:hover .docs-icon-img{opacity:0.55}#docs-dlp,#docs-star,#docs-folder .docs-icon{vertical-align:baseline}.docs-debug-info,.docs-debug-info a{color:#777!important;font-size:8px}.docs-debug-container{margin-right:6px;margin-top:55px;vertical-align:top;font-size:8px}#docs-header.docs-hub-appbar .docs-debug-container{margin-top:calc(56px - 8px)}.docs-titlebar-buttons{font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;padding:0 44px 0 0;position:absolute;right:0;text-align:right;top:26px;vertical-align:middle;white-space:nowrap;box-sizing:border-box}.docs-debug-container.docs-debug-info{display:flex;position:absolute;right:0;top:0}.docs-titlebar-button{z-index:1}#docs-docos-commentsbutton{margin-right:9px}#docs-titlebar-save{text-align:center}#docs-docos-commentsbutton,#docs-titlebar-share-client-button div{height:24px;padding-bottom:3px;vertical-align:middle}#docs-header.docs-hub-appbar #docs-titlebar-share-client-button div{height:28px;margin-right:8px}#docs-titlebar-share-client-button div.jfk-button{margin-right:0}#docs-docos-commentsbutton{cursor:default}.docs-titlebar-buttons .goog-menu-button-dropdown{position:relative;top:2px;vertical-align:baseline}.docs-menubar{cursor:default;display:inline-block;font-size:13px;font-size:var(--docs-material-font-size-normal,13px);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;height:29px;margin-left:52px;outline:none;position:relative;white-space:nowrap}.docs-menubar .goog-control{padding:3px 7px 5px 7px;margin-top:2px;border:1px solid transparent;outline:none}.docs-menubar .goog-control-hover{background:#eee;border-color:#eee}.docs-menubar .goog-control-open{background:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-bottom:none;-moz-box-shadow:0 2px 4px rgba(0,0,0,0.2);-webkit-box-shadow:0 2px 4px rgba(0,0,0,0.2);box-shadow:0 2px 4px rgba(0,0,0,0.2);color:black;z-index:1003}.docs-menubar .goog-control-disabled{color:#ccc}#docs-menubars{white-space:nowrap}#docs-editor-container{background:#eee;padding:0}#docs-editor{background:#eee;outline:none}#docs-editor.companion-enabled{width:calc(100% - 56px)}.docs-gaia-disabled{color:#999;cursor:text}.docs-hide-label{display:none}.docs-title-save-label{color:#777;display:inline-block;margin-left:14px;max-width:250px;overflow:hidden;vertical-align:text-bottom;white-space:nowrap}.docs-title-save-label-with-icon .docs-title-save-label-text{max-width:calc(100% - 24px)}.docs-title-save-label-text{display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis;vertical-align:text-bottom;white-space:nowrap;font-size:13px;font-size:var(--docs-material-font-size-normal,13px)}.docs-title-save-label-text:hover,.docs-title-save-label-text-focused{cursor:pointer;text-decoration:underline}.docs-title-save-label-disabled>.docs-title-save-label-text:hover{cursor:auto;text-decoration:none}:not(.docs-title-save-label-disabled)>.docs-title-save-label-text-link{text-decoration:underline}.docs-material.docs-title-save-label .docs-title-save-label-icon{cursor:pointer;margin:0 0 -1px 7px;opacity:0.54;vertical-align:text-bottom}.docs-title-save-label-text:empty+.docs-title-save-label-icon{display:none}.docs-title-save-label-unsaved-changes{background-color:#fce4e2;color:#da362c;border-radius:4px;margin-bottom:-5px;margin-left:9px;padding:5px}.docs-title-save-label-unsaved-changes-button{cursor:pointer;display:none;font-weight:bold;margin-left:10px;outline:none}.docs-title-save-label-unsaved-changes .docs-title-save-label-unsaved-changes-button{display:inline-block}.docs-title-save-label-unsaved-changes-button.goog-flat-button-disabled{cursor:default;color:rgba(0,0,0,0.26)}#blob-notice-button{border:none;border-radius:4px;background-color:#fce8e6;color:#c5221f;cursor:pointer;font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;margin:0 0 0 14px;outline:0;padding:4px 8px;white-space:nowrap}.docs-hc-ie#blob-notice-button,.docs-hc-edge#blob-notice-button,.docs-hc-gecko#blob-notice-button{border:1px solid transparent}.docs-rename-dialog,.docs-edit-description-dialog{width:340px}.docs-rename-dialog .modal-dialog-userInput,.docs-edit-description-dialog .modal-dialog-userInput{width:300px}.docs-gm .docs-rename-dialog,.docs-gm .docs-edit-description-dialog{min-width:312px;width:auto;width:unset}.docs-gm .docs-rename-dialog .modal-dialog-content{font-size:12px}.docs-gm .docs-rename-dialog .modal-dialog-userInput{width:100%}#docs-help-anchor{left:30%;position:absolute}#docs-help-anchor-right{right:0;position:absolute}.docs-faux-link{color:#20c;cursor:pointer;text-decoration:underline}.docs-offscreen{position:absolute;left:-10000px;top:-10000px}.docs-offscreen-z-index{position:absolute;left:0px;top:-1px;z-index:-2;opacity:0}.modal-dialog-bg,.goog-modalpopup-bg{z-index:1002}.modal-dialog,.goog-modalpopup{z-index:1003}.goog-menu{z-index:1003}#docs-menu-shield{background-color:#fff;position:absolute;z-index:1004}.docs-menu-hide-mnemonics .goog-menuitem-mnemonic-hint{text-decoration:none}.docs-menu-hide-mnemonics .goog-menuitem-mnemonic-separator{display:none}.goog-menu.goog-menu-noaccel .docs-menuheader{color:#9aa0a6!important;padding-left:12px}.goog-menu.goog-menu-noaccel .apps-menuitem{padding-right:10px}.goog-menu.goog-menu-noicon .goog-menuitem.apps-menuitem{padding-left:16px}.goog-menuitem.apps-menuitem{padding:6px 10px 6px 30px;white-space:normal}.goog-menuitem-highlight.apps-menuitem{border-style:none;padding-bottom:6px;padding-top:6px}.apps-menuitem .goog-menuitem-label{padding-right:6px}.apps-menuitem .goog-menuitem-accel,.docs-gm .goog-menuitem .goog-menuitem-accel{float:right;padding:0px 0px 0px 24px;position:relative}.goog-submenu .goog-menuitem-content{margin-right:42px}.docs-halfhovermenuitem .goog-submenu-arrow,.apps-menuitem .goog-submenu-arrow,.docs-gm .goog-menuitem .goog-submenu-arrow{margin-right:4px}.apps-menuitem.goog-menuitem-ie{padding:3px 10px 20px 30px}.apps-menuitem .goog-menuitem-icon-ie{float:left;top:0em}.apps-menuitem .goog-menuitem-label-ie{float:left}.modal-dialog-content{font-size:13px;font-size:var(--docs-material-font-size-normal,13px)}#docs-hub-open-external-appbarbutton .hub-open-external-icon-container,#docs-hub-close-appbarbutton .hub-close-icon-container,.docs-icon.goog-inline-block.hub-document-icon-container{height:20px;outline:0;width:20px;margin-top:2px}#docs-hub-open-external-appbarbutton .hub-open-external-icon-container,#docs-hub-close-appbarbutton .hub-close-icon-container{position:relative;top:1px;left:1px}#docs-hub-open-external-appbarbutton,#docs-hub-close-appbarbutton{margin:0 0 0 2px;width:32px;height:32px}#docs-hub-open-external-appbarbutton:hover,#docs-hub-open-external-appbarbutton:focus,#docs-hub-close-appbarbutton:hover,#docs-hub-close-appbarbutton:focus{background-color:rgba(0,0,0,.06)}input{font-family:inherit}body{background-color:white;color:black;font-weight:normal;font-size:13px;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;margin:0}.jfk-activityIndicator{display:inline-block;position:relative;direction:ltr}.jfk-activityIndicator,.jfk-activityIndicator-icon,.jfk-activityIndicator-circle,.jfk-activityIndicator-circle-transition{height:19px;width:19px}.jfk-activityIndicator-small.jfk-activityIndicator,.jfk-activityIndicator-small .jfk-activityIndicator-icon,.jfk-activityIndicator-small .jfk-activityIndicator-circle,.jfk-activityIndicator-small .jfk-activityIndicator-circle-transition{height:16px;width:16px}.jfk-activityIndicator-icon{background:url(//ssl.gstatic.com/ui/v1/activityindicator/offline.png) center no-repeat}.jfk-activityIndicator-small .jfk-activityIndicator-icon{background:url(//ssl.gstatic.com/ui/v1/activityindicator/offline_16.png) center no-repeat}.jfk-activityIndicator-icon{-webkit-transition:opacity .218s linear .44s;-moz-transition:opacity .218s linear .44s;-o-transition:opacity .218s linear .44s;transition:opacity .218s linear .44s;top:0;left:0;position:absolute;opacity:0}.jfk-activityIndicator-circle{-webkit-border-radius:50%;-moz-border-radius:50%;border-radius:50%;top:0;left:0;position:absolute}.jfk-activityIndicator-mask{overflow:hidden;position:absolute}.jfk-activityIndicator-circle-transition{position:relative}.jfk-activityIndicator-transition{-webkit-transition:all .22s ease-in;-moz-transition:all .22s ease-in;-o-transition:all .22s ease-in;transition:all .22s ease-in}.jfk-activityIndicator-transition-second{-webkit-transition:all .22s ease-out .22s;-moz-transition:all .22s ease-out .22s;-o-transition:all .22s ease-out .22s;transition:all .22s ease-out .22s}.jfk-bubble.jfk-bubble-promo{background-color:#f9edbe;border:1px solid #f0c36d}.jfk-bubble-promo .jfk-bubble-arrowdown .jfk-bubble-arrowimplbefore,.jfk-bubble-promo .jfk-bubble-arrowup .jfk-bubble-arrowimplbefore{border-color:#f0c36d transparent}.jfk-bubble-promo .jfk-bubble-arrowdown .jfk-bubble-arrowimplafter,.jfk-bubble-promo .jfk-bubble-arrowup .jfk-bubble-arrowimplafter{border-color:#f9edbe transparent}.jfk-bubble-promo .jfk-bubble-arrowleft .jfk-bubble-arrowimplbefore,.jfk-bubble-promo .jfk-bubble-arrowright .jfk-bubble-arrowimplbefore{border-color:transparent #f0c36d}.jfk-bubble-promo .jfk-bubble-arrowleft .jfk-bubble-arrowimplafter,.jfk-bubble-promo .jfk-bubble-arrowright .jfk-bubble-arrowimplafter{border-color:transparent #f9edbe}.jfk-star{display:inline-block;height:19px;text-align:center;width:19px;padding:2px}.jfk-star:before{content:url(//ssl.gstatic.com/ui/v1/star/star4.png);content:-webkit-image-set(url(//ssl.gstatic.com/ui/v1/star/star4.png) 1x,url(//ssl.gstatic.com/ui/v1/star/star4_2x.png) 2x)}.jfk-star-hover:before{content:url(//ssl.gstatic.com/ui/v1/star/star-hover4.png);content:-webkit-image-set(url(//ssl.gstatic.com/ui/v1/star/star-hover4.png) 1x,url(//ssl.gstatic.com/ui/v1/star/star-hover4_2x.png) 2x)}.jfk-star-active:before{content:url(//ssl.gstatic.com/ui/v1/star/star-active4.png);content:-webkit-image-set(url(//ssl.gstatic.com/ui/v1/star/star-active4.png) 1x,url(//ssl.gstatic.com/ui/v1/star/star-active4_2x.png) 2x)}.jfk-star-checked:before{content:url(//ssl.gstatic.com/ui/v1/star/star-lit4.png);content:-webkit-image-set(url(//ssl.gstatic.com/ui/v1/star/star-lit4.png) 1x,url(//ssl.gstatic.com/ui/v1/star/star-lit4_2x.png) 2x)}.jfk-star-checked.jfk-star-hover:before{content:url(//ssl.gstatic.com/ui/v1/star/star-lit-hover4.png);content:-webkit-image-set(url(//ssl.gstatic.com/ui/v1/star/star-lit-hover4.png) 1x,url(//ssl.gstatic.com/ui/v1/star/star-lit-hover4_2x.png) 2x)}.jfk-star-checked.jfk-star-active:before{content:url(//ssl.gstatic.com/ui/v1/star/star-lit-active4.png);content:-webkit-image-set(url(//ssl.gstatic.com/ui/v1/star/star-lit-active4.png) 1x,url(//ssl.gstatic.com/ui/v1/star/star-lit-active4_2x.png) 2x)}.apps-share-sprite{background-image:url(//ssl.gstatic.com/docs/documents/share/images/sprite-22.svg)}.sharing-aria-region{position:absolute;top:-1000px;height:1px;overflow:hidden}.share-butterbar-container{font-family:Roboto,arial,sans-serif;font-size:13px;font-weight:bold;position:fixed;display:inline-block;padding-bottom:5px}.share-client-dialog .share-butterbar-container{font-family:arial,sans-serif}.share-butterbar-container .jfk-butterBar-shown{height:21px}.share-butterbar-top{top:23px}.share-butterbar-zindex{z-index:3021}.share-butter-icon{opacity:.55;display:inline-block;width:21px;height:21px;margin-bottom:1px;margin-top:1px;margin-right:1px;vertical-align:middle}.share-butter-message,.share-butter-link{line-height:21px}.share-butter-link,.share-butter-link:visited{color:#15c;text-decoration:none;cursor:pointer}.share-butter-link:focus{outline:none}.share-butter-link:active{color:#d14836}.share-butter-link:disabled{color:#222;cursor:default}.share-butter-copy-icon{background-position:0 -120px}.share-butter-specific-people-icon{background-position:0 -72px}.share-butter-person-link-icon{background-position:0 -294px}.share-client-dialog{max-height:100%;overflow:auto;width:auto!important;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}* html .share-client-dialog{max-height:none!important;overflow:visible!important}*:first-child+html .share-client-dialog{max-height:none!important;overflow:visible!important}.share-client-dialog .modal-dialog-content{padding:0}.share-client-dialog .modal-dialog-title{padding:0}.share-client-dialog .share-client-dialog-hidden-title{height:0;margin:0;padding:0}.share-client-dialog .modal-dialog-title{font-family:arial,sans-serif;font-weight:normal}.share-client-content-iframe{display:flex;height:100%;width:100%;border:none}.share-client-dialog .modal-dialog-buttons{display:none}.share-client-error-dialog{font-family:arial,sans-serif;font-size:12px;width:400px}.share-client-loading-contents{height:99px;text-align:center;width:454px}.share-client-spinner{background-image:url(//ssl.gstatic.com/docs/documents/share/images/spinner-1.gif);display:inline-block;margin-top:41px;width:16px;height:16px}.inline-share-ui-status{font-size:12pt;font-weight:bold;height:19px;padding:5px 10px;background-color:#f1f4ff}.inline-share-ui-overlay{position:absolute;z-index:150;background-color:#fff;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"}.share-client-panel-dialog-share{height:100%;width:100%}.share-client-panel-dialog-overlay{position:absolute;z-index:150}.share-client-offscreen{position:absolute!important;left:-10000px!important;top:-10000px!important}.share-client-loading-dialog{font-family:arial,sans-serif}.share-client-debug{display:none;position:absolute;bottom:0;right:0;color:#777;font-size:10px}.team-drive-share-client-dialog{border:none;border-radius:2px;box-shadow:0px 24px 38px 3px rgba(0,0,0,0.14),0px 9px 46px 8px rgba(0,0,0,0.12),0px 11px 15px -7px rgba(0,0,0,0.2);padding:0}.full-screen-share-client-dialog{background-color:transparent!important;border:none!important;height:100vh;overflow:hidden;padding:0!important;width:100vw!important}.full-screen-share-client-dialog .modal-dialog-content{background:transparent;height:100%;width:100%}.modal-dialog.share-client-dialog.team-drive-share-client-dialog{padding:0}.full-screen-share-client-dialog .modal-dialog-title,.team-drive-share-client-dialog .modal-dialog-title{display:none}.jfk-tooltip{z-index:30000}.scb-container,.scb-icon{display:inline-block}.scb-button-icon{margin:-3px 2px 0px -5px;vertical-align:middle!important}.scb-tooltip-contents{color:#fff;font-size:13px;max-width:300px}.scb-tooltip-title{font-size:14px;font-weight:bold}.scb-tooltip-text{font-weight:normal}.scb-tooltip-icon-container{width:25px;vertical-align:top}.scb-tooltip-separator{border-top:1px solid #555555;margin:2px 0}.jfk-button-standard .scb-button-icon{opacity:.70}.jfk-button-standard.jfk-button-checked .scb-button-icon,.jfk-button-standard.jfk-button-selected .scb-button-icon,.jfk-button-standard.jfk-button-hover .scb-button-icon{opacity:0.9}.jfk-button-standard.jfk-button-disabled .scb-button-icon{opacity:0.333}.scb-public-icon-white,.scb-unlisted-icon-white,.scb-domain-public-icon-white,.scb-domain-unlisted-icon-white,.scb-privately-shared-icon-white,.scb-private-icon-white,.scb-invalid-icon-white,.scb-dlp-icon{width:21px;height:21px;background-repeat:no-repeat;vertical-align:bottom}.scb-public-icon-white{background-position:0 -802px}.scb-unlisted-icon-white{background-position:0 -48px}.scb-domain-public-icon-white{background-position:0 -243px}.scb-domain-unlisted-icon-white{background-position:0 -599px}.scb-privately-shared-icon-white{background-position:0 -318px}.scb-private-icon-white{background-position:0 -219px}.scb-invalid-icon-white{background-position:0 -623px}.scb-dlp-icon{background-position:0 -898px}.docs-branding-presentations .scb-public-icon-white{background-position:0 -671px}.docs-branding-presentations .scb-unlisted-icon-white{background-position:0 -294px}.docs-branding-presentations .scb-domain-public-icon-white{background-position:0 -850px}.docs-branding-presentations .scb-domain-unlisted-icon-white{background-position:0 -551px}.docs-branding-presentations .scb-privately-shared-icon-white{background-position:0 -72px}.docs-branding-presentations .scb-private-icon-white{background-position:0 -575px}.docs-branding-presentations .scb-invalid-icon-white{background-position:0 -826px}.docs-branding-icon{direction:ltr;text-align:left;height:60px;overflow:hidden;vertical-align:middle;width:40px}.docs-branding-icon-img:before{content:url(//ssl.gstatic.com/docs/common/branding_sprite1.svg)}.docs-branding-icon-img{position:absolute}.docs-branding-icon-drive,.docs-branding-icon-default{left:0;top:0}.docs-branding-icon-documents{left:0;top:-180px}.docs-branding-icon-spreadsheets{left:0;top:-300px}.docs-branding-icon-presentations{left:0;top:-360px}.docs-branding-icon-drawings{left:0;top:-60px}.docs-branding-icon-forms{left:0;top:-120px}.docs-branding-icon-scripts{left:0;top:-240px}.docs-icon{direction:ltr;text-align:left;height:21px;overflow:hidden;vertical-align:middle;width:21px}.docs-icon-img:before{content:url(//ssl.gstatic.com/docs/common/jfk_sprite186.png)}.docs-icon-img{*background:url(//ssl.gstatic.com/docs/common/jfk_sprite186.png)}.docs-icon-img-legacy{background:url(//ssl.gstatic.com/docs/common/jfk_sprite186.png)}.docs-icon-img-container{height:4167px;position:absolute;width:42px}.goog-color-menu-button-indicator .docs-icon{height:19px}.goog-menuitem-icon .docs-icon-img-container{opacity:.70}.goog-menuitem-icon .docs-icon-document,.goog-menuitem-icon .docs-icon-punch,.goog-menuitem-icon .docs-icon-presentation,.goog-menuitem-icon .docs-icon-spreadsheet,.goog-menuitem-icon .docs-icon-form,.goog-menuitem-icon .docs-icon-drawing,.goog-menuitem-icon .docs-icon-script,.goog-menuitem-icon .docs-icon-site{opacity:1}.docs-icon-save{left:0;top:-1077px}.docs-icon-print{left:0;top:-528px}.docs-icon-undo,.docs-icon-redo-rtl{left:0;top:-759px}.docs-icon-redo,.docs-icon-undo-rtl{left:-21px;top:-1434px}.docs-icon-copy{left:0;top:-2694px}.docs-icon-cut{left:0;top:-2085px}.docs-icon-paste{left:-21px;top:-528px}.docs-icon-document{left:-21px;top:-1392px}.docs-icon-presentation{left:-21px;top:-444px}.docs-icon-punch{left:-21px;top:-444px}.docs-icon-spreadsheet{left:-21px;top:-1014px}.docs-icon-form{left:-21px;top:-1140px}.docs-icon-form-black{left:0;top:-1203px}.docs-icon-drawing{left:0;top:-4044px}.docs-icon-site{left:-21px;top:-2442px}.docs-icon-drawing-black{left:-21px;top:-2904px}.docs-icon-excel{left:-21px;top:-2253px}.docs-icon-powerpoint{left:-21px;top:-2043px}.docs-icon-word{left:0;top:-2778px}.docs-icon-script{left:-21px;top:-3393px}.docs-icon-code{left:-21px;top:-3393px}.docs-icon-insert-script{left:-21px;top:-2673px}.docs-icon-gadget{left:0;top:-2295px}.docs-icon-image{left:0;top:-2442px}.docs-icon-clipboard{left:0;top:-864px}.docs-icon-bold{left:0;top:-1035px}.docs-icon-italic{left:0;top:-3540px}.docs-icon-text-color{left:-21px;top:-2148px}.docs-icon-align-left{left:0;top:-3750px}.docs-icon-align-center{left:-21px;top:-1623px}.docs-icon-align-right{left:-21px;top:-2274px}.docs-icon-align-justify{left:0;top:-2253px}.docs-icon-align-shapes-left{left:-21px;top:-591px}.docs-icon-align-shapes-center{left:0;top:-1140px}.docs-icon-align-shapes-right{left:0;top:-4104px}.docs-icon-align-shapes-top{left:0;top:-2463px}.docs-icon-align-shapes-middle{left:0;top:-801px}.docs-icon-align-shapes-bottom{left:0;top:-402px}.docs-icon-distribute-shapes-horizontally{left:-21px;top:-1371px}.docs-icon-distribute-shapes-vertically{left:-21px;top:-3687px}.docs-icon-valign-top{left:0;top:-3771px}.docs-icon-valign-middle{left:0;top:-297px}.docs-icon-valign-bottom{left:-21px;top:-3582px}.docs-icon-list-number{left:0;top:-3624px}.docs-icon-list-bullet{left:0;top:-2232px}.docs-icon-indent{left:0;top:-3876px}.docs-icon-outdent{left:-21px;top:-864px}.docs-icon-line-spacing{left:-21px;top:-1497px}.docs-icon-columns{left:0;top:-1056px}.docs-icon-underline{left:0;top:-675px}.docs-icon-text-bgcolor{left:-21px;top:-192px}.docs-icon-textbox{left:-21px;top:-1329px}.docs-icon-shapes{left:-21px;top:-2127px}.docs-icon-line-width{left:-21px;top:-2358px}.docs-icon-add-trendline{left:-21px;top:-87px}.docs-icon-data-label{left:0;top:-1602px}.docs-icon-next{left:-21px;top:-2988px}.docs-icon-previous{left:0;top:-1434px}.docs-icon-no-color{left:-21px;top:-2106px}.docs-icon-fill-color{left:0;top:-3645px}.docs-icon-line-color{left:-21px;top:-2694px}.docs-icon-line-type{left:0;top:-2967px}.docs-icon-table{left:0;top:-3351px}.docs-icon-comment{left:-21px;top:-66px}.docs-icon-comment-blank{left:0;top:-3393px}.docs-icon-comment-blank-highlighted{left:0;top:-1560px}.docs-icon-insert-comment{left:-21px;top:-66px}.docs-icon-chart{left:0;top:-423px}.docs-icon-list-number-rtl{left:-21px;top:-2064px}.docs-icon-list-bullet-rtl{left:-21px;top:-3918px}.docs-icon-indent-rtl{left:0;top:-1497px}.docs-icon-outdent-rtl{left:0;top:-2820px}.docs-icon-line-spacing-rtl{left:-21px;top:-2085px}.docs-icon-text-ltr{left:0;top:-192px}.docs-icon-text-rtl{left:-21px;top:-2421px}.docs-icon-sheet-rtl{left:-21px;top:-972px}.docs-icon-share{left:0;top:-3201px}.docs-icon-subscript{left:0;top:-3456px}.docs-icon-superscript{left:-21px;top:-3960px}.docs-icon-strikethrough{left:0;top:-486px}.docs-icon-clear-formatting{left:0;top:-1707px}.docs-icon-link{left:-21px;top:-4125px}.docs-icon-special-character{left:-21px;top:-696px}.docs-icon-close-white{left:-21px;top:-2463px}.docs-icon-close-small{left:-21px;top:-3309px}.docs-icon-close-thin{left:-21px;top:-2022px}.docs-icon-paint-format{left:0;top:-591px}.docs-icon-video{left:0;top:-3414px}.docs-icon-reload{left:-21px;top:-4146px}.docs-icon-reload-rtl{left:0;top:-3960px}.docs-icon-insert-page-break{left:-21px;top:-3666px}.docs-icon-close{left:-21px;top:-654px}.docs-icon-check{left:-21px;top:-1791px}.docs-icon-up{left:-21px;top:-3159px}.docs-icon-down{left:-21px;top:-402px}.docs-icon-add-page{left:0;top:-1959px}.docs-icon-email{left:-21px;top:-108px}.docs-icon-insert-equation{left:-21px;top:-2400px}.docs-icon-insert-horizontal-line{left:-21px;top:-3117px}.docs-icon-tabstop-center{left:0;top:-3792px}.docs-icon-tabstop-center-bottom{left:0;top:-339px}.docs-icon-tabstop-left{left:0;top:-255px}.docs-icon-tabstop-right{left:-21px;top:-1707px}.docs-icon-border-all{left:0;top:-1329px}.docs-icon-border-right{left:0;top:-45px}.docs-icon-border-left{left:-21px;top:-1098px}.docs-icon-border-top{left:0;top:-4083px}.docs-icon-border-bottom{left:-21px;top:-45px}.docs-icon-border-outside{left:-21px;top:-213px}.docs-icon-border-inside{left:-21px;top:-2001px}.docs-icon-border-none{left:0;top:-885px}.docs-icon-border-horizontal{left:0;top:-1245px}.docs-icon-border-vertical{left:0;top:-1644px}.docs-icon-merge{left:0;top:-2022px}.docs-icon-wrap{left:-21px;top:-1749px}.docs-icon-autofilter{left:0;top:-4125px}.docs-icon-autofilter-filled{left:-21px;top:-381px}.docs-icon-insert-function{left:0;top:-3477px}.docs-icon-insert-formula{left:0;top:-738px}.docs-icon-folder-shared{left:0;top:-3117px}.docs-icon-folder-outline{left:0;top:-381px}.docs-icon-folder-outline-hover{left:0;top:-2673px}.docs-icon-folder-outline-pressed{left:-21px;top:-171px}.docs-icon-folder-solid{left:0;top:-2568px}.docs-icon-drive{left:-21px;top:-3624px}.docs-icon-drive-grey{left:-21px;top:-1077px}.docs-icon-drive-grey-hover{left:0;top:-2526px}.docs-icon-drive-grey-pressed{left:0;top:-2358px}.docs-icon-drive-hover{left:0;top:-1665px}.docs-icon-drive-pressed{left:-21px;top:-150px}.docs-icon-drive-large{left:0;top:-1266px}.docs-icon-back{left:0;top:-822px}.docs-icon-back-rtl{left:-21px;top:-3834px}.docs-icon-arrow-more{left:0;top:-276px}.docs-icon-arrow-more-rtl{left:0;top:-993px}.docs-icon-search-this-document{left:0;top:-24px}.docs-icon-arrow-dropdown{left:0;top:-3981px}.docs-icon-word-art{left:-21px;top:-4083px}.docs-icon-delete-x{left:0;top:-2904px}.docs-icon-settings{left:0;top:-780px}.docs-icon-drive-large-wrapper{width:42px;height:42px}.docs-icon-plus{left:0;top:-1392px}.docs-icon-plus-white{left:0;top:-3096px}.docs-icon-alert{left:-21px;top:-3180px}.docs-icon-trash{left:0;top:-507px}.docs-icon-locked{left:-21px;top:-3729px}.docs-icon-unlocked{left:0;top:-2589px}.docs-icon-add-fonts{left:-21px;top:-507px}.docs-icon-enter-compact{left:0;top:-2736px}.docs-icon-exit-compact{left:0;top:-1539px}.docs-icon-mode-edit{left:0;top:-213px}.docs-icon-mode-review{left:-21px;top:-318px}.docs-icon-mode-review-white{left:0;top:-3372px}.docs-icon-mode-view{left:0;top:-654px}.docs-icon-mode-view-white{left:0;top:-3330px}.docs-icon-chat{left:-21px;top:-2946px}.docs-icon-star{left:0;top:-1182px}.docs-icon-duplicate{left:-21px;top:-3855px}.docs-icon-file{left:0;top:-2862px}.docs-icon-opacity{left:0;top:-3561px}.docs-icon-label-slant{left:0;top:-2106px}.docs-icon-point-size{left:-21px;top:-549px}.docs-icon-question{left:0;top:-3687px}.docs-icon-vertical-gridlines{left:-21px;top:-2631px}.docs-icon-left-axis{left:-21px;top:-1686px}.docs-icon-right-axis{left:0;top:-3897px}.docs-icon-left-axis-gridlines{left:-21px;top:-3561px}.docs-icon-right-axis-gridlines{left:0;top:-3729px}.docs-icon-reset{left:0;top:-2043px}.docs-icon-drag-move{left:0;top:-3435px}.docs-icon-col-dragger{left:-21px;top:-927px}.docs-icon-chrome-store{left:-21px;top:-3051px}.docs-icon-fit-area{left:0;top:-3603px}.docs-icon-zoom-out{left:-21px;top:-2526px}.docs-icon-zoom-tool{left:0;top:-2610px}.docs-icon-download{left:0;top:-2946px}.docs-icon-fusion-table{left:-21px;top:-2841px}.docs-icon-spreadsheet-sink{left:0;top:-2064px}.docs-icon-send-responses{left:0;top:-234px}.docs-icon-liveform{left:-21px;top:-423px}.docs-icon-ellipsis{left:0;top:-1833px}.docs-icon-html-preview{left:-21px;top:-2505px}.docs-icon-grid{left:-21px;top:-3264px}.docs-icon-add-animation{left:0;top:-150px}.docs-icon-playhead{left:0;top:-444px}.docs-icon-playhead-rtl{left:0;top:-3519px}.docs-icon-unsupported{left:0;top:-906px}.docs-icon-calendar{left:0;top:-2001px}.docs-zippy-closed{left:0;top:-1728px}.docs-zippy-open{left:-21px;top:-2967px}.docs-icon-bookmark{left:-21px;top:-1182px}.docs-icon-heading{left:0;top:-3030px}.docs-icon-file-blue{left:-21px;top:-1350px}.docs-icon-web-result{left:0;top:-1518px}.docs-icon-mic{left:-21px;top:-1917px}.docs-icon-paragraph{left:0;top:-2274px}.docs-icon-bookmark-black{left:0;top:-1770px}.docs-icon-web-result-blue{left:0;top:-465px}.docs-icon-popout{left:-21px;top:-570px}.docs-icon-checkbox{left:-21px;top:-3414px}.docs-icon-checkbox-type{left:-21px;top:-1308px}.docs-icon-dropdown-type{left:-21px;top:-1644px}.docs-icon-grid-type{left:0;top:-3498px}.docs-icon-image-type{left:0;top:-2925px}.docs-icon-radio-type{left:0;top:-2505px}.docs-icon-scale-type{left:-21px;top:-2883px}.docs-icon-text-type{left:-21px;top:-3009px}.docs-icon-time-type{left:0;top:-972px}.docs-icon-insert-text-block{left:0;top:-3834px}.docs-icon-accepting-responses-on{left:-21px;top:-1119px}.docs-icon-accepting-responses-off{left:0;top:-1371px}.docs-icon-decimal-increase{left:0;top:-3918px}.docs-icon-decimal-decrease{left:0;top:-1308px}.docs-icon-settings-white{left:-21px;top:-3498px}.docs-icon-no-symbol{left:0;top:-2757px}.docs-icon-crop{left:0;top:-3708px}.docs-icon-green-check{left:0;top:-3051px}.docs-icon-font-size{left:0;top:-1413px}.docs-icon-reset-image{left:0;top:-2421px}.docs-icon-r-squared{left:0;top:-2169px}.docs-icon-graph-legend{left:0;top:-2883px}.docs-icon-cast{left:0;top:-1917px}.docs-icon-wrap-overflow{left:-21px;top:-24px}.docs-icon-wrap-wrap{left:-21px;top:-1602px}.docs-icon-wrap-clip{left:0;top:-3309px}.docs-icon-highlights{left:-21px;top:-3939px}.docs-icon-green-back{left:0;top:-360px}.docs-icon-arrow-back-white{left:0;top:-3072px}.docs-icon-arrow-back-white-rtl{left:0;top:-630px}.docs-icon-help{left:0;top:-1875px}.docs-icon-highlight-green{left:-21px;top:-3201px}.docs-icon-explore-black{left:-21px;top:-2799px}.docs-icon-explore-black-padded{left:0;top:-3180px}.docs-icon-explore-green{left:0;top:-3813px}.docs-icon-explore-white{left:0;top:-1686px}.docs-icon-insert-autovis-chart{left:-21px;top:-738px}.docs-icon-insert-autovis-chart-white{left:0;top:-1455px}.docs-icon-zoom-in{left:0;top:-2316px}.docs-icon-thumb-up{left:0;top:-1098px}.docs-icon-thumb-down{left:0;top:-2547px}.docs-icon-dlp-warning{left:0;top:-3582px}.docs-icon-dogfood{left:0;top:-4065px}.docs-icon-add-to-drive{left:0;top:-3939px}.docs-icon-paste-without-formatting{left:-21px;top:-1980px}.docs-icon-qanda{left:-21px;top:-2610px}.docs-icon-update-chart{left:0;top:-1161px}.docs-icon-arrow-back-dark{left:0;top:-3285px}.docs-icon-arrow-back-dark-rtl{left:0;top:-948px}.docs-icon-open-in-external{left:-21px;top:-759px}.docs-icon-unlink{left:0;top:-1350px}.docs-icon-bar-chart{left:-21px;top:-2337px}.docs-icon-column-chart{left:0;top:-1014px}.docs-icon-line-chart{left:0;top:-549px}.docs-icon-pie-chart{left:-21px;top:-1413px}.docs-icon-pie-chart-outline{height:24px;left:0;top:0;width:24px}.docs-icon-named-range{left:0;top:-3243px}.docs-icon-clock{left:0;top:-696px}.docs-icon-cancel{left:-21px;top:-255px}.docs-icon-arrow-line-tool{left:0;top:-4002px}.docs-icon-arrow-tilted{left:-21px;top:-2190px}.docs-icon-unsupported-black{left:-21px;top:-3222px}.docs-icon-text-rotation{left:-21px;top:-2379px}.docs-icon-text-rotation-up{left:0;top:-2148px}.docs-icon-text-rotation-down{left:0;top:-3264px}.docs-icon-text-rotation-angleup{left:-21px;top:-3030px}.docs-icon-text-rotation-angledown{left:-21px;top:-3813px}.docs-icon-text-rotation-vertical{left:0;top:-717px}.docs-icon-text-rotation-none{left:-21px;top:-2652px}.docs-icon-keep-lightbulb{left:-21px;top:-717px}.docs-icon-update-table{left:-21px;top:-3540px}.docs-icon-update-slide{left:-21px;top:-1560px}.docs-icon-overflow-three-dots{left:-21px;top:-2232px}.docs-icon-restore{left:-21px;top:-4002px}.docs-icon-paragraph-border-between{left:0;top:-129px}.docs-icon-paragraph-border-bottom{left:0;top:-1854px}.docs-icon-paragraph-border-left{left:-21px;top:-3876px}.docs-icon-paragraph-border-right{left:-21px;top:-2295px}.docs-icon-paragraph-border-top{left:0;top:-3666px}.docs-icon-diagram-white{left:-21px;top:-1875px}.docs-icon-drive-black{left:-21px;top:-1812px}.docs-icon-file-upload{left:0;top:-2379px}.docs-icon-photos{left:-21px;top:-906px}.docs-icon-keyboard{left:0;top:-318px}.docs-icon-dogfood-white{left:0;top:-2715px}.docs-icon-hierarchy{left:-21px;top:-843px}.docs-icon-timeline{left:0;top:-3138px}.docs-icon-process{left:0;top:-2841px}.docs-icon-transition{left:0;top:-612px}.docs-icon-mask{left:0;top:-1224px}.docs-icon-visibility-off{left:0;top:-2337px}.docs-icon-volume-up{left:-21px;top:-3372px}.docs-icon-camera{left:-21px;top:-2484px}.docs-icon-pivot-table{left:0;top:-1623px}.docs-icon-insert-pivot-table{left:0;top:-3159px}@media screen and (-webkit-min-device-pixel-ratio:2){.docs-icon-img{content:url(//ssl.gstatic.com/docs/common/jfk_sprite_hdpi124.png)}.docs-icon-img-container{height:4380px;position:absolute;width:42px}.docs-icon-save{left:0;top:-3870px}.docs-icon-print{left:0;top:-1578px}.docs-icon-undo,.docs-icon-redo-rtl{left:0;top:-3282px}.docs-icon-redo,.docs-icon-undo-rtl{left:-21px;top:-1137px}.docs-icon-copy{left:-21px;top:-3282px}.docs-icon-cut{left:0;top:-360px}.docs-icon-paste{left:-21px;top:-594px}.docs-icon-document{left:0;top:-42px}.docs-icon-presentation{left:-21px;top:-2292px}.docs-icon-punch{left:-21px;top:-2292px}.docs-icon-spreadsheet{left:-21px;top:-510px}.docs-icon-form{left:-21px;top:-990px}.docs-icon-form-black{left:-21px;top:-3660px}.docs-icon-drawing{left:-21px;top:-3828px}.docs-icon-site{left:0;top:-3177px}.docs-icon-drawing-black{left:0;top:-3618px}.docs-icon-excel{left:0;top:-84px}.docs-icon-powerpoint{left:-21px;top:-3492px}.docs-icon-word{left:-21px;top:-864px}.docs-icon-script{left:-21px;top:-2862px}.docs-icon-code{left:-21px;top:-2862px}.docs-icon-insert-script{left:-21px;top:-3261px}.docs-icon-gadget{left:0;top:-2145px}.docs-icon-image{left:0;top:-4146px}.docs-icon-clipboard{left:-21px;top:-1683px}.docs-icon-bold{left:-21px;top:-1200px}.docs-icon-italic{left:-21px;top:-759px}.docs-icon-text-color{left:0;top:-738px}.docs-icon-align-left{left:0;top:-510px}.docs-icon-align-center{left:0;top:-4083px}.docs-icon-align-right{left:-21px;top:-3198px}.docs-icon-align-justify{left:0;top:-2061px}.docs-icon-align-shapes-left{left:-21px;top:-1704px}.docs-icon-align-shapes-center{left:0;top:-2799px}.docs-icon-align-shapes-right{left:0;top:-615px}.docs-icon-align-shapes-top{left:0;top:-1053px}.docs-icon-align-shapes-middle{left:-21px;top:-2355px}.docs-icon-align-shapes-bottom{left:0;top:-3345px}.docs-icon-distribute-shapes-horizontally{left:-21px;top:-105px}.docs-icon-distribute-shapes-vertically{left:0;top:-3093px}.docs-icon-valign-top{left:0;top:-2967px}.docs-icon-valign-middle{left:0;top:-318px}.docs-icon-valign-bottom{left:-21px;top:-2208px}.docs-icon-list-number{left:0;top:-2757px}.docs-icon-list-bullet{left:-21px;top:-3870px}.docs-icon-indent{left:-21px;top:-1431px}.docs-icon-outdent{left:-21px;top:-4104px}.docs-icon-line-spacing{left:-21px;top:-4041px}.docs-icon-columns{left:0;top:-2463px}.docs-icon-underline{left:-21px;top:-1494px}.docs-icon-text-bgcolor{left:-21px;top:-2187px}.docs-icon-textbox{left:0;top:-1557px}.docs-icon-shapes{left:-21px;top:0}.docs-icon-line-width{left:0;top:-2862px}.docs-icon-add-trendline{left:0;top:-3051px}.docs-icon-data-label{left:0;top:-4314px}.docs-icon-next{left:-21px;top:-2271px}.docs-icon-previous{left:0;top:-2208px}.docs-icon-no-color{left:0;top:-1095px}.docs-icon-fill-color{left:0;top:-2355px}.docs-icon-line-color{left:-21px;top:-381px}.docs-icon-line-type{left:0;top:-1116px}.docs-icon-table{left:-21px;top:-1872px}.docs-icon-comment{left:0;top:-1326px}.docs-icon-comment-blank{left:0;top:-4167px}.docs-icon-comment-blank-highlighted{left:0;top:-489px}.docs-icon-insert-comment{left:0;top:-1326px}.docs-icon-chart{left:0;top:-1431px}.docs-icon-list-number-rtl{left:-21px;top:-2988px}.docs-icon-list-bullet-rtl{left:0;top:-1284px}.docs-icon-indent-rtl{left:0;top:-1977px}.docs-icon-outdent-rtl{left:0;top:-63px}.docs-icon-line-spacing-rtl{left:0;top:-1221px}.docs-icon-text-ltr{left:-21px;top:-4188px}.docs-icon-text-rtl{left:0;top:-678px}.docs-icon-sheet-rtl{left:-21px;top:-234px}.docs-icon-share{left:0;top:-105px}.docs-icon-subscript{left:0;top:-2103px}.docs-icon-superscript{left:0;top:-4041px}.docs-icon-strikethrough{left:0;top:-3135px}.docs-icon-clear-formatting{left:0;top:-1389px}.docs-icon-link{left:0;top:-4335px}.docs-icon-special-character{left:-21px;top:-2082px}.docs-icon-close-white{left:-21px;top:-1242px}.docs-icon-close-small{left:0;top:-3996px}.docs-icon-close-thin{left:0;top:-2988px}.docs-icon-paint-format{left:0;top:-2694px}.docs-icon-video{left:-21px;top:-2019px}.docs-icon-reload{left:-21px;top:-3975px}.docs-icon-reload-rtl{left:-21px;top:-1620px}.docs-icon-insert-page-break{left:-21px;top:-3639px}.docs-icon-close{left:0;top:-1137px}.docs-icon-check{left:0;top:-1242px}.docs-icon-up{left:-21px;top:-531px}.docs-icon-down{left:-21px;top:-3723px}.docs-icon-add-page{left:-21px;top:-1788px}.docs-icon-email{left:-21px;top:-3156px}.docs-icon-insert-equation{left:-21px;top:-3072px}.docs-icon-insert-horizontal-line{left:-21px;top:-2418px}.docs-icon-tabstop-center{left:0;top:-1872px}.docs-icon-tabstop-center-bottom{left:-21px;top:-780px}.docs-icon-tabstop-left{left:-21px;top:-2757px}.docs-icon-tabstop-right{left:0;top:-1515px}.docs-icon-border-all{left:0;top:-1179px}.docs-icon-border-right{left:0;top:-1683px}.docs-icon-border-left{left:-21px;top:-678px}.docs-icon-border-top{left:0;top:-2568px}.docs-icon-border-bottom{left:-21px;top:-822px}.docs-icon-border-outside{left:0;top:-3387px}.docs-icon-border-inside{left:-21px;top:-3345px}.docs-icon-border-none{left:-21px;top:-189px}.docs-icon-border-horizontal{left:0;top:-1305px}.docs-icon-border-vertical{left:-21px;top:-1662px}.docs-icon-merge{left:-21px;top:-3534px}.docs-icon-wrap{left:-21px;top:-4146px}.docs-icon-autofilter{left:0;top:-4272px}.docs-icon-autofilter-filled{left:0;top:-3660px}.docs-icon-insert-function{left:0;top:-1368px}.docs-icon-insert-formula{left:0;top:-3681px}.docs-icon-folder-shared{left:-21px;top:-3240px}.docs-icon-folder-outline{left:0;top:-1200px}.docs-icon-folder-outline-hover{left:-21px;top:-1914px}.docs-icon-folder-outline-pressed{left:0;top:-885px}.docs-icon-folder-solid{left:-21px;top:-573px}.docs-icon-drive{left:0;top:-2334px}.docs-icon-drive-grey{left:0;top:-4125px}.docs-icon-drive-grey-hover{left:-18px;top:-3786px}.docs-icon-drive-grey-pressed{left:0;top:-573px}.docs-icon-drive-hover{left:-21px;top:-2334px}.docs-icon-drive-pressed{left:0;top:-3450px}.docs-icon-drive-large{left:0;top:-3576px}.docs-icon-back{left:0;top:-4293px}.docs-icon-back-rtl{left:0;top:-2547px}.docs-icon-arrow-more{left:-21px;top:-3891px}.docs-icon-arrow-more-rtl{left:0;top:-531px}.docs-icon-search-this-document{left:0;top:-423px}.docs-icon-arrow-dropdown{left:-21px;top:-969px}.docs-icon-word-art{left:-21px;top:-297px}.docs-icon-delete-x{left:0;top:-3891px}.docs-icon-settings{left:-21px;top:-4335px}.docs-icon-drive-large-wrapper{width:42px;height:42px}.docs-icon-plus{left:0;top:-1998px}.docs-icon-plus-white{left:0;top:-2082px}.docs-icon-alert{left:-21px;top:-3408px}.docs-icon-trash{left:-21px;top:-3303px}.docs-icon-locked{left:0;top:-1410px}.docs-icon-unlocked{left:0;top:-1704px}.docs-icon-add-fonts{left:-21px;top:-318px}.docs-icon-enter-compact{left:0;top:-126px}.docs-icon-exit-compact{left:-21px;top:-2967px}.docs-icon-mode-edit{left:-21px;top:-3030px}.docs-icon-mode-review{left:0;top:-468px}.docs-icon-mode-review-white{left:0;top:-255px}.docs-icon-mode-view{left:-21px;top:-1998px}.docs-icon-mode-view-white{left:0;top:-1074px}.docs-icon-chat{left:-21px;top:-2040px}.docs-icon-star{left:0;top:-4188px}.docs-icon-duplicate{left:-21px;top:-1452px}.docs-icon-file{left:0;top:-1452px}.docs-icon-opacity{left:-21px;top:-2694px}.docs-icon-label-slant{left:-21px;top:-1116px}.docs-icon-point-size{left:0;top:-2376px}.docs-icon-question{left:-21px;top:-657px}.docs-icon-vertical-gridlines{left:0;top:-1788px}.docs-icon-left-axis{left:-21px;top:-3765px}.docs-icon-right-axis{left:0;top:-1662px}.docs-icon-left-axis-gridlines{left:0;top:-657px}.docs-icon-right-axis-gridlines{left:-21px;top:-4083px}.docs-icon-reset{left:-21px;top:-1032px}.docs-icon-drag-move{left:0;top:-3555px}.docs-icon-col-dragger{left:-21px;top:-1767px}.docs-icon-chrome-store{left:0;top:-3492px}.docs-icon-fit-area{left:0;top:-3975px}.docs-icon-zoom-out{left:0;top:-2589px}.docs-icon-zoom-tool{left:0;top:-3828px}.docs-icon-download{left:-21px;top:-423px}.docs-icon-fusion-table{left:-21px;top:-3954px}.docs-icon-spreadsheet-sink{left:0;top:-3030px}.docs-icon-send-responses{left:-21px;top:-2145px}.docs-icon-liveform{left:0;top:-3912px}.docs-icon-ellipsis{left:0;top:-3471px}.docs-icon-html-preview{left:-21px;top:-3807px}.docs-icon-grid{left:0;top:-990px}.docs-icon-add-animation{left:0;top:-2484px}.docs-icon-playhead{left:0;top:-2229px}.docs-icon-playhead-rtl{left:0;top:-843px}.docs-icon-unsupported{left:0;top:-1011px}.docs-icon-calendar{left:-21px;top:-3912px}.docs-zippy-closed{left:-21px;top:-1347px}.docs-zippy-open{left:0;top:-2673px}.docs-icon-bookmark{left:-21px;top:-2397px}.docs-icon-heading{left:0;top:-3408px}.docs-icon-file-blue{left:0;top:-2418px}.docs-icon-web-result{left:0;top:-3072px}.docs-icon-mic{left:0;top:-4251px}.docs-icon-paragraph{left:0;top:-339px}.docs-icon-bookmark-black{left:0;top:-147px}.docs-icon-web-result-blue{left:-21px;top:-1011px}.docs-icon-popout{left:0;top:-906px}.docs-icon-checkbox{left:-21px;top:-4062px}.docs-icon-checkbox-type{left:0;top:-3429px}.docs-icon-dropdown-type{left:0;top:-189px}.docs-icon-grid-type{left:-21px;top:-2946px}.docs-icon-image-type{left:0;top:-3240px}.docs-icon-radio-type{left:0;top:-3303px}.docs-icon-scale-type{left:0;top:-2715px}.docs-icon-text-type{left:-21px;top:-2736px}.docs-icon-time-type{left:-21px;top:-552px}.docs-icon-insert-text-block{left:-21px;top:-3681px}.docs-icon-accepting-responses-on{left:0;top:-1347px}.docs-icon-accepting-responses-off{left:0;top:-2505px}.docs-icon-decimal-increase{left:-21px;top:-1536px}.docs-icon-decimal-decrease{left:0;top:-2271px}.docs-icon-settings-white{left:0;top:-1893px}.docs-icon-no-symbol{left:0;top:-1956px}.docs-icon-crop{left:0;top:-2778px}.docs-icon-green-check{left:0;top:-3513px}.docs-icon-font-size{left:0;top:-1032px}.docs-icon-reset-image{left:-21px;top:-3366px}.docs-icon-r-squared{left:0;top:-3933px}.docs-icon-graph-legend{left:0;top:-3849px}.docs-icon-cast{left:0;top:-2019px}.docs-icon-wrap-overflow{left:0;top:-948px}.docs-icon-wrap-wrap{left:-21px;top:-2124px}.docs-icon-wrap-clip{left:0;top:-3639px}.docs-icon-highlights{left:0;top:-3744px}.docs-icon-green-back{left:-21px;top:-2715px}.docs-icon-arrow-back-white{left:0;top:-4017px}.docs-icon-arrow-back-white-rtl{left:0;top:-2439px}.docs-icon-help{left:0;top:-1851px}.docs-icon-highlight-green{left:0;top:-1536px}.docs-icon-explore-black{left:0;top:-1473px}.docs-icon-explore-black-padded{left:0;top:-3114px}.docs-icon-explore-green{left:0;top:-381px}.docs-icon-explore-white{left:0;top:-3534px}.docs-icon-insert-autovis-chart{left:0;top:-2610px}.docs-icon-insert-autovis-chart-white{left:0;top:-297px}.docs-icon-zoom-in{left:-21px;top:-1389px}.docs-icon-thumb-up{left:-21px;top:-339px}.docs-icon-thumb-down{left:-21px;top:-4251px}.docs-icon-dlp-warning{left:-21px;top:-255px}.docs-icon-dogfood{left:0;top:-3786px}.docs-icon-add-to-drive{left:0;top:-21px}.docs-icon-paste-without-formatting{left:0;top:-1158px}.docs-icon-qanda{left:0;top:-3198px}.docs-icon-update-chart{left:0;top:-594px}.docs-icon-arrow-back-dark{left:0;top:-210px}.docs-icon-arrow-back-dark-rtl{left:0;top:-444px}.docs-icon-open-in-external{left:0;top:-234px}.docs-icon-unlink{left:0;top:-276px}.docs-icon-bar-chart{left:0;top:0}.docs-icon-column-chart{left:-21px;top:-2568px}.docs-icon-line-chart{left:-21px;top:-927px}.docs-icon-pie-chart{left:0;top:-717px}.docs-icon-pie-chart-outline{height:24px;left:0;top:-4356px;width:24px}.docs-icon-named-range{left:0;top:-3765px}.docs-icon-clock{left:-21px;top:-843px}.docs-icon-cancel{left:0;top:-1767px}.docs-icon-arrow-line-tool{left:0;top:-168px}.docs-icon-arrow-tilted{left:0;top:-864px}.docs-icon-unsupported-black{left:-21px;top:-3471px}.docs-icon-text-rotation{left:0;top:-1830px}.docs-icon-text-rotation-up{left:0;top:-3009px}.docs-icon-text-rotation-down{left:0;top:-822px}.docs-icon-text-rotation-angleup{left:-21px;top:-1557px}.docs-icon-text-rotation-angledown{left:-21px;top:-1095px}.docs-icon-text-rotation-vertical{left:0;top:-2946px}.docs-icon-text-rotation-none{left:0;top:-2904px}.docs-icon-keep-lightbulb{left:-21px;top:-2610px}.docs-icon-update-table{left:-21px;top:-1179px}.docs-icon-update-slide{left:-21px;top:-2652px}.docs-icon-overflow-three-dots{left:0;top:-969px}.docs-icon-restore{left:-21px;top:-2229px}.docs-icon-paragraph-border-between{left:-21px;top:-3429px}.docs-icon-paragraph-border-bottom{left:-21px;top:-1977px}.docs-icon-paragraph-border-left{left:-21px;top:-615px}.docs-icon-paragraph-border-right{left:-21px;top:-1893px}.docs-icon-paragraph-border-top{left:0;top:-2250px}.docs-icon-diagram-white{left:0;top:-2397px}.docs-icon-drive-black{left:0;top:-3324px}.docs-icon-file-upload{left:-21px;top:-1221px}.docs-icon-photos{left:-21px;top:-4230px}.docs-icon-keyboard{left:-21px;top:-3135px}.docs-icon-dogfood-white{left:0;top:-2040px}.docs-icon-hierarchy{left:0;top:-1263px}.docs-icon-timeline{left:0;top:-1809px}.docs-icon-process{left:-21px;top:-2166px}.docs-icon-transition{left:-21px;top:-699px}.docs-icon-mask{left:-21px;top:-21px}.docs-icon-visibility-off{left:0;top:-2883px}.docs-icon-volume-up{left:0;top:-2652px}.docs-icon-camera{left:-21px;top:-2925px}.docs-icon-pivot-table{left:-21px;top:-2841px}.docs-icon-insert-pivot-table{left:0;top:-2313px}}#googlebar-coldstart{height:28px;line-height:28px;background-color:transparent;padding:0 30px;z-index:1003}.googlebar-coldstart-email-container{background-color:#fff;float:right;height:inherit}.googlebar-coldstart-email{color:#999;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:11px;padding:0 15px}.modal-dialog a{color:#15c}.docs-material #docs-branding-container{margin-top:0;width:64px}.docs-material .docs-branding-icon,.docs-material #docs-branding-container a,.docs-material #docs-branding-logo,.docs-material #docs-drive-logo{height:40px;width:40px}.docs-material #docs-branding-container a,.docs-material #docs-branding-container .docs-branding-logo-no-link{border-radius:50%;margin:4px 0 4px 8px;padding:8px}.docs-material #docs-branding-container a:focus{background-color:rgba(0,0,0,.06);outline:none}.docs-material #docs-menubar,.docs-material #docs-titlebar-container{margin-left:64px}.docs-material .docs-title-outer{margin-left:0}.docs-material #docs-folder:not(.docs-titlebar-badge){margin-top:1px}.docs-material #docs-branding-container{background-color:inherit}.docs-material .docs-branding-icon-img:before{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222.svg)}.docs-material .docs-branding-icon-documents{left:0;top:-6079px}.docs-material .docs-branding-icon-drawings{left:-20px;top:-4336px}.docs-material .docs-branding-icon-default,.docs-material .docs-branding-icon-forms,.docs-material .docs-branding-icon-scripts,.docs-material .docs-branding-icon-drive{left:-20px;top:-5353px}.docs-material .docs-branding-icon-spreadsheets{left:0;top:-1910px}.docs-material .docs-branding-icon-presentations{left:-20px;top:-5475px}.docs-material #docs-branding-container:not(.docs-branding-crossfade-transition-disabled):hover #docs-drive-logo{opacity:0}.docs-material #docs-branding-container:not(.docs-branding-crossfade-transition-disabled):hover #docs-branding-logo{opacity:1}.docs-material #docs-activity-indicator{padding-top:3px}.docs-material .docs-titlebar-badges .jfk-activityIndicator{vertical-align:top}.docs-material #docs-header #docs-titlebar{padding-top:9px}.docs-material #docs-header.docs-hub-appbar #docs-titlebar{padding-top:calc((56px - 24px)/2 - 2px)}.docs-material #docs-header #docs-titlebar-container{max-height:33px}.docs-material #docs-header.docs-hub-appbar #docs-titlebar-container{margin-left:0;max-height:none}.docs-material .docs-menubar{height:31px}.docs-material #docs-branding-container,.docs-material #docs-chrome-cover{height:64px}.docs-material .docs-appbar-circle-button.jfk-button{box-shadow:none;background-color:transparent;background-image:none;cursor:pointer;height:40px;width:40px;border-radius:50%;border-width:1px;border-style:solid;border-color:transparent;box-shadow:none;background-clip:padding-box;cursor:pointer;-webkit-tap-highlight-color:transparent;min-width:0;padding:0;margin:0 9px 0 0}.docs-material .docs-appbar-circle-button.jfk-button .docs-icon{height:24px;width:24px;opacity:0.54}.docs-gm .docs-material .docs-appbar-circle-button.jfk-button .docs-icon{opacity:1}.docs-material .docs-appbar-circle-button.jfk-button-hover,.docs-material .docs-appbar-circle-button.jfk-button:focus{background-color:rgba(0,0,0,.06)}.docs-material .docs-appbar-circle-button.jfk-button-active,.docs-material .docs-appbar-circle-button.jfk-button-checked{background-color:rgba(0,0,0,0.12)}.docs-gm .docs-material .docs-appbar-circle-button.jfk-button-active,.docs-gm .docs-material .docs-appbar-circle-button.jfk-button-checked{background-color:#e6f4ea}.docs-material .docs-appbar-circle-button.jfk-button-active .docs-icon,.docs-material .docs-appbar-circle-button.jfk-button-checked .docs-icon{opacity:0.87}.docs-gm .docs-material .docs-appbar-circle-button.jfk-button-active .docs-icon,.docs-gm .docs-material .docs-appbar-circle-button.jfk-button-checked .docs-icon{opacity:1}.docs-material .docs-appbar-circle-button.jfk-button-disabled .docs-icon{opacity:.26}.docs-gm .docs-material .docs-appbar-circle-button.jfk-button-disabled .docs-icon{opacity:.38}.docs-material .docs-appbar-circle-button.jfk-button-disabled{cursor:inherit}.docs-material .docs-chat.jfk-button{display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;transition:background 0.2s 0.1s;background-color:#e8eaed;background-image:none}.docs-gm .docs-material .docs-chat.jfk-button,.docs-gm .docs-material .docs-chat.jfk-button.jfk-button-clear-outline,.docs-gm .docs-material .docs-chat.jfk-button.jfk-button-active.jfk-button-focused{background-color:#fff;border:2px solid #dadce0;box-shadow:0 0 0 2px #fff}.docs-gm .docs-material .docs-chat.jfk-button.jfk-button-focused{background-color:#fff}.docs-material .docs-chat.jfk-button,.docs-material .docs-chat.jfk-button.jfk-button-clear-outline,.docs-material .docs-chat.jfk-button.jfk-button-active.jfk-button-focused{height:32px;width:32px;border-radius:50%;border-width:2px;border-style:solid;border-color:#fff;box-shadow:none;background-clip:padding-box;cursor:pointer;-webkit-tap-highlight-color:transparent;margin:0 0 0 -8px}.docs-material .docs-chat.jfk-button.jfk-button-hover{background-color:#dadce0}.docs-gm .docs-material .docs-chat.jfk-button.jfk-button-hover,.docs-gm .docs-material .docs-chat.jfk-button.jfk-button-hover.jfk-button-clear-outline,.docs-gm .docs-material .docs-chat.jfk-button.jfk-button-hover.jfk-button-focused{background-color:#dadce0}.docs-gm .docs-material .docs-chat.jfk-button.jfk-button-hover.jfk-button-clear-outline.jfk-button-focused.jfk-button-active{margin:0 0 0 -8px}.docs-material .docs-chat.jfk-button.jfk-button-active{background-color:#bdc1c6}.docs-material .docs-chat.jfk-button.jfk-button-focused{border:4px solid rgba(0,0,0,0.12);margin:-2px -2px -2px -10px}.docs-gm .docs-material .docs-chat.jfk-button.jfk-button-focused{border:4px solid rgba(0,0,0,0.12);margin:-2px -2px -2px -10px;box-shadow:none}.docs-material .docs-chat.jfk-button .docs-icon{-webkit-transition-duration:200ms;-moz-transition-duration:200ms;-o-transition-duration:200ms;transition-duration:200ms;-webkit-transition-property:opacity;-moz-transition-property:opacity;-o-transition-property:opacity;transition-property:opacity;-webkit-transition-timing-function:cubic-bezier(0.4,0.0,0.2,1);-moz-transition-timing-function:cubic-bezier(0.4,0.0,0.2,1);-o-transition-timing-function:cubic-bezier(0.4,0.0,0.2,1);transition-timing-function:cubic-bezier(0.4,0.0,0.2,1);opacity:.71;margin:0}.docs-material .docs-chat.jfk-button.jfk-button-active .docs-icon,.docs-material .docs-chat.jfk-button.jfk-button-checked .docs-icon,.docs-material .docs-chat.jfk-button.jfk-button-focused .docs-icon,.docs-material .docs-chat.jfk-button.jfk-button-hover .docs-icon{opacity:.86}.docs-material .docs-chat.jfk-button.jfk-button-disabled .docs-icon{opacity:0.50}.docs-material .docs-chat-badge{border-radius:50%;border:1px solid #fff;right:-3px;top:-3px}.docs-gm .docs-explore-feedback-title,.docs-gm .docs-explore-feedback-button{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px}.docs-gm .docs-explore-sidebar-title-heading,.docs-gm .docs-explore-sidebar-title-heading-button{font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:16px;font-weight:500;line-height:24px;position:relative;left:auto;height:auto;max-width:calc(100% - 64px);padding:0;right:auto;top:auto}.docs-gm .docs-explore-sidebar-title-heading-button{font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:16px}.docs-gm .docs-explore-serp-webresultscard-header-text,.docs-gm .docs-explore-serp-webresultscard-allresults-text{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px}.docs-gm .docs-explore-serp-enterpriseresultscard-allresults-text{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px}.docs-gm .docs-explore-serp-enterpriseresult-embeddeditems-show-more-button{font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500}.docs-gm .docs-explore-serp-enterpriseresult-snippet{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px}.docs-gm .docs-explore-serp-enterpriseresult-title{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px}.docs-gm .docs-explore-searchbar-labelinput{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px}.docs-gm .docs-explore-card-title-heading{color:#3c4043;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;line-height:24px;text-transform:none}.docs-gm .docs-explore-card-more-button{color:#1a73e8;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;line-height:20px}.docs-gm .docs-explore-card-subtitle{color:#80868b;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;line-height:16px}.docs-material.goog-menu.goog-menu-nocheckbox .goog-menuitem,.docs-material.goog-menu.goog-menu-noicon .goog-menuitem{padding-left:16px}.docs-material.goog-menu .goog-menuitem{padding-left:36px}.docs-material.goog-menu .apps-menuitem .goog-menuitem-checkbox,.docs-material.goog-menu .apps-menuitem .goog-menuitem-icon{left:8px}.docs-material.goog-menu .apps-menuitem.goog-option-selected{background-position:left 5px center}.docs-gm .docs-material.goog-menu .apps-menuitem.goog-option-selected{background-image:none}.docs-gm .docs-material.goog-menu .apps-menuitem.goog-option-selected .goog-menuitem-checkbox{background:no-repeat url(//ssl.gstatic.com/docs/common/material_common_sprite222.svg) -40px -614px;height:18px;width:18px;top:50%;margin-top:-9px}.docs-gm .docs-menubar .goog-control{border:1px solid transparent;border-radius:4px;box-shadow:none;color:#202124;cursor:pointer;font-size:14px;letter-spacing:.2px;padding:4px 6px}.docs-gm .docs-menubar .goog-control-hover{background-color:#f1f3f4}.docs-gm .docs-menubar .goog-control-open{background-color:#e6f4ea}.docs-gm .docs-menubar .goog-control-active,.docs-gm .docs-menubar .goog-control:hover:active{background-color:#ceead6}.docs-gm .docs-menubar .goog-control-disabled{color:#9aa0a6;background-color:white;cursor:default}.docs-gm .docs-menubar .docs-menu-button-open-below,.docs-gm .docs-menubar .docs-menu-button-open-above{z-index:1003}.docs-gm .docs-menubar .goog-control.docs-menu-button-open-below{border-bottom-left-radius:0;border-bottom-right-radius:0}.docs-gm .goog-menu.docs-menu-attached-button-above{border-top-left-radius:0}.docs-gm .goog-menu.docs-menu-attached-button-below{border-bottom-left-radius:0}.docs-gm .goog-menu{border:1px solid transparent;border-radius:4px;box-shadow:0 2px 6px 2px rgba(60,64,67,.15);max-height:calc(100vh - 70px);overflow-y:auto}.docs-gm .goog-menu .goog-dimension-picker,.docs-gm .goog-menu.docs-fontmenu{overflow:hidden}.docs-gm .goog-menu.docs-omnibox-parent,.docs-gm .goog-menu.docs-ruler-context-menu{overflow:visible}.docs-gm .docs-fontmenu{max-height:none;max-height:unset}.docs-gm .goog-menuseparator{border-top:1px solid #dadce0;margin:8px 0 8px 36px}.docs-gm .docs-colormenuitems .goog-menuseparator,.docs-gm .waffle-conditionalformat-default-menu .goog-menuseparator{margin-left:0}.docs-gm .goog-menu-noicon .goog-menuseparator{margin-left:13px}.docs-gm .goog-menuitem{color:#202124;font-size:14px;letter-spacing:.2px;line-height:20px}.docs-gm .goog-menu .goog-menuitem{padding:6px 15px 6px 38px}.docs-gm .goog-menu-noicon .goog-menuitem{padding-left:15px}.docs-gm .goog-menu .apps-menuitem .goog-menuitem-checkbox,.docs-gm .goog-menu .apps-menuitem .goog-menuitem-icon{margin:7px 8px 7px 12px;left:0;top:0}.docs-gm .goog-menuitem .goog-menuitem-content{min-height:20px}.docs-gm .goog-menuitem .goog-submenu-arrow{padding-top:0}.docs-gm .goog-menuitem .docs-toolbar-mode-switcher-menu-description,.docs-gm .goog-menuitem .docs-display-density-toolbar-menuitem-description,.docs-gm .goog-menuitem .punch-qanda-presenter-view-menu-item-description{color:#80868b;font-size:12px;line-height:1}.docs-gm .goog-menuitem-highlight{background-color:#f1f3f4}.docs-gm .goog-menuitem.goog-menuitem-highlight{border-color:#f1f3f4;border-style:dotted;border-width:1px 0;padding-top:5px;padding-bottom:5px}.docs-gm .apps-menuitem.goog-menuitem-highlight{border:none;padding-top:6px;padding-bottom:6px}.docs-gm .docs-submenuitem.goog-menuitem{padding-bottom:0;padding-right:10px;padding-top:0}.docs-gm .docs-fontmenu .goog-menuitem{padding-bottom:6px;padding-right:48px;padding-top:6px}.docs-gm .docs-submenuitem.goog-menuitem-highlight{border:none;border-bottom:1px solid #e6e6e6}.docs-gm .docs-fontmenu .goog-menuitem-highlight{border:none}.docs-gm .goog-menuitem-disabled,.docs-gm .goog-menuitem-disabled .goog-menuitem-content{color:#9aa0a6!important}.docs-gm .goog-menuitem-active:hover:active{background-color:#e8eaed}.docs-gm .goog-menuitem-accel,.docs-gm .goog-menuitem-disabled .goog-menuitem-accel{color:#80868b;font-weight:500}.docs-gm .docs-ruler-context-menu-arrow-before{border:0}.docs-gm .docs-omnibox-autocomplete .goog-menuitem-icon{top:auto}.docs-material #docs-presence-container{display:flex;-webkit-align-items:center;align-items:center;height:36px;margin:0 8px 0 0}.docs-material .docs-presence-plus-widget{display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-end;justify-content:flex-end}.docs-material .docs-presence-plus-widget-open .docs-presence-plus-widget-status{display:none}.docs-material .docs-presence-plus-widget-collabs{height:36px}.docs-material .docs-presence-plus-collab-widget-container{margin:0 0 0 -8px;overflow:visible;height:auto;width:auto}.docs-material .docs-presence-plus-collab-widget{display:flex}.docs-material .docs-presence-plus-collab-widget-color-block,.docs-material.docs-presence-plus-widget-overflow-menu .docs-presence-plus-collab-widget-color-block{height:32px;width:32px;border-radius:50%;border-width:2px;border-style:solid;border-color:#fff;box-shadow:none;background-clip:padding-box;cursor:pointer;-webkit-tap-highlight-color:transparent;background-color:#fff;opacity:1;overflow:visible}.docs-material .docs-presence-plus-collab-widget-image-container,.docs-material.docs-presence-plus-widget-overflow-menu .docs-presence-plus-collab-widget-image-container{height:32px;width:32px;border-radius:50%;padding:0;overflow:visible;display:inline-block;opacity:.5;box-shadow:0 0 1px 0 white}.docs-material .docs-presence-plus-collab-widget-active .docs-presence-plus-collab-widget-image-container{opacity:1}.docs-material .docs-presence-plus-collab-widget-image-border,.docs-material.docs-presence-plus-widget-overflow-menu .docs-presence-plus-collab-widget-image-border{height:28px;width:28px;border-radius:50%;margin:2px;border:none}.docs-material .docs-presence-plus-collab-widget-image,.docs-material.docs-presence-plus-widget-overflow-menu .docs-presence-plus-collab-widget-image{height:28px;width:28px;border-radius:50%;padding:0;left:0}.docs-material .docs-presence-plus-collab-widget-focus:focus{outline:none}.docs-material .docs-presence-plus-collab-widget-focus:focus .docs-presence-plus-collab-widget-color-block{border:4px solid rgba(0,0,0,0.12);margin:-2px}.docs-material .docs-presence-plus-widget-overflow-button{height:32px;width:32px;border-radius:50%;border-width:2px;border-style:solid;border-color:#fff;box-shadow:none;background-clip:padding-box;cursor:pointer;-webkit-tap-highlight-color:transparent;margin:0 0 0 -8px;background-color:#e8eaed;background-image:none;color:rgba(32,33,36,.71)}.docs-material .docs-hub-appbar .docs-presence-plus-widget-overflow-button{height:28px;width:28px;border-radius:50%;border-width:2px;border-style:solid;border-color:#fff;box-shadow:none;background-clip:padding-box;cursor:pointer;-webkit-tap-highlight-color:transparent}.docs-material .docs-hub-appbar .docs-presence-plus-widget-overflow-button .goog-flat-menu-button-caption{line-height:28px}.docs-material .docs-presence-plus-widget-overflow-button.goog-flat-menu-button-focused{border:4px solid rgba(0,0,0,0.12);color:rgba(32,33,36,.86);margin:-2px -2px -2px -10px}.docs-material .docs-presence-plus-widget-overflow-button.goog-flat-menu-button-focused.goog-flat-menu-button-open{border:2px solid rgba(255,255,255,1);margin:0 0 0 -8px}.docs-material .docs-presence-plus-widget-overflow-button.goog-flat-menu-button-open{background-color:#e8eaed;z-index:auto}.docs-material .docs-presence-plus-widget-overflow-button.goog-flat-menu-button-hover{box-shadow:none;background-color:#dadce0;color:rgba(32,33,36,.86)}.docs-material .docs-presence-plus-widget-overflow-button.goog-flat-menu-button-active{background-color:#bdc1c6;color:rgba(32,33,36,.86)}.docs-material .docs-presence-plus-widget-overflow-button.goog-flat-menu-button-open .goog-flat-menu-button-caption{-webkit-transition-duration:200ms;-moz-transition-duration:200ms;-o-transition-duration:200ms;transition-duration:200ms;-webkit-transition-property:opacity;-moz-transition-property:opacity;-o-transition-property:opacity;transition-property:opacity;-webkit-transition-timing-function:cubic-bezier(0.4,0.0,0.2,1);-moz-transition-timing-function:cubic-bezier(0.4,0.0,0.2,1);-o-transition-timing-function:cubic-bezier(0.4,0.0,0.2,1);transition-timing-function:cubic-bezier(0.4,0.0,0.2,1);-webkit-transition-delay:100ms;-moz-transition-delay:100ms;-o-transition-delay:100ms;transition-delay:100ms;opacity:0}.docs-material .docs-presence-plus-widget-overflow-button.goog-flat-menu-button-open .goog-flat-menu-button-dropdown{-webkit-transition-duration:200ms;-moz-transition-duration:200ms;-o-transition-duration:200ms;transition-duration:200ms;-webkit-transition-property:opacity;-moz-transition-property:opacity;-o-transition-property:opacity;transition-property:opacity;-webkit-transition-timing-function:cubic-bezier(0.4,0.0,0.2,1);-moz-transition-timing-function:cubic-bezier(0.4,0.0,0.2,1);-o-transition-timing-function:cubic-bezier(0.4,0.0,0.2,1);transition-timing-function:cubic-bezier(0.4,0.0,0.2,1);-webkit-transition-delay:100ms;-moz-transition-delay:100ms;-o-transition-delay:100ms;transition-delay:100ms;opacity:1}.docs-material .docs-presence-plus-widget-overflow-button .goog-flat-menu-button-caption{-webkit-transition-duration:200ms;-moz-transition-duration:200ms;-o-transition-duration:200ms;transition-duration:200ms;-webkit-transition-property:opacity;-moz-transition-property:opacity;-o-transition-property:opacity;transition-property:opacity;-webkit-transition-timing-function:cubic-bezier(0.4,0.0,0.2,1);-moz-transition-timing-function:cubic-bezier(0.4,0.0,0.2,1);-o-transition-timing-function:cubic-bezier(0.4,0.0,0.2,1);transition-timing-function:cubic-bezier(0.4,0.0,0.2,1);left:-2px;line-height:32px;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:500}.docs-material .docs-presence-plus-widget-overflow-button .goog-flat-menu-button-dropdown{-webkit-transition-duration:200ms;-moz-transition-duration:200ms;-o-transition-duration:200ms;transition-duration:200ms;-webkit-transition-property:opacity;-moz-transition-property:opacity;-o-transition-property:opacity;transition-property:opacity;-webkit-transition-timing-function:cubic-bezier(0.4,0.0,0.2,1);-moz-transition-timing-function:cubic-bezier(0.4,0.0,0.2,1);-o-transition-timing-function:cubic-bezier(0.4,0.0,0.2,1);transition-timing-function:cubic-bezier(0.4,0.0,0.2,1);right:10px;opacity:0;border-width:0 6px 6px;border-color:rgba(32,33,36,.71) transparent}.docs-material .docs-presence-plus-widget-overflow-button.goog-flat-menu-button-active .goog-flat-menu-button-dropdown,.docs-material .docs-presence-plus-widget-overflow-button.goog-flat-menu-button-focused .goog-flat-menu-button-dropdown,.docs-material .docs-presence-plus-widget-overflow-button.goog-flat-menu-button-hover .goog-flat-menu-button-dropdown{border-color:rgba(32,33,36,.86) transparent}.docs-material.docs-presence-plus-widget-overflow-menu{max-height:340px;width:256px;padding:4px 0 8px 0;border-radius:2px;box-shadow:0px 2px 2px 0px rgba(0,0,0,0.14),0px 3px 1px -2px rgba(0,0,0,0.12),0px 1px 5px 0px rgba(0,0,0,0.2)}.docs-material.docs-presence-plus-widget-overflow-menu .goog-menuheader{display:flex;-webkit-align-items:center;align-items:center;margin-left:16px;height:40px;color:rgba(0,0,0,0.54);font-weight:500}.docs-material.docs-presence-plus-widget-overflow-menu .docs-presence-plus-collab-widget-container{margin:0;height:48px;width:100%}.docs-material.docs-presence-plus-widget-overflow-menu .docs-presence-plus-collab-widget-color-block{margin:0 16px 0;border:none}.docs-material.docs-presence-plus-widget-overflow-menu .docs-presence-plus-collab-widget{display:flex;-webkit-align-items:center;align-items:center;height:48px}.docs-material.docs-presence-plus-widget-overflow-menu .docs-presence-plus-collab-widget-name{color:rgba(0,0,0,0.87);margin:0}.docs-material.docs-presence-plus-widget-overflow-menu .docs-presence-plus-collab-widget-idle-text{color:rgba(0,0,0,0.54);margin-left:6px;font-size:13px}@keyframes material-collab-join{from{opacity:0}to{opacity:1}}@-webkit-keyframes material-collab-join{from{opacity:0}to{opacity:1}}.docs-material .docs-presence-plus-collab-widget-enter-material{-webkit-animation-name:material-collab-join;-moz-animation-name:material-collab-join;-o-animation-name:material-collab-join;animation-name:material-collab-join;-webkit-animation-timing-function:cubic-bezier(0,0,.2,1);-moz-animation-timing-function:cubic-bezier(0,0,.2,1);-o-animation-timing-function:cubic-bezier(0,0,.2,1);animation-timing-function:cubic-bezier(0,0,.2,1);-webkit-animation-duration:200ms;-moz-animation-duration:200ms;-o-animation-duration:200ms;animation-duration:200ms;-webkit-animation-fill-mode:both;animation-fill-mode:both}.docs-material .docs-presence-plus-collab-widget-exit-material{-webkit-animation-name:material-collab-join;-moz-animation-name:material-collab-join;-o-animation-name:material-collab-join;animation-name:material-collab-join;-webkit-animation-direction:reverse;-moz-animation-direction:reverse;-o-animation-direction:reverse;animation-direction:reverse;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);-moz-animation-timing-function:cubic-bezier(.4,0,.2,1);-o-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-duration:200ms;-moz-animation-duration:200ms;-o-animation-duration:200ms;animation-duration:200ms;-webkit-animation-fill-mode:both;animation-fill-mode:both}.docs-gm .docs-title-input:focus{border:2px solid #1a73e8!important;margin:-1px;box-shadow:none;border-radius:4px!important}.docs-material .docs-titlebar-button{display:inline-flex;align-items:center;justify-content:center}.docs-revisions-sidebar .docs-revisions-sidebar-title{height:64px}.docs-material .docs-debug-container{margin-right:16px}.docs-material #docs-docos-commentsbutton{box-shadow:none;background-color:transparent;background-image:none;cursor:pointer;height:40px;width:40px;border-radius:50%;border-width:1px;border-style:solid;border-color:transparent;box-shadow:none;background-clip:padding-box;cursor:pointer;-webkit-tap-highlight-color:transparent;min-width:0;padding:0;margin:0 9px 0 0}.docs-material #docs-docos-commentsbutton.jfk-button.jfk-button-hover,.docs-material #docs-docos-commentsbutton:focus{background-color:rgba(0,0,0,.06)}.docs-material #docs-docos-commentsbutton.jfk-button.jfk-button-active,.docs-material #docs-docos-commentsbutton.jfk-button.jfk-button-checked{background-color:rgba(0,0,0,0.12)}.docs-gm .docs-material #docs-docos-commentsbutton.jfk-button.jfk-button-active,.docs-gm .docs-material #docs-docos-commentsbutton.jfk-button.jfk-button-checked{background-color:#e6f4ea}.docs-material #docs-docos-commentsbutton .docs-icon{height:24px;width:24px;opacity:0.54}.docs-material #docs-docos-commentsbutton.jfk-button.jfk-button-active .docs-icon,.docs-material #docs-docos-commentsbutton.jfk-button.jfk-button-checked .docs-icon{opacity:0.87}.docs-material #docs-docos-commentsbutton.jfk-button.jfk-button-disabled .docs-icon{opacity:.26}.docs-gm .docs-material #docs-docos-commentsbutton .docs-icon{opacity:1}.docs-gm .docs-material #docs-docos-commentsbutton.jfk-button.jfk-button-active .docs-icon,.docs-gm .docs-material #docs-docos-commentsbutton.jfk-button.jfk-button-checked .docs-icon{opacity:1}.docs-gm .docs-material #docs-docos-commentsbutton.jfk-button.jfk-button-disabled .docs-icon{opacity:.38}.docs-material #docs-docos-commentsbutton.jfk-button.jfk-button-disabled,.docs-material #docs-titlebar-share-client-button .jfk-button.jfk-button-disabled,.docs-material #docs-script-button-bar .jfk-button.jfk-button-disabled{cursor:inherit}.docs-material #docs-docos-commentsbutton .docs-docos-commentsbutton-badge{background-color:#1a73e8;border:1.5px solid white;border-radius:50%;height:10px;left:22px;position:absolute;top:4px;width:10px;z-index:inherit}.docs-material #docs-titlebar-share-client-button .jfk-button{box-shadow:none;background-color:#4285f4;background-image:none;cursor:pointer;border-color:transparent!important;border-radius:2px;border-width:1px;border-style:inset;color:#fff;font-size:13px;height:30px;padding:0 14px;text-transform:uppercase;font-size:var(--docs-material-font-size-normal,13px);margin-right:12px;padding:0 7px;min-width:0}.docs-material #docs-titlebar-share-client-button .jfk-button-disabled{background-color:rgba(0,0,0,0.12);opacity:1}.docs-material #docs-titlebar-share-client-button .jfk-button .scb-button-icon{margin:0 3px 0 -4px}.docs-material #docs-titlebar-share-client-button .jfk-button:focus{border-color:rgba(0,0,0,0.38)!important}.docs-material #docs-titlebar-share-client-button .jfk-button.jfk-button-hover{box-shadow:0px 2px 2px 0px rgba(0,0,0,0.14),0px 3px 1px -2px rgba(0,0,0,0.12),0px 1px 5px 0px rgba(0,0,0,0.2)}.docs-material #docs-header.docs-hub-appbar #docs-titlebar-share-client-button .jfk-button{padding-left:16px;padding-right:16px}.docs-material #docs-header.docs-hub-appbar #docs-titlebar-share-client-button .jfk-button.jfk-button-hover{height:28px}.docs-material #docs-titlebar-share-client-button .jfk-button.jfk-button-active,.docs-material #docs-titlebar-share-client-button .jfk-button.jfk-button-checked{box-shadow:0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12),0px 2px 4px -1px rgba(0,0,0,0.2);background-color:#3367d6}.docs-material #docs-script-button-bar .jfk-button{box-shadow:none;background-color:rgba(0,0,0,.04);background-image:none;cursor:pointer;border-color:transparent!important;border-radius:2px;border-width:1px;border-style:inset;color:rgba(0,0,0,0.54);font-size:13px;height:30px;padding:0 14px;text-transform:uppercase;margin-right:8px}.docs-material #docs-script-button-bar .jfk-button.jfk-button-disabled{background-color:#fff;color:rgba(0,0,0,0.26)}.docs-material #docs-script-button-bar .jfk-button:focus{border-color:#4285f4!important;color:rgba(0,0,0,.60)}.docs-material #docs-script-button-bar .jfk-button.jfk-button-hover{box-shadow:0px 2px 2px 0px rgba(0,0,0,0.14),0px 3px 1px -2px rgba(0,0,0,0.12),0px 1px 5px 0px rgba(0,0,0,0.2);color:rgba(0,0,0,.60)}.docs-material #docs-script-button-bar .jfk-button.jfk-button-active,.docs-material #docs-script-button-bar .jfk-button.jfk-button-checked{box-shadow:0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12),0px 2px 4px -1px rgba(0,0,0,0.2);background-color:rgba(0,0,0,0.12);color:rgba(0,0,0,0.87)}.docs-material #docs-titlebar-share-client-button .jfk-button.jfk-button-clear-outline,.docs-material #docs-script-button-bar .jfk-button.jfk-button-clear-outline{border-color:transparent!important}#docs-docos-caret{display:none}.docs-material .docs-docos-activitybox{top:60px}.docs-material #docs-header .docs-titlebar-buttons{align-items:center;background-color:#fff;display:flex;height:64px;padding:0 12px 0 16px;top:0;z-index:900}.docs-material #docs-header.docs-hub-appbar .docs-titlebar-buttons{background-color:transparent;height:56px}.docs-material #docs-header .docs-titlebar-buttons.docs-titlebar-occluding::before{background:linear-gradient(to right,transparent,rgba(60,64,67,.1) 70%,rgba(60,64,67,.2) 100%);content:'';height:100%;left:-6px;position:absolute;width:6px;top:0}.docs-material #docs-header .docs-titlebar-buttons-rtl.docs-titlebar-occluding::before{background:linear-gradient(to left,transparent,rgba(60,64,67,.1) 70%,rgba(60,64,67,.2) 100%)}.docs-material #docs-header .docs-titlebar-buttons #docs-titlebar-edit-buttons{display:inherit;align-items:inherit}.docs-material .docs-titlebar-buttons .onegoogle-material-minibar{text-align:left}.docs-material #googlebar-coldstart{height:32px;width:32px;border-radius:50%;background-color:#0f9d58;margin:0 8px 0 0;padding:0;z-index:auto}.docs-material #googlebar-coldstart .docs-icon-img{opacity:0.54}.docs-gm .docs-title-untitled{font-style:normal}.docs-gm #docs-titlebar-share-client-button .jfk-button{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;padding:9px 16px 10px 12px;text-transform:capitalize}.docs-gm #docs-titlebar-share-client-button .jfk-button-disabled{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#f1f3f4;color:#3c4043;opacity:0.38;padding:9px 16px 10px 12px}.docs-gm #docs-titlebar-share-client-button .jfk-button .scb-button-icon{margin:0 3px 0 -4px}.docs-gm #docs-titlebar-share-client-button .jfk-button:focus{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#4f9e67;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15);padding:9px 16px 10px 12px;border-color:transparent!important}.docs-gm #docs-titlebar-share-client-button .jfk-button.jfk-button-hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#2a8947;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15);padding:9px 16px 10px 12px}.docs-gm #docs-titlebar-share-client-button .jfk-button.jfk-button-hover:focus{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#62a877;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15);padding:9px 16px 10px 12px}.docs-gm #docs-titlebar-share-client-button .jfk-button.jfk-button-active,.docs-gm #docs-titlebar-share-client-button .jfk-button.jfk-button-checked{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#62a877;box-shadow:0 2px 6px 2px rgba(52,168,83,0.15);padding:9px 16px 10px 12px}.docs-gm #docs-titlebar-share-client-button .decoupled-docs-share-button.docs-titlebar-button.jfk-button{padding:9px 16px 10px 16px}.docs-material #docs-recall-titlebar-search-menu-container{align-self:flex-start;margin:12px 16px 0px 16px}.docs-material .docs-title-bar-find-icon-container{height:24px;width:24px}.goog-toolbar-button,.goog-toolbar-menu-button{-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;background:0;border-color:transparent;border-style:solid;border-width:1px;outline:none;padding:0;height:24px;color:#333;line-height:24px;list-style:none;font-size:11px;font-weight:bold;text-decoration:none;vertical-align:middle;cursor:default}.goog-toolbar-button-outer-box,.goog-toolbar-button-inner-box .goog-toolbar-menu-button-outer-box,.goog-toolbar-menu-button-inner-box{border:0;vertical-align:top}.goog-toolbar-button-outer-box,.goog-toolbar-menu-button-outer-box{margin:0;padding:0}.goog-toolbar-button-inner-box,.goog-toolbar-menu-button-inner-box{padding:0 2px}.goog-toolbar-button-hover,.goog-toolbar-button-active,.goog-toolbar-button-checked,.goog-toolbar-button-selected{color:#222;padding:0}.goog-toolbar-button-hover,.goog-toolbar-menu-button-hover{border-color:#c6c6c6!important;color:#222}.goog-toolbar-menu-button-open{color:#222}.goog-toolbar-button-hover,.goog-toolbar-menu-button-hover{-webkit-box-shadow:0 1px 1px rgba(0,0,0,.1);-moz-box-shadow:0 1px 1px rgba(0,0,0,.1);box-shadow:0 1px 1px rgba(0,0,0,.1);background-color:#f8f8f8;background-image:-webkit-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-moz-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-ms-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-o-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:linear-gradient(top,#f8f8f8,#f1f1f1)}.goog-toolbar-button-active,.goog-toolbar-menu-button-active{-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1);background-color:#f6f6f6;background-image:-webkit-linear-gradient(top,#f6f6f6,#f1f1f1);background-image:-moz-linear-gradient(top,#f6f6f6,#f1f1f1);background-image:-ms-linear-gradient(top,#f6f6f6,#f1f1f1);background-image:-o-linear-gradient(top,#f6f6f6,#f1f1f1);background-image:linear-gradient(top,#f6f6f6,#f1f1f1);border-color:#c6c6c6}.goog-toolbar-button-selected,.goog-toolbar-button-checked,.goog-toolbar-menu-button-open{-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1);background-color:#eee;background-image:-webkit-linear-gradient(top,#eee,#e0e0e0);background-image:-moz-linear-gradient(top,#eee,#e0e0e0);background-image:-ms-linear-gradient(top,#eee,#e0e0e0);background-image:-o-linear-gradient(top,#eee,#e0e0e0);background-image:linear-gradient(top,#eee,#e0e0e0);border-color:#ccc}.goog-toolbar-button-disabled,.goog-toolbar-menu-button-disabled{color:#222!important;opacity:0.3;filter:alpha(opacity=30)}.goog-toolbar-button-collapse-right,.goog-toolbar-button-collapse-right .goog-toolbar-button-outer-box,.goog-toolbar-button-collapse-right .goog-toolbar-button-inner-box{margin-right:0}.goog-toolbar-button-collapse-left,.goog-toolbar-button-collapse-left .goog-toolbar-button-outer-box,.goog-toolbar-button-collapse-left .goog-toolbar-button-inner-box{margin-left:0}.goog-toolbar-menu-button-dropdown{background:url(//ssl.gstatic.com/ui/v1/disclosure/small-grey-disclosure-arrow-down.png) center no-repeat;float:right;margin:10px 2px 0 3px;padding:0;opacity:.8;vertical-align:middle;width:5px;height:7px;*float:none;*position:relative;*top:-3px}.goog-toolbar-separator{border-left:1px solid #ccc;height:17px;line-height:normal;list-style:none;margin:0 2px;outline:none;overflow:hidden;padding:0;text-decoration:none;vertical-align:middle;width:0}.goog-toolbar-select .goog-toolbar-menu-button-dropdown{background:url(//ssl.gstatic.com/ui/v1/disclosure/small-grey-disclosure-arrow-down.png) center no-repeat;height:11px;margin-top:7px;width:7px;-webkit-transform:none;-moz-transform:none;transform:none;filter:none}.goog-toolbar-menu-button-caption{padding:0;margin:0}.docs-material #docs-toolbar-wrapper{border-top:1px solid #e0e0e0;border-bottom:1px solid #e0e0e0;background:#fff;box-shadow:none}.docs-gm #docs-toolbar-wrapper{border-top:1px solid #dadce0;border-bottom:1px solid #dadce0}.docs-material #docs-side-toolbar{margin:0 21px 0 0}.docs-material.companion-enabled #docs-side-toolbar{margin:0 4px 0 0}.docs-material #docs-toolbar-wrapper,.docs-material #docs-equationtoolbar,.docs-material .docs-printpreview-toolbar,.docs-material #docs-header.docs-hub-appbar #docs-titlebar-container{padding:0 21px 0 22px}.docs-material #docs-header.docs-hub-appbar #docs-titlebar-container{padding-left:24px}.docs-material #docs-equationtoolbar,.docs-material .docs-printpreview-toolbar{background:#fff}.docs-material #docs-equationtoolbar{border-top-width:0;border-bottom:1px solid #e0e0e0}.docs-material.companion-enabled #docs-equationtoolbar{padding-right:4px}.docs-gm #docs-equationtoolbar .goog-toolbar-menu-button-inner-box{padding-top:0}.docs-gm #docs-equationtoolbar .goog-toolbar-menu-button-caption{padding-top:2px}#hide-equation-toolbar-button{float:right}.docs-gm #docs-omnibox-toolbar .docs-omnibox-input{height:26px}.docs-gm #docs-omnibox-toolbar .docs-omnibox-autocomplete{margin:6px 4px 6px 1px}.docs-gm .goog-toolbar,.docs-gm #docs-toolbar{min-height:38px}.docs-material .goog-toolbar-button,.docs-material .goog-toolbar-combo-button,.docs-material .goog-toolbar-menu-button{box-shadow:none;background-color:#fff;background-image:none;cursor:pointer;border-color:transparent!important;border-radius:2px;border-width:1px}.docs-material .goog-toolbar-button-hover,.docs-material .goog-toolbar-menu-button-hover,.docs-material .goog-toolbar-combo-button-hover,.docs-material .docs-toolbar-button-split-sympathy-hover,.docs-material .docs-toolbar-split-create-button,.docs-material .docs-toolbar-split-create-button.goog-toolbar-button-hover,.docs-material .docs-toolbar-split-create-button.goog-toolbar-menu-button-hover,.docs-gm .docs-material.trix-palette .goog-palette-cell-hover{box-shadow:none;background-color:rgba(0,0,0,.06);background-image:none;cursor:pointer;border-color:transparent!important;border-radius:2px;border-width:1px;cursor:pointer}.docs-gm .docs-material .goog-toolbar-button-hover,.docs-gm .docs-material .goog-toolbar-menu-button-hover,.docs-gm .docs-material .goog-toolbar-combo-button-hover,.docs-gm .docs-material .docs-toolbar-button-split-sympathy-hover,.docs-gm .docs-material .docs-toolbar-split-create-button,.docs-gm .docs-material .docs-toolbar-split-create-button.goog-toolbar-button-hover,.docs-gm .docs-material .docs-toolbar-split-create-button.goog-toolbar-menu-button-hover .docs-gm .docs-material.trix-palette .goog-palette-cell-hover{background-color:#f1f3f4}.docs-material .goog-toolbar-button-active,.docs-material .goog-toolbar-button-checked,.docs-material .goog-toolbar-button-selected,.docs-material .goog-toolbar-combo-button-open,.docs-material .goog-toolbar-menu-button-open,.docs-material .docs-toolbar-split-create-button.goog-toolbar-button-active,.docs-material .docs-toolbar-split-create-button.goog-toolbar-menu-button-active,.docs-material .docs-toolbar-split-create-button.goog-toolbar-menu-button-open,.docs-gm .docs-material.trix-palette .goog-palette-cell-selected{box-shadow:none;background-color:rgba(0,0,0,0.12);background-image:none;cursor:pointer;border-color:transparent!important;border-radius:2px;border-width:1px}.docs-gm .docs-material .goog-toolbar-button-active,.docs-gm .docs-material .goog-toolbar-button-checked,.docs-gm .docs-material .goog-toolbar-button-selected,.docs-gm .docs-material .goog-toolbar-combo-button-open,.docs-gm .docs-material .goog-toolbar-menu-button-open,.docs-gm .docs-material .docs-toolbar-split-create-button.goog-toolbar-button-active,.docs-gm .docs-material .docs-toolbar-split-create-button.goog-toolbar-menu-button-active,.docs-gm .docs-material .docs-toolbar-split-create-button.goog-toolbar-menu-button-open,.docs-gm .docs-material.trix-palette .goog-palette-cell-selected{background-color:#e6f4ea;color:#188038}.docs-material .goog-toolbar-button,.docs-material .goog-toolbar-menu-button{margin:3px 1px 0;height:26px;line-height:26px;color:rgba(0,0,0,.7)}.docs-material .goog-toolbar-button-inner-box,.docs-material .goog-toolbar-menu-button-inner-box{height:26px;min-width:26px}.docs-material .docs-toolbar-button-split-left .goog-toolbar-button-inner-box{min-width:26px}.docs-material .goog-toolbar-toggle-button.goog-toolbar-button-checked+.goog-toolbar-toggle-button.goog-toolbar-button-checked{border-left-color:#ccc;border-left-style:solid;border-left-width:1px;border-top-left-radius:2px;border-bottom-left-radius:2px;margin-left:1px}.docs-material .goog-toolbar-toggle-button.goog-toolbar-button-checked+.goog-toolbar-toggle-button.goog-toolbar-button-checked .goog-toolbar-button-outer-box .goog-toolbar-button-inner-box,.docs-material .goog-toolbar-toggle-button.goog-toolbar-button-checked+.goog-toolbar-toggle-button.goog-toolbar-button-checked.goog-toolbar-button-hover .goog-toolbar-button-outer-box .goog-toolbar-button-inner-box{margin-left:0}.docs-material .goog-toolbar-button .docs-icon,.docs-material .goog-toolbar-menu-button .docs-icon{opacity:0.54}.docs-gm .docs-material .goog-toolbar-button .docs-icon,.docs-gm .docs-material .goog-toolbar-menu-button .docs-icon,.docs-gm .docs-material .goog-toolbar-combo-button-dropdown,.docs-gm .docs-material .goog-toolbar-menu-button-dropdown{opacity:1}.docs-material .goog-toolbar-button-hover .docs-icon,.docs-material .goog-toolbar-button-selected .docs-icon,.docs-material .goog-toolbar-button-checked .docs-icon,.docs-material .goog-toolbar-button-active .docs-icon,.docs-material .goog-toolbar-menu-button-hover .docs-icon,.docs-material .goog-toolbar-menu-button-selected .docs-icon,.docs-material .goog-toolbar-menu-button-checked .docs-icon,.docs-material .goog-toolbar-menu-button-open .docs-icon{opacity:0.87}.docs-gm .docs-material .goog-toolbar-button-hover .docs-icon,.docs-gm .docs-material .goog-toolbar-button-selected .docs-icon,.docs-gm .docs-material .goog-toolbar-button-checked .docs-icon,.docs-gm .docs-material .goog-toolbar-button-active .docs-icon,.docs-gm .docs-material .goog-toolbar-menu-button-hover .docs-icon,.docs-gm .docs-material .goog-toolbar-menu-button-selected .docs-icon,.docs-gm .docs-material .goog-toolbar-menu-button-checked .docs-icon,.docs-gm .docs-material .goog-toolbar-menu-button-open .docs-icon{opacity:1}.docs-gm .goog-toolbar-button-inner-box,.docs-gm .goog-toolbar-menu-button-inner-box{height:24px;min-width:24px}.docs-gm .goog-toolbar-button .docs-icon{margin:0 0 1px 0}.docs-gm .goog-toolbar-button.docs-icon-toolbar-button-with-text .docs-icon-toolbar-button-with-text-icon-container{margin-right:4px}.docs-gm .goog-toolbar-menu-button.docs-textcolormenubutton .docs-icon{margin-top:1px}.docs-material .goog-toolbar-separator.goog-inline-block{border-left:1px solid #e0e0e0;margin:0 3px}.docs-material .docs-toolbar-small-separator+div.goog-toolbar-button,.docs-material .docs-toolbar-small-separator+div.goog-toolbar-menu-button{margin-left:1px}.docs-gm .goog-toolbar-separator.goog-inline-block{border-left:1px solid #dadce0;margin:9px 4px;height:20px}.docs-material .docs-toolbar-button-split-left,.docs-material .docs-toolbar-button-split-left.goog-inline-block{margin-right:0}.docs-material .docs-toolbar-button-split-right,.docs-material .docs-toolbar-button-split-right.goog-inline-block{margin-left:0}.docs-material .docs-toolbar-button-split-right.goog-toolbar-button-hover,.docs-material .docs-toolbar-button-split-right.goog-toolbar-menu-button-hover,.docs-material .docs-toolbar-button-split-right.docs-toolbar-button-split-sympathy-hover,.docs-material .docs-toolbar-button-split-left+.docs-toolbar-button-split-right.goog-toolbar-menu-button-open,.docs-material .docs-toolbar-split-create-button+.docs-toolbar-button-split-right{border-left-color:rgba(0,0,0,0.12)!important}.docs-gm .docs-material .docs-toolbar-button-split-right.goog-toolbar-button-hover,.docs-gm .docs-material .docs-toolbar-button-split-right.goog-toolbar-menu-button-hover,.docs-gm .docs-material .docs-toolbar-button-split-right.docs-toolbar-button-split-sympathy-hover,.docs-gm .docs-material .docs-toolbar-button-split-left+.docs-toolbar-button-split-right.goog-toolbar-menu-button-open,.docs-gm .docs-material .docs-toolbar-split-create-button+.docs-toolbar-button-split-right{border-left-color:#f1f3f4!important}.docs-material .docs-toolbar-split-create-button.goog-toolbar-menu-button{margin-right:3px}.docs-material .goog-toolbar-menu-button-dropdown,.docs-material .docs-toolbar-split-create-button .goog-toolbar-menu-button-dropdown,.docs-material .goog-toolbar-combo-button-dropdown{margin-top:10px}.docs-gm .docs-gm-arrow .docs-icon{margin:0}.docs-material .goog-toolbar-select .goog-toolbar-menu-button-dropdown{margin-top:8px}.docs-gm .docs-gm-arrow.goog-toolbar-menu-button-dropdown,.docs-gm .docs-toolbar-split-create-button .goog-toolbar-menu-button-dropdown,.docs-gm .docs-gm-arrow.goog-toolbar-combo-button-dropdown{background:none;margin:0 -1px 0 -3px;width:13px}.docs-gm .goog-toolbar-select .goog-toolbar-menu-button-outer-box .goog-toolbar-menu-button-inner-box .goog-toolbar-menu-button-dropdown{margin-right:-1px}.docs-material .goog-toolbar-combo-button{height:26px;line-height:26px;vertical-align:inherit;margin:0 1px}.docs-material .goog-toolbar-combo-button-input{color:rgba(0,0,0,.7)}.docs-material .goog-toolbar-combo-button-hover .goog-toolbar-combo-button-input{border-right-color:rgba(0,0,0,0.12)!important}.docs-material .goog-toolbar-combo-button-input,.docs-material .goog-toolbar-combo-button-input:focus{height:22px!important}.docs-material .goog-toolbar-combo-button-input:focus{border:1px solid #4d90fe!important}.docs-gm .goog-toolbar-button,.docs-gm .goog-toolbar-menu-button,.docs-gm .goog-toolbar-combo-button,.docs-gm #docs-equationtoolbar .goog-toolbar-button,.docs-gm #docs-equationtoolbar .goog-toolbar-menu-button,.docs-gm .trix-palette .goog-palette-cell{height:24px;line-height:24px;margin:6px 1px;top:0}.docs-gm .goog-toolbar-button-disabled,.docs-gm .goog-toolbar-menu-button-disabled,.docs-gm .trix-palette .goog-palette-cell-disabled{color:#5f6368!important;cursor:inherit;opacity:.38}.docs-gm .goog-toolbar-combo-button-input{box-sizing:border-box;height:20px!important;width:48px!important}.docs-gm .goog-toolbar-combo-button-open{background-color:#f1f3f4}.docs-gm .goog-toolbar-combo-button-input::selection{background-color:#e6f4ea}.docs-gm .goog-toolbar-combo-button-input:focus{border:2px solid #1a73e8!important;border-radius:4px;padding:0 7px}.docs-material .goog-color-menu-button-indicator{height:20px;border-bottom-color:transparent}.docs-material .docs-textcolormenubutton .goog-toolbar-menu-button-outer-box .goog-toolbar-menu-button-inner-box .goog-toolbar-menu-button-caption .goog-color-menu-button-indicator{bottom:0}.docs-material.docs-toolbar-more-bubble{border:0;box-shadow:0px 2px 2px 0px rgba(0,0,0,0.14),0px 3px 1px -2px rgba(0,0,0,0.12),0px 1px 5px 0px rgba(0,0,0,0.2);border-radius:2px}.docs-material.docs-toolbar-more-bubble .jfk-bubble-arrowup .jfk-bubble-arrowimplafter,.docs-material.docs-toolbar-more-bubble .jfk-bubble-arrowup .jfk-bubble-arrowimplbefore{border-color:transparent}.docs-material.docs-toolbar-more-toolbar{background:#fff;border-radius:2px;padding:0 4px}.docs-gm .docs-toolbar-more-bubble{border-radius:4px;box-shadow:0 2px 6px 2px rgba(60,64,67,.15)}.docs-gm .docs-toolbar-more-toolbar{border-radius:4px}.docs-gm .jfk-tooltip{}.jfk-button{font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500}.jfk-button-flat{font-weight:normal}.goog-toolbar-button,.goog-toolbar-menu-button{font-weight:500;font-size:11px;font-size:var(--docs-material-font-size-12,11px)}.docs-gm #docs-editor,.docs-gm #docs-editor-container{background:#f8f9fa}.goog-tab{font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500}.goog-flat-menu-button-caption{font-weight:500;font-weight:var(--docs-material-font-weight-normal,500)}.modal-dialog-buttons{font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif}.modal-dialog-buttons button{font-weight:500}.modal-dialog-title{font-size:16px;font-size:var(--docs-material-font-size-22,16px)}.goog-flat-menu-button{font-weight:500}.jfk-countrypicker-countryCurrent,.jfk-countrypicker-countryCurrent:hover{font-weight:500}.jfk-accordion .goog-zippy-expanded{font-weight:500}.jfk-titleLink{font-weight:500}.jfk-countrypicker-countryCurrent,.jfk-countrypicker-countryCurrent:hover{font-weight:500}.jfk-slideToggle{font-weight:500}.jfk-tooltip{font-weight:500;font-size:11px;font-size:var(--docs-material-font-size-12,11px)}.jfk-bubble-arrowdown .jfk-bubble-arrowimplbefore,.jfk-bubble-arrowup .jfk-bubble-arrowimplbefore{border-color:#dadce0 transparent}.apps-shortcutshelpcontentimpl-title-container{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-family:var(--docs-material-header-font-family,Roboto,RobotoDraft,Helvetica,Arial,sans-serif)}.apps-shortcutshelppopup-title-container{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-family:var(--docs-material-header-font-family,Roboto,RobotoDraft,Helvetica,Arial,sans-serif)}.docs-gm .docs-debug-container{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif}.docs-gm .docs-rotationhandle-circle,.docs-gm .docs-rotationhandle-stick,.docs-gm .docs-squarehandleselectionbox-handle,.docs-gm .waffle-obj-drag-component{background-color:#1a73e8}.docs-gm .docs-rotationhandle-outline,.docs-gm .docs-squarehandleselectionbox-border,.docs-gm .docs-roundedcornerselectionbox-border{border-color:#1a73e8}.docs-gm .docs-rotationhandle-stick{height:24px}.docs-gm .punch-animation-sidebar-play.jfk-button,.docs-gm .punch-animation-sidebar-stop.jfk-button,.docs-gm .waffle-filterbox-button-container .jfk-button-action,.docs-gm .docs-suggestiondialog-accept-container .jfk-button,.docs-gm .docs-suggestiondialog-accept-container .goog-flat-menu-button,.docs-gm .docs-offline-optinpromo-buttons .jfk-button-action{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;cursor:pointer}.docs-gm .punch-animation-sidebar-play.jfk-button-hover,.docs-gm .punch-animation-sidebar-stop.jfk-button-hover,.docs-gm .waffle-filterbox-button-container .jfk-button-action.jfk-button-hover,.docs-gm .docs-suggestiondialog-accept-container .jfk-button-hover,.docs-gm .docs-suggestiondialog-accept-container .goog-flat-menu-button-hover,.docs-gm .docs-offline-optinpromo-buttons .jfk-button-action.jfk-button-hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#2a8947;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15)}.docs-gm .punch-animation-sidebar-play.jfk-button-focused,.docs-gm .punch-animation-sidebar-stop.jfk-button-focused,.docs-gm .waffle-filterbox-button-container .jfk-button-action.jfk-button-focused,.docs-gm .docs-suggestiondialog-accept-container .jfk-button-focused,.docs-gm .docs-suggestiondialog-accept-container .goog-flat-menu-button-focused,.docs-gm .docs-offline-optinpromo-buttons .jfk-button-action.jfk-button-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#4f9e67;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15)}.docs-gm .punch-animation-sidebar-play.jfk-button-hover.jfk-button-focused,.docs-gm .punch-animation-sidebar-stop.jfk-button-hover.jfk-button-focused,.docs-gm .waffle-filterbox-button-container .jfk-button-action.jfk-button-hover.jfk-button-focused,.docs-gm .docs-suggestiondialog-accept-container .jfk-button-hover.jfk-button-focused,.docs-gm .docs-suggestiondialog-accept-container .goog-flat-menu-button-hover.goog-flat-menu-button-focused,.docs-gm .docs-offline-optinpromo-buttons .jfk-button-action.jfk-button-hover.jfk-button-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#62a877;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15)}.docs-gm .punch-animation-sidebar-play.jfk-button-pressed,.docs-gm .punch-animation-sidebar-stop.jfk-button-pressed,.docs-gm .waffle-filterbox-button-container .jfk-button-action.jfk-button-pressed,.docs-gm .docs-suggestiondialog-accept-container .jfk-button-pressed,.docs-gm .docs-suggestiondialog-accept-container .goog-flat-menu-button-pressed,.docs-gm .docs-offline-optinpromo-buttons .jfk-button-action.jfk-button-pressed{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#62a877;box-shadow:0 2px 6px 2px rgba(52,168,83,0.15)}.docs-gm .punch-animation-sidebar-play.jfk-button-disabled,.docs-gm .punch-animation-sidebar-stop.jfk-button-disabled,.docs-gm .waffle-filterbox-button-container .jfk-button-action.jfk-button-disabled,.docs-gm .docs-suggestiondialog-accept-container .jfk-button-disabled,.docs-gm .docs-suggestiondialog-accept-container .goog-flat-menu-button-disabled,.docs-gm .docs-offline-optinpromo-buttons .jfk-button-action.jfk-button-disabled{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#f1f3f4;color:#3c4043;opacity:0.38;cursor:default}.docs-gm .docs-image-effect-adjustment-reset-button,.docs-gm .waffle-filterbox-button-container .jfk-button-standard,.docs-gm .docs-suggestiondialog-reject-container .jfk-button,.docs-gm .docs-suggestiondialog-reject-container .goog-flat-menu-button,.motion-ui .punch-animation-sidebar-add.goog-flat-button,.docs-gm .docs-offline-optinpromo-buttons .jfk-button-standard{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:white;border:1px solid #dadce0!important;color:#188038;cursor:pointer}.docs-gm .docs-image-effect-adjustment-reset-button.jfk-button-hover,.docs-gm .waffle-filterbox-button-container .jfk-button-standard.jfk-button-hover,.docs-gm .docs-suggestiondialog-reject-container .jfk-button-hover,.docs-gm .docs-suggestiondialog-reject-container .goog-flat-menu-button-hover,.motion-ui .punch-animation-sidebar-add.goog-flat-button-hover,.docs-gm .docs-offline-optinpromo-buttons .jfk-button-standard.jfk-button-hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#f8fcf9;border:1px solid #c8e7d1!important}.docs-gm .docs-image-effect-adjustment-reset-button.jfk-button-focused,.docs-gm .waffle-filterbox-button-container .jfk-button-standard.jfk-button-focused,.docs-gm .docs-suggestiondialog-reject-container .jfk-button-focused,.docs-gm .docs-suggestiondialog-reject-container .goog-flat-menu-button-focused,.motion-ui .punch-animation-sidebar-add.goog-flat-button-focused,.docs-gm .docs-offline-optinpromo-buttons .jfk-button-standard.jfk-button-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#e7f5eb;border:1px solid #bbe2c6!important}.docs-gm .docs-image-effect-adjustment-reset-button.jfk-button-hover.jfk-button-focused,.docs-gm .waffle-filterbox-button-container .jfk-button-standard.jfk-button-hover.jfk-button-focused,.docs-gm .docs-suggestiondialog-reject-container .jfk-button-hover.jfk-button-focused,.docs-gm .docs-suggestiondialog-reject-container .goog-flat-menu-button-hover.goog-flat-menu-button-focused,.motion-ui .punch-animation-sidebar-add.goog-flat-button-hover.goog-flat-button-focused,.docs-gm .docs-offline-optinpromo-buttons .jfk-button-standard.jfk-button-hover.jfk-button-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#dff2e4;border:1px solid #b5e0c1!important}.docs-gm .docs-image-effect-adjustment-reset-button.jfk-button-pressed,.docs-gm .waffle-filterbox-button-container .jfk-button-standard.jfk-button-pressed,.docs-gm .docs-suggestiondialog-reject-container .jfk-button-pressed,.docs-gm .docs-suggestiondialog-reject-container .goog-flat-menu-button-pressed,.motion-ui .punch-animation-sidebar-add.goog-flat-button-pressed,.docs-gm .docs-offline-optinpromo-buttons .jfk-button-standard.jfk-button-pressed{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#dff2e4;border:1px solid transparent!important;box-shadow:0 2px 6px 2px rgba(60,64,67,.15)}.docs-gm .docs-image-effect-adjustment-reset-button.jfk-button-disabled,.docs-gm .waffle-filterbox-button-container .jfk-button-standard.jfk-button-disabled,.docs-gm .docs-suggestiondialog-reject-container .jfk-button-disabled,.docs-gm .docs-suggestiondialog-reject-container .goog-flat-menu-button-disabled,.motion-ui .punch-animation-sidebar-add.goog-flat-button-disabled,.docs-gm .docs-offline-optinpromo-buttons .jfk-button-standard.jfk-button-disabled{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:white;border:1px solid #f1f3f4!important;color:#3c4043;opacity:0.38;cursor:default}.docs-gm .modal-dialog button,.docs-gm .modal-dialog .jfk-button-standard{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:white;border:1px solid #dadce0!important;color:#188038}.docs-gm .modal-dialog button:hover,.docs-gm .modal-dialog .jfk-button-standard.jfk-button-hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#f8fcf9;border:1px solid #c8e7d1!important}.docs-gm .modal-dialog button:focus,.docs-gm .modal-dialog .jfk-button-standard.jfk-button-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#e7f5eb;border:1px solid #bbe2c6!important}.docs-gm .modal-dialog button:hover:focus,.docs-gm .modal-dialog .jfk-button-standard.jfk-button-hover.jfk-button-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#dff2e4;border:1px solid #b5e0c1!important}.docs-gm .modal-dialog button:active,.docs-gm .modal-dialog button:focus:active,.docs-gm .modal-dialog .jfk-button-standard.jfk-button-active,.docs-gm .modal-dialog .jfk-button-standard.jfk-button-focus.jfk-button-active{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#dff2e4;border:1px solid transparent!important;box-shadow:0 2px 6px 2px rgba(60,64,67,.15)}.docs-gm .modal-dialog button[disabled],.docs-gm .modal-dialog .jfk-button-standard.jfk-button-disabled{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:white;border:1px solid #f1f3f4!important;color:#3c4043;opacity:0.38}.docs-gm .modal-dialog .goog-buttonset-action,.docs-gm .modal-dialog .jfk-button-action,.docs-gm .docs-material-bubble .jfk-button-action{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff}.docs-gm .modal-dialog .goog-buttonset-action:hover,.docs-gm .modal-dialog .jfk-button-action.jfk-button-hover,.docs-gm .docs-material-bubble .jfk-button-action.jfk-button-hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#2a8947;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15)}.docs-gm .modal-dialog .goog-buttonset-action:focus,.docs-gm .modal-dialog .jfk-button-action.jfk-button-focused,.docs-gm .docs-material-bubble .jfk-button-action.jfk-button-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#4f9e67;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15)}.docs-gm .modal-dialog .goog-buttonset-action:hover:focus,.docs-gm .modal-dialog .jfk-button-action.jfk-button-hover.jfk-button-focused,.docs-gm .docs-material-bubble .jfk-button-action.jfk-button-hover.jfk-button-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#62a877;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15)}.docs-gm .modal-dialog .goog-buttonset-action:active,.docs-gm .modal-dialog .goog-buttonset-action:focus:active,.docs-gm .modal-dialog .jfk-button-action.jfk-button-active,.docs-gm .modal-dialog .jfk-button-action.jfk-button-focus.jfk-button-active,.docs-gm .docs-material-bubble .jfk-button-action.jfk-button-active,.docs-gm .docs-material-bubble .jfk-button-action.jfk-button-focus.jfk-button-active{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#62a877;box-shadow:0 2px 6px 2px rgba(52,168,83,0.15)}.docs-gm .modal-dialog .goog-buttonset-action[disabled],.docs-gm .modal-dialog .jfk-button-action.jfk-button-disabled,.docs-gm .docs-material-bubble .jfk-button-action.jfk-button-disabled{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#f1f3f4;color:#3c4043;opacity:0.38}.docs-gm .modal-dialog .goog-flat-button,.docs-gm .modal-dialog button,.docs-gm .modal-dialog .goog-buttonset-action,.docs-gm .modal-dialog .jfk-button-standard,.docs-gm .modal-dialog .jfk-button-action,.docs-gm .docs-material-bubble .jfk-button-standard,.docs-gm .docs-material-bubble .jfk-button-action{cursor:pointer}.docs-gm .modal-dialog .goog-flat-button.goog-flat-button-disabled,.docs-gm .modal-dialog button[disabled],.docs-gm .modal-dialog .goog-buttonset-action[disabled],.docs-gm .modal-dialog .jfk-button-standard.jfk-button-disabled,.docs-gm .modal-dialog .jfk-button-action.jfk-button-disabled,.docs-gm .docs-material-bubble .jfk-button-standard.jfk-button-disabled,.docs-gm .docs-material-bubble .jfk-button-action.jfk-button-disabled{cursor:default}.docs-gm .modal-dialog .jfk-textinput{border:1px solid #dadce0;border-radius:4px;box-sizing:border-box;color:#3c4043;padding:1px 8px;font-size:14px;height:36px;margin:8px 0}.docs-gm .modal-dialog textarea.jfk-textinput{min-height:36px;height:auto;height:unset;padding:7px 8px}.docs-gm.docs-material-gm-dialog textarea.jfk-textinput{min-height:52px;max-height:52px;min-width:100%;height:auto;height:unset;padding:7px 8px}.docs-gm.docs-material-gm-dialog .jfk-textinput,.docs-gm .docs-material-bubble .jfk-textinput{border:1px solid #dadce0;border-radius:4px;box-sizing:border-box;color:#3c4043;padding:1px 8px;font-size:14px;height:36px;margin:8px 0}.docs-gm.docs-material-gm-dialog .jfk-textinput:focus,.docs-gm .docs-material-bubble .jfk-textinput:focus{border:2px solid #1a73e8;box-shadow:none;padding:0px 7px}.docs-gm.docs-material-gm-dialog textarea.jfk-textinput:focus{padding:6px 7px}.docs-material-gm-dialog-title-close:hover{opacity:1}.docs-gm .docs-material-gm-dialog-title-close{background-color:transparent;border-radius:50%;cursor:pointer;line-height:18px;text-align:center}.docs-gm .docs-material-gm-dialog-title-close:hover{background-color:#f1f3f4}.docs-gm .docs-material-gm-dialog-title-close:focus{background-color:#e8eaed;outline:none}.docs-gm .modal-dialog .jfk-textinput.sketchy-guiderow-position{margin:0}.docs-gm .modal-dialog .jfk-textinput:focus{border:2px solid #1a73e8;box-shadow:none;padding:0px 7px}.docs-gm .modal-dialog textarea.jfk-textinput:focus{padding:6px 7px}.docs-gm .modal-dialog,.docs-gm .docs-offline-optinpromo.jfk-bubble,.docs-gm .docs-sync-indicator-popup.jfk-bubble{background-color:#fff;border:1px solid transparent;border-radius:8px;box-shadow:0 4px 8px 3px rgba(60,64,67,.15);position:absolute;z-index:1003;padding:24px}.docs-gm .picker.modal-dialog{padding:0;z-index:1201}.docs-gm .modal-dialog,.docs-gm .modal-dialog-content,.docs-gm #docs-offline-optinpromo-description,.docs-gm #docs-offline-optinpromo-learn-more-container{color:#3c4043}.docs-gm #docs-offline-optinpromo-title{border-bottom:none;padding:24px}.docs-gm .modal-dialog-title-text,.docs-gm .docs-offline-optinpromo-title-text{color:#202124;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:22px;font-weight:400;line-height:28px}.docs-gm .docs-offline-optinpromo-buttons{display:flex;flex-direction:row-reverse}.docs-gm .docs-offline-optinpromo-confirm-buttons{margin-top:24px}.docs-gm .docs-offline-optinpromo-buttons .jfk-button{cursor:pointer;margin-left:16px;margin-right:0}.docs-gm .modal-dialog-buttons,.docs-gm .docs-findandreplacedialog-buttons{display:flex;justify-content:flex-end;margin-top:24px}.docs-gm .modal-dialog-buttons button{margin:0 0 0 12px}.docs-gm .modal-dialog-buttons button:first-child{margin-left:0}.docs-gm .docs-dialog .modal-dialog-title{position:relative}.docs-gm .docs-dialog .modal-dialog-title-text{display:inline-block;max-width:calc(100% - 32px);min-width:200px}.docs-gm .docs-dialog .modal-dialog-title-close{background-color:transparent;border-radius:50%;cursor:pointer;height:18px;line-height:18px;padding:7px;right:0;text-align:center;top:-3px;width:18px}.docs-gm .docs-dialog .modal-dialog-title-close:hover{background-color:#f1f3f4}.docs-gm .docs-dialog .modal-dialog-title-close:focus{background-color:#e8eaed;outline:none}.docs-gm .docs-dialog .modal-dialog-title-close:after{position:relative;right:0;top:0}.docs-gm .modal-dialog .docs-flatcolormenubutton .goog-flat-menu-button-caption,.docs-gm .sketchy-shape-effects-shadow-tile .docs-flatcolormenubutton .goog-flat-menu-button-caption{height:22px;width:22px;border-radius:50%;border:1px solid #dadce0;margin:0;outline:none}.docs-gm .modal-dialog .docs-flatcolormenubutton.goog-flat-menu-button,.docs-gm .sketchy-shape-effects-shadow-tile .docs-flatcolormenubutton.goog-flat-menu-button{padding:6px 0 6px 6px}.docs-gm div.goog-modalpopup-bg,.docs-gm div.modal-dialog-bg{background-color:#000;left:0;position:absolute;top:0;z-index:1002;opacity:.6!important}.docs-gm ::-webkit-scrollbar-track{box-shadow:none;margin:0 4px}.docs-gm ::-webkit-scrollbar-track:hover{box-shadow:none;background:none}.docs-gm ::-webkit-scrollbar-thumb{border-style:solid;border-color:transparent;border-width:4px;background-color:#dadce0;border-radius:8px;box-shadow:none}.docs-gm ::-webkit-scrollbar-thumb:hover{background-color:#80868b}.docs-gm ::-webkit-scrollbar-thumb:active{background-color:#5f6368}.docs-gm .modal-dialog .goog-flat-menu-button,.docs-gm .sketchy-shape-effects-shadow-tile .goog-flat-menu-button{border:1px solid #dadce0;border-radius:4px;box-sizing:border-box;cursor:pointer;padding:8px 6px 8px 8px;width:100%;align-items:center;background:none;color:#3c4043;display:inline-flex;justify-content:space-between;outline:none;position:relative;width:auto;width:unset}.docs-gm .modal-dialog .goog-flat-menu-button-disabled,.docs-gm .sketchy-shape-effects-shadow-tile .goog-flat-menu-button-disabled{color:#5f6368;opacity:.38;cursor:default}.docs-gm .modal-dialog .goog-flat-menu-button:active,.docs-gm .sketchy-shape-effects-shadow-tile .goog-flat-menu-button:active{background-color:#fff;border:1px solid transparent;box-shadow:0 2px 6px 2px rgba(60,64,67,.15)}.docs-gm .modal-dialog .goog-flat-menu-button-hover,.docs-gm .sketchy-shape-effects-shadow-tile .goog-flat-menu-button-hover{background-color:rgba(60,64,67,0.04);border:1px solid #dadce0;box-shadow:none}.docs-gm .modal-dialog .goog-flat-menu-button-focused,.docs-gm .sketchy-shape-effects-shadow-tile .goog-flat-menu-button-focused{background-color:rgba(60,64,67,0.06);border:1px solid #dadce0}.docs-gm .modal-dialog .goog-flat-menu-button-open,.docs-gm .sketchy-shape-effects-shadow-tile .goog-flat-menu-button-open{background-color:rgba(60,64,67,0.04);border:1px solid transparent}.docs-gm .modal-dialog .goog-flat-menu-button-hover.goog-flat-menu-button-open,.docs-gm .sketchy-shape-effects-shadow-tile .goog-flat-menu-button-hover.goog-flat-menu-button-open{background-color:rgba(60,64,67,0.06)}.docs-gm .modal-dialog .goog-flat-menu-button-focused.goog-flat-menu-button-open,.docs-gm .sketchy-shape-effects-shadow-tile .goog-flat-menu-button-focused.goog-flat-menu-button-open{background-color:rgba(60,64,67,0.08)}.docs-gm .modal-dialog .goog-flat-menu-button-disabled,.docs-gm .sketchy-shape-effects-shadow-tile .goog-flat-menu-button-disabled{border:1px solid #dadce0;box-shadow:none;cursor:default}.docs-gm .modal-dialog .goog-flat-menu-button-caption,.docs-gm .sketchy-shape-effects-shadow-tile .goog-flat-menu-button-caption{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;color:#202124;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;height:20px;line-height:20px;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.docs-gm .modal-dialog .goog-flat-menu-button-disabled .goog-flat-menu-button-caption,.docs-gm .sketchy-shape-effects-shadow-tile .goog-flat-menu-button-disabled .goog-flat-menu-button-caption{color:#5f6368;opacity:.38;cursor:default}.docs-gm .modal-dialog .goog-flat-menu-button-dropdown,.docs-gm .sketchy-shape-effects-shadow-tile .goog-flat-menu-button-dropdown{background:no-repeat url(//ssl.gstatic.com/docs/common/material_common_sprite222_grey_medium.svg) -40px -732px;height:18px;width:18px;border:none;margin-top:0;position:relative;right:0;top:0}.docs-gm .modal-dialog .goog-flat-menu-button-disabled .goog-flat-menu-button-dropdown,.docs-gm .sketchy-shape-effects-shadow-tile .goog-flat-menu-button-disabled .goog-flat-menu-button-dropdown{opacity:.38}.docs-gm .modal-dialog .goog-flat-menu-button-disabled.goog-flat-menu-button:active,.docs-gm .sketchy-shape-effects-shadow-tile .goog-flat-menu-button-disabled.goog-flat-menu-button:active{border:1px solid #dadce0;box-shadow:none;cursor:default;box-shadow:none}.docs-gm .modal-dialog .goog-flat-menu-button-open .goog-flat-menu-button-dropdown,.docs-gm .sketchy-shape-effects-shadow-tile .goog-flat-menu-button-open .goog-flat-menu-button-dropdown{-moz-transform:rotate(180deg);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.docs-gm .modal-dialog .jfk-radiobutton-disabled .jfk-radiobutton-label{color:#5f6368;opacity:.38;cursor:default}.docs-gm .share-butterbar-container{font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-family:var(--docs-material-header-font-family,"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif);font-size:13px;font-size:var(--docs-material-font-size-normal,13px);font-weight:normal;font-weight:var(--docs-material-font-weight-normal,normal)}.docs-gm .share-client-dialog .share-butterbar-container{font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-family:var(--docs-material-header-font-family,"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif)}.docs-gm .share-butterbar-container .jfk-butterBar-shown{height:40px;padding:0 16px}.docs-gm .share-butterbar-container .jfk-butterBar-shown>span{display:flex;padding-top:4px}.docs-gm .share-butter-icon{margin-right:8px}.docs-gm .share-butter-link,.docs-gm .share-butter-link:visited{color:#188038;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-family:var(--docs-material-header-font-family,"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif);font-size:16px;margin-left:80px}.docs-gm .share-butter-link:hover,.docs-gm .share-butter-link:active{color:#0d652d}.docs-gm .share-butter-link:disabled{color:#188038}.docs-display-density-comfortable#docs-toolbar-wrapper{min-height:calc(35px + 9px - 2px)}.docs-display-density-comfortable.goog-menu .goog-menuitem:not(.docs-submenuitem){padding-top:9px;padding-bottom:9px}.docs-display-density-comfortable .waffle-function-category-row-description{display:block}.docs-display-density-comfortable .shape-palette .goog-palette-cell{padding:5px}.docs-display-density-comfortable.waffle-function-category-row.waffle-function-category-active{padding:5px 10px}.docs-display-density-comfortable.goog-menu:not(.docs-fontmenu) .goog-menuitem:not(.waffle-colormenuitems-scheme-header-edit-button):not(.docs-submenuitem):not(.apps-menuitem):not(.docs-menuitem-add-fonts).goog-menuitem-highlight{padding-top:calc(9px - 1px);padding-bottom:calc(9px - 1px);border-width:1px 0}.docs-display-density-comfortable.goog-menu .goog-menuitem-icon{top:calc(9px - 1px)}.docs-display-density-comfortable.goog-menu .goog-menuitem-highlight:not(.apps-menuitem):not(.docs-menuitem-add-fonts) .goog-menuitem-icon{top:calc(calc(9px - 1px) - 1px)}.docs-gm .docs-display-density-comfortable.goog-menu .apps-menuitem .goog-menuitem-icon{top:0;margin-top:11px;margin-bottom:11px}.docs-gm .docs-display-density-comfortable.goog-menu .goog-menuitem-highlight:not(.apps-menuitem) .goog-menuitem-icon{top:0;margin-top:10px;margin-bottom:10px}.docs-display-density-comfortable .goog-palette-cell{padding:4px}#t-border-palette.docs-display-density-comfortable .goog-palette-cell{padding:4px 6px 4px 4px}#t-border-palette.docs-display-density-comfortable #t-border-style-menu-button{margin-top:6px}#t-border-palette.docs-display-density-comfortable .goog-toolbar-color-menu-button{padding-top:3px;padding-bottom:3px}.docs-display-density-comfortable.trix-palette .goog-palette-cell{display:inline-block;margin:2px;padding:4px 6px 4px 4px}.docs-display-density-comfortable.trix-palette .goog-palette-table{margin:0}#t-text-rotation-palette td:not(.goog-palette-cell),.docs-display-density-comfortable.trix-palette{padding:0}.docs-display-density-comfortable .goog-inline-block.goog-toolbar-combo-button.waffle-text-rotation-combobox{padding-top:3px;padding-bottom:3px;margin:4px}.docs-display-density-comfortable.waffle-ac-renderer .waffle-function-autocomplete-row-description{display:block}.docs-display-density-comfortable.goog-menu .docs-omnibox-input{padding-top:5px;padding-bottom:5px;height:33px}.docs-display-density-comfortable .docs-material-colorpalette-cell{padding:2px}.docs-display-density-comfortable .docs-material-colorpalette-colorswatch{height:24px;width:24px}.docs-gm .docs-display-density-comfortable.docs-colormenuitems .goog-menuitem.colormenuitems-custom-header-add-button{padding:10px 0}.docs-gm .goog-menu.docs-display-density-comfortable .goog-menuitem.colormenuitems-no-color{padding-top:9px;padding-bottom:9px;border-width:1px 0}.docs-display-density-comfortable.docs-colormenuitems .goog-menuitem.goog-inline-block.waffle-colormenuitems-scheme-header-edit-button{padding:5px}.docs-display-density-comfortable.docs-colormenuitems .goog-menuitem-highlight.waffle-colormenuitems-scheme-header-edit-button{padding-top:4px;padding-bottom:4px;border-width:1px 0}.docs-display-density-comfortable.docs-colormenuitems .goog-menuseparator{margin:10px 0}.docs-display-density-comfortable.goog-menu .docs-omnibox-autocomplete{padding-top:6px;padding-bottom:6px}.docs-display-density-comfortable.goog-menu .docs-omnibox-autocomplete.goog-menuitem-highlight{padding-top:calc(6px - 1px);padding-bottom:calc(6px - 1px)}.docs-display-density-comfortable .goog-toolbar .goog-toolbar-button,.docs-display-density-comfortable .goog-toolbar .goog-toolbar-combo-button,.docs-display-density-comfortable .goog-toolbar .goog-toolbar-menu-button{padding:2px;margin-left:2px;margin-right:2px}.docs-display-density-comfortable .docs-toolbar-more-toolbar{min-height:calc(35px + 2*2px)}.docs-display-density-comfortable .goog-toolbar .goog-toolbar-separator.goog-inline-block{height:calc(35px + 2*2px)}.docs-gm .docs-display-density-comfortable .goog-toolbar .goog-toolbar-separator.goog-inline-block{height:24px}.docs-display-density-comfortable .goog-toolbar .docs-toolbar-button-split-left{margin-right:0}.docs-display-density-comfortable .goog-toolbar .docs-toolbar-button-split-right{margin-left:0}.docs-display-density-comfortable .goog-toolbar .docs-omnibox-input{height:29px}.docs-display-density-comfortable .goog-toolbar .docs-omnibox-autocomplete{margin-right:2px}.docs-display-density-comfortable.docs-colormenuitems .docs-c-u-colormenutogglebutton-base{padding:4px 33px}.docs-display-density-comfortable.docs-colormenuitems .jfk-palette-table{width:100%}.docs-display-density-comfortable.docs-colormenuitems .jfk-palette-row{display:flex;-webkit-justify-content:space-between;justify-content:space-between}.docs-display-density-comfortable.docs-colormenuitems .jfk-palette-colorswatch,.docs-display-density-comfortable.docs-colormenuitems .docs-colormenuitems-custom-palette .jfk-palette-cell{height:22px;width:22px}.docs-display-density-comfortable.goog-menu.docs-fontmenu .docs-menuitem-add-fonts{border-color:#eee}.docs-display-density-comfortable.goog-menu.docs-fontmenu .goog-menuitem.docs-submenuitem{padding-top:9px;padding-bottom:9px;border:0}.docs-display-density-comfortable.goog-menu.docs-fontmenu .goog-menuitem.docs-submenuitem::before{line-height:38px}.docs-display-density-comfortable.goog-menu.docs-fontmenu .docs-submenuitem-splitbutton{height:calc(38px - 2px);line-height:calc(38px - 2px)}body:not(.docs-gm) .docs-display-density-comfortable.goog-menu .goog-menuitem-ie{padding-top:7px;padding-bottom:24px}body:not(.docs-gm) .docs-display-density-comfortable.goog-menu .goog-menuitem-icon-ie{top:4px}.docs-display-density-toolbar-menuitem-label{font-weight:500;padding-bottom:4px}.docs-display-density-toolbar-menuitem-description{font-size:11px;color:#777}.docs-display-density-comfortable .goog-toolbar.chart-toolbar-with-omnibox{display:flex;-ms-flex-align:center;-moz-box-align:center;-webkit-box-align:center;box-align:center;-webkit-align-items:center;align-items:center}.docs-display-density-comfortable .goog-toolbar.chart-toolbar-with-omnibox .sheet-toolbar-button{margin-right:calc(2px*2)}.docs-chat.jfk-button{border-radius:0;height:28px;margin-left:2px;margin-right:0px;min-width:24px;vertical-align:top}.docs-chat.jfk-button .docs-icon{opacity:.70}.docs-chat.jfk-button.jfk-button-checked .docs-icon{opacity:0.9}.docs-chat.jfk-button.jfk-button-disabled .docs-icon{opacity:0.333}.docs-chat-badge{background:#db4437;border-radius:6px;display:none;height:12px;pointer-events:none;position:absolute;right:-4px;top:-4px;width:12px}.docs-chat-badge-visible{display:block}.docs-chat-badge.docs-chat-hc-gecko{filter:url("data:image/svg+xml;utf8,\00003csvg%20xmlns=\000027http://www.w3.org/2000/svg\000027\00003e\00003cfilter%20id=\000027invertColor\000027\00003e\00003cfeColorMatrix%20type=\000027matrix\000027%20values=\000027-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0\000027/\00003e\00003c/filter\00003e\00003c/svg\00003e#invertColor")}.docs-chat-badge.docs-chat-hc-ie{-ms-high-contrast-adjust:none;background-color:white}.docs-chat-message-tooltip-container{-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;box-shadow:0 1px 1px 0 rgba(0,0,0,0.14),0 2px 1px -1px rgba(0,0,0,0.12),0 1px 3px 0 rgba(0,0,0,0.2);background-color:#fafafa;padding:12px;z-index:501}.docs-chat-message-tooltip-container .jfk-bubble-arrowup .jfk-bubble-arrowimplafter{border-color:#fafafa transparent}.docs-chat-message-tooltip-container .jfk-bubble-arrowup .jfk-bubble-arrowimplbefore{border-color:rgba(0,0,0,0.3) transparent}.docs-chat-message-tooltip{font-size:13px;height:32px;line-height:18px;position:relative;text-align:left;width:192px}.docs-chat-message-tooltip-subject{opacity:.87;font-weight:500}.docs-chat-message-tooltip-content{opacity:.54;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-break:break-all;word-wrap:break-word}.docs-chat-pane-container{border-left:1px solid #d9d9d9;outline:none;position:absolute;right:0;top:0;width:300px}.docs-gm .docs-chat-pane-container{overflow:hidden;box-shadow:-3px 0px 6px -3px rgba(60,64,67,.15),3px 0px 6px -3px rgba(60,64,67,.15);border-left:0}.docs-chat-pane{background-color:#fff;font-size:13px;height:100%;overflow:hidden;position:relative;z-index:801}.docs-gm .docs-chat-pane{font-size:14px}.docs-chat-users{background:#f5f5f5;color:#000;margin:0;max-height:33%;outline-style:none;overflow:auto;padding:8px 0 3px 0;text-align:left;vertical-align:top}.docs-chat-users-empty{display:none}.docs-chat-messages{background-color:#fff;box-sizing:border-box;color:rgba(0,0,0,.87);outline-style:none;overflow:auto;padding:16px 24px 0px 16px;position:relative;vertical-align:middle}.docs-gm .docs-chat-messages{color:#3c4043;letter-spacing:.25px;padding:16px 16px 0px 16px}.docs-chat-edit-container{background:#eee;bottom:0;height:96px;margin:0;outline:0;position:absolute;width:100%}.docs-gm .docs-chat-edit-container{background-color:#fff}.docs-chat-edit-box{border:1px solid #5ea0e3;box-sizing:border-box;font-size:100%;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;height:64px;left:16px;outline:0;overflow:auto;padding:8px;position:relative;top:16px;width:268px;resize:none}.docs-gm .docs-chat-edit-box{border:1px solid #dadce0;border-radius:4px;box-sizing:border-box;color:#3c4043;padding:1px 8px;font-size:14px;height:36px;margin:8px 0}.docs-gm .docs-chat-edit-box{height:64px;margin:0;padding:8px}.docs-chat-edit-box::-webkit-input-placeholder,.docs-chat-edit-box::-moz-placeholder,.docs-chat-edit-box:-ms-input-placeholder{color:#5f6368}.docs-chat-edit-box-focus{outline:1px solid #5ea0e3}.docs-gm .docs-chat-edit-box-focus{border:2px solid #1a73e8;box-shadow:none;padding:0px 7px}.docs-gm .docs-chat-edit-box-focus{padding:7px}.docs-chat-roster{width:250px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;word-break:break-all;word-wrap:break-word}.docs-gm .docs-chat-roster{width:240px}.label-input-label{color:#a9a9a9}.docs-chat-status{color:gray;line-height:12px}.docs-chat-name{font-weight:500}.docs-gm .docs-chat-name{font-weight:500}.docs-chat-message.docs-chat-status-message{margin-bottom:0px}.docs-chat-message{line-height:18px;margin-bottom:2px;outline-style:none;word-wrap:break-word;white-space:pre-wrap}.docs-chat-first-series-message{margin-top:10px}.docs-user-roster{margin:0;outline-style:none;padding:0 0 10px 1em;position:relative}.docs-user-roster-name{color:#666;left:2.7em;position:absolute;top:0}.docs-user-roster-bubble{height:13px;margin-right:1px;top:1px;vertical-align:text-bottom;width:13px}.docs-user-roster-bubble-clickable{cursor:pointer}.docs-chat-anon{color:gray;font-size:11px;padding:6px 24px 3px 16px}.docs-chat-title-bar{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;background-color:#616161;border-bottom:1px solid #616161;border-top:1px solid #616161;color:#fff;height:15px;padding:10px 0 10px 12px;position:relative}.docs-gm .docs-chat-title-bar{display:flex;align-items:center;color:#202124;background-color:#fff;height:56px;padding:0 16px;border-bottom:1px solid #dadce0;border-top:1px solid #dadce0;font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:16px;z-index:1;padding-right:56px;letter-spacing:.1px}.docs-chat-title-bar-highlight{background-color:#4285f4;border-bottom-color:#4285f4;border-top-color:#4285f4;color:#fff}.docs-chat-title{font-weight:500}.docs-gm .docs-chat-title-bar.docs-chat-shadow{box-shadow:0 2px 6px 2px rgba(60,64,67,.15)}.docs-gm .docs-chat-edit-container.docs-chat-shadow{box-shadow:0 -2px 6px 2px rgba(60,64,67,.15)}.docs-sidebar-close-button.docs-chat-close-button{float:right;top:8px}.docs-sidebar-gm-close-button.docs-chat-close-button{position:absolute;right:11px;top:12px}.docs-presence-widget{cursor:pointer;height:19px;margin:0 0 5px 0;outline:0;position:absolute;right:44px;top:11px;width:207px}#docs-presence-menubar .docs-presence-widget{top:5px}#docs-presence .docs-presence-widget{display:inline-block;position:relative;right:auto;text-align:left;width:auto}.docs-presence-widget-inner{border:1px solid transparent;height:17px;margin-bottom:8px}#docs-presence .docs-presence-widget-inner{display:inline-block;max-width:190px}.docs-presence-widget-normal .docs-presence-widget-inner{background:#fff;border-color:#fff;color:#666}.docs-presence-widget-hover .docs-presence-widget-inner,.docs-presence-widget-focused .docs-presence-widget-inner{background:#f3f3f3;border-color:#f3f3f3;color:#222!important}.docs-presence-widget-open .docs-presence-widget-inner{background:#f3f3f3;border-color:#e5e5e5;color:#666}.docs-presence-widget-notify .docs-presence-widget-inner{color:#fff}.docs-presence-widget-arrow{position:absolute!important;top:0}.docs-presence-widget-content{font-size:11px;line-height:18px;max-width:98px;overflow:hidden;padding:0 4px;text-overflow:ellipsis;white-space:nowrap}#docs-presence .docs-presence-widget-content{max-width:90px;position:relative;vertical-align:top}.docs-presence-widget-collab{max-width:90px;overflow:hidden;position:absolute;right:4px;top:1px}#docs-presence .docs-presence-widget-collab{display:inline-block;margin-right:4px;position:relative;right:auto;top:auto}.docs-presence-widget-collab .docs-user-roster-bubble{margin:1px;vertical-align:baseline}#docs-presence-container{height:29px;margin-right:10px;vertical-align:middle}#docs-presence{vertical-align:top}.docs-presence-plus-widget{max-width:250px;outline:0;text-align:left}#docs-bars .docs-presence-plus-widget{position:absolute;overflow:hidden;right:0;top:2px}.docs-presence-plus-widget-inner{vertical-align:top}.docs-presence-plus-widget-status{color:#222;display:none;text-align:right;margin:8px 10px 0 0}.docs-presence-plus-widget-open .docs-presence-plus-widget-status{display:block}.docs-presence-plus-widget-collabs{height:30px}.docs-hub-appbar .docs-presence-plus-widget-collabs{display:flex;align-items:center}.docs-presence-plus-widget-open .docs-presence-plus-widget-collabs{display:none}.docs-presence-plus-widget-overflow-button{border-radius:0;height:28px;margin:0 2px 0 -1px;min-width:0;padding:0;width:13px}.docs-presence-plus-widget-overflow-button .goog-flat-menu-button-dropdown{right:3px}.docs-presence-plus-widget-overflow-menu{max-height:300px;outline:none;overflow:auto;padding:7px;text-align:left;white-space:nowrap}.docs-presence-plus-widget-overflow,.docs-presence-plus-collab-widget-container{height:30px;overflow:hidden;vertical-align:top}.docs-presence-plus-collab-widget-color-block{height:30px;overflow:hidden;width:25px}.docs-presence-plus-collab-widget-menuitem,.docs-gm .goog-menu .docs-presence-plus-collab-widget-menuitem.goog-menuitem,.docs-gm .goog-menu .docs-presence-plus-collab-widget-menuitem.goog-menuitem-highlight{border-style:none;padding:0}.docs-presence-plus-collab-widget-container{margin:0 2px;width:25px}.docs-presence-plus-collab-widget-color-block{opacity:.5;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)"}.docs-presence-plus-collab-widget-active .docs-presence-plus-collab-widget-color-block{opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}.docs-presence-plus-collab-widget-exit .docs-presence-plus-collab-widget-color-block{height:0;width:0}.docs-presence-plus-collab-widget-image,.docs-presence-plus-collab-widget-image-container{height:25px;padding-bottom:5px;width:25px}.docs-presence-plus-collab-widget-image-container{overflow:hidden}.docs-hub-appbar .docs-presence-plus-collab-widget-color-block,.docs-hub-appbar .docs-presence-plus-collab-widget-image-container{height:28px;width:28px}.docs-hub-appbar .docs-presence-plus-collab-widget-image{height:24px;width:24px}.docs-presence-plus-collab-widget-image-border{border-bottom:1px solid #fff;height:24px}.docs-presence-plus-collab-widget-idle-text{color:#777;font-size:11px}.docs-presence-plus-collab-widget-active .docs-presence-plus-collab-widget-idle-text{display:none}.docs-presence-plus-widget-overflow-button-collabs{margin:0}@-webkit-keyframes color-join{from{margin-top:25px}to{margin-top:0}}@-moz-keyframes color-join{from{margin-top:25px}to{margin-top:0}}@-ms-keyframes color-join{from{margin-top:25px}to{margin-top:0}}.docs-presence-plus-collab-widget-enter .docs-presence-plus-collab-widget-color-block{-webkit-animation-name:color-join;-moz-animation-name:color-join;-ms-animation-name:color-join;-webkit-animation-duration:.5s;-moz-animation-duration:.5s;-ms-animation-duration:.5s}@-webkit-keyframes image-join{0%{height:0;padding-bottom:0}33%{height:0;padding-bottom:0}100%{height:25px;padding-bottom:5px}}@-moz-keyframes image-join{0%{height:0;padding-bottom:0}33%{height:0;padding-bottom:0}100%{height:25px;padding-bottom:5px}}@-ms-keyframes image-join{0%{height:0;padding-bottom:0}33%{height:0;padding-bottom:0}100%{height:25px;padding-bottom:5px}}.docs-presence-plus-collab-widget-enter .docs-presence-plus-collab-widget-image-container{-webkit-animation-name:image-join;-moz-animation-name:image-join;-ms-animation-name:image-join;-webkit-animation-duration:1.5s;-moz-animation-duration:1.5s;-ms-animation-duration:1.5s;-webkit-animation-timing-function:ease-in;-moz-animation-timing-function:ease-in;-ms-animation-timing-function:ease-in}@-webkit-keyframes collab-exit{0%{height:30px;width:25px;margin:0;opacity:.5}25%{height:30px;width:25px;margin:0;opacity:.5}99%{height:0;width:0;margin:15px 12px}100%{height:0;width:0;margin:0}}@-moz-keyframes collab-exit{0%{height:30px;width:25px;margin:0;opacity:.5}25%{height:30px;width:25px;margin:0;opacity:.5}99%{height:0;width:0;margin:15px 12px}100%{height:0;width:0;margin:0}}@-ms-keyframes collab-exit{0%{height:30px;width:25px;margin:0;opacity:.5}25%{height:30px;width:25px;margin:0;opacity:.5}99%{height:0;width:0;margin:15px 12px}100%{height:0;width:0;margin:0}}.docs-presence-plus-collab-widget-exit .docs-presence-plus-collab-widget-color-block{-webkit-animation-name:collab-exit;-moz-animation-name:collab-exit;-ms-animation-name:collab-exit;-webkit-animation-duration:1s;-moz-animation-duration:1s;-ms-animation-duration:1s}@-webkit-keyframes collab-image-exit{0%{margin:0;padding-bottom:5px}25%{margin:0;padding-bottom:5px}100%{margin-top:-15px;margin-left:-12px}}@-moz-keyframes collab-image-exit{0%{margin:0;padding-bottom:5px}25%{margin:0;padding-bottom:5px}100%{margin-top:-15px;margin-left:-12px}}@-ms-keyframes collab-image-exit{0%{margin:0;padding-bottom:5px}25%{margin:0;padding-bottom:5px}100%{margin-top:-15px;margin-left:-12px}}.docs-presence-plus-collab-widget-exit .docs-presence-plus-collab-widget-image{-webkit-animation-name:collab-image-exit;-moz-animation-name:collab-image-exit;-ms-animation-name:collab-image-exit;-webkit-animation-duration:1s;-moz-animation-duration:1s;-ms-animation-duration:1s}.docs-presence-plus-widget-overflow-menu .docs-presence-plus-collab-widget-container{display:block;height:25px;margin:0 0 5px;width:auto}.docs-presence-plus-widget-overflow-menu .docs-presence-plus-collab-widget-color-block{width:30px}.docs-presence-plus-widget-overflow-menu .docs-presence-plus-collab-widget{height:25px;padding-right:20px}.docs-presence-plus-widget-overflow-menu .docs-presence-plus-collab-widget-image{position:relative;left:-1px}.docs-presence-plus-widget-overflow-menu .docs-presence-plus-collab-widget-image,.docs-presence-plus-widget-overflow-menu .docs-presence-plus-collab-widget-image-container{padding-bottom:0}.docs-presence-plus-widget-overflow-menu .docs-presence-plus-collab-widget-image-container{padding-left:5px}.docs-presence-plus-widget-overflow-menu .docs-presence-plus-collab-widget-image-border{border-bottom:none;border-left:1px solid #fff;height:25px}.docs-presence-plus-widget-overflow-menu .docs-presence-plus-collab-widget-name{color:#222;font-size:13px;margin:4px 0 0 5px;vertical-align:top}.jfk-bubble.jfk-bubble-promo.hub-anchored-bubble{background-color:#ffffff;border-color:#ffffff;border-radius:8px;height:auto;width:226px;word-wrap:break-word;padding:18px 16px;box-shadow:rgba(0,0,0,0.2) 0px 1px 3px 1px}.jfk-bubble.jfk-bubble-promo.hub-anchored-bubble .jfk-bubble-arrowup .jfk-bubble-arrowimplbefore{border-color:#dadce0 transparent;top:-1px}.jfk-bubble.jfk-bubble-promo.hub-anchored-bubble .jfk-bubble-arrowup .jfk-bubble-arrowimplafter{border-color:#ffffff transparent;top:0}.hub-anchored-bubble-body{color:#3c4043;font-family:Roboto;line-height:20px;padding:0 8px}.hub-anchored-bubble-action-row{font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;padding-top:15px;text-align:right}.hub-anchored-bubble-dismiss-container{font-size:14px;color:#1a73e8;cursor:pointer;letter-spacing:0.25px;line-height:16px;outline:none;padding:8px}.talk_roster{display:none}.docs-chat-mole-hidden>div{top:-10000px!important;left:-10000px!important}.talk_chat_widget{z-index:900!important}.docs-gm-promo.jfk-bubble.jfk-bubble-promo.classification-badge-popout{background-color:#fff;border:0;border-radius:8px;height:auto;width:320px;word-wrap:break-word;margin-top:12px}.classification-badge-popout-body{color:#3c4043;font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;line-height:22px;vertical-align:top}.classification-badge-popout-action-row{font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;text-align:right;display:flex;justify-content:flex-end;margin:8px 0 -8px 0}.classification-badge-popout-action-container{color:#188038;cursor:pointer;outline:none;width:auto;padding:12px 10px 12px 10px;border:1px solid transparent;border-radius:4px;border-color:transparent;font-size:14px;font-weight:500;letter-spacing:0.025em;transition:all 0.3s cubic-bezier(0.4,0,0.2,1)}.classification-badge-popout-action-container:hover{background:#f8fcf9;border-radius:4px}.classification-badge-popout-header{font-size:18px;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:400;margin-bottom:8px;line-height:22px}.classification-badge-close-icon.docs-icon{height:24px;width:24px}.classification-badge-close{cursor:pointer;float:right;margin-right:-13px;top:-5px}.classification-badge-open-icon.docs-icon{margin-left:2px}.docs-gm .classification-badge-open-icon .docs-icon-img{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_green.svg)}.classification-badge-popout-container{padding:24px}.docs-gm-promo.jfk-bubble.jfk-bubble-promo.classification-badge-popout .jfk-bubble-arrowup .jfk-bubble-arrowimplbefore,.docs-gm-promo.jfk-bubble.jfk-bubble-promo.classification-badge-popout .jfk-bubble-arrowup .jfk-bubble-arrowimplafter{border-color:#fff transparent}.jfk-bubble.jfk-bubble-promo.classification-badge-popout .jfk-bubble-arrowup .jfk-bubble-arrowimplbefore{background:#fff;border-radius:4px;box-shadow:0 0 3px 0 rgba(32,33,36,0.3);position:absolute;transform:rotate(-48deg);height:13px}.jfk-bubble.jfk-bubble-promo.classification-badge-popout .jfk-bubble-arrowup .jfk-bubble-arrowimplafter{height:24px;top:-14px;left:-15px;transform:scale(1.02) perspective(24px) rotateX(60deg);width:16px}.docs-copydocdialog{width:360px}.docs-copydocdialog-filenameinput{width:250px}.docs-copydocdialog-warning,.docs-copydocdialog-destination-sharewarning{color:#999;font-size:11px}.docs-copydocdialog-checkbox{font-size:14px;letter-spacing:0.2px;padding-top:5px;vertical-align:top}.docs-gm .docs-copydocdialog-checkbox{cursor:pointer;padding-top:8px}.docs-gm .docs-copydocdialog-checkbox .jfk-checkbox{margin-top:-8px;margin-right:8px}.docs-copydocdialog-checkbox.docs-copydocdialog-collaboratorcheckbox{padding-top:0}.docs-gm .docs-copydocdialog{min-width:312px;width:auto;width:unset}.docs-gm .docs-copydocdialog .docs-copydocdialog-filenameinput{width:100%}.docs-gm .docs-copydocdialog .docs-copydocdialog-destination-button{height:34px;width:294px}.docs-gm .docs-copydocdialog-destination-img{top:3px}.docs-gm .docs-copydocdialog-destination-name{vertical-align:sub}.docs-copydocdialog-checkbox-disabled{opacity:.38}.docs-gm .docs-copydocdialog-includeresolvedcommentscheckbox .jfk-checkbox{vertical-align:top;margin-top:-4px}.docs-copydocdialog-checkbox-label{width:285px;display:inline-block}.docs-copydocdialog-destination-button,.docs-copydocdialog-filenameinput{margin-top:4px}.docs-copydocdialog-destination-button{border:1px solid #ddd;margin-right:0;overflow:hidden;position:relative;text-align:left;text-overflow:ellipsis;width:250px}.docs-copydocdialog-destination-button.jfk-button-focused{border:1px solid #4d90fe}.docs-copydocdialog-destination-section{margin-top:16px}.docs-copydocdialog-destination-img{height:10px;margin-right:5px;position:relative;top:2px;width:13px}.docs-copydocdialog-description{font-size:16px;height:72px;letter-spacing:0.15px;line-height:24px;vertical-align:top;width:312px}.docs-gm .docs-copydocdialog-description{height:auto;height:unset;color:#5f6368;max-width:464px;width:100%}.goog-menu.picker-min.docs-copydocdialog-destination-picker{z-index:1003}.modal-dialog.docs-dialog.docs-copy-endangered-dialog{z-index:1007;width:376px}.modal-dialog-bg.docs-copy-endangered-dialog-bg{z-index:1006}.docs-gm .modal-dialog.docs-dialog.docs-copy-endangered-dialog{min-width:464px;width:auto;width:unset}.docs-dialog.docs-hc-gecko .modal-dialog-title-close:after{filter:invert(100%)}.docs-dialog.docs-hc-ie .modal-dialog-title-close:after{-ms-high-contrast-adjust:none;background-color:white}.docs-dialog .modal-dialog-title-close{opacity:0.54}.docs-dialog .modal-dialog-title-close:hover{opacity:0.87}.modal-dialog-title-text{font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:normal}.docs-dialog .modal-dialog-title-close:after{background:none;right:13px;top:14px;content:url(//ssl.gstatic.com/images/icons/material/system/svg/close_18px.svg);height:18px;width:18px}.docs-details-dialog{min-width:200px}.docs-details-error{margin-left:10px;margin-top:40px}.docs-details-loading{background-image:url(//ssl.gstatic.com/docs/common/loading_animation.gif);height:50px;margin:auto;width:50px}.docs-details-table{border-collapse:collapse}.docs-details-field{font-size:13px;font-weight:500;height:27px;width:100px}#docs-details-folder{margin-right:6px;outline:none;vertical-align:bottom}.docs-details-value{height:27px;max-width:200px}.docs-details-value[data-hovercard-id]{text-decoration:underline;text-decoration-style:dotted}.docs-gm .docs-details-dialog{min-width:312px;padding:24px}.docs-gm .docs-details-dialog .modal-dialog-title-text{color:#3c4043;font-size:22px;font-weight:normal;height:28px}.docs-gm .docs-details-field,.docs-gm .docs-details-value{font-size:14px;height:20px;padding:8px 0}.docs-gm .docs-details-field{color:#3c4043;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;min-width:100px;padding-right:20px}.docs-gm .docs-details-value{color:#202124;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif}.picker-iframe.picker-min{-moz-box-shadow:rgba(0,0,0,.2) 0 4px 16px;-webkit-box-shadow:rgba(0,0,0,.2) 0 4px 16px;box-shadow:rgba(0,0,0,.2) 0 4px 16px;color:#000;padding:0;position:absolute;z-index:1002}.picker-iframe.picker-minew .picker-min-frame-up{background-color:#f1f1f1}.picker-iframe.picker-white-callout.picker-minew .picker-min-frame-up{background-color:#fff}.picker-iframe.picker-min.goog-menu{border-color:#ccc;line-height:0;max-height:none;overflow:visible}.picker-iframe.picker-min-top{margin-top:15px}.picker-iframe.picker-minew.picker-min-top{margin-top:9px}.picker-iframe.picker-min-bottom{margin-top:-15px}.picker-iframe.picker-minew.picker-min-bottom{margin-top:-9px}.picker-iframe .picker-min-arrow-up,.picker-iframe .picker-min-arrow-down{position:absolute;width:32px;z-index:0}.picker-iframe .picker-min-arrow-up{top:-15px}.picker-iframe.picker-minew .picker-min-arrow-up{top:-10px;width:20px}.picker-iframe .picker-min-arrow-down{bottom:-16px}.picker-iframe.picker-minew .picker-min-arrow-down{bottom:-10px;width:20px}.picker-iframe .picker-min-arrow-inner,.picker-iframe .picker-min-arrow-border{border:16px solid;height:0;position:absolute;width:0}.picker-iframe.picker-minew .picker-min-arrow-inner,.picker-iframe.picker-minew .picker-min-arrow-border{border:10px solid}.picker-iframe.picker-minew .picker-min-arrow-up .picker-min-arrow-inner{border-color:#f1f1f1 transparent}.picker-iframe.picker-white-callout.picker-minew .picker-min-arrow-up .picker-min-arrow-inner{border-color:#fff transparent}.picker-iframe .picker-min-arrow-up .picker-min-arrow-inner{border-color:#fff transparent;top:1px;z-index:1}.picker-iframe .picker-min-arrow-down .picker-min-arrow-inner{border-color:#fff transparent;bottom:1px;z-index:1}.picker-iframe .picker-min-arrow-up .picker-min-arrow-border,.picker-iframe .picker-min-arrow-down .picker-min-arrow-border{border-color:rgba(0,0,0,0.2) transparent}.picker-iframe .picker-min-arrow-down .picker-min-arrow-border{bottom:0}.picker-iframe .picker-min-arrow-up .picker-min-arrow-inner,.picker-iframe .picker-min-arrow-up .picker-min-arrow-border{border-top-width:0}.picker-iframe .picker-min-arrow-down .picker-min-arrow-inner,.picker-iframe .picker-min-arrow-down .picker-min-arrow-border{border-bottom-width:0}.drive-organize-atd-popup{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;vertical-align:middle}.drive-organize-atd-popup-undo-btn{margin:auto}.drive-organize-popup{position:absolute;z-index:1002;-webkit-box-shadow:rgba(0,0,0,0.2) 0 4px 16px;-moz-box-shadow:rgba(0,0,0,0.2) 0 4px 16px;box-shadow:rgba(0,0,0,0.2) 0 4px 16px;background-color:#f1f1f1;border:1px solid rgba(0,0,0,0.2);color:#6e6e6e;font-size:13px;font-weight:normal;text-align:left;white-space:nowrap}.drive-organize-popup-outline-hidden *:focus{outline:none}.drive-organize-popup-content{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;padding:10px}.drive-organize-popup-message{overflow:hidden;text-overflow:ellipsis;-webkit-box-orient:vertical;-webkit-line-clamp:6;display:-webkit-box;max-height:90px;margin:auto;max-width:160px;padding-right:10px;word-break:break-word}.drive-organize-button{display:inline-block;margin:auto}.drive-organize-popup-link-btn{color:#15c;cursor:pointer;padding:0 7px}.drive-organize-popup-close-btn{cursor:pointer;height:15px;padding:3px;vertical-align:middle}.drive-organize-popup-link-btn.drive-organize-button-hover{text-decoration:underline}.drive-organize-popup-arrow{position:absolute;width:20px}.drive-organize-popup-arrow .drive-organize-popup-triangle-before,.drive-organize-popup-arrow .drive-organize-popup-triangle-after{content:'';display:block;height:0;position:absolute;width:0}.drive-organize-popup-arrow .drive-organize-popup-triangle-before{border:10px solid}.drive-organize-popup-arrow .drive-organize-popup-triangle-after{border:9px solid}.drive-organize-popup-arrowdown{bottom:0}.drive-organize-popup-arrowup{top:-10px}.drive-organize-popup-arrowdown .drive-organize-popup-triangle-before,.drive-organize-popup-arrowup .drive-organize-popup-triangle-before{border-color:rgba(0,0,0,0.2) transparent;left:0}.drive-organize-popup-arrowdown .drive-organize-popup-triangle-after,.drive-organize-popup-arrowup .drive-organize-popup-triangle-after{border-color:#f1f1f1 transparent;left:1px}.drive-organize-popup-arrowdown .drive-organize-popup-triangle-before{border-bottom-width:0}.drive-organize-popup-arrowdown .drive-organize-popup-triangle-after{border-bottom-width:0}.drive-organize-popup-arrowup .drive-organize-popup-triangle-before{border-top-width:0}.drive-organize-popup-arrowup .drive-organize-popup-triangle-after{border-top-width:0;top:2px}.drive-organize-dialog{-webkit-box-shadow:0 4px 16px rgba(0,0,0,.2);-moz-box-shadow:0 4px 16px rgba(0,0,0,.2);box-shadow:0 4px 16px rgba(0,0,0,.2);background:#fff;background-clip:padding-box;color:#000;font-family:inherit;outline:0;padding:24px;position:absolute;width:560px;z-index:2204}.drive-organize-dialog-bg{background:#000;left:0;position:absolute;top:0;z-index:2203}div.drive-organize-dialog-bg{filter:alpha(opacity=50);opacity:.50}.drive-organize-dialog-title{background-color:#fff;color:#000;cursor:default;font-size:20px;font-weight:normal;line-height:24px}.drive-organize-dialog-title-close{height:11px;margin:24px;opacity:0.7;padding:6px;position:absolute;right:0;top:0;width:11px}.drive-organize-dialog-title-close:after{background:url(//ssl.gstatic.com/ui/v1/dialog/close-x.png);content:'';height:11px;position:absolute;width:11px}.drive-organize-dialog-title-close:hover{opacity:1}.drive-organize-dialog-content{background-color:#fff;font-size:16px;line-height:1.4em;padding-top:24px;padding-bottom:24px;word-wrap:break-word}.drive-organize-dialog-buttons{text-align:right}.drive-organize-dialog-buttons .drive-organize-button{-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;background-color:#f5f5f5;background-image:-webkit-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:-moz-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:-ms-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:-o-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:linear-gradient(top,#f5f5f5,#f1f1f1);border:1px solid #dcdcdc;border:1px solid rgba(0,0,0,0.1);color:#444;cursor:default;font-family:inherit;font-size:11px;font-weight:bold;height:29px;line-height:27px;margin:0 0 0 16px;min-width:72px;outline:0;padding:0 8px}.drive-organize-dialog-buttons .drive-organize-button:hover,.drive-organize-dialog-buttons .drive-organize-button:active{-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 1px rgba(0,0,0,0.1);box-shadow:0 1px 1px rgba(0,0,0,0.1);background-color:#f8f8f8;background-image:-webkit-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-moz-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-ms-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-o-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:linear-gradient(top,#f8f8f8,#f1f1f1);border:1px solid #c6c6c6;color:#333}.drive-organize-dialog-buttons .drive-organize-button:active{-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.drive-organize-dialog-buttons .drive-organize-button:focus{border:1px solid #4d90fe}.drive-organize-dialog-buttons .drive-organize-button[disabled]{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;background:#fff;background-image:none;border:1px solid #f3f3f3;border:1px solid rgba(0,0,0,0.5);color:rgba(0,0,0,.26)}.drive-organize-dialog-buttons .goog-buttonset-action{background-color:#4d90fe;background-image:-webkit-linear-gradient(top,#4d90fe,#4787ed);background-image:-moz-linear-gradient(top,#4d90fe,#4787ed);background-image:-ms-linear-gradient(top,#4d90fe,#4787ed);background-image:-o-linear-gradient(top,#4d90fe,#4787ed);background-image:linear-gradient(top,#4d90fe,#4787ed);border:1px solid #3079ed;color:#fff}.drive-organize-dialog-buttons .goog-buttonset-action:hover,.drive-organize-dialog-buttons .goog-buttonset-action:active{background-color:#357ae8;background-image:-webkit-linear-gradient(top,#4d90fe,#357ae8);background-image:-moz-linear-gradient(top,#4d90fe,#357ae8);background-image:-ms-linear-gradient(top,#4d90fe,#357ae8);background-image:-o-linear-gradient(top,#4d90fe,#357ae8);background-image:linear-gradient(top,#4d90fe,#357ae8);border:1px solid #2f5bb7;color:#fff}.drive-organize-dialog-buttons .goog-buttonset-action:active{-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.3);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.3);box-shadow:inset 0 1px 2px rgba(0,0,0,0.3)}.drive-organize-dialog-buttons .goog-buttonset-action:focus{-webkit-box-shadow:inset 0 0 0 1px #fff;-moz-box-shadow:inset 0 0 0 1px #fff;box-shadow:inset 0 0 0 1px #fff;border:1px solid #fff;border:rgba(0,0,0,0) solid 1px;outline:1px solid #4d90fe;outline:rgba(0,0,0,0) 0}.drive-organize-dialog-buttons .goog-buttonset-action[disabled]{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;background:#4d90fe;color:#fff;filter:alpha(opacity=50);opacity:0.5}.drive-organize-dialog .goog-menu{box-shadow:none;margin-bottom:-24px;padding:0;position:relative;z-index:inherit}.drive-organize-dialog .goog-menuitem{color:#000;font-size:13px;height:16px;margin:0;opacity:.87;padding:0 0 24px 16px}.drive-organize-dialog-parent-name{font-weight:bold}.drive-organize-dialog-list-item{display:block;overflow:hidden;text-overflow:ellipsis}.drive-organize-dialog .goog-menuitem-highlight{border-left:0;background-color:inherit}.drive-organize-dialog .goog-menuitem-content{margin:0}.drive-organize-dialog .goog-menuitem-highlight .goog-menuitem-content,.drive-organize-dialog .goog-option-selected .goog-menuitem-content{color:inherit}.drive-organize-dialog .goog-menuitem-active .goog-menuitem-checkbox{background:rgba(235,235,235,1)}.drive-organize-dialog .goog-menuitem-focus .goog-menuitem-checkbox{border-color:rgba(77,144,254,1)}.drive-organize-dialog .goog-option-selected{background:rgba(255,255,255,0)}.drive-organize-dialog .goog-option-selected .goog-menuitem-checkbox::after{-webkit-border-radius:50%;-moz-border-radius:50%;border-radius:50%;background:rgba(96,96,96,1);content:'';display:block}.modal-dialog.docs-endangered-doc-warning-dialog{z-index:1007}.modal-dialog-bg.docs-endangered-doc-warning-dialog-bg{z-index:1006}.docs-gm .modal-dialog.docs-endangered-doc-warning-dialog{min-width:464px;width:auto;width:unset}.fatal-error-dialog-container{display:table;width:374px}.fatal-error-dialog-contents{display:table-row;min-height:100px}.fatal-error-dialog-contents a:hover{cursor:pointer}.fatal-error-message{display:table-cell;vertical-align:middle;width:320px}.fatal-error-debug-text{font-size:85%;height:200px;width:90%}.docs-invite-favicon{height:16px;margin-right:5px;vertical-align:sub;width:16px}.docs-invite-header{height:77px;max-height:77px;width:100%;overflow-x:hidden;overflow-y:hidden;background:#f5f5f5;font-size:12.5px;color:#444;border-bottom:1px solid #d9d9d9}.docs-invite-header>div{display:table;width:100%;height:100%;max-height:inherit}.docs-invite-button{margin-right:25px}.docs-invite-fixedcol{display:table-cell;vertical-align:middle;white-space:nowrap}.docs-invite-flexcol{display:table-cell;width:100%;vertical-align:middle;max-height:inherit}.docs-invite-inviter-img{height:60px;border:1px solid #ccc;margin-left:25px}.docs-invite-heavy{font-weight:500;color:#222}.docs-invite-business-icon{margin-left:40px}.docs-invite-msg{margin:0px 10px 0px 25px;max-height:inherit;line-height:2.0}.docs-invite-business-header{position:absolute;z-index:1}#titlebar-mode-indicator-container{margin-right:10px}#titlebar-mode-indicator-container>div{border-radius:4px;text-transform:none;font-size:14px;font-weight:500;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;height:36px;line-height:calc(36px - 2px)}.docs-hub-appbar #titlebar-mode-indicator-container>div{align-items:center;color:#188038;display:flex;height:28px;letter-spacing:0.25px}.docs-hub-appbar #titlebar-mode-indicator-container>.titlebar-request-access-button{padding-left:16px;padding-right:16px}#titlebar-mode-indicator-container .docs-approval-status-indicator>.docs-icon,#titlebar-mode-indicator-container .docs-approval-lock>.docs-icon{margin-right:8px}.kix-titlebar-mode-switcher.docs-material-menu-button-flat-primary .docs-icon-img.docs-icon-acl-view-only,.kix-titlebar-mode-switcher.docs-material-menu-button-flat-primary .docs-icon-img.docs-icon-acl-view-only:before{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_blue.svg)}.kix-titlebar-mode-switcher .docs-material-menu-button-flat-primary-dropdown{vertical-align:middle}.kix-titlebar-mode-switcher .docs-material-menu-button-flat-primary-dropdown-icon{opacity:1}.docs-hub-appbar #titlebar-mode-indicator-container>.kix-titlebar-approvals-button{float:left}#titlebar-mode-indicator-container>.kix-titlebar-approvals-button.docs-material-menu-button-flat-primary,#titlebar-mode-indicator-container>.kix-titlebar-approvals-button.docs-material-menu-button-flat-primary-hover.docs-material-menu-button-flat-primary-focused{border:none}#titlebar-mode-indicator-container .kix-titlebar-approvals-button.docs-material-menu-button-flat-primary .docs-material-menu-button-flat-primary-dropdown{margin-top:5px}#titlebar-mode-indicator-container>.docs-material-menu-button-flat-primary,.titlebar-request-access-button.docs-material-button,.titlebar-request-access-button.docs-material-button.docs-material-button-focused.docs-material-button-no-focus-border,.kix-titlebar-approvals-button.docs-material-button,.kix-titlebar-approvals-button.docs-material-button.docs-material-button-focused.docs-material-button-no-focus-border{border:1px solid #e8eaed}#titlebar-mode-indicator-container>.docs-material-menu-button-flat-primary-hover,.titlebar-request-access-button.docs-material-button.docs-material-button-hover,.kix-titlebar-approvals-button.docs-material-button.docs-material-button-hover{background:#f8fcf9;border:1px solid #c8e7d1}#titlebar-mode-indicator-container>.docs-material-menu-button-flat-primary-focused,.titlebar-request-access-button.docs-material-button.docs-material-button-focused,.kix-titlebar-approvals-button.docs-material-button.docs-material-button-focused{background:#e7f5eb;border:1px solid #bbe2c6}.titlebar-request-access-button.docs-material-button.docs-material-button-focused,.kix-titlebar-approvals-button.docs-material-button.docs-material-button-focused{line-height:32px;padding:0 8px}#titlebar-mode-indicator-container>.docs-material-menu-button-flat-primary-hover.docs-material-menu-button-flat-primary-focused,.titlebar-request-access-button.docs-material-button.docs-material-button-hover.docs-material-button-focused,.kix-titlebar-approvals-button.docs-material-button.docs-material-button-hover.docs-material-button-focused{background:#dff2e4;border:1px solid #b5e0c1}#titlebar-mode-indicator-container>.docs-material-menu-button-flat-primary-open,.titlebar-request-access-button.docs-material-button.docs-material-button-active,.kix-titlebar-approvals-button.docs-material-button.docs-material-button-active{box-shadow:0 2px 6px 2px rgba(60,64,67,.15)}.titlebar-request-access-button-tooltip{max-width:200px}.docs-parent-collections-container-prefix,.docs-parent-collections-container-text{color:rgba(0,0,0,.54);padding-left:4px}.docs-parent-collections-container-folder-name{color:rgba(0,0,0,.87);font-size:14px;padding-left:4px;bottom:1px}.docs-parent-collections-container{padding:2px 4px 0px 2px}.docs-parent-collections-container:hover,.docs-parent-collections-container:focus{background-color:#eeeeee;border-radius:2px}.docs-parent-collections-container-icon{bottom:2px}.docs-parent-collections-container-icon:not(.docs-parent-collections-container-icon-material){opacity:.54}.request-comment-access-toast-link{text-transform:uppercase;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-weight:500!important}.modal-dialog.docs-dialog.docs-restore-dialog{z-index:1007}.modal-dialog-bg.docs-restore-dialog-bg{z-index:1006}.docs-gm .modal-dialog.docs-dialog.docs-restore-dialog{min-width:464px;width:auto;width:unset}#docs-toolbar-iterator-label{color:rgba(0,0,0,0.87);font-size:13px;line-height:24px;margin-right:10px;margin-top:4px;vertical-align:middle}#docs-toolbar-iterator-previous,#docs-toolbar-iterator-next{margin-left:3px;margin-right:3px}.docs-in-editor-sync-state-icon{float:right;margin:0 0 0 24px;vertical-align:middle}.docs-in-editor-sync-state-icon .docs-icon{height:20px;margin:0;opacity:1;width:20px}.docs-in-editor-animated-sync{-webkit-animation-duration:2s;-moz-animation-duration:2s;-o-animation-duration:2s;animation-duration:2s;-webkit-animation-iteration-count:infinite;-moz-animation-iteration-count:infinite;-o-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:spin;-moz-animation-name:spin;-o-animation-name:spin;animation-name:spin;-webkit-animation-timing-function:linear;-moz-animation-timing-function:linear;-o-animation-timing-function:linear;animation-timing-function:linear;-webkit-transform-origin:center;-moz-transform-origin:center;-ms-transform-origin:center;-o-transform-origin:center;transform-origin:center}@keyframes spin{0%{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-ms-transform:rotate(360deg);-o-transform:rotate(360deg);transform:rotate(360deg)}100%{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);-o-transform:rotate(0deg);transform:rotate(0deg)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-ms-transform:rotate(360deg);-o-transform:rotate(360deg);transform:rotate(360deg)}100%{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);-o-transform:rotate(0deg);transform:rotate(0deg)}}.docs-offline-optindialog-short-disclaimer{margin-top:20px}.docs-offline-optindialog-disclaimer-link{cursor:pointer}#docs-offline-optindialog-disclaimer-link.docs-offline-optindialog-disclaimer-link-disabled{color:#ccc;pointer-events:none;text-decoration:none}.docs-offline-optindialog-disclaimer{margin-top:20px;max-width:400px}.docs-offline-optinpromo.jfk-bubble{font-size:13px;max-width:500px;outline:none;padding-left:24px;padding-top:11px;position:fixed;right:15px;top:113px}.docs-offline-optinpromo .jfk-bubble-arrow{display:none}#docs-offline-optinpromo-title{font-size:19px;font-weight:500;margin:12px 0}.docs-offline-optinpromo-notice{color:#767676;font-size:11px;margin:14px 0}.docs-offline-optinpromo-notice a{text-decoration:none}.docs-offline-optinpromo hr{border-top-color:#e1e1e1;border-top-style:solid;border-width:1px 0 0 0}.docs-offline-optinpromo-confirm-buttons{margin-top:15px}.docs-offline-welcomepromo{width:400px}.docs-offline-welcomepromo .modal-dialog-content{padding-right:80px;position:relative}.doc-offline-welcomepromo-img{position:absolute;right:0;top:-25px}.docs-gm #docs-offline-optinpromo-title,.docs-gm .docs-offline-optinpromo-buttons{padding:0}.docs-labelinputmenuitem{outline:none;padding-right:30px;padding-left:30px}#docs-omnibox-toolbar .docs-omnibox-autocomplete{margin-right:4px}.docs-omnibox-autocomplete{margin-top:4px}.docs-omnibox-input{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:100%;min-width:178px}.docs-omnibox-input::-webkit-input-placeholder{color:#777;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:11px;font-weight:500;opacity:1;padding-top:2px}.docs-omnibox-input::-moz-placeholder{color:#777;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:11px;font-weight:500;opacity:1}.docs-omnibox-input:-ms-input-placeholder{color:#777;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:11px;font-weight:500;opacity:1}.docs-gm .docs-omnibox-input.jfk-textinput{border:1px solid #dadce0;border-radius:4px;box-sizing:border-box;color:#3c4043;padding:1px 8px;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;line-height:16px;height:20px}.docs-gm .docs-omnibox-input.jfk-textinput::placeholder{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;line-height:16px}.docs-gm .docs-omnibox-input.jfk-textinput:focus{border:2px solid #1a73e8;box-shadow:none;padding:0px 7px}.docs-omnibox-autocomplete .ac-renderer{box-shadow:0 2px 4px rgba(0,0,0,0.2);border:1px solid #ccc;background-color:#fff;min-width:250px;outline:medium none;position:fixed;width:auto;z-index:1003}.docs-omnibox-autocomplete .ac-highlighted{font-weight:500}.docs-omnibox-autocomplete .ac-active{background-color:#eee}.docs-omnibox-row-content{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif}.docs-promo-title-prefix{color:#d25342;font-weight:500}.docs-promo-title{color:#333;font-weight:500}.docs-promo-content{color:#666;cursor:pointer}.docs-promo-dismiss-link{color:#15c;cursor:pointer}.jfk-bubble.jfk-bubble-promo.docs-promo-bubble .jfk-bubble-arrowdown .jfk-bubble-arrowimplbefore,.jfk-bubble.jfk-bubble-promo.docs-promo-bubble .jfk-bubble-arrowup .jfk-bubble-arrowimplbefore{border-color:rgba(0,0,0,.1) transparent}.jfk-bubble.jfk-bubble-promo.docs-promo-bubble .jfk-bubble-arrowleft .jfk-bubble-arrowimplbefore,.jfk-bubble.jfk-bubble-promo.docs-promo-bubble .jfk-bubble-arrowright .jfk-bubble-arrowimplbefore{border-color:transparent rgba(0,0,0,.1)}.jfk-bubble.jfk-bubble-promo.docs-promo-bubble .jfk-bubble-arrowdown .jfk-bubble-arrowimplafter{border:10px solid;border-bottom-width:0;border-color:#fafafa transparent}.jfk-bubble.jfk-bubble-promo.docs-promo-bubble .jfk-bubble-arrowup .jfk-bubble-arrowimplafter{border:10px solid;border-top-width:0;border-color:#fafafa transparent}.jfk-bubble.jfk-bubble-promo.docs-promo-bubble .jfk-bubble-arrowleft .jfk-bubble-arrowimplafter{border:10px solid;border-left-width:0;border-color:transparent #fafafa}.jfk-bubble.jfk-bubble-promo.docs-promo-bubble .jfk-bubble-arrowright .jfk-bubble-arrowimplafter{border:10px solid;border-right-width:0;border-color:transparent #fafafa}.jfk-bubble.docs-promo-bubble{background-color:#fafafa;border:none;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;box-shadow:rgba(255,255,255,.9) 0 1px 0 inset,rgba(0,0,0,.03) 0 -1px 0 inset,rgba(0,0,0,.15) 0 15px 10px,rgba(0,0,0,.3) 0 8px 36px;padding:0}.docs-gm-promo.jfk-bubble.docs-promo-bubble{background-color:#188038;border-radius:8px;box-shadow:0 2px 6px 2px rgba(60,64,67,.15);margin-top:4px}.docs-gm-promo.jfk-bubble.jfk-bubble-promo.docs-promo-bubble .jfk-bubble-arrowimplbefore{border-color:transparent}.docs-gm-promo.jfk-bubble.jfk-bubble-promo.docs-promo-bubble .jfk-bubble-arrowimplafter{border-color:#188038 transparent}.docs-promo-text-container{width:363px;word-wrap:break-word}.docs-promo-text-container-ltr{float:right}.docs-promo-container{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:24px 16px 0 16px}.docs-gm-promo .docs-promo-container{padding:16px}.docs-promo-icon-container{width:48px;height:48px;margin-right:16px;float:left}.docs-promo-header{color:#000;opacity:0.87;font-size:15px;font-weight:500}.docs-gm-promo .docs-promo-header{color:#fff;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:16px;font-weight:500;opacity:1}.docs-promo-header-prefix{color:#d25342}.docs-promo-body{color:#666;font-size:13px;line-height:20px;padding-top:20px}.docs-gm-promo .docs-promo-body{color:#fff;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;padding:4px 0}.docs-promo-action-row{font-weight:500;padding-top:20px;padding-right:8px;padding-bottom:24px;position:relative;text-align:right}.docs-gm-promo .docs-promo-action-row{padding:0}.docs-promo-action-row a,.docs-promo-action-row a:link,.docs-promo-action-row a:active,.docs-promo-action-row a:hover,.docs-promo-action-row a:visited{text-decoration:none}.docs-promo-action-row a,.docs-promo-action-row a:link,.docs-promo-action-row a:active,.docs-promo-action-row a:hover,.docs-promo-action-row a:visited{color:#4285f4}.docs-promo-action-container{color:#4285f4;cursor:pointer;text-transform:uppercase}.docs-gm-promo .docs-promo-action-container{color:#fff;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;margin:0 0 0 20px;text-transform:none}.docs-gm-promo .docs-promo-action-container:focus{outline-color:#fff}.docs-promo-action-button-right{margin-left:12.5px;float:right}.docs-promo-action-button-left{margin-right:12.5px}.docs-promo-two-buttons .docs-promo-action-button-right{max-width:125px;text-align:center}.docs-promo-two-buttons .docs-promo-action-button-left{max-width:61px;text-align:center}.docs-revisions-chromecover-titlebar{-ms-flex-align:center;-moz-box-align:center;-webkit-box-align:center;box-align:center;-webkit-align-items:center;align-items:center;display:flex;flex-direction:row;-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;box-pack:start;-ms-flex-pack:start;-webkit-box-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;font-size:16px;max-width:50vw}.docs-gm .docs-revisions-chromecover-titlebar{font-size:18px;line-height:24px}.docs-revisions-chromecover-titlebar-name-label{font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:normal;font-weight:var(--docs-material-font-weight-bold,normal);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.docs-gm .docs-revisions-chromecover-titlebar-name-label{font-weight:400}.docs-revisions-chromecover-titlebar[class*="docs-hc"] .docs-revisions-chromecover-titlebar-button-action{border:1px solid #fff}.docs-revisions-chromecover-titlebar-button-back-container{height:100%;min-width:58px}.docs-revisions-chromecover-titlebar-button-back{background-color:transparent;border:0;cursor:pointer;left:18px;margin:0;outline:0;padding:0}.docs-revisions-chromecover-titlebar-button-back.docs-material .docs-icon{height:21px;width:21px;margin:0;padding-bottom:3px}.docs-revisions-chromecover-titlebar-button-action{-ms-flex-align:center;-moz-box-align:center;-webkit-box-align:center;box-align:center;-webkit-align-items:center;align-items:center;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;display:flex;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-tap-highlight-color:transparent;background-color:#0f9d58;border:none;color:#fff;cursor:pointer;font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;height:36px;margin:0 0 0 24px;outline:none;padding:0 16px;text-transform:uppercase;white-space:nowrap;will-change:box-shadow,filter,background-color,color}.docs-gm .docs-revisions-chromecover-titlebar-button-action{padding:0 24px;text-transform:none}.docs-revisions-chromecover-titlebar-button-action,.docs-revisions-chromecover-titlebar-button-action.goog-flat-button-active,.docs-revisions-chromecover-titlebar-button-action.goog-flat-button-hover{-webkit-transition-duration:0.28s;-moz-transition-duration:0.28s;-o-transition-duration:0.28s;transition-duration:0.28s;-webkit-transition-property:box-shadow,filter,background-color,color;-moz-transition-property:box-shadow,filter,background-color,color;-o-transition-property:box-shadow,filter,background-color,color;transition-property:box-shadow,filter,background-color,color;-webkit-transition-timing-function:cubic-bezier(0.4,0.0,0.2,1);-moz-transition-timing-function:cubic-bezier(0.4,0.0,0.2,1);-o-transition-timing-function:cubic-bezier(0.4,0.0,0.2,1);transition-timing-function:cubic-bezier(0.4,0.0,0.2,1)}.docs-revisions-chromecover-titlebar-button-action.goog-flat-button-active,.docs-revisions-chromecover-titlebar-button-action.goog-flat-button-focused{filter:brightness(88%)}.docs-revisions-chromecover-titlebar-button-action.goog-flat-button-active{box-shadow:0 6px 10px 0 rgba(0,0,0,0.14),0 1px 18px 0 rgba(0,0,0,0.12),0 3px 5px -1px rgba(0,0,0,0.2)}.docs-revisions-chromecover-titlebar-button-action.goog-flat-button-hover:not(.goog-flat-button-active){box-shadow:0 2px 2px 0 rgba(0,0,0,0.14),0 3px 1px -2px rgba(0,0,0,0.12),0 1px 5px 0 rgba(0,0,0,0.2)}.docs-revisions-chromecover-content{-ms-flex-align:center;-moz-box-align:center;-webkit-box-align:center;box-align:center;-webkit-align-items:center;align-items:center;display:flex;flex-direction:row;box-pack:start;-ms-flex-pack:start;-webkit-box-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start;height:inherit}.docs-revisions-chromecover-content-exclude-sidebar-width{width:calc(100% - 250px)}.docs-gm .docs-revisions-chromecover-content-exclude-sidebar-width{width:calc(100% - 300px)}.docs-revisions-chromecover-content-color-default{background-color:#424242;color:#fff}.docs-gm .docs-revisions-chromecover-content-color-default{background-color:#fff;color:#202124}.docs-revisions-icon{cursor:pointer;direction:ltr;height:24px;min-height:24px;min-width:24px;outline:none;position:relative;text-align:left;vertical-align:middle;width:24px}.docs-hc-gecko .docs-revisions-icon{filter:invert(100%)}.docs-hc-ie .docs-revisions-icon{-ms-high-contrast-adjust:none;background-color:#fff}.docs-revisions-icon-rtl{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.docs-revisions-icon-focused:before{-webkit-transform:scale(1.375);-moz-transform:scale(1.375);-ms-transform:scale(1.375);-o-transform:scale(1.375);transform:scale(1.375);-webkit-border-radius:50%;-moz-border-radius:50%;border-radius:50%;background-color:#000;content:'';display:block;height:inherit;opacity:.12;position:absolute;width:inherit}.docs-revisions-icon-img-mask{height:inherit;overflow:hidden;position:absolute;width:inherit}.docs-revisions-icon-img:before{content:url(//ssl.gstatic.com/docs/common/revisions_sprite1.svg)}.docs-revisions-icon-img{height:72px;position:absolute;width:24px}.docs-revisions-icon-open .docs-revisions-icon-arrow{left:0;top:-48px}.docs-revisions-icon-arrow{left:0;top:0}.docs-revisions-icon-overflow{left:0;top:-24px}.docs-revisions-sidebar{display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;background-color:#fff;height:100%;outline-style:none;position:absolute;right:0;width:250px;z-index:2}.docs-gm .docs-revisions-sidebar{overflow:hidden;box-shadow:-3px 0px 6px -3px rgba(60,64,67,.15),3px 0px 6px -3px rgba(60,64,67,.15);width:300px}.docs-revisions-sidebar-header{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.docs-gm .docs-revisions-sidebar-header{background-color:#fff;color:#202124}.docs-revisions-sidebar[class*="docs-hc"]{border-left:1px solid #fff}.docs-revisions-sidebar[class*="docs-hc"]>.docs-revisions-sidebar-header{border-bottom:1px solid #fff}.docs-revisions-sidebar-header-bg-color-brand{background-color:#0f9d58}.docs-revisions-sidebar-header-text-color-brand{color:#fff}.docs-revisions-sidebar-title{-ms-flex-align:center;-moz-box-align:center;-webkit-box-align:center;box-align:center;-webkit-align-items:center;align-items:center;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:flex;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:16px;height:60px;padding:18px;width:100%}.docs-gm .docs-revisions-sidebar-title{font-size:16px;line-height:24px;padding:20px 16px}.docs-revisions-sidebar-name-filter-switch-container{-ms-flex-align:center;-moz-box-align:center;-webkit-box-align:center;box-align:center;-webkit-align-items:center;align-items:center;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:flex;border-top:1px solid rgba(255,255,255,0.2);height:47px;justify-content:space-between;padding:14px 14px 14px 18px;width:100%}.docs-gm .docs-revisions-sidebar-name-filter-switch-container{border-bottom:1px solid #dadce0;border-top:1px solid #dadce0;padding:12px 16px;height:40px}.docs-revisions-sidebar-name-filter-switch-container label{color:#fff;cursor:pointer;font-size:12px;font-weight:normal;opacity:0.87;word-break:break-word}.docs-gm .docs-revisions-sidebar-name-filter-switch-container label{color:#3c4043;line-height:16px}.docs-revisions-sidebar-revisions-list{position:relative;overflow:auto;overflow-x:hidden}.docs-revisions-sidebar-revisions-list:focus{outline-style:none}.docs-revisions-sidebar-revisions-list:focus-visible,.docs-revisions-sidebar-revisions-list:moz-focusring{outline-style:auto}body:not(.docs-gm) .docs-revisions-sidebar-revisions-list::-webkit-scrollbar{width:11px}body:not(.docs-gm) .docs-revisions-sidebar-revisions-list::-webkit-scrollbar-thumb{border-width:1px}body:not(.docs-gm) .docs-revisions-sidebar-revisions-list::-webkit-scrollbar-track{border-width:0}.docs-revisions-sidebar-actions{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;border-top:1px solid #cfcfcf;padding:9px 14px}.docs-revisions-sidebar-detail-button,#docs-revisions-sidebar-iw-button{margin-top:9px}.docs-revisions-sidebar-date-group{-ms-flex-align:center;-moz-box-align:center;-webkit-box-align:center;box-align:center;-webkit-align-items:center;align-items:center;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:flex;background-color:#f5f5f5;border-bottom:1px solid #eee;color:#616161;font-size:13px;font-weight:500;height:35px;padding-left:18px}.docs-gm .docs-revisions-sidebar-date-group{color:#3c4043;background-color:#fff;font-size:11px;font-weight:500;line-height:21px;text-transform:uppercase}.docs-revisions-sidebar-revisions-list-container{overflow:auto}.docs-revisions-sidebar-revisions-empty-container{display:flex;-ms-flex-align:center;-moz-box-align:center;-webkit-box-align:center;box-align:center;-webkit-align-items:center;align-items:center;-ms-flex:1 0 auto;-webkit-flex:1 0 auto;flex:1 0 auto}.docs-revisions-sidebar-revisions-empty{color:#616161;margin:0 18px;text-align:center}.docs-gm .docs-revisions-sidebar-revisions-empty-details{color:#80868b;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;line-height:20px}.docs-revisions-sidebar-revisions-empty-title{font-size:15px;font-weight:500}.docs-gm .docs-revisions-sidebar-revisions-empty-title{color:#3c4043;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:16px;font-weight:500;line-height:24px}.docs-revisions-sidebar-revisions-empty-details,.docs-revisions-sidebar-revisions-empty-title{margin-bottom:8px}a.docs-revisions-sidebar-revisions-empty-learn-more{color:#4285f4}.docs-gm a.docs-revisions-sidebar-revisions-empty-learn-more{color:#1a73e8;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;line-height:20px}.docs-ui-toast.docs-revisions-snack{z-index:1001}.docs-revisions-snack .docs-ui-toast-control{font-weight:500;text-transform:uppercase}.docs-revisions-snapshot-prompt .jfk-textinput{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;height:29px;margin-top:16px;width:100%}.docs-revisions-snapshot-prompt-loading-indicator,.docs-revisions-snapshot-prompt-loading-indicator .docs-spinner{-ms-flex-align:center;-moz-box-align:center;-webkit-box-align:center;box-align:center;-webkit-align-items:center;align-items:center;display:flex;box-pack:center;-ms-flex-pack:center;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center}.docs-revisions-snapshot-prompt-loading-indicator{min-height:96px;min-width:300px}.docs-revisions-snapshot-prompt-loading-indicator .docs-spinner{height:32px;width:32px}.docs-revisions-snapshot-prompt-loading-indicator .docs-quantum-spinner{margin:0;position:initial}.docs-revisions-switch{cursor:pointer;margin-left:14px}.docs-revisions-switch[class*="docs-hc"]>.apps-ui-material-slide-toggle-thumb,.docs-revisions-switch[class*="docs-hc"]>.apps-ui-material-slide-toggle-track{border:1px solid #fff;will-change:border-style}.docs-revisions-switch .apps-ui-material-slide-toggle-thumb{background-color:#bdbdbd}.docs-gm .docs-revisions-switch .apps-ui-material-slide-toggle-thumb{background-color:#fff}.docs-revisions-switch .apps-ui-material-slide-toggle-track{background-color:#fff;opacity:.3}.docs-gm .docs-revisions-switch .apps-ui-material-slide-toggle-track{background-color:#9aa0a6;opacity:1}.docs-revisions-switch.apps-ui-material-slide-toggle-container-checked .apps-ui-material-slide-toggle-thumb{background-color:#fafafa}.docs-gm .docs-revisions-switch.apps-ui-material-slide-toggle-container-checked .apps-ui-material-slide-toggle-thumb{background-color:#0f9d58}.docs-revisions-switch.apps-ui-material-slide-toggle-container-checked .apps-ui-material-slide-toggle-track{background-color:#000;opacity:.38}.docs-gm .docs-revisions-switch.apps-ui-material-slide-toggle-container-checked .apps-ui-material-slide-toggle-track{background-color:#0f9d58}.docs-revisions-tile{contain:content;outline:none;position:relative}.docs-revisions-tile-content-wrapper{padding-bottom:12px;border-bottom:1px solid #eee}.docs-revisions-tile-selected{background-color:#e2f3eb}.docs-revisions-tile-hover:not(.docs-revisions-tile-selected){background-color:#f5f5f5}.docs-revisions-tile-header{display:flex;flex-direction:column;font-size:13px;font-size:var(--docs-material-font-size-normal,13px);padding:12px 18px 3px 36px;position:relative}.docs-revisions-tile-actions,.docs-revisions-tile-collaborator-list{margin:0 18px 0 36px}.docs-gm .docs-revisions-tile-actions{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;line-height:16px;padding-top:3px}.docs-revisions-tile-collaborator{display:flex;flex-direction:column;font-size:12px}.docs-revisions-tile-collaborator-name{-ms-flex-align:center;-moz-box-align:center;-webkit-box-align:center;box-align:center;-webkit-align-items:center;align-items:center;display:flex;color:#585858}.docs-gm .docs-revisions-tile-collaborator{line-height:16px}.docs-gm .docs-revisions-tile-collaborator-name{color:#3c4043;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif}.docs-revisions-tile-collaborator-link{line-height:1;margin-top:3px}.docs-gm .docs-revisions-tile-collaborator-link{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;line-height:16px;margin-top:3px}.docs-revisions-tile-indented{margin-left:50px}.docs-revisions-tile-indented .docs-revisions-tile-header{padding-left:0}.docs-revisions-tile-indented .docs-revisions-tile-actions,.docs-revisions-tile-indented .docs-revisions-tile-collaborator-list{margin-left:0}.docs-revisions-tile-caption-v0{color:#808080;font-size:11px}.docs-revisions-tile-show-v0{color:#4275d6;font-size:11px}.docs-revisions-tile-show-v0-link{cursor:pointer;font-weight:500}.docs-revisions-tile-swatch{width:8px;height:8px;margin-right:5px}.docs-gm .docs-revisions-tile-swatch{border-radius:50%}.docs-revisions-tile-arrow-button,.docs-revisions-tile-menu-button{position:absolute}.docs-revisions-tile-arrow-button{left:9px;top:10px}.docs-revisions-tile-menu-button{right:9px;top:10px}.docs-revisions-tile-shade{border-bottom:1px solid #eee;cursor:progress;height:100%;position:absolute;width:100%;z-index:1}.docs-revisions-tile-shade:before{background-color:#fff;content:'';display:block;height:inherit;opacity:0.95;width:inherit}.docs-revisions-tile-shade .docs-spinner{-ms-flex-align:center;-moz-box-align:center;-webkit-box-align:center;box-align:center;-webkit-align-items:center;align-items:center;display:flex;box-pack:center;-ms-flex-pack:center;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-transform:scale(0.5);-moz-transform:scale(0.5);-ms-transform:scale(0.5);-o-transform:scale(0.5);transform:scale(0.5);height:48px;left:50%;margin:-24px 0 0 -24px;position:absolute;top:50%;width:48px}.docs-revisions-tile-shade .docs-quantum-spinner{margin:0;position:initial}.docs-revisions-tile-descriptor{color:#000;font-size:14px}.docs-gm .docs-revisions-tile-descriptor{font-style:italic}.docs-revisions-tile-selected .docs-revisions-tile-descriptor{font-weight:500}.docs-gm .docs-revisions-tile-selected .docs-revisions-tile-descriptor,.docs-gm .docs-revisions-tile-selected .docs-revisions-tile-text-box~.docs-revisions-tile-descriptor{color:#188038}.docs-revisions-tile-text-box~.docs-revisions-tile-descriptor{color:#585858;font-size:12px;font-weight:normal;margin-top:3px}.docs-gm .docs-revisions-tile-descriptor,.docs-gm .docs-revisions-tile-text-box~.docs-revisions-tile-descriptor{color:#3c4043;font-size:12px;font-weight:400;line-height:16px}.docs-revisions-tile-text-box{-webkit-transition-duration:0.28s;-moz-transition-duration:0.28s;-o-transition-duration:0.28s;transition-duration:0.28s;-webkit-transition-property:border-color;-moz-transition-property:border-color;-o-transition-property:border-color;transition-property:border-color;-webkit-transition-timing-function:cubic-bezier(0.4,0.0,0.2,1);-moz-transition-timing-function:cubic-bezier(0.4,0.0,0.2,1);-o-transition-timing-function:cubic-bezier(0.4,0.0,0.2,1);transition-timing-function:cubic-bezier(0.4,0.0,0.2,1);background:transparent;border-radius:2px;border:1px solid transparent;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;margin:-3px;margin-right:18px;outline:0;padding:2px;resize:none;will-change:border-color}.docs-revisions-tile-text-box:hover:enabled{border-color:#9e9e9e}.docs-revisions-tile-text-box:focus:enabled{border-color:#498dff}.docs-revisions-tile-text-box:disabled{color:#000;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.docs-revisions-tile-selected .docs-revisions-tile-text-box{font-weight:500}.docs-gm .docs-revisions-tile-text-box{font-weight:400;line-height:20px}.docs-gm .docs-revisions-tile-selected .docs-revisions-tile-text-box{color:#188038;font-weight:700}.docs-gm docs-revisions-tile-text-box:disabled{color:#3c4043}.alt-text-dialog-content textarea{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif}#alt-text-dialog-title,#alt-text-dialog-description{width:400px}#alt-text-dialog-description{height:100px;padding-top:6px;padding-left:9px}.alt-text-dialog-content td{padding-top:10px;vertical-align:top}.alt-text-dialog-content tr{margin:5px 0}.alt-text-dialog-content label{font-weight:500;padding-right:30px;position:relative;top:5px}.alt-text-dialog-intro{max-width:500px;padding:5px 0}.docs-bubble{background-color:#fff;border-radius:2px;border:1px solid;border-color:#bbb #bbb #a8a8a8;-moz-box-shadow:0 1px 3px rgba(0,0,0,.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,.2);-ms-box-shadow:0 1px 3px rgba(0,0,0,.2);box-shadow:0 1px 3px rgba(0,0,0,.2);color:#666;cursor:default;padding:12px 20px;position:absolute;z-index:502;white-space:nowrap}.docs-bubble.docs-linkbubble-bubble{z-index:503}.docs-bubble-link,.docs-bubble a{color:#15c!important;cursor:pointer;text-decoration:none!important}.docs-bubble a{display:inline-block;max-width:400px;text-overflow:ellipsis;overflow:hidden;vertical-align:bottom}.docs-bubble-link:hover,.docs-bubble a:hover{text-decoration:underline!important}.docs-bubble-label{font-weight:500}a.docs-bubble-link-disabled{color:#ccc!important;text-decoration:none!important}.docs-bubble .docs-bubble-button .docs-icon{vertical-align:baseline;width:18px;height:18px;margin:0px}.docs-bubble .docs-bubble-button{box-shadow:none;background-color:transparent;background-image:none;cursor:pointer;height:18px;width:18px;border-radius:50%;border-width:0px;border-style:solid;border-color:transparent;box-shadow:none;background-clip:padding-box;cursor:pointer;-webkit-tap-highlight-color:transparent;min-width:auto;min-width:unset;margin-right:0px;padding:6px}.docs-bubble .docs-bubble-button.jfk-button:hover,.docs-bubble .docs-bubble-button.jfk-button:focus{background-color:rgba(0,0,0,.06)}.docs-bubble .docs-bubble-button.jfk-button:hover:active,.docs-bubble .docs-bubble-button.jfk-button.goog-toolbar-button-checked{background-color:#e6f4ea}.docs-hc-gecko .docs-bubble-button,.docs-hc-ie .docs-bubble-button{border:1px solid transparent}.docs-clipboardshortcutsdialog{color:#666}.docs-clipboardshortcutsdialog-shortcut{padding-right:40px}.docs-clipboardshortcutsdialog-mac .docs-clipboardshortcutsdialog-shortcut{padding-right:95px}.docs-clipboardshortcutsdialog-shortcut-command{padding-bottom:5px}.docs-clipboardshortcutsdialog-shortcuts{padding:15px 0}.docs-clipboardshortcutsdialog-shortcut-command{line-height:1.0;font-size:36px;font-weight:500}.modal-dialog.color-dialog{padding:10px}.color-dialog>.modal-dialog-title{display:none}.color-dialog>.modal-dialog-buttons{margin-top:8px;padding-left:18px}.docs-colormenuitems-header{padding-left:5px}.docs-colormenuitems-custom-header{margin-left:-23px}.docs-gm .colormenuitems-custom-header-add-button .docs-colormenuitems-custom-header,.docs-gm .docs-colormenuitems-scheme-header{margin-left:5px}.docs-gm .docs-colormenuitems .goog-menuitem.colormenuitems-custom-header-add-button{border-radius:4px;border-width:1px 0;font-size:13px;padding:2px 0}.docs-gm .goog-menuitem.colormenuitems-custom-header-add-button.goog-menuitem-highlight{border-width:0}.docs-gm .docs-colormenuitems-scheme-header{padding:4px 0 4px 5px}.docs-gm .goog-menu .goog-menuitem.colormenuitems-no-color{border-color:transparent;border-style:dotted;border-width:1px;padding:5px 15px 5px 38px}.docs-gm .docs-colormenuitems .docs-colormenuitems-scheme-header,.docs-gm .docs-colormenuitems .docs-colormenuitems-custom-header{color:#3c4043;font-size:11px;font-weight:500;letter-spacing:.8px;padding-left:0px;text-transform:uppercase}.docs-gm .docs-colormenuitems .docs-text-color-state-change-button.jfk-button{background-color:#fff;background-image:none;border:none;box-shadow:none;color:#5f6368;cursor:pointer;font-size:14px}.docs-gm .docs-colormenuitems .docs-text-color-state-change-button.jfk-button-checked{border-bottom:2px solid #0f9d58;color:#202124}.docs-colormenuitems.goog-menu{padding:10px}.docs-colormenuitems .jfk-palette-table{margin:0;padding:3px}.docs-colormenuitems .jfk-palette-cell-hover{border:1px solid #fff;outline:1px solid #000}.docs-colormenuitems-theme-header{padding-top:5px}.docs-colormenuitems-custom-palette .jfk-palette-cell{border-color:#ccc;height:16px;width:16px}.docs-colormenuitems-custom-palette .jfk-palette-cell-selected{border-color:black;outline:none}.goog-color-menu-button.goog-menu-button{background-color:#f5f5f5;background-image:-webkit-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:-moz-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:-ms-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:-o-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:linear-gradient(top,#f5f5f5,#f1f1f1)}.goog-color-menu-button .goog-menu-button-outer-box,.goog-color-menu-button .goog-menu-button-inner-box{border-color:rgba(0,0,0,0.1)}.goog-color-menu-button.goog-menu-button-focused .goog-menu-button-outer-box,.goog-color-menu-button.goog-menu-button-focused .goog-menu-button-inner-box{border-color:#4d90fe}.goog-color-menu-button.goog-menu-button-open .goog-menu-button-outer-box,.goog-color-menu-button.goog-menu-button-open .goog-menu-button-inner-box{border-color:rgba(0,0,0,0.1)}.goog-color-menu-button.goog-menu-button-hover .goog-menu-button-outer-box,.goog-color-menu-button.goog-menu-button-hover .goog-menu-button-inner-box{border-color:rgba(0,0,0,0.1)!important}.goog-color-menu-button.goog-menu-button-hover .goog-menu-button-outer-box{box-shadow:0 1px 1px rgba(0,0,0,.1)}.docs-flatcolormenubutton.goog-flat-menu-button{min-width:0px}.docs-flatcolormenubutton .goog-flat-menu-button-caption{display:inline-block;height:14px;outline:1px solid #bbb;vertical-align:middle;width:14px}.docs-copy-link{width:500px}.copy-link-dialog{color:black;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;white-space:normal}.copy-link-butter-holder{position:absolute;top:0px;padding-top:16px;left:220px}.docs-chromeextensioninstalldialog-image{vertical-align:top}.docs-chromeextensioninstalldialog-textpart{width:360px;padding:0 0 15px 25px;color:#333}.docs-chromeextensioninstalldialog-note{padding:25px 0 0 0;color:#666}.docs-chromeextensioninstalldialog-noteV2{color:#666;padding:10px 0 0 0}.docs-chromeextensioninstalldialog-shortcuts{color:#666}.docs-findbar-input{width:170px;height:19px}.docs-gm .docs-findbar-content,.docs-gm .docs-gotobar-content{height:36px}.docs-slidingdialog .docs-findbar-text{border:1px solid #aaa;font-size:11px;height:16px;margin-right:4px;padding:2px;width:172px}.docs-slidingdialog #docs-findbar-spinner{display:inline-block;position:relative;transition:left 300ms ease-out;transition:width 300ms ease-out;vertical-align:middle}.docs-gm .docs-slidingdialog #docs-findbar-button-previous,.docs-gm .docs-slidingdialog #waffle-gotobar-button-go{margin-left:8px;margin-right:8px}.docs-slidingdialog #docs-findbar-button-next{margin-right:8px}.docs-gm .docs-slidingdialog .goog-toolbar-separator{height:24px;width:2px;margin:0 8 0 0px;position:center;vertical-align:middle}.docs-slidingdialog #docs-findbar-button-more-options{margin-right:8px}.docs-findbar-button-previous-rtl{margin-left:-1px}.docs-findbar-content .jfk-button-disabled{background-color:#f5f5f5;border-color:rgba(0,0,0,0.1);border-color:#dcdcdc}.docs-gm .docs-findbar-content .jfk-button-disabled,.docs-gm .docs-gotobar-content .jfk-button-disabled{opacity:.38}.docs-gm .docs-findbar-content .jfk-button,.docs-gm .docs-gotobar-content .jfk-button{background-image:none;background-color:transparent;border-color:transparent;margin:0 8px 0 0;min-width:24px;vertical-align:middle}.docs-gm .docs-findbar-content .jfk-button-hover,.docs-gm .docs-gotobar-content .jfk-button-hover{box-shadow:none;background-color:rgba(0,0,0,.06);background-image:none;cursor:pointer;border-color:transparent!important;border-radius:2px;border-width:1px}.docs-gm .docs-findbar-content .jfk-button-active,.docs-gm .docs-gotobar-content .jfk-button-active{box-shadow:none;background-color:rgba(0,0,0,0.12);background-image:none;cursor:pointer;border-color:transparent!important;border-radius:2px;border-width:1px}.docs-findinput-container{background:#fff;border:1px solid #d9d9d9;border-top:1px solid #c0c0c0;min-width:20px;padding:0 8px;width:100%}.docs-findinput-container-focus{border:1px solid #4d90fe;box-shadow:inset 0 1px 2px rgba(0,0,0,0.3);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.3);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.3);outline:none}.docs-gm .docs-findinput-container,.docs-gm .docs-gotoinput-container{border:1px solid #dadce0;border-radius:4px;box-sizing:border-box;color:#3c4043;padding:1px 8px;font-size:14px;height:36px;margin:8px 0;margin:0}.docs-gm .docs-findinput-container-focus,.docs-gm .docs-gotoinput-container:focus{border:2px solid #1a73e8;box-shadow:none;padding:0px 7px}.docs-findinput-input,.docs-findinput-input:focus{background:transparent!important;border:none!important;box-shadow:none!important;-moz-box-shadow:none!important;-webkit-box-shadow:none!important;font-size:13px;height:25px;margin:0;outline:none!important;padding:1px 0px!important;width:100%}.docs-findinput-count-container{max-width:120px;overflow:hidden;padding:0 8px 0 4px;text-align:right}.docs-findinput-count{color:#ccc;white-space:nowrap}#fontSizeSelect .goog-toolbar-menu-button-caption,#docs-font-size .goog-toolbar-menu-button-caption{overflow:hidden;text-overflow:ellipsis;width:20px;white-space:nowrap}#fontSizeSelect .goog-toolbar-combo-button-caption,#docs-font-size .goog-toolbar-combo-button-caption{width:48px!important}#fontSizeSelect .goog-toolbar-combo-button-input,#docs-font-size .goog-toolbar-combo-button-input{width:28px}#fontSizeSelect.docs-font-size-inc-dec-combobox{border-color:#dadce0!important;border-radius:0;vertical-align:middle;width:39px}.goog-toolbar[role="toolbar"] .docs-font-size-inc-dec-action-button.goog-toolbar-button{border-color:#dadce0!important}#fontSizeDecrement.docs-font-size-inc-dec-action-button.goog-toolbar-button{border-radius:2px 0 0 2px;border-right:0!important;margin-left:5px;margin-right:0}.goog-toolbar[role="toolbar"] .docs-font-size-inc-dec-action-button.goog-toolbar-button,.docs-font-size-inc-dec-action-button.goog-toolbar-button .goog-toolbar-button-outer-box,.docs-font-size-inc-dec-action-button.goog-toolbar-button .goog-toolbar-button-inner-box{height:22px;min-width:23px;width:23px}#fontSizeIncrement.docs-font-size-inc-dec-action-button.goog-toolbar-button{border-left:0!important;border-radius:0 2px 2px 0;margin-left:0;margin-right:5px}#fontSizeSelect.docs-font-size-inc-dec-combobox,#fontSizeSelect.docs-font-size-inc-dec-combobox .goog-toolbar-combo-button-caption,#fontSizeSelect.docs-font-size-inc-dec-combobox .goog-toolbar-combo-button-inner-box{height:22px;margin-left:0;margin-right:0}#fontSizeSelect.docs-font-size-inc-dec-combobox .goog-toolbar-combo-button-input{height:24px!important;margin:-1px;text-align:center;width:41px!important;padding:0}#fontSizeSelect.docs-font-size-inc-dec-combobox .goog-toolbar-combo-button-caption{width:41px!important}#fontSizeSelect.docs-font-size-inc-dec-combobox .goog-toolbar-combo-button-inner-box{padding:0}.docs-font-size-inc-dec-combobox.goog-toolbar-combo-button-hover:not(.goog-toolbar-combo-button-open) .goog-toolbar-combo-button-input{border-right-color:transparent!important}.goog-toolbar[role="toolbar"] .docs-font-size-inc-dec-action-button.goog-toolbar-button .docs-icon{height:22px;margin:0;vertical-align:baseline;width:22px}.docs-gm .goog-menu.goog-menu-noicon.docs-font-size-inc-dec-menu .goog-menuitem{min-width:39px;padding-right:0;padding-left:0;text-align:center}.hsv,.hsva{position:relative;width:182px;height:185px}.hsv label span,.hsva label span{display:none}.hsv-hs-backdrop,.hsv-hs-image,.hsva-hs-backdrop,.hsva-hs-image{position:absolute;top:45px;left:10px;width:128px;height:128px;border:1px solid #999}.hsv-hs-backdrop,.hsva-hs-backdrop{background-color:#000}.hsv-hs-image,.hsv-v-image,.hsv-hs-handle,.hsv-v-handle,.hsva-hs-image,.hsva-v-image,.hsva-a-image,.hsva-hs-handle,.hsva-v-handle,.hsva-a-handle,.hsva-swatch-backdrop{background-image:url(//ssl.gstatic.com/docs/drawings/images/hsva-sprite-sm.png)}.hsv-noalpha .hsv-hs-image,.hsv-noalpha .hsv-v-image,.hsv-noalpha .hsv-hs-handle,.hsv-noalpha .hsv-v-handle,.hsva-noalpha .hsva-hs-image,.hsva-noalpha .hsva-v-image,.hsva-noalpha .hsva-a-image,.hsva-noalpha .hsva-hs-handle,.hsva-noalpha .hsva-v-handle,.hsva-noalpha .hsva-a-handle,.hsva-noalpha .hsva-swatch-backdrop{background-image:url(//ssl.gstatic.com/docs/drawings/images/hsva-sprite-sm.gif)}.hsv-hs-image,.hsva-hs-image{background-position:0 0}.hsv-hs-handle,.hsva-hs-handle{position:absolute;left:5px;top:40px;width:11px;height:11px;overflow:hidden;background-position:0 -128px}.hsv-v-image,.hsva-v-image,.hsva-a-image{position:absolute;top:45px;left:155px;width:9px;height:128px;border:1px solid #999;background-color:#fff;background-position:-128px 0}.hsv-v-handle,.hsva-v-handle,.hsva-a-handle{position:absolute;top:40px;left:148px;width:25px;height:11px;background-position:-11px -128px;overflow:hidden}.hsv-swatch,.hsva-swatch,.hsva-swatch-backdrop{position:absolute;top:10px;right:auto;left:10px;width:30px;height:22px;border:1px solid #999;background-color:#fff}.hsv-input,.hsva-input{position:absolute;top:10px;right:auto;left:50px;width:75px}.hsva{width:205px}.hsva-a-image{left:182px;background-position:-137px 0}.hsva-a-handle{left:175px}.hsva-swatch,.hsva-swatch-backdrop{background-position:-36px -128px}.hsva-swatch{z-index:5}.hsva-swatch-backdrop{z-index:1}.docs-loading-animation{width:28px;height:6px;position:absolute;margin:auto;bottom:0;left:0;right:0;top:0}.docs-loading-animation-dot-1,.docs-loading-animation-dot-2,.docs-loading-animation-dot-3{background-color:rgba(0,0,0,.2);border-radius:6px;display:inline-block;height:6px;position:absolute;width:6px}.docs-loading-animation-dot-1{-webkit-animation:docs-loading-animation-pulse 1s ease-in-out infinite 0s;-moz-animation:docs-loading-animation-pulse 1s ease-in-out infinite 0s;-o-animation:docs-loading-animation-pulse 1s ease-in-out infinite 0s;animation:docs-loading-animation-pulse 1s ease-in-out infinite 0s;left:0}.docs-loading-animation-dot-2{-webkit-animation:docs-loading-animation-pulse 1s ease-in-out infinite .33s;-moz-animation:docs-loading-animation-pulse 1s ease-in-out infinite .33s;-o-animation:docs-loading-animation-pulse 1s ease-in-out infinite .33s;animation:docs-loading-animation-pulse 1s ease-in-out infinite .33s;left:50%;margin-left:-3px}.docs-loading-animation-dot-3{-webkit-animation:docs-loading-animation-pulse 1s ease-in-out infinite .66s;-moz-animation:docs-loading-animation-pulse 1s ease-in-out infinite .66s;-o-animation:docs-loading-animation-pulse 1s ease-in-out infinite .66s;animation:docs-loading-animation-pulse 1s ease-in-out infinite .66s;right:0}@-webkit-keyframes docs-loading-animation-pulse{0%,40%,100%{background-color:rgba(0,0,0,.2);-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}15%{background-color:rgba(0,0,0,1);-webkit-transform:scale(1.2);-moz-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2)}}@keyframes docs-loading-animation-pulse{0%,40%,100%{background-color:rgba(0,0,0,.2);-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}15%{background-color:rgba(0,0,0,1);-webkit-transform:scale(1.2);-moz-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2)}}.mobile-apps-promo-base{border-radius:8px!important;bottom:48px!important;height:248px;left:auto!important;right:48px!important;top:auto!important;width:656px}.mobile-apps-promo-base .docs-promo-icon-container{height:200px;margin-left:16px;width:100px}.mobile-apps-promo-base .docs-promo-text-container{height:168px;margin-top:5px;margin-right:8px;width:458px}.mobile-apps-promo-base .docs-promo-header{color:#202124;font-family:'Google Sans';font-size:24px;font-weight:400;max-height:50px}.mobile-apps-promo-base .docs-promo-body{color:#5f6368;font-family:Roboto;font-size:18px;font-weight:100;line-height:24px;max-height:56px;padding-top:16px}.mobile-apps-promo-base .docs-promo-action-row{display:flex;flex-direction:row-reverse;padding-top:35px}.mobile-apps-promo-base .docs-promo-action-container{font-family:'Google Sans';font-size:14px;font-weight:100;letter-spacing:0.25px;line-height:16px;text-transform:none}.mobile-apps-promo-base .docs-promo-action-row .docs-promo-action-button-left{align-items:center;background-color:white;border:1.2px solid #dadce0;border-radius:4px;color:#202124;display:flex;justify-content:center;margin-right:0;max-height:40px;padding:10px 22px 11px 22px;width:58px}.mobile-apps-promo-base .docs-promo-action-row .docs-promo-action-button-right{align-items:center;background:#188038;border:1.2px solid #188038;border-radius:4px;color:#fff;display:flex;justify-content:center;margin-left:0;margin-right:16px;max-height:40px;padding:9px 22.5px 9.5px 23px;width:112px}.mobile-apps-promo-base .docs-promo-action-row .docs-promo-action-button-right:hover{background:#2a8947}.mobile-apps-promo-base .docs-promo-action-row .docs-promo-action-button-left:hover{background:#f1f3f4}.docs-slidingdialog-button-close:focus{outline:1px solid #4d90fe}.docs-gm .docs-slidingdialog-close-container{padding-top:3px;vertical-align:middle}.docs-gm .docs-slidingdialog-close-container .goog-flat-button{cursor:pointer}.docs-gm .docs-slidingdialog .docs-icon-close{opacity:1}.docs-slidingdialog{background-color:#fff;border-bottom:1px solid #d9d9d9;border-top:none;border-left:1px solid #d9d9d9;border-right:1px solid #d9d9d9;margin-top:-1px;padding:10px 12px;outline:none}.docs-gm .docs-slidingdialog{border-bottom-right-radius:8px;border-bottom-left-radius:8px;padding:16px 12px}.docs-slidingdialog .jfk-textinput{border-top-color:#d9d9d9;margin-right:0}.docs-slidingdialog .jfk-textinput:focus{border-top-color:#4d90fe}.docs-slidingdialog .goog-custom-button-inner-box{padding:1px 2px 0 2px}.docs-slidingdialog .goog-custom-button{margin:-2px 0 0 0}.docs-slidingdialog .docs-icon-up,.docs-slidingdialog .docs-icon-down,.docs-slidingdialog .docs-icon-close,.docs-slidingdialog .docs-icon-ellipsis,.docs-slidingdialog .docs-icon-overflow-three-dots{opacity:.40}.docs-gm .docs-slidingdialog .docs-icon-img{opacity:1}.docs-slidingdialog .jfk-button{vertical-align:top}.docs-slidingdialog .goog-flat-button{background-color:transparent;border:0;cursor:default;margin:0;padding:0}.docs-slidingdialog .goog-flat-button-hover{background-color:transparent}.docs-slidingdialog-holder{margin-top:-1px;overflow:hidden;position:absolute;right:44px;z-index:507;min-width:300px}.docs-slidingdialog-wrapper{left:0;position:relative;width:100%}.jfk-button.docs-submenuitem-splitbutton{background-color:#eee;border-top:1px solid #f2f2f2;border-bottom:1px solid #f2f2f2;border-bottom-right-radius:0;border-radius:0;border-right:none!important;border-top-right-radius:0;color:#6e6e6e;cursor:pointer;font-size:70%;font-weight:normal;height:57px;left:auto;line-height:59px;margin:0;min-height:26px;min-width:0;padding:0;position:absolute;right:0;top:0;width:34px;-moz-border-radius-topright:0;-moz-border-radius-bottomright:0;-webkit-border-top-right-radius:0;-webkit-border-bottom-right-radius:0}.goog-menuitem.docs-submenuitem{border:none;border-bottom:1px solid #e6e6e6;height:59px;padding-top:0;padding-bottom:0}.goog-menuitem.docs-submenuitem .goog-menuitem-content{height:59px;line-height:59px}.goog-menuitem.docs-submenuitem .goog-menuitem-checkbox{height:59px;top:0}.docs-squarehandleselectionbox-border{position:absolute;border:1px solid #0096fd;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;z-index:30;background-color:rgba(0,0,0,0)}.docs-squarehandleselectionbox-handle{position:absolute;border:1px solid #fff;background-color:#0096fd;width:7px;height:7px;font-size:0;z-index:40}.docs-ui-toast{align-items:center;border-radius:2px;display:flex;flex-direction:row;background-color:#323232;bottom:24px;color:white;font-size:14px;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;left:24px;line-height:20px;min-width:288px;max-width:568px;outline:none;padding:17px 24px;position:absolute;z-index:999}.docs-gm .docs-ui-toast{background-color:#202124;border-radius:4px;box-shadow:0 4px 8px 3px rgba(60,64,67,.15);color:#dadce0;padding:16px 24px}.docs-ui-toast-content{flex-grow:1;flex-shrink:1;display:inline-block}.docs-ui-toast-control-bar{flex-grow:0;flex-shrink:0;color:#a1c2fa;cursor:pointer;display:inline-block;margin-left:24px}.docs-gm .docs-ui-toast-control-bar{color:#34a853}.docs-ui-toast-control{display:inline-block;outline:none;padding-left:10px;font-weight:500}.docs-gm .docs-ui-toast-control{font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:16px;font-weight:500;text-transform:none}.docs-ui-toast-close-bar{cursor:pointer;display:inline-block;margin-left:24px}.docs-ui-toast-close{display:inline-block;background-color:transparent;border:0}.goog-toolbar-combo-button{-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;background:0;border-color:transparent;border-style:solid;border-width:1px;outline:none;padding:0;height:24px;color:#333;line-height:24px;list-style:none;font-size:11px;font-weight:500;text-decoration:none;vertical-align:middle;cursor:default;top:2px}.goog-toolbar-combo-button-outer-box,.goog-toolbar-combo-button-inner-box{border:0;vertical-align:top}.goog-toolbar-combo-button-outer-box{margin:0;padding:0}.goog-toolbar-combo-button-inner-box{padding:0 2px;margin:0 1px}.goog-toolbar-combo-button-hover{box-shadow:0 1px 1px rgba(0,0,0,.1);background-color:#f8f8f8;background-image:-webkit-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-moz-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-ms-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-o-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:linear-gradient(top,#f8f8f8,#f1f1f1);border-color:#c6c6c6!important;color:#222}.goog-toolbar-combo-button-active{box-shadow:inset 0 1px 2px rgba(0,0,0,.1);background-color:#f6f6f6;background-image:-webkit-linear-gradient(top,#f6f6f6,#f1f1f1);background-image:-moz-linear-gradient(top,#f6f6f6,#f1f1f1);background-image:-ms-linear-gradient(top,#f6f6f6,#f1f1f1);background-image:-o-linear-gradient(top,#f6f6f6,#f1f1f1);background-image:linear-gradient(top,#f6f6f6,#f1f1f1);border-color:#c6c6c6}.goog-toolbar-combo-button-open{box-shadow:inset 0 1px 2px rgba(0,0,0,.1);background-color:#eee;background-image:-webkit-linear-gradient(top,#eee,#e0e0e0);background-image:-moz-linear-gradient(top,#eee,#e0e0e0);background-image:-ms-linear-gradient(top,#eee,#e0e0e0);background-image:-o-linear-gradient(top,#eee,#e0e0e0);background-image:linear-gradient(top,#eee,#e0e0e0);border-color:#ccc;color:#222}.goog-toolbar-combo-button-disabled{color:#222!important;opacity:0.3;filter:alpha(opacity=30)}.goog-toolbar-combo-button-dropdown{background:url(//ssl.gstatic.com/ui/v1/disclosure/small-grey-disclosure-arrow-down.png) center no-repeat;float:right;margin:9px 0 0 0px;padding:0 0 0 1px;min-width:7px;opacity:.8;vertical-align:middle;width:5px;height:7px;*float:none;*position:relative;*top:-3px}.goog-toolbar-combo-button-caption{padding:0;margin:0 0 0 -3px}.docs-toolbar-small-separator+div.goog-toolbar-combo-button{margin:4px 1px 0 -1px}.goog-toolbar-combo-button-input{background:transparent;border:1px solid transparent!important;color:#333;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif!important;font-size:12px!important;font-weight:500!important;height:20px!important;overflow:hidden!important}.goog-toolbar-combo-button-hover .goog-toolbar-combo-button-input{border-right:1px solid #d9d9d9!important}.goog-toolbar-combo-button-open .goog-toolbar-combo-button-input{background:transparent;border-right:1px solid transparent!important}.goog-toolbar-combo-button-input:focus{box-shadow:inset 0 1px 2px rgba(0,0,0,0.3);-webkit-user-select:text!important;-moz-user-select:text!important;background:#fff;border:1px solid #4d90fe!important;height:20px;outline:none}.docs-toolbar-zoom-combobox .goog-toolbar-menu-button-caption{overflow:hidden;text-overflow:ellipsis;width:20px;white-space:nowrap}.docs-toolbar-zoom-combobox .goog-toolbar-combo-button-caption{width:48px!important}.docs-toolbar-zoom-combobox .goog-toolbar-combo-button-input{width:28px}.docs-material-dialog{background:#fff;border-radius:2px;border:none;box-shadow:0px 16px 24px 2px rgba(0,0,0,0.14),0px 6px 30px 5px rgba(0,0,0,0.12),0px 8px 10px -5px rgba(0,0,0,0.2);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;position:absolute;z-index:1003}.docs-material-dialog-bg{background-color:#000;left:0;position:absolute;top:0;z-index:1002}.docs-material-dialog:focus{outline:none}.docs-material-dialog-title{border-bottom:1px solid rgba(0,0,0,0.12);padding:24px 24px 20px 24px}.docs-material-dialog-title-draggable{cursor:move}.docs-material-dialog-title-text{font:500 21px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;padding-right:38px}.docs-material-dialog-title-close{border:1px solid transparent;border-radius:2px;box-sizing:border-box;cursor:pointer;display:block;height:20px;opacity:0.54;position:absolute;right:24px;top:26px;width:20px}.docs-material-dialog-title-close:focus{border-color:#4285f4;opacity:1.0;outline:none}.docs-material-dialog-title-close:hover{opacity:1.0}.docs-material-dialog-content{padding:24px}.docs-material-dialog-buttons{float:right;padding:8px 4px 14px 4px}.docs-material-dialog-buttons:after{clear:both;content:"";display:block;height:0;width:0}.docs-material-gm-dialog{background-color:#fff;border:1px solid transparent;border-radius:8px;box-shadow:0 4px 8px 3px rgba(60,64,67,.15);position:absolute;z-index:1003}.docs-material-gm-dialog-bg{background-color:#000;left:0;position:absolute;top:0;z-index:1002}.docs-material-gm-dialog:focus{outline:none}.docs-material-gm-dialog-title{border-bottom:none;padding:24px}.docs-material-gm-dialog-title-text{color:#202124;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:22px;font-weight:400;line-height:28px}.docs-material-gm-dialog-title-close{height:24px;position:absolute;right:24px;top:26px;width:24px}.docs-material-gm-dialog-content{min-width:312px;padding:0px 24px 24px}.docs-material-gm-dialog-buttons{display:flex;justify-content:flex-end;padding:24px}.docs-material-gm-dialog .docs-material-button-fill-primary.docs-material-button{margin-left:12px;text-transform:none}.docs-material-gm-dialog .docs-material-button-hairline-default.docs-material-button{text-transform:none}.docs-charts-editor-material-color-picker{color:rgba(0,0,0,0.87);cursor:pointer;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;line-height:21px;outline:none;width:100%}.docs-charts-editor-material-color-picker-disabled{color:rgba(0,0,0,0.12);cursor:default}.docs-charts-editor-material-color-picker-outer-box{transition:border-color 0.3s ease;border-bottom:1px solid rgba(0,0,0,0.12);margin-bottom:1px;padding-bottom:5px;width:100%}.docs-charts-editor-material-color-picker-hover .docs-charts-editor-material-color-picker-outer-box,.docs-charts-editor-material-color-picker-focused .docs-charts-editor-material-color-picker-outer-box{border-bottom-color:rgba(0,0,0,0.38)}.docs-charts-editor-material-color-picker-open .docs-charts-editor-material-color-picker-outer-box{border-bottom-width:2px;border-bottom-color:#4285f4;margin-bottom:0px}.docs-charts-editor-material-color-picker-inner-box{width:100%}.docs-charts-editor-material-color-picker-disabled .docs-charts-editor-material-color-picker-outer-box{border-bottom:1px dotted rgba(0,0,0,0.12)}.docs-charts-editor-material-color-picker-indicator{border:1px solid rgba(0,0,0,0.12);border-radius:2px;float:left;height:20px;margin-top:6px;position:relative;top:1px;width:20px}.docs-charts-editor-material-color-picker-text{overflow:hidden;padding-left:4px;padding-right:28px;position:relative;text-overflow:ellipsis;top:10px;vertical-align:middle;white-space:nowrap}.docs-charts-editor-material-color-picker-dropdown{position:absolute;right:8px;top:0px}.docs-charts-editor-material-color-picker-dropdown-icon{transition:opacity 0.3s ease;background:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI1IiBoZWlnaHQ9IjMiPjxwb2x5Z29uIHBvaW50cz0iMCwwIDUsMCAyLjUsMyIgZmlsbD0iIzAwMCIvPjwvc3ZnPg==") no-repeat;background-size:contain;height:8px;opacity:0.38;position:relative;top:19px;width:8px}.docs-gm .docs-charts-editor-material-color-picker-dropdown-icon{opacity:1}.docs-charts-editor-material-color-picker-hover .docs-charts-editor-material-color-picker-dropdown-icon,.docs-charts-editor-material-color-picker-focused .docs-charts-editor-material-color-picker-dropdown-icon{opacity:0.54}.docs-gm .docs-charts-editor-material-color-picker-hover .docs-charts-editor-material-color-picker-dropdown-icon,.docs-gm .docs-charts-editor-material-color-picker-focused .docs-charts-editor-material-color-picker-dropdown-icon{opacity:1}.docs-charts-editor-material-color-picker-disabled .docs-charts-editor-material-color-picker-dropdown-icon{opacity:0.12}.docs-gm .docs-charts-editor-material-color-picker-disabled .docs-gm .docs-charts-editor-material-color-picker-dropdown-icon{opacity:.38}.docs-charts-editor-material-combo-box{height:26px;line-height:26px;outline:0;width:100%}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-combo-box{height:42px;line-height:42px}.docs-charts-editor-material-combo-box-disabled{cursor:default}.docs-charts-editor-material-combo-box .docs-charts-editor-material-combo-box-outer-box{transition:border-color 0.3s ease;border-bottom:1px solid rgba(0,0,0,0.12);height:26px;line-height:26px;margin-bottom:1px;width:100%}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-combo-box .docs-charts-editor-material-combo-box-outer-box{border:1px solid #dadce0;border-radius:4px;box-sizing:border-box;cursor:pointer;padding:8px 6px 8px 8px;width:100%;height:42px;line-height:42px;padding:8px}.docs-charts-editor-material-combo-box-hover .docs-charts-editor-material-combo-box-outer-box,.docs-charts-editor-material-combo-box-focused .docs-charts-editor-material-combo-box-outer-box{border-bottom-color:rgba(0,0,0,0.38)}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-combo-box-hover .docs-charts-editor-material-combo-box-outer-box{background-color:rgba(60,64,67,0.04);border:1px solid #dadce0}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-combo-box-focused .docs-charts-editor-material-combo-box-outer-box{background-color:rgba(60,64,67,0.06);border:1px solid #dadce0}.docs-charts-editor-material-combo-box-open .docs-charts-editor-material-combo-box-outer-box{border-bottom-width:2px;border-bottom-color:#4285f4;margin-bottom:0px}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-combo-box-open .docs-charts-editor-material-combo-box-outer-box{background-color:rgba(60,64,67,0.04);border:1px solid transparent}.docs-charts-editor-material-combo-box-disabled .docs-charts-editor-material-combo-box-outer-box{border-bottom:1px dotted rgba(0,0,0,0.12)}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-combo-box-disabled .docs-charts-editor-material-combo-box-outer-box{border:1px solid #dadce0;box-shadow:none;cursor:default}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-combo-box-inner-box{align-items:center;display:flex;justify-content:space-between;position:relative;width:100%;height:100%}.docs-charts-editor-material-combo-box-inner-box{width:100%}.docs-charts-editor-material-combo-box-caption{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding-right:28px;width:100%}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-combo-box-caption{padding-right:0}.docs-charts-editor-material-combo-box-input,.docs-charts-editor-material-combo-box-input:focus{background:none;border:none;box-shadow:none;color:rgba(0,0,0,0.87);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;height:26px;line-height:26px;padding:0;width:100%}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-combo-box-caption .docs-charts-editor-material-combo-box-input,.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-combo-box-caption .docs-charts-editor-material-combo-box-input:focus{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;color:#202124;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;height:20px;line-height:20px;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border:none;padding:0}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-combo-box-disabled .docs-charts-editor-material-combo-box-input{color:rgba(0,0,0,0.26)}.docs-charts-editor-material-combo-box-disabled .docs-charts-editor-material-combo-box-input{background:none;color:rgba(0,0,0,0.12);cursor:default}.docs-charts-editor-material-combo-box-dropdown{position:absolute;right:8px;top:10px}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-combo-box-dropdown{align-items:center;display:flex;height:24px;justify-content:center;width:24px;position:static}.docs-charts-editor-material-combo-box-dropdown-icon{transition:opacity 0.3s ease;background:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI1IiBoZWlnaHQ9IjMiPjxwb2x5Z29uIHBvaW50cz0iMCwwIDUsMCAyLjUsMyIgZmlsbD0iIzAwMCIvPjwvc3ZnPg==") no-repeat;background-size:contain;cursor:pointer;height:8px;opacity:0.38;width:8px}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-combo-box-dropdown-icon{background:no-repeat url(//ssl.gstatic.com/docs/common/material_common_sprite222_grey_medium.svg) -40px -732px;height:18px;width:18px;opacity:1}.docs-charts-editor-material-combo-box-hover .docs-charts-editor-material-combo-box-dropdown-icon,.docs-charts-editor-material-combo-box-focused .docs-charts-editor-material-combo-box-dropdown-icon{opacity:0.54}.docs-charts-editor-material-combo-box-disabled .docs-charts-editor-material-combo-box-dropdown-icon{opacity:0.12}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-combo-box-disabled .docs-charts-editor-material-combo-box-dropdown-icon{opacity:.26}.docs-charts-editor-material-icon-menu-button{cursor:pointer;height:26px;margin:0;min-width:40px;outline:none;user-select:none}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-icon-menu-button{height:auto;min-width:34px}.docs-charts-editor-material-icon-menu-button-disabled{cursor:default}.docs-charts-editor-material-icon-menu-button .docs-icon-img{transition:opacity 200ms cubic-bezier(0.4,0.0,0.2,1);opacity:0.54}.docs-gm .docs-charts-editor-material-icon-menu-button .docs-icon-img{opacity:1.0}.docs-charts-editor-material-icon-menu-button-disabled .docs-icon-img{opacity:0.12}.docs-gm .docs-charts-editor-material-icon-menu-button-disabled .docs-icon-img{opacity:.38}.docs-charts-editor-material-icon-menu-button-outer-box{transition:background 250ms cubic-bezier(0.4,0.0,0.2,1);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:rgba(0,0,0,0.04);border-radius:1px;height:26px;line-height:26px;margin-right:4px;padding:0px 4px;width:100%}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-icon-menu-button-outer-box{background:#fff;border:2px solid #fff;border-radius:4px;height:100%;line-height:34px;margin-right:0;padding:0}.docs-charts-editor-material-icon-menu-button-open .docs-charts-editor-material-icon-menu-button-outer-box{background:rgba(0,0,0,0.12)}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-icon-menu-button-open .docs-charts-editor-material-icon-menu-button-outer-box{background:#e6f4ea}.docs-charts-editor-material-icon-menu-button-inner-box{width:100%}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-icon-menu-button-caption{margin-left:2px}.docs-charts-editor-material-icon-menu-button-dropdown{position:absolute;right:0;top:0}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-icon-menu-button-dropdown{left:15px}.docs-charts-editor-material-icon-menu-button-dropdown-icon{transition:opacity 250ms cubic-bezier(0.4,0.0,0.2,1);background:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI1IiBoZWlnaHQ9IjMiPjxwb2x5Z29uIHBvaW50cz0iMCwwIDUsMCAyLjUsMyIgZmlsbD0iIzAwMCIvPjwvc3ZnPg==") no-repeat;background-size:contain;height:8px;opacity:0.54;position:relative;top:9px;width:8px}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-icon-menu-button-dropdown-icon{background:no-repeat url(//ssl.gstatic.com/docs/common/material_common_sprite222_grey_medium.svg) -40px -732px;height:18px;opacity:1;width:18px}.docs-charts-editor-material-icon-menu-button-focused .docs-charts-editor-material-icon-menu-button-dropdown-icon,.docs-charts-editor-material-icon-menu-button-open .docs-charts-editor-material-icon-menu-button-dropdown-icon{opacity:0.87}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-icon-menu-button-open .docs-icon-img{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_green.svg)}.docs-gm .docs-charts-editor-material-icon-menu-button-focused .docs-gm .docs-charts-editor-material-icon-menu-button-dropdown-icon,.docs-gm .docs-charts-editor-material-icon-menu-button-open .docs-gm .docs-charts-editor-material-icon-menu-button-dropdown-icon{opacity:1}.docs-charts-editor-material-icon-menu-button-disabled .docs-charts-editor-material-icon-menu-button-dropdown-icon{opacity:0.12}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-icon-menu-button-disabled .docs-charts-editor-material-icon-menu-button-dropdown-icon{opacity:.26}.docs-gm .docs-charts-editor-material-icon-menu-button-disabled .docs-gm .docs-charts-editor-material-icon-menu-button-dropdown-icon{opacity:.38}.docs-charts-editor-material-menu-button{color:rgba(0,0,0,0.87);cursor:pointer;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;height:26px;line-height:26px;outline:0;width:100%}.docs-charts-editor-material-menu-button-disabled{color:rgba(0,0,0,0.12);cursor:default}.docs-charts-editor-material-menu-button-outer-box{transition:border-color 0.3s ease;border-bottom:1px solid rgba(0,0,0,0.12);height:26px;line-height:26px;margin-bottom:1px;width:100%}.docs-charts-editor-material-menu-button-hover .docs-charts-editor-material-menu-button-outer-box,.docs-charts-editor-material-menu-button-focused .docs-charts-editor-material-menu-button-outer-box{border-bottom-color:rgba(0,0,0,0.38)}.docs-charts-editor-material-menu-button-open .docs-charts-editor-material-menu-button-outer-box{border-bottom-width:2px;border-bottom-color:#4285f4;margin-bottom:0px}.docs-charts-editor-material-menu-button-disabled .docs-charts-editor-material-menu-button-outer-box{border-bottom:1px dotted rgba(0,0,0,0.12)}.docs-charts-editor-material-menu-button-inner-box{display:flex;width:100%}.docs-charts-editor-material-menu-button-caption{display:inline-block;line-height:26px;overflow:hidden;padding-right:28px;position:relative;text-overflow:ellipsis;white-space:nowrap;-ms-flex:1;-webkit-flex:1;flex:1}.docs-charts-editor-material-menu-button-dropdown{position:absolute;right:8px;top:10px;white-space:nowrap}.docs-charts-editor-material-menu-button-dropdown-icon{transition:opacity 0.3s ease;background:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI1IiBoZWlnaHQ9IjMiPjxwb2x5Z29uIHBvaW50cz0iMCwwIDUsMCAyLjUsMyIgZmlsbD0iIzAwMCIvPjwvc3ZnPg==") no-repeat;background-size:contain;height:8px;opacity:0.38;width:8px}.docs-charts-editor-material-menu-button-hover .docs-charts-editor-material-menu-button-dropdown-icon,.docs-charts-editor-material-menu-button-focused .docs-charts-editor-material-menu-button-dropdown-icon{opacity:0.54}.docs-gm .docs-charts-editor-material-menu-button-hover .docs-charts-editor-material-menu-button-dropdown-icon,.docs-gm .docs-charts-editor-material-menu-button-focused .docs-charts-editor-material-menu-button-dropdown-icon{opacity:1}.docs-charts-editor-material-menu-button-disabled .docs-charts-editor-material-menu-button-dropdown-icon{opacity:0.12}.docs-gm .docs-charts-editor-material-menu-button-disabled .docs-gm .docs-charts-editor-material-menu-button-dropdown-icon{opacity:.38}.docs-charts-editor-material-text-area textarea{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;transition:border-bottom-color 0.3s ease;background:none;border:none;border-bottom:1px solid rgba(0,0,0,0.12);color:rgba(0,0,0,0.87);font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;height:26px;line-height:26px;min-height:26px;outline:none;padding:0;width:100%;resize:none;white-space:pre;overflow-wrap:normal;overflow-y:scroll;overflow-x:hidden}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-text-area textarea{transition:border-color 0.3s ease;color:#3c4043;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;height:42px;line-height:36px;min-height:42px}.docs-charts-editor-material-text-area textarea::placeholder{color:rgba(0,0,0,0.38)}.docs-charts-editor-material-text-area textarea::-webkit-input-placeholder{color:rgba(0,0,0,0.38)}.docs-charts-editor-material-text-area textarea::-moz-placeholder{color:rgba(0,0,0,0.38)}.docs-charts-editor-material-text-area textarea:-ms-input-placeholder{color:rgba(0,0,0,0.38)}.docs-charts-editor-material-text-area textarea::-ms-input-placeholder{color:rgba(0,0,0,0.38)}.docs-charts-editor-material-text-area textarea:hover,.docs-charts-editor-material-text-area-hover textarea{border-bottom-color:rgba(0,0,0,0.38)}.docs-charts-editor-material-text-area textarea:focus,.docs-charts-editor-material-text-area-focus textarea{box-shadow:none;border:none;border-bottom:2px solid #4285f4}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-text-area textarea:focus,.docs-charts-editor-material-text-area-focus textarea{border:2px solid #4285f4}.docs-charts-editor-material-text-area textarea:disabled,.docs-charts-editor-material-text-area-disabled textarea{background:none;border-bottom:1px dotted rgba(0,0,0,0.12);color:rgba(0,0,0,0.12)}.docs-charts-editor-material-textbutton{transition:background 200ms cubic-bezier(0.4,0.0,0.2,1);background:rgba(0,0,0,0.04);border-radius:2px;cursor:pointer;height:26px;margin-right:4px;outline:none;padding:4px;text-align:center}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-textbutton{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:white;border:1px solid #dadce0!important;color:#188038;height:24px;padding:3px 12px 5px;margin-right:0}.docs-charts-editor-material-textbutton-label{color:#2196f3;font-size:12px;text-transform:uppercase}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-textbutton-label{color:#188038;font-size:14px;letter-spacing:.25px;line-height:14px;text-transform:none}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-textbutton-disabled .docs-charts-editor-material-textbutton-label{color:#3c4043;opacity:.38}.docs-charts-editor-material-textbutton-outer-box{vertical-align:-webkit-baseline-middle}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-textbutton-outer-box{vertical-align:baseline}.docs-charts-editor-material-textbutton-hover,.docs-charts-editor-material-textbutton-focused{}.docs-charts-editor-material-textbutton-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#e7f5eb;border:1px solid #bbe2c6!important;height:24px;padding:3px 12px 5px}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-textbutton-hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#f8fcf9;border:1px solid #c8e7d1!important;height:24px;padding:3px 12px 5px}.docs-charts-editor-material-textbutton-checked{background:rgba(0,0,0,0.12)}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-textbutton-checked{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#dff2e4;border:1px solid transparent!important;box-shadow:0 2px 6px 2px rgba(60,64,67,.15);height:24px;padding:3px 12px 5px}.docs-charts-editor-material-textbutton-disabled{cursor:default}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-textbutton-disabled{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:white;border:1px solid #f1f3f4!important;height:24px;padding:3px 12px 5px}.docs-charts-editor-material-textbutton .docs-icon-img{transition:opacity 200ms cubic-bezier(0.4,0.0,0.2,1);opacity:0.54}.docs-gm .docs-charts-editor-material-textbutton .docs-icon-img{opacity:1}.docs-charts-editor-material-textbutton-focused .docs-icon-img,.docs-charts-editor-material-textbutton-checked .docs-icon-img{opacity:0.87}.docs-gm .docs-charts-editor-material-textbutton-focused .docs-icon-img,.docs-gm .docs-charts-editor-material-textbutton-checked .docs-icon-img{opacity:1}.docs-charts-editor-material-textbutton-disabled .docs-icon-img{opacity:0.12}.docs-gm .docs-charts-editor-material-textbutton-disabled .docs-icon-img{opacity:.38}.docs-charts-editor-material-text-input input{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;transition:border-bottom-color 0.3s ease;background:none;border:none;border-bottom:1px solid rgba(0,0,0,0.12);color:rgba(0,0,0,0.87);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;height:26px;line-height:26px;outline:none;padding:0;width:100%}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-text-input .jfk-textinput{transition:border-color 0.3s ease;height:42px;line-height:42px;margin:0}.docs-charts-editor-material-text-input input::placeholder{color:rgba(0,0,0,0.38)}.docs-charts-editor-material-text-input input::-webkit-input-placeholder{color:rgba(0,0,0,0.38)}.docs-charts-editor-material-text-input input::-moz-placeholder{color:rgba(0,0,0,0.38)}.docs-charts-editor-material-text-input input:-ms-input-placeholder{color:rgba(0,0,0,0.38)}.docs-charts-editor-material-text-input input::-ms-input-placeholder{color:rgba(0,0,0,0.38)}.docs-charts-editor-material-text-input input:hover,.docs-charts-editor-material-text-input-hover input{border-bottom-color:rgba(0,0,0,0.38)}.docs-charts-editor-material-text-input input:focus,.docs-charts-editor-material-text-input-focus input{box-shadow:none;border:none;border-bottom:2px solid #4285f4}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-text-input input:focus,.docs-charts-editor-material-text-input-focus input{box-shadow:none;border:2px solid #4285f4}.docs-charts-editor-material-text-input input:disabled,.docs-charts-editor-material-text-input-disabled input{background:none;border-bottom:1px dotted rgba(0,0,0,0.12);color:rgba(0,0,0,0.12)}.docs-charts-editor-material-togglebutton{transition:background 200ms cubic-bezier(0.4,0.0,0.2,1);background:rgba(0,0,0,0.04);border-radius:2px;cursor:pointer;height:26px;line-height:26px;margin-right:4px;outline:none;text-align:center;width:26px}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-togglebutton{background:#fff;border:2px solid #fff;border-radius:4px;height:34px;line-height:34px;margin-right:0;width:30px}.docs-charts-editor-material-togglebutton-hover,.docs-charts-editor-material-togglebutton-focused{}.docs-charts-editor-material-togglebutton-checked{background:rgba(0,0,0,0.12)}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-togglebutton-checked{background:#e6f4ea}.docs-charts-editor-material-togglebutton-checked.docs-charts-editor-material-togglebutton-hover,.docs-charts-editor-material-togglebutton-checked.docs-charts-editor-material-togglebutton-focused{}.docs-charts-editor-material-togglebutton-checked.docs-charts-editor-material-togglebutton-active{}.docs-charts-editor-material-togglebutton-disabled{cursor:default}.docs-charts-editor-material-togglebutton .docs-icon-img{transition:opacity 200ms cubic-bezier(0.4,0.0,0.2,1);opacity:0.54}.docs-gm .docs-charts-editor-material-togglebutton .docs-icon-img{opacity:1}.docs-charts-editor-material-togglebutton-focused .docs-icon-img,.docs-charts-editor-material-togglebutton-checked .docs-icon-img{opacity:0.87}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-togglebutton-checked .docs-icon-img{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_green.svg)}.docs-gm .docs-charts-editor-material-togglebutton-focused .docs-icon-img,.docs-gm .docs-charts-editor-material-togglebutton-checked .docs-icon-img{opacity:1}.docs-charts-editor-material-togglebutton-disabled .docs-icon-img{opacity:0.12}.docs-gm .docs-charts-editor-material-togglebutton-disabled .docs-icon-img{opacity:.38}.docs-charts-editor-material-toolbar-color-picker{cursor:pointer;height:26px;min-width:40px;outline:none;user-select:none}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-toolbar-color-picker{color:#3c4043;outline:none;width:100%;height:42px;max-width:100%;width:auto}.docs-charts-editor-material-toolbar-color-picker-disabled{cursor:default}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-toolbar-color-picker-disabled{color:#5f6368;opacity:.38;cursor:default}.docs-charts-editor-material-toolbar-color-picker-outer-box{transition:background 250ms cubic-bezier(0.4,0.0,0.2,1);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:rgba(0,0,0,0.04);border-radius:2px;height:100%;padding:2px 4px;width:100%}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-toolbar-color-picker-outer-box{border:1px solid #dadce0;border-radius:4px;box-sizing:border-box;cursor:pointer;padding:8px 6px 8px 8px;width:100%;background:#fff;max-width:100%;width:auto}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-toolbar-color-picker-hover .docs-charts-editor-material-toolbar-color-picker-outer-box{background-color:rgba(60,64,67,0.04);border:1px solid #dadce0}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-toolbar-color-picker-disabled .docs-charts-editor-material-toolbar-color-picker-outer-box{border:1px solid #dadce0;box-shadow:none;cursor:default}.docs-charts-editor-material-toolbar-color-picker-open .docs-charts-editor-material-toolbar-color-picker-outer-box{background:rgba(0,0,0,0.12)}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-toolbar-color-picker-open .docs-charts-editor-material-toolbar-color-picker-outer-box{background-color:rgba(60,64,67,0.04);border:1px solid transparent}.docs-charts-editor-material-toolbar-color-picker-inner-box{width:100%}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-toolbar-color-picker-inner-box{align-items:center;display:flex;justify-content:space-between;position:relative;width:100%;height:100%}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-toolbar-color-picker-content-container{width:80%}.docs-charts-editor-material-toolbar-color-picker-indicator{border-bottom:3px solid transparent;height:18px;width:22px}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-toolbar-color-picker-indicator{height:22px;width:22px;border-radius:50%;border:1px solid #dadce0;margin:0;outline:none}.docs-charts-editor-material-toolbar-color-picker-disabled .docs-charts-editor-material-toolbar-color-picker-indicator{opacity:0.12}.docs-gm .docs-charts-editor-material-toolbar-color-picker-disabled .docs-charts-editor-material-toolbar-color-picker-indicator{opacity:.38}.docs-charts-editor-material-toolbar-color-picker-indicator .docs-icon{transition:opacity 250ms cubic-bezier(0.4,0.0,0.2,1);-webkit-transform:scale(0.9);-moz-transform:scale(0.9);-ms-transform:scale(0.9);-o-transform:scale(0.9);transform:scale(0.9);height:14px;left:1px;opacity:0.54;width:18px}.docs-gm .docs-charts-editor-material-toolbar-color-picker-indicator .docs-icon{opacity:1}.docs-charts-editor-material-toolbar-color-picker-focused .docs-charts-editor-material-toolbar-color-picker-indicator .docs-icon,.docs-charts-editor-material-toolbar-color-picker-open .docs-charts-editor-material-toolbar-color-picker-indicator .docs-icon{opacity:0.87}.docs-gm .docs-charts-editor-material-toolbar-color-picker-focused .docs-charts-editor-material-toolbar-color-picker-indicator .docs-icon,.docs-gm .docs-charts-editor-material-toolbar-color-picker-open .docs-charts-editor-material-toolbar-color-picker-indicator .docs-icon{opacity:1}.docs-charts-editor-material-toolbar-color-picker-text{transition:color 250ms cubic-bezier(0.4,0.0,0.2,1);color:rgba(0,0,0,0.54);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:11px;padding:3px 8px 3px 2px;top:1px}.docs-gm .docs-charts-editor-material-toolbar-color-picker-text{color:rgba(0,0,0,0.87)}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-toolbar-color-picker-text{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;color:#202124;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;height:20px;line-height:20px;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;height:100%;padding:3px 5px;max-width:65%}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-toolbar-color-picker-caption{height:100%}.docs-charts-editor-material-toolbar-color-picker-focused .docs-charts-editor-material-toolbar-color-picker-text,.docs-charts-editor-material-toolbar-color-picker-open .docs-charts-editor-material-toolbar-color-picker-text{color:rgba(0,0,0,0.87)}.docs-charts-editor-material-toolbar-color-picker-disabled .docs-charts-editor-material-toolbar-color-picker-text{color:rgba(0,0,0,0.12)}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-toolbar-color-picker-disabled .docs-charts-editor-material-toolbar-color-picker-text{color:rgba(0,0,0,0.26)}.docs-charts-editor-material-toolbar-color-picker-dropdown{float:right}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-toolbar-color-picker-dropdown{align-items:center;display:flex;height:24px;justify-content:center;width:24px}.docs-charts-editor-material-toolbar-color-picker-dropdown-icon{transition:opacity 250ms cubic-bezier(0.4,0.0,0.2,1);background:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI1IiBoZWlnaHQ9IjMiPjxwb2x5Z29uIHBvaW50cz0iMCwwIDUsMCAyLjUsMyIgZmlsbD0iIzAwMCIvPjwvc3ZnPg==") no-repeat;background-size:contain;height:8px;opacity:0.54;position:relative;top:9px;width:8px}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-toolbar-color-picker-dropdown-icon{background:no-repeat url(//ssl.gstatic.com/docs/common/material_common_sprite222_grey_medium.svg) -40px -732px;height:18px;width:18px;opacity:1;top:0}.docs-charts-editor-material-toolbar-color-picker-focused .docs-charts-editor-material-toolbar-color-picker-dropdown-icon,.docs-charts-editor-material-toolbar-color-picker-open .docs-charts-editor-material-toolbar-color-picker-dropdown-icon{opacity:0.87}.docs-gm .docs-charts-editor-material-toolbar-color-picker-focused .docs-charts-editor-material-toolbar-color-picker-dropdown-icon,.docs-gm .docs-charts-editor-material-toolbar-color-picker-open .docs-charts-editor-material-toolbar-color-picker-dropdown-icon{opacity:1}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-toolbar-color-picker-open .docs-charts-editor-material-toolbar-color-picker-dropdown-icon{-moz-transform:rotate(180deg);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.docs-charts-editor-material-toolbar-color-picker-disabled .docs-charts-editor-material-toolbar-color-picker-dropdown-icon{opacity:0.12}.docs-gm .docs-charts-editor-material-toolbar-color-picker-disabled .docs-charts-editor-material-toolbar-color-picker-dropdown-icon{opacity:.38}.docs-charts-editor-overflow-menu-button{outline:none;cursor:pointer}.docs-charts-editor-overflow-menu-button-icon{transition:opacity 0.3s ease;background:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgdmlld2JveD0iMCAwIDIwIDIwIiBoZWlnaHQ9IjIwIj48cGF0aCBkPSJtMTAgNmMxLjEgMCAyLTAuOSAyLTJzLTAuOS0yLTItMi0yIDAuOS0yIDIgMC45IDIgMiAyem0wIDJjLTEuMSAwLTIgMC45LTIgMnMwLjkgMiAyIDIgMi0wLjkgMi0yLTAuOS0yLTItMnptMCA2Yy0xLjEgMC0yIDAuOS0yIDJzMC45IDIgMiAyIDItMC45IDItMi0wLjktMi0yLTJ6Ii8+PC9zdmc+") no-repeat;opacity:0.38;height:21px;position:relative;right:5px;top:6px;width:21px}.docs-gm .waffle-gm-sidebar .docs-charts-editor-overflow-menu-button-icon{right:12px;top:7px}.docs-charts-editor-overflow-menu-button-hover .docs-charts-editor-overflow-menu-button-icon,.docs-charts-editor-overflow-menu-button-focused .docs-charts-editor-overflow-menu-button-icon{opacity:0.54}.docs-charts-editor-overflow-menu-button-disabled .docs-charts-editor-overflow-menu-button-icon{opacity:0.12}.docs-charts-editor-overflow-menu-button-caption{min-height:21px;overflow:hidden;padding-right:28px;position:absolute;text-overflow:ellipsis;top:10px;white-space:nowrap}.docs-charts-editor-material-icon-menu-button-palette .toolbar-icon,.docs-charts-editor-material-icon-menu-button-palette .docs-common-icon{margin:3px 5px 4px 2px}.docs-charts-editor-material-icon-menu-button-palette .goog-palette-cell{border:0}.docs-charts-editor-material-icon-menu-button-palette .goog-palette-table{border:0;margin:0 4px}.docs-charts-editor-material-icon-menu-button-palette .goog-palette-cell-hover{background:#eeeeee}.docs-charts-editor-chip-content{display:flex;background-color:#f1f3f4;border-radius:32px;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;height:32px;overflow:hidden;position:relative;white-space:nowrap}.docs-gm .waffle-gm-sidebar .docs-charts-editor-chip-content{border-radius:36px;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;height:36px}.docs-charts-editor-chip-content>*{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.docs-charts-editor-chip-label{-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-shrink:1;-ms-flex-negative:1;flex-shrink:1;cursor:default;line-height:32px;margin-left:16px;overflow:hidden;text-overflow:ellipsis;vertical-align:top}.docs-gm .waffle-gm-sidebar .docs-charts-editor-chip-label{line-height:36px;margin-right:10px}.docs-charts-editor-chip-button{box-shadow:none;cursor:pointer;margin:0;min-width:0;outline:0;padding:0;position:absolute;right:0}.docs-charts-editor-chip.docs-charts-editor-chip-invalid .docs-charts-editor-chip-content{border:1px solid #db4437}.docs-charts-editor-chip.docs-charts-editor-chip-invalid .docs-charts-editor-chip-error-message{display:block}.docs-charts-editor-chip-error-message{color:#db4437;display:none;font-size:11px;left:8px;position:relative;top:3px}.docs-charts-editor-collapsible-header{transition:color 250ms cubic-bezier(0.4,0.0,0.2,1);color:rgba(0,0,0,0.54);cursor:pointer;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;font-weight:500;height:42px;line-height:42px;position:relative}.docs-gm .waffle-gm-sidebar .docs-charts-editor-collapsible-header{background-color:#f8f9fa;color:#80868b;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;height:56px;line-height:56px}.docs-charts-editor-collapsible-header.goog-control-open{color:rgba(0,0,0,0.87)}.docs-charts-editor-collapsible-header.goog-control-disabled{color:rgba(0,0,0,0.26);cursor:default}.docs-charts-editor-collapsible-header.goog-control-focused{color:rgba(0,0,0,0.87);outline:none}.docs-gm .waffle-gm-sidebar .docs-charts-editor-collapsible-header.goog-control-focused{color:#3c4043}.docs-charts-editor-collapsible-title{height:42px;line-height:42px;margin:0 2px 0 16px;overflow:hidden;text-overflow:ellipsis;width:190px}.docs-gm .waffle-gm-sidebar .docs-charts-editor-collapsible-title{height:56px;line-height:56px;padding:0 36px}.docs-charts-editor-collapsible-summary{color:rgba(0,0,0,0.54);height:42px;line-height:42px;overflow:hidden;position:absolute;right:42px;text-align:right;text-overflow:ellipsis;width:115px}.docs-gm .waffle-gm-sidebar .docs-charts-editor-collapsible-summary{height:56px;line-height:56px}.goog-control-disabled .docs-charts-editor-collapsible-summary{color:#888}.docs-charts-editor-collapsible-icon{transition:all 250ms cubic-bezier(0.4,0.0,0.2,1);background:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgdmlld0JveD0iMCAwIDE4IDE4Ij48ZyBzdHlsZT0iZmlsbDpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZTpub25lIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSg5IDkpc2NhbGUoMSAtMSl0cmFuc2xhdGUoLTkgLTkpIj48cmVjdCB3aWR0aD0iMTgiIGhlaWdodD0iMTgiLz48cG9seWdvbiBwb2ludHM9IjkgNSAzIDExIDQuNCAxMi40IDkgNy44IDEzLjYgMTIuNCAxNSAxMSIgZmlsbD0iIzAwMCIvPjwvZz48L2c+PC9zdmc+");height:18px;opacity:0.54;position:absolute;right:16px;top:11px;width:18px}.docs-gm .waffle-gm-sidebar .docs-charts-editor-collapsible-icon{background:none;height:20px;left:16px;top:20px;transform:rotate(-90deg);width:20px}.docs-gm .waffle-gm-sidebar .docs-charts-editor-collapsible-icon .docs-icon{height:20px;vertical-align:top;width:20px}.goog-control-checked .docs-charts-editor-collapsible-icon{opacity:0.87;transform:rotate(-180deg)}.docs-gm .waffle-gm-sidebar .goog-control-checked .docs-charts-editor-collapsible-icon{top:14px;transform:none}.docs-gm .waffle-gm-sidebar .goog-control-focused .docs-charts-editor-collapsible-icon{opacity:0.87}.goog-control-disabled .docs-charts-editor-collapsible-icon{display:none}.docs-charts-editor-collapsible-content{transition:max-height 0.25s cubic-bezier(0.4,0.0,0.2,1);overflow:hidden}.docs-gm .waffle-gm-sidebar .docs-charts-editor-collapsible-content{background-color:#fff}.docs-charts-editor-collapsible-content-animating{transition:none}.docs-charts-editor-collapsible-content>div{padding:0 16px 6px 16px}.docs-charts-editor-collapsible-content.docs-charts-editor-collapsible-content-no-padding>div{padding:0}.docs-gm .waffle-gm-sidebar .docs-charts-editor-customize-tab .docs-charts-editor-bundle.docs-charts-editor-parent-bundle>.docs-charts-editor-collapsible-opened{box-shadow:0 1px 3px 1px rgba(60,64,67,.15);border:2px solid #fff;border-radius:8px}.docs-gm .waffle-gm-sidebar .docs-charts-editor-collapsible-opened .docs-charts-editor-collapsible-header{background-color:#fff;color:#3c4043}.docs-charts-editor-back-tab-header-back{float:left;margin:6px 7px 0 7px;right:auto}.docs-gm .docs-material .docs-charts-editor-back-tab-header-back .docs-icon .docs-icon-img{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_green.svg)}.docs-charts-editor-back-tab-header-title.jfk-button.docs-sidebar-toggle-tab{text-align:left;width:270px}.docs-charts-editor-back-tab-header.docs-sidebar-toggle-tabs .jfk-button.docs-sidebar-toggle-tab>div{overflow:hidden;text-overflow:ellipsis;width:100%}.docs-charts-editor-back-tab-header .docs-charts-editor-back-tab-header-title.jfk-button.docs-sidebar-toggle-tab-active>div:after{border-bottom:none}.docs-charts-editor-editorslider-hide{display:none}.docs-charts-editor-editorslider-slide-in-right{animation-duration:0.3s;animation-name:docs-charts-editor-editorslider-slide-in-right;animation-timing-function:ease;transform:translateX(0%)}.docs-charts-editor-editorslider-slide-out-right{animation-duration:0.3s;animation-name:docs-charts-editor-editorslider-slide-out-right;animation-timing-function:ease;transform:translateX(100%)}@keyframes docs-charts-editor-editorslider-slide-in-right{from{transform:translateX(100%)}to{transform:translateX(0%)}}@keyframes docs-charts-editor-editorslider-slide-out-right{from{transform:translateX(0%)}to{transform:translateX(100%)}}.docs-charts-editor-labeledinput-error{color:#db4437;display:none;font-size:11px;margin-bottom:4px;margin-top:4px}.docs-charts-editor-labeledinput-haserror .docs-charts-editor-labeledinput-error{display:block}.docs-gm .waffle-gm-sidebar .docs-charts-editor-labeledinput-haserror input:hover{border-color:#c53929}.docs-charts-editor-labeledinput-haserror input,.docs-charts-editor-labeledinput-haserror input:focus{border-bottom:2px solid #db4437}.docs-gm .waffle-gm-sidebar .docs-charts-editor-labeledinput-haserror input,.docs-gm .waffle-gm-sidebar .docs-charts-editor-labeledinput-haserror input:focus{border:2px solid #db4437}.docs-charts-editor-labeledinput-haserror input:hover:not(:focus){border-bottom-color:#c53929}.docs-charts-editor-labeledselect-menu-style-wide{width:255px}.docs-charts-editor-labeledselect-menu-style-narrow{width:146px}.docs-gm .waffle-gm-sidebar .docs-material-gm-labeled-select-disabled .docs-material-gm-labeled-select-caption{color:rgba(0,0,0,0.26)}.docs-gm .waffle-gm-sidebar .docs-material-gm-labeled-select-disabled .docs-material-gm-labeled-select-dropdown-icon{opacity:.26}.docs-gm .waffle-gm-sidebar .docs-charts-editor-customize-tab .docs-charts-editor-bundle.docs-charts-editor-parent-bundle>.docs-charts-editor-noncollapsible-section.docs-charts-editor-collapsible-opened{border:none;border-radius:0;box-shadow:none}.docs-gm .waffle-gm-sidebar .docs-charts-editor-noncollapsible-section .docs-charts-editor-collapsible-header{color:#3c4043;cursor:default;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;height:auto;line-height:1;padding-bottom:0.5em;padding-top:1.5em}.docs-gm .waffle-gm-sidebar .docs-charts-editor-noncollapsible-section .docs-charts-editor-collapsible-title{height:auto;line-height:1;padding-left:0;overflow:visible}.docs-explore-icon{direction:ltr;text-align:left;overflow:hidden;position:relative;vertical-align:middle}.docs-explore-img:before{content:url(//ssl.gstatic.com/docs/common/menu_feature_sprite7.svg)}.docs-explore-img{height:4332px;position:absolute;width:72px}.docs-explore-hc-gecko .docs-explore-icon{filter:invert(100%)}.docs-explore-hc-ie .docs-explore-icon{-ms-high-contrast-adjust:none;background-color:white}.docs-explore-auto-awesome-grey{left:0;top:-4314px}.docs-explore-back-white{left:0;top:-4194px}.docs-explore-back-white-rtl{left:-36px;top:-640px}.docs-explore-cite-black{left:-42px;top:-2992px}.docs-explore-cite-black-18{left:-48px;top:-4128px}.docs-explore-docs-18{left:0;top:-2974px}.docs-explore-drawing-18{left:-50px;top:-3034px}.docs-explore-email-18{left:-36px;top:-3946px}.docs-explore-excel-18{left:-24px;top:-4128px}.docs-explore-expand-down{left:0;top:-1748px}.docs-explore-expand-up{left:0;top:-164px}.docs-explore-file-18{left:0;top:-1080px}.docs-explore-filter-button-black-18{left:0;top:-434px}.docs-explore-folder-18{left:-20px;top:-4194px}.docs-explore-form-18{left:-18px;top:-1122px}.docs-explore-forward-arrow-black{left:0;top:-4170px}.docs-explore-forward-arrow-black-rtl{left:-18px;top:-988px}.docs-explore-google-logo{left:-24px;top:-3840px}.docs-explore-group-blue-18{left:-18px;top:-4314px}.docs-explore-group-black-18{left:0;top:-1122px}.docs-explore-image-18{left:-24px;top:-164px}.docs-explore-insert-black{left:0;top:-3840px}.docs-explore-insert-black-18{left:-18px;top:-640px}.docs-explore-keep-yellow-18{left:0;top:-3658px}.docs-explore-lock-black-18{left:-50px;top:-2474px}.docs-explore-more-black{left:-48px;top:-4146px}.docs-explore-pdf-18{left:0;top:-988px}.docs-explore-powerpoint-18{left:-18px;top:-3946px}.docs-explore-preview-white{left:0;top:-4128px}.docs-explore-question-green{left:-50px;top:-2454px}.docs-explore-search-black{left:-18px;top:-2992px}.docs-explore-search-close-white{left:0;top:-1098px}.docs-explore-search-history-black{left:0;top:-452px}.docs-explore-sheets-18{left:-36px;top:-4314px}.docs-explore-sites-18{left:0;top:-1944px}.docs-explore-slides-18{left:-24px;top:-1098px}.docs-explore-thumb-down-18{left:-50px;top:-3052px}.docs-explore-thumb-up-18{left:0;top:-2522px}.docs-explore-video-18{left:0;top:-3946px}.docs-explore-word-18{left:-50px;top:-3016px}.docs-explore-show-more-14{left:0;top:-4152px}.docs-explore-promo-icon-wrapper{background-color:white;border-radius:50px;display:flex;height:100px;left:-46px;position:absolute;top:-36px;width:100px}.docs-explore-promo-icon{cursor:pointer;display:block;margin:auto}.waffle-assistant-entry{background-color:rgba(255,255,255,0.8);border:none;border-left:1px solid #c2c2c2;float:right;height:38px;padding-right:10px}.waffle-assistant-entry-button{border:1px solid transparent;cursor:pointer;height:34px;transition:padding 0.5s cubic-bezier(0.4,0.0,0.2,1);width:100%}.waffle-assistant-entry-button-icon{display:inline-block;position:relative;padding:7px 0 7px 8px}.waffle-assistant-entry-label{color:#0f9d58;display:inline-block;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;overflow:hidden;padding-left:8px;transition:all 0.5s cubic-bezier(0.4,0.0,0.2,1);vertical-align:middle}.waffle-assistant-entry-button-black-icon{display:none;opacity:.54}.waffle-assistant-entry-inactive{border-left:1px solid transparent;background-color:transparent}.waffle-assistant-entry-inactive .waffle-assistant-entry-button-black-icon{display:block}.waffle-assistant-entry-inactive .waffle-assistant-entry-button-green-icon{display:none}.waffle-assistant-entry-inactive .waffle-assistant-entry-label{color:#737373;opacity:0;padding-right:0}.waffle-assistant-entry-expanded{background-color:rgba(255,255,255,0.8);border-left:1px solid #c2c2c2}.waffle-assistant-entry-expanded .waffle-assistant-entry-label{opacity:1;padding-right:6px}.waffle-assistant-entry-opened{background-color:#dadada;border-left:1px solid #c2c2c2;box-shadow:inset 0 0 6px rgba(0,0,0,.22)}.waffle-assistant-entry-opened .waffle-assistant-entry-button-black-icon{display:block}.waffle-assistant-entry-opened .waffle-assistant-entry-button-green-icon{display:none}.waffle-assistant-entry-opened .waffle-assistant-entry-label{color:#737373}.waffle-assistant-link-button{color:#4285f4;display:inline;text-decoration:underline}.waffle-assistant-link-button:hover,.waffle-assistant-link-button:focus{cursor:pointer;text-decoration:underline}.waffle-assistant-link-button:focus{margin:0 2px;outline-color:#4285f4;outline-width:2px}.waffle-assistant-button{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;border:1px solid transparent;border-radius:2px;font-size:11px;font-weight:500;margin-right:0;min-width:40px;opacity:0.8;padding:0;text-align:center;white-space:nowrap}.waffle-assistant-button-focused{border:1px solid #5e97f6;outline:none}.waffle-assistant-button-hover,.waffle-assistant-button-focused,.waffle-assistant-button-holder .waffle-assistant-button.waffle-assistant-button-hover,.waffle-assistant-button-holder .waffle-assistant-button.waffle-assistant-button-focused{cursor:pointer;opacity:1}.waffle-assistant-button-holder .waffle-assistant-button{height:24px;min-width:24px;opacity:0.6;padding:2px}.waffle-assistant-dragged-formula{box-shadow:1px 1px 4px rgba(0,0,0,0.28);background-color:#fff;border:1px solid #e0e0e0;line-height:22px;overflow-wrap:break-word;word-wrap:break-word}.waffle-assistant-formula-insertion-rect{background-color:#000;opacity:0.06}.waffle-assistant-visible{visibility:visible}.docs-ui-toast.waffle-assistant-toast{box-shadow:0px 2px 2px 0px rgba(0,0,0,0.14),0px 3px 1px -2px rgba(0,0,0,0.12),0px 1px 5px 0px rgba(0,0,0,0.2);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:flex;bottom:60px;color:rgba(255,255,255,0.87);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;font-weight:500;left:auto;line-height:20px;min-width:0;padding:14px 24px;right:15px;width:286px}.waffle-assistant-toast-content{-ms-flex:1;-webkit-flex:1;flex:1;font-weight:400;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.waffle-assistant-toast-action{color:#a0c1fc;text-transform:uppercase}.waffle-assistant-panel-title-bar{height:20px}.waffle-assistant-panel-back-button{cursor:pointer}.waffle-assistant-panel-back-button-icon{height:20px;margin-bottom:1px}.waffle-assistant-panel-pane{height:100%}.waffle-assistant-sidebar.waffle-sidebar-container{box-shadow:0px 2px 2px 0px rgba(0,0,0,0.14),0px 3px 1px -2px rgba(0,0,0,0.12),0px 1px 5px 0px rgba(0,0,0,0.2);background:#f1f1f1;width:320px}.waffle-assistant-title.waffle-sidebar-title{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;transition:height .3s;background-color:#0f9d58;color:#fff;font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;line-height:20px;min-height:36px;padding:0px}.waffle-assistant-title .waffle-sidebar-title-close{right:11px;top:6px}.waffle-assistant-title-bar,.waffle-assistant-panel-title-bar{display:flex;-webkit-align-items:center;align-items:center}.waffle-assistant-replaceable-title,.waffle-assistant-title-bar{padding:8px 12px}.waffle-assistant-replaceable-title .waffle-assistant-title-bar{padding:0}.waffle-assistant-title-text{-ms-flex:1;-webkit-flex:1;flex:1;-webkit-align-items:center;align-items:center;font-weight:500;margin-top:4px;padding-left:12px}.waffle-assistant-title-icon{height:20px;position:relative;width:20px}.waffle-assistant-sidebar-content.waffle-sidebar-content{overflow:hidden}.waffle-assistant-scroll-pane{background:#f1f1f1;height:100%;overflow-x:hidden;overflow-y:auto}.waffle-assistant-scroll-pane-content{height:100%}.waffle-assistant-scroll-pane-feature-content{height:100%}.waffle-assistant-expanded-panel{height:100%;width:320px}.waffle-assistant-spinner-container{text-align:center;pointer-events:none;position:absolute;width:100%}.waffle-assistant-expanded-panel .waffle-assistant-spinner-container{display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;height:100%}.waffle-assistant-empty-list{display:flex;background:#fff;color:rgb(46%,46%,46%);height:100%;text-align:center;width:320px}.waffle-assistant-empty-list-content{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;margin:auto 24px;width:100%}.waffle-assistant-empty-list svg{padding-bottom:24px}.waffle-assistant-empty-list-title{color:rgb(46%,46%,46%);font-size:15px;font-weight:500}.waffle-assistant-empty-list-body{color:rgb(46%,46%,46%);font-size:13px;padding:8px 0}.waffle-assistant-empty-list-link{font-size:13px;font-weight:400;margin:0}.waffle-assistant-empty-list-link span,.waffle-assistant-empty-list-link a{color:#1a73e8;cursor:pointer}.waffle-assistant-empty-list-link a:hover{text-decoration:none}.waffle-assistant-feature-section{box-shadow:0 2px 2px rgba(0,0,0,0.10);background:white;margin-bottom:8px}.waffle-assistant-feature-section:last-child{margin-bottom:0}.waffle-assistant-section-header{display:flex;-webkit-align-items:center;align-items:center;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;padding:16px 16px 0 16px;position:relative;width:288px}.waffle-assistant-section-title{-ms-flex:1;-webkit-flex:1;flex:1;color:rgba(0,0,0,0.54);font-size:13px;font-weight:600;height:15px;line-height:15px;text-transform:uppercase}.jfk-button.waffle-assistant-section-more-button{border:0;color:#1a73e8;cursor:pointer;height:15px;font-size:13px;line-height:15px;margin-right:16px;text-transform:uppercase}.jfk-button.waffle-assistant-section-more-button:focus{border:1px solid #5e97f6;outline:none}.waffle-assistant-section-content{padding-bottom:10px}.waffle-assistant-scroll-pane::-webkit-scrollbar{width:12px}.waffle-assistant-scroll-pane::-webkit-scrollbar-thumb{background-clip:padding-box;background-color:#dadce0;border:solid transparent;border-width:1px 1px 1px 2px;box-shadow:none;min-height:28px;padding:1px}.waffle-assistant-scroll-pane::-webkit-scrollbar-thumb:hover{background-color:#bdc1c6;box-shadow:none}.waffle-assistant-scroll-pane::-webkit-scrollbar-thumb:active{background-color:#80868b}.waffle-assistant-scroll-pane::-webkit-scrollbar-track{background-clip:border-box;background-color:#f8f8f8;border:none;border-width:1px;box-shadow:none}.waffle-assistant-scroll-pane::-webkit-scrollbar-track:hover{background-clip:border-box;background-color:#f8f8f8;border:none;border-width:1px;box-shadow:none}.waffle-assistant-form .waffle-assistant-input-edit-button{flex-shrink:0;margin-right:3px}.waffle-assistant-card-feedback{flex-shrink:0;margin-right:3px}.waffle-assistant-card{background:#fff;border-bottom:1px solid #e0e0e0;margin-bottom:8px;outline:0;overflow:hidden;position:relative}.waffle-assistant-feature-section .waffle-assistant-card{margin-bottom:0}.waffle-assistant-panel-pane .waffle-assistant-card{box-shadow:0 2px 2px rgba(0,0,0,0.10)}.waffle-assistant-card-spinner-container{position:absolute;text-align:center;top:50%;transform:translateY(-50%);width:100%}.waffle-assistant-card-inner{position:relative}.waffle-assistant-padded-card{padding:15px}.waffle-assistant-button-holder{background-color:rgba(255,255,255,0.7);padding:3px;position:absolute;top:0;z-index:1}.waffle-assistant-dragger-card .waffle-assistant-button-holder,.waffle-assistant-dragger-card .waffle-assistant-chart-highlights,.waffle-assistant-dragger-card .waffle-assistant-facet-section{display:none}.waffle-assistant-card-draggable{cursor:move}.waffle-assistant-readonly .waffle-assistant-card:hover{cursor:default}.waffle-assistant-card-options{-webkit-border-radius:0 0 0 2px;-moz-border-radius:0 0 0 2px;border-radius:0 0 0 2px;box-shadow:-1px 1px 3px #d3d3d3;right:0}.waffle-assistant-padded-card{padding:15px}.waffle-assistant-feedback-card-content{-ms-flex:1;-webkit-flex:1;flex:1;vertical-align:middle;line-height:19px}.waffle-assistant-feedback-card-text{margin:2px 0}.waffle-assistant-feedback-card-custom-msg-placeholder{font-size:10px;font-style:italic;line-height:11px;margin:2px 0}.waffle-assistant-feedback-card{box-shadow:0px 2px 4px rgba(0,0,0,.3);display:flex;background-color:white;cursor:default;margin:5px;max-height:500px;overflow:hidden;padding:15px;width:250px}.waffle-assistant-feedback-card-close-button{-webkit-align-self:flex-start;align-self:flex-start;min-width:auto}.waffle-assistant-card .waffle-assistant-feedback-card{transition:all .1s}.waffle-assistant-dragger-card .waffle-assistant-feedback-card{display:none}.waffle-assistant-card .waffle-assistant-feedback-card-hidden{padding:0 15px 0 15px;margin:0 5px 0 5px;max-height:0}.waffle-assistant-insert-chart-button.jfk-button,.waffle-assistant-zoom-button.jfk-button,.waffle-assistant-thumbs-down-button.jfk-button,.waffle-assistant-thumbs-up-button.jfk-button{cursor:pointer;display:block;height:24px;margin:0 auto 0 auto;min-width:24px;opacity:.6;padding:1px;width:24px}.waffle-assistant-insert-chart-button.jfk-button:hover,.waffle-assistant-zoom-button.jfk-button:hover,.waffle-assistant-thumbs-down-button.jfk-button:hover,.waffle-assistant-thumbs-up-button.jfk-button:hover{opacity:.8}.waffle-assistant-insert-chart-button.jfk-button:active,.waffle-assistant-zoom-button.jfk-button:active,.waffle-assistant-thumbs-down-button.jfk-button:active,.waffle-assistant-thumbs-up-button.jfk-button:active{opacity:1}.waffle-assistant-thumbs-down-icon{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -150px 0;height:24px;width:24px}.waffle-assistant-thumbs-up-icon{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -113px -46px;height:24px;width:24px}.waffle-assistant-button-separator{border-bottom:1px solid #d3d3d3;height:0;margin:3px;width:21px}.waffle-assistant-card-feedback-container{display:flex;-webkit-align-items:flex-end;align-items:flex-end;-webkit-justify-content:center;justify-content:center;background:rgba(0,0,0,0.38);height:100%;position:absolute;width:100%;z-index:1}.waffle-assistant-feedback-card-hidden{display:none!important}.waffle-assistant-thumbs-container,.waffle-assistant-facet-thumbs-container{border-top:1px dashed #e0e0e0;color:#616161}.waffle-assistant-thumbs{display:flex;-webkit-align-items:center;align-items:center;height:40px;line-height:16px;padding:0 15px}.waffle-assistant-thumbs-button-holder{display:flex}.waffle-assistant-thumbs-up-button,.waffle-assistant-thumbs-down-button{min-width:30px!important}.waffle-assistant-thumbs-text{-ms-flex:1;-webkit-flex:1;flex:1;text-transform:uppercase}.waffle-assistant-quicksum-panel{background:#fff;border-bottom:1px solid #e0e0e0;line-height:19px;margin-bottom:8px;padding:15px;position:relative}.waffle-assistant-scroll-pane-feature-content .waffle-assistant-quicksum-panel{box-shadow:0 2px 2px rgba(0,0,0,0.10)}.waffle-assistant-quicksum-entry{border:1px solid transparent;color:#757575;cursor:move;font-family:Roboto,Arial,sans-serif;padding:0 5px}.waffle-assistant-quicksum-entry:hover,.waffle-assistant-quicksum-entry:focus{border:1px solid #5e97f6}.waffle-assistant-quicksum-panel-readonly .waffle-assistant-quicksum-entry:hover,.waffle-assistant-quicksum-panel-readonly .waffle-assistant-quicksum-entry:focus{border:1px solid transparent}.waffle-assistant-quicksum-panel-readonly .waffle-assistant-quicksum-entry{border:1px solid transparent;cursor:default}.waffle-assistant-quicksum-entry-name{font-weight:500;margin-right:10px}.waffle-assistant-quicksum-entry-value{float:right}.waffle-assistant-walkthrough-promo-content{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;line-height:22px;padding:15px 20px;width:300px}.waffle-assistant-walkthrough-promo-header{font-size:20px}.waffle-assistant-walkthrough-promo-button{cursor:pointer;font-size:14px;font-weight:500;text-transform:uppercase}.waffle-assistant-walkthrough-promo-continue-button{color:#5e97f5;margin-right:10px}.waffle-assistant-walkthrough-promo-close-button{margin-left:10px;opacity:0.7}.waffle-april2018-promo-base,.waffle-assistant-entry-promo{background-color:#0f9d58;border-color:#0f9d58;bottom:-500px;right:-450px}.waffle-april2018-promo-content,.waffle-assistant-entry-promo .docs-explore-promo-content{left:-300px;top:-170px;width:360px}.range-border.waffle-assistant-table-range-border{border-color:#0f9d58;border-style:dashed;line-height:0}.waffle-assistant-table-range-rect{background-color:#0f9d58;opacity:0.06;pointer-events:none}.range-border.waffle-assistant-header-range-border{border-color:#f09300;border-style:dashed;line-height:0}.waffle-assistant-header-range-rect{background-color:#f09300;opacity:0.06;pointer-events:none}.waffle-assistant-card .docs-charts-tooltip{font-size:10px;padding:4px 8px;line-height:1.1em}.waffle-assistant-highlight-styled-rect{background-color:#34a853;opacity:0.06;pointer-events:none}.range-border.waffle-assistant-highlight-styled-border{border-color:#34a853;border-style:dashed}.waffle-assistant-highlight-styled-rect-red{background-color:#ea4335;opacity:0.06;pointer-events:none}.range-border.waffle-assistant-highlight-styled-border-red{border-color:#ea4335;border-style:dashed}.waffle-assistant-mouseover-highlight-styled-rect{background-color:#34a853;opacity:0.25;pointer-events:none}.range-border.waffle-assistant-mouseover-highlight-styled-border{border-color:#34a853;border-style:dashed}.waffle-assistant-mouseover-highlight-styled-rect-red{background-color:#ea4335;opacity:0.25;pointer-events:none}.range-border.waffle-assistant-mouseover-highlight-styled-border-red{border-color:#ea4335;border-style:dashed}.waffle-inline-assistant-refresh-banner{background:white;border:0.5px solid transparent;box-shadow:0 -1px 5px rgba(128,134,139,0.09),0px 3px 5px rgba(128,134,139,0.06),0px 1px 2px rgba(60,64,67,0.3),0px 1px 3px rgba(60,64,67,0.15);margin-bottom:8px;overflow:hidden;position:absolute;z-index:10}.waffle-inline-assistant-refresh-text{color:#202124;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:0.3px;line-height:16px;margin:12px 0 12px 16px;width:166px}.waffle-inline-assistant-refresh-text-container{align-items:center;background:#e6f4ea;border-radius:4px;display:flex;flex-wrap:wrap;justify-content:space-between;margin:8px;position:relative;width:284px}.waffle-sidebar-container .waffle-inline-assistant-refresh-button.jfk-button-standard,.waffle-sidebar-container .waffle-inline-assistant-refresh-button.jfk-button-standard.jfk-button-hover,.waffle-sidebar-container .waffle-inline-assistant-refresh-button.jfk-button-standard.jfk-button-focused,.waffle-sidebar-container .waffle-inline-assistant-refresh-button.jfk-button-standard.jfk-button-hover.jfk-button-focused{background:none;border:none!important;color:#188038;cursor:pointer;margin-right:8px;max-width:100%;overflow:hidden;padding:8px;text-overflow:ellipsis;white-space:nowrap}.waffle-sidebar-container .waffle-inline-assistant-refresh-button.jfk-button-standard.jfk-button-hover,.waffle-sidebar-container .waffle-inline-assistant-refresh-button.jfk-button-standard.jfk-button-focused,.waffle-sidebar-container .waffle-inline-assistant-refresh-button.jfk-button-standard.jfk-button-hover.jfk-button-focused{background:rgba(0,0,0,.06)}.waffle-inline-assistant-sidebar-category-cards{color:#3c4043;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif}.waffle-inline-assistant-sidebar-category-label{color:#5f6368;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:11px;font-weight:500;height:14px;letter-spacing:0.8px;line-height:14px;text-transform:uppercase}.waffle-inline-assistant-sidebar-category-description{color:#3c4043;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;line-height:16px;letter-spacing:0.3px;font-weight:normal;padding:8px 8px 4px 16px}.waffle-inline-assistant-sidebar-intro{color:#80868b;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;padding:16px 16px 6px}.waffle-inline-assistant-sidebar-accepted-container{margin:0 20px;text-align:center}.waffle-inline-assistant-sidebar-accept-back{margin-right:0}.waffle-inline-assistant-sidebar-column-filter-dropdown-container{margin-bottom:16px;overflow:hidden;padding-right:15px;position:relative}.waffle-inline-assistant-sidebar-column-filter-dropdown{float:right;margin:auto;width:125px}.docs-material-gm-labeled-select-focused .docs-material-gm-labeled-select-outer-box{background-color:rgba(60,64,67,0.06);border:1px solid #dadce0}.waffle-inline-assistant-sidebar-column-filter-dropdown .docs-material-gm-labeled-select-outer-box{border-radius:8px;padding:0 6px 0 10px;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif}.waffle-inline-assistant-sidebar-column-filter-dropdown .waffle-view-icons-error-filled{display:none;height:13px;width:13px}.waffle-inline-assistant-sidebar-column-filter-dropdown .filter-active .waffle-view-icons-error-filled{display:block}.waffle-inline-assistant-sidebar-column-filter-dropdown .filter-active .docs-material-gm-labeled-select-outer-box{border:none;background-color:#fce8e6}.waffle-inline-assistant-sidebar-column-filter-dropdown .filter-active.docs-material-gm-labeled-select-focused .docs-material-gm-labeled-select-outer-box{background-color:#fad2cf}.waffle-inline-assistant-sidebar-column-filter-dropdown .filter-active .docs-material-gm-labeled-select-caption{color:#d93025}.waffle-inline-assistant-recommendation-container{align-items:center;border:1px solid #dadce0;border-top:none;display:flex;height:36px;margin:0;outline:none;overflow-x:auto;overflow-y:hidden;position:relative}.waffle-inline-assistant-recommendation-container:last-child{border-bottom-left-radius:4px;border-bottom-right-radius:4px}.waffle-inline-assistant-overflow-suggestions .waffle-inline-assistant-recommendation-container:last-child{border-bottom-left-radius:0;border-bottom-right-radius:0}.waffle-inline-assistant-gridrange-chip{background-color:#f8f9fa;border-right:1px solid #dadce0;box-sizing:border-box;color:#d93025;flex-shrink:0;font-weight:500;height:36px;line-height:36px;overflow:hidden;padding:1px 0;position:relative;text-align:center;width:48px}.waffle-inline-assistant-gridrange-chip.waffle-inline-assistant-gridrange-chip-changed{color:#1a73e8}.waffle-inline-assistant-gridrange-chip.waffle-inline-assistant-gridrange-chip-neutral{color:#3c4043}.waffle-inline-assistant-gridrange-chip-hovered{background-color:rgba(0,0,0,.06)}.waffle-inline-assistant-suggestion-row{flex-grow:1;overflow:hidden;position:relative;white-space:nowrap}.waffle-inline-assistant-suggestion-overflow-action-strip{align-items:center;border:1px solid #dadce0;border-radius:0 0 4px 4px;border-top:none;display:flex;flex-wrap:wrap;justify-content:flex-end;min-height:32px;padding:0 6px;text-align:left}.waffle-inline-assistant-suggestion-overflow-action-strip .waffle-assistant-feedback-button{height:30px}.waffle-inline-assistant-accept-button,.waffle-inline-assistant-ignore-button{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.waffle-inline-assistant-card-show-more-button{border-radius:100%;color:#3c4043;cursor:pointer;font-size:12px;font-weight:normal;height:24px;letter-spacing:0.3px;margin:0 auto 0 6px;min-width:24px;padding:2px;width:24px}.waffle-inline-assistant-card-show-more-button.jfk-button-checked{transform:rotate(180deg)}.waffle-inline-assistant-card-show-more-button.jfk-button-checked .docs-icon{margin-bottom:5px;margin-right:1px}.waffle-inline-assistant-card-show-more-button.jfk-button-checked:hover{box-shadow:0 -1px 1px rgba(0,0,0,0.1)}.waffle-inline-assistant-card-show-more-button:hover,.waffle-inline-assistant-card-show-more-button:focus{background:rgba(0,0,0,.06)}.waffle-inline-assistant-card-show-more-button:active{background:rgba(0,0,0,0.12)}.waffle-inline-assistant-card-show-more-button .docs-icon{height:24px;margin:0;width:24px;zoom:75%}.waffle-inline-assistant-suggestion-details{border-radius:4px;border-top:1px solid #dadce0;margin:0 14px 16px;outline:none;overflow:hidden}.waffle-inline-assistant-suggestion-details:last-child{margin:0 14px 14px}.waffle-inline-assistant-nf-suggestion{margin-bottom:8px;outline:none}.waffle-inline-assistant-nf-row{align-items:center;border:none;border-radius:0;display:flex;margin:0;overflow:hidden;padding:0 0 0 8px;text-overflow:ellipsis}.waffle-inline-assistant-nf-suggestion-description{color:#5f6368;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:0.3px;line-height:16px;margin:0 16px 3px}.waffle-inline-assistant-nf-suggestion-text{flex-grow:1;height:36px;padding:1px 0;line-height:36px;overflow:hidden;position:relative;text-overflow:ellipsis;border-radius:4px 0 0 4px;box-sizing:border-box}.waffle-inline-assistant-nf-original-preview{text-decoration:line-through}.waffle-inline-assistant-nf-suggested-preview{color:#188038}.waffle-inline-assistant-nf-check{border-radius:50%;flex-shrink:0;width:27px;min-width:27px;margin:0 3px;padding:2px;cursor:pointer}.waffle-inline-assistant-nf-check.jfk-button-hover{box-shadow:none}.waffle-inline-assistant-nf-check:hover,.waffle-inline-assistant-nf-check:focus{background:rgba(0,0,0,.06)}.waffle-inline-assistant-nf-check:active{background:rgba(0,0,0,0.12)}.waffle-inline-assistant-sidebar-rd-category-bulk-pill{align-items:center;border:1px solid #dadce0;border-radius:4px;box-sizing:border-box;color:#3c4043;display:flex;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;justify-content:space-between;margin:0 14px 11px;padding:5px 6px;overflow:hidden}.waffle-inline-assistant-bulk-rd-message{height:30px;line-height:30px;margin:0 10px}.waffle-inline-assistant-rd-cell-preview{border:none;border-radius:0;margin:0;padding:0 8px;overflow:hidden;text-overflow:ellipsis}.waffle-inline-assistant-rd-deleted-strikethrough{position:absolute;left:9px;top:50%;height:1px;background:#3c4043;z-index:1;right:9px}.waffle-inline-assistant-rd-cell-value-divider{height:36px;border-left:1px solid #dadce0;margin:0 10px;display:inline-block;vertical-align:middle}.waffle-inline-assistant-tw-row{height:36px;line-height:36px;padding:0 8px}.waffle-inline-assistant-tw-space{background:#f28b82;border:1px solid transparent;box-sizing:border-box;display:inline-block;height:18px;margin:8px 0.5px 10px 0.5px;mix-blend-mode:multiply;vertical-align:middle;width:4px}.docs-material-gm-checkbox.waffle-inline-assistant-rd-checkbox{position:absolute;right:8px;top:50%!important;transform:translateY(-50%);border:2px solid #5f6368!important}.docs-material-gm-checkbox-checked.waffle-inline-assistant-rd-checkbox{background-color:#5f6368!important;border:2px solid #5f6368!important}.docs-material-gm-checkbox-checked.waffle-assistant-kg-apply-all-check{background-color:#5f6368!important;border:2px solid #5f6368!important}.waffle-inline-assistant-sidebar .waffle-sidebar-content{bottom:0;left:0;position:absolute;right:0;z-index:1}.waffle-inline-assistant-sidebar-toast{align-items:center;background:#202124;border:1px solid transparent;border-radius:4px;bottom:14px;box-shadow:0 5px 7px rgba(60,64,67,0.15),0 2px 2px rgba(60,64,67,0.3);box-sizing:border-box;display:flex;opacity:1;overflow:hidden;padding:16px 12px 16px 16px;position:absolute;right:14px;width:268px;z-index:1000}.waffle-inline-assistant-sidebar-toast-hidden{opacity:0;transition:opacity 0.2s linear}.waffle-inline-assistant-toast-text{color:#dadce0;flex-grow:1;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:normal;letter-spacing:0.25px;line-height:19px}.jfk-button.waffle-inline-assistant-toast-undo-button{box-sizing:border-box;color:#6ba5ed;cursor:pointer;margin:0;padding:0}.waffle-inline-assistant-sidebar-rd-category-bulk-pill .waffle-inline-assistant-bulk-rd-accept-button,.waffle-inline-assistant-toast-undo-button{margin:0 2px 0 0}.waffle-inline-assistant-sidebar-insights-promo{background:#f8f9fa;border-radius:8px;margin:14px;padding:18px}.waffle-inline-assistant-sidebar-insights-button{display:block;margin:0 auto}.waffle-inline-assistant-sidebar-insights-header{color:#202124;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:16px;font-weight:500;letter-spacing:0.1px;line-height:24px;text-align:center}.waffle-inline-assistant-sidebar-insights-body{color:#3c4043;font-size:14px;letter-spacing:0.2px;line-height:20px;margin:16px 0;text-align:center}.waffle-inline-assistant-sidebar-empty-container{margin:20px;text-align:center}.waffle-inline-assistant-sidebar-accepted-message,.waffle-inline-assistant-sidebar-empty-message{color:#3c4043;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;letter-spacing:0.2px;margin:15px}.waffle-inline-assistant-sidebar-empty-check{filter:invert(100%);height:30px;padding:10px}.waffle-assistant-floating-popup{box-shadow:0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12),0px 2px 4px -1px rgba(0,0,0,0.2);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:white;border-radius:10px;bottom:30px;left:55px;padding:18px;position:absolute;width:320px;z-index:20}.waffle-assistant-popup-view{box-shadow:0 2px 6px 2px rgba(60,64,67,.15);display:table;position:absolute}.waffle-assistant-popup-suggestion{background:#fff;color:#3c4043;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;overflow:hidden;outline:none;margin:2px 10px;padding:8px 0 8px 14px;position:relative;text-align:left;cursor:pointer}.waffle-assistant-popup-suggestion:hover,.waffle-assistant-popup-suggestion:focus{background:rgba(0,0,0,.06)}.waffle-assistant-popup-suggestion:active{background:rgba(0,0,0,0.12)}.waffle-assistant-popup-suggestion-text{font-size:14px;line-height:21px;white-space:normal;word-wrap:break-word}.docs-material-gm-checkbox.waffle-assistant-card-checkbox{border:2px solid #80868b;float:left;margin-top:-1px;position:absolute;top:50%;transform:translateY(-50%)}.docs-material-gm-checkbox-checked.waffle-assistant-card-checkbox{border:2px solid #188038}.waffle-assistant-card-unchecked-hovered-checkbox{opacity:0.7}.waffle-inline-assistant-sidebar-accept{float:right;margin:16px}.waffle-inline-assistant-sidebar-survey-container{background-color:#f8f9fa;cursor:pointer;padding:12px;text-align:center}.waffle-inline-assistant-sidebar-accepted-container .waffle-inline-assistant-sidebar-survey-container{margin:0 -20px}.waffle-inline-assistant-sidebar-survey-link:hover{text-decoration:none}.waffle-inline-assistant-sidebar-survey-container:hover,.waffle-inline-assistant-sidebar-survey-container:focus{background:rgba(0,0,0,.06)}.waffle-inline-assistant-sidebar-survey-container:active{background:rgba(0,0,0,0.12)}.waffle-inline-assistant-sidebar{background-color:white}.waffle-inline-assistant-sidebar .waffle-sidebar-footer-container{background-color:white;border-top:1px solid #dadce0}.waffle-inline-assistant-feedback-button.waffle-ui-text-link-button{align-items:center;color:#5f6368;display:flex;float:right;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;line-height:24px;padding:8px}.waffle-inline-assistant-feedback-button svg{margin-right:5px}.waffle-assistant-card-text{color:#5f6368;display:inline-block;font-size:14px;letter-spacing:0.2px;line-height:20px;margin-left:32px;margin-right:40px;white-space:normal;word-wrap:break-word}.waffle-assistant-card-text .waffle-assistant-feedback-button{float:right}.waffle-assistant-form{align-items:center;display:flex;flex-shrink:1;overflow:hidden;width:100%}.waffle-assistant-form .jfk-textinput{flex-shrink:1;min-width:1px;width:100%;text-overflow:ellipsis}.waffle-inline-assistant-sidebar-category-show-more-button{color:#3c4043;cursor:pointer;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:normal;letter-spacing:0.3px;margin:4px 14px 16px;position:relative;text-align:center}.waffle-inline-assistant-sidebar-category-show-more-description{background:white;display:inline-block;line-height:16px;padding:0 8px}.waffle-inline-assistant-sidebar-category-show-more-background-line{background:#dadce0;height:1px;left:0;margin-top:-1px;position:absolute;right:0;top:50%;z-index:-100}.waffle-inline-assistant-sidebar-category-show-more-button:hover .waffle-inline-assistant-sidebar-category-show-more-description,.waffle-inline-assistant-sidebar-category-show-more-button:focus .waffle-inline-assistant-sidebar-category-show-more-description{background:#f0f0f0}.waffle-inline-assistant-sidebar-category-show-more-button:hover,.waffle-inline-assistant-sidebar-category-show-more-button:focus{background:rgba(0,0,0,.06)}.waffle-inline-assistant-sidebar-category-show-more-button:active .waffle-inline-assistant-sidebar-category-show-more-description{background:#e0e0e0}.waffle-inline-assistant-sidebar-category-show-more-button:active{background:rgba(0,0,0,0.12)}.waffle-inline-assistant-sidebar-divider{border-top:1px solid #dadce0;margin:6px 15px 8px}.waffle-inline-assistant-sidebar-category-show-more-button .docs-icon{height:24px;margin:0 4px 0 0;width:24px}.docs-auto-fix{filter:invert(37%) sepia(93%) saturate(360%) hue-rotate(86deg) brightness(88%) contrast(100%)}.waffle-inline-assistant-sidebar-category-show-more-button.jfk-button-hover{box-shadow:none}.waffle-inline-assistant-sidebar-category-header{color:#188038;margin:12px 0;overflow:hidden;padding:0 3px 0 16px}.waffle-inline-assistant-rec-range{color:#188038;font-weight:500}.waffle-inline-assistant-rec-range-red{color:#d93025;font-weight:500}.waffle-inline-assistant-rec-detail{color:#202124;font-weight:500;white-space:nowrap}.waffle-assistant-popup-num-patterns{font-weight:500}.waffle-assistant-popup-button-row{margin-top:18px;text-align:right}.jfk-button-action.waffle-assistant-popup-button{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff}.jfk-button-action.waffle-assistant-popup-button.goog-button-hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#2a8947;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15)}.jfk-button-action.waffle-assistant-popup-button.goog-button-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#4f9e67;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15)}.jfk-button-action.waffle-assistant-popup-button.goog-button-hover.goog-button-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#62a877;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15)}.jfk-button-standard.waffle-assistant-popup-button{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:white;border:1px solid #dadce0!important;color:#188038}.jfk-button-standard.waffle-assistant-popup-button.goog-button-hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#f8fcf9;border:1px solid #c8e7d1!important}.jfk-button-standard.waffle-assistant-popup-button.goog-button-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#e7f5eb;border:1px solid #bbe2c6!important}.jfk-button-standard.waffle-assistant-popup-button.goog-button-hover.goog-button-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#dff2e4;border:1px solid #b5e0c1!important}.waffle-assistant-popup-button-review{margin-right:0}.waffle-assistant-popup-button-dismiss{background-color:#f1f3f4}.waffle-assistant-popup-logo{float:left;margin-right:18px;min-width:0;outline:none;padding:3px}.waffle-feedback-troubleshoot-item{color:#5f6368;font-size:11px;width:168px}.waffle-feedback-troubleshoot-item-icon,.waffle-feedback-troubleshoot-item-text{display:inline}.waffle-assistant-feedback-dialog,.waffle-assistant-feedback-product-info-dialog{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif}.waffle-assistant-feedback-dialog{min-width:464px;max-width:512px}.waffle-assistant-feedback-dialog .docs-material-gm-dialog-content{font-size:14px;padding-bottom:0}.waffle-assistant-feedback-dialog-radio-button{padding:8px}.waffle-assistant-feedback-dialog-radio-button .jfk-radiobutton-radio{left:0}.waffle-assistant-feedback-dialog-radio-button .jfk-radiobutton-label{margin-left:16px}.waffle-assistant-feedback-dialog-feedback-radio-buttons-control .waffle-assistant-feedback-dialog-radio-button{display:block}.waffle-assistant-feedback-dialog-legal{margin-right:16px;max-width:256px}.waffle-assistant-feedback-dialog-legal-information-text{color:#80868b}.waffle-assistant-feedback-dialog-product-info-display-text{color:#5f6368;cursor:pointer;padding-top:10px;text-decoration:underline}.waffle-assistant-feedback-dialog-header{color:#1967d2;font-weight:500;padding:8px 0;text-transform:uppercase}.waffle-assistant-feedback-product-info-dialog .docs-material-gm-dialog-content{max-height:568px;overflow:auto;overflow-wrap:break-word;width:466px}.waffle-assistant-feedback-product-info-dialog dt{font-weight:500}.waffle-assistant-feedback-dialog .jfk-textinput{border:1px solid #dadce0;border-radius:4px;box-sizing:border-box;color:#3c4043;padding:1px 8px;font-size:14px;height:36px;margin:8px 0}.waffle-assistant-feedback-dialog textarea.jfk-textinput{height:auto;height:unset;min-height:52px;min-width:100%;max-height:52px;padding:7px 8px}.waffle-assistant-feedback-dialog .jfk-textinput:focus{border:2px solid #1a73e8;box-shadow:none;padding:0px 7px}.waffle-assistant-feedback-dialog textarea.jfk-textinput:focus{padding:6px 7px}.waffle-assistant-kg-description{color:#5f6368;display:inline-block;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;letter-spacing:.3px;line-height:16px;margin:0 16px;white-space:normal;word-wrap:break-word}.waffle-assistant-apply-all-description{color:#5f6368;display:inline-block;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;letter-spacing:.3px;line-height:16px;margin:0 16px;white-space:normal;word-wrap:break-word}.waffle-assistant-kg-card{border-radius:8px;box-shadow:0 -1px 5px rgba(128,134,139,0.09),0 3px 5px rgba(128,134,139,0.06),0 1px 2px rgba(60,64,67,0.3),0 1px 3px rgba(60,64,67,0.15);margin:0 14px 16px;outline:none;overflow:hidden;position:relative}.waffle-assistant-kg-cell-input-row{border:1px solid #dadce0;border-top:none;font-size:13px;margin:0;position:relative}.waffle-inline-assistant-overflow-suggestions:last-child .waffle-assistant-kg-cell-input-row{border-bottom-left-radius:4px;border-bottom-right-radius:4px}.waffle-assistant-card-apply-all{background-color:#e6f4ea;border-radius:4px;color:#188038;font-family:'Google Sans Medium',sans-serif;font-size:14px;font-weight:medium;height:36px;margin:0 14px 4px;overflow:hidden;position:relative;z-index:1000}.waffle-assistant-card-apply-all .waffle-inline-assistant-apply-all-input-box.jfk-textinput{color:inherit}.waffle-assistant-card-apply-all-focused{background-color:white;border:1.5px solid #1a73e8;color:inherit;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;margin:0 14px 2px}.waffle-assistant-apply-all-text-empty{background-color:white;border:1px solid #dadce0}.waffle-inline-assistant-category-card{border-radius:8px;box-shadow:0 -1px 5px rgba(128,134,139,0.09),0 3px 5px rgba(128,134,139,0.06),0 1px 2px rgba(60,64,67,0.3),0 1px 3px rgba(60,64,67,0.15);margin:0 14px 16px;overflow:hidden}.waffle-assistant-input-container{display:flex;height:36px;overflow-x:auto;overflow-y:hidden}.waffle-assistant-input-container.waffle-assistant-input-container-focused,.waffle-assistant-input-container.waffle-assistant-input-container-changed{border-radius:4px;margin:0 -1px}.waffle-assistant-input-container.waffle-assistant-input-container-focused{border:1.5px solid #d93025}.waffle-assistant-card-apply-all .waffle-assistant-input-container.waffle-assistant-input-container-focused{margin:0 14px -1px}.waffle-assistant-input-container.waffle-assistant-input-container-changed{border:1.5px solid #1a73e8}.waffle-assistant-input-reject-icon{cursor:pointer;height:36px;line-height:36px;margin:-1px 0 0 0;min-width:27px;opacity:0;z-index:-1}.waffle-inline-assistant-gridrange-chip-hovered .waffle-assistant-input-reject-icon,.waffle-assistant-kg-cell-input-row:hover .waffle-assistant-input-reject-icon,.waffle-assistant-kg-cell-input-row:focus .waffle-assistant-input-reject-icon{opacity:100;z-index:1000}.waffle-assistant-input-reject-icon:focus{background:rgba(0,0,0,.06);opacity:100;z-index:1000}.waffle-assistant-input-reject-icon:hover{background:rgba(0,0,0,.06)}.waffle-assistant-input-reject-icon:active{background:rgba(0,0,0,0.12)}.waffle-assistant-input-return-icon{cursor:pointer;filter:invert(37%) sepia(68%) saturate(4465%) hue-rotate(204deg) brightness(96%) contrast(89%);flex-shrink:0;margin:4px}.waffle-sidebar-container .waffle-assistant-kg-cell-input.jfk-textinput:focus{border:none;outline-offset:0;padding:1px 8px}.waffle-sidebar-container .waffle-assistant-kg-cell-input.jfk-textinput{background-color:transparent;border:none;border-radius:0;margin:0}.waffle-assistant-kg-apply-all-container{display:flex;margin:0;overflow-x:auto;overflow-y:hidden;padding:8px 9px}waffle-assistant-kg-apply-to-all-text{display:inline-block;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;letter-spacing:0.3px;line-height:16px;margin:1px 1px 1px 4px;vertical-align:middle}input.jfk-textinput.waffle-assistant-kg-cell-input.waffle-inline-assistant-apply-all-input-box{width:100%}.waffle-assistant-kg-card-apply-all-hint{background:white;color:#1a73e8;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;left:27px;letter-spacing:0.3px;line-height:16px;padding:2px 4px;position:absolute;top:-9px;z-index:1001}.waffle-assistant-kg-card-apply-all-hint.waffle-assistant-kg-card-apply-all-hint-changed{color:#1a73e8}.waffle-inline-assistant-fade-in .waffle-inline-assistant-sidebar-column-filter-dropdown,.waffle-inline-assistant-fade-in .waffle-inline-assistant-sidebar-section{animation-duration:.5s;animation-name:fadein}@keyframes fadein{from{opacity:0;transform:scale(.85,.85)}to{opacity:1;transform:scale(1,1)}}.waffle-assistant-icon-button{background:transparent;border-radius:50%;box-sizing:border-box;cursor:pointer;height:32px;line-height:32px;outline:none;text-align:center;width:32px}.small.waffle-assistant-icon-button{height:24px;line-height:24px;width:24px}.waffle-assistant-icon-button:hover{background:rgba(13,101,45,.06)}.waffle-assistant-icon-button:focus{background:rgba(13,101,45,.12)}.waffle-assistant-icon-button:active{background:rgba(13,101,45,.1)}.goog-grey.waffle-assistant-icon-button:hover{background:rgba(32,33,36,.04)}.goog-grey.waffle-assistant-icon-button:focus{background:rgba(13,101,45,.12)}.goog-grey.waffle-assistant-icon-button:active{background:rgba(13,101,45,.1)}.waffle-assistant-input-return-icon.waffle-assistant-icon-button:hover{background:rgba(0,0,0,.06)}.waffle-assistant-input-return-icon.waffle-assistant-icon-button:focus{background:rgba(0,0,0,.12)}.waffle-assistant-input-return-icon.waffle-assistant-icon-button:active{background:rgba(0,0,0,.1)}.waffle-assistant-kg-card.waffle-assistant-input-edit-button{display:none}.waffle-assistant-anomaly-message{font-weight:bold;text-transform:lowercase}.waffle-assistant-input-edit-button .docs-icon{margin:0 1px 4px 0}.waffle-inline-assistant-bulk-accept-button{border:1px solid #a8dab5;cursor:pointer}.waffle-inline-assistant-bulk-accept-button:hover{background:#e6f4ea}.waffle-inline-assistant-bulk-accept-button:focus{background:#ceead6;border:1px solid #0d652d}.waffle-inline-assistant-bulk-accept-button:active{background:#ceead6;border:1px solid #a8dab5}.waffle-inline-assistant-bulk-action-button-disabled,.waffle-inline-assistant-bulk-action-button-disabled:hover,.waffle-inline-assistant-bulk-action-button-disabled:focus,.waffle-inline-assistant-bulk-action-button-disabled:active{background:white;border:1px solid rgba(60,64,67,0.12);cursor:default}.waffle-inline-assistant-bulk-accept-button-icon.docs-icon{height:24px;margin:1px 2px 1px 5px;width:24px}.waffle-inline-assistant-bulk-accept-button-icon .docs-icon-img{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_green.svg)!important}.waffle-inline-assistant-bulk-action-button-disabled .docs-icon-img{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_grey_medium.svg)}.waffle-inline-assistant-bulk-reject-button{border:1px solid #dadce0}.waffle-inline-assistant-bulk-reject-button:hover{background:#f8f9fa;cursor:pointer}.waffle-inline-assistant-bulk-reject-button:focus{background:#f1f3f4;border:1px solid #202124}.waffle-inline-assistant-bulk-reject-button:active{background:#f1f3f4;border:1px solid #dadce0}.waffle-inline-assistant-bulk-reject-button-icon.docs-icon{height:24px;margin:1.5px 2px 1.5px 5px;width:24px}.waffle-inline-assistant-bulk-action-buttons-wrapper{display:flex;margin:12px 0 12px 16px;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row}.waffle-inline-assistant-bulk-action-button{align-items:center;background:#ffffff;border-radius:20px;box-sizing:border-box;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;height:36px;margin-right:8px;mix-blend-mode:normal;width:36px}.waffle-inline-assistant-bulk-action-button:focus{outline:none}.waffle-inline-assistant-bulk-action-buttons-description{color:#188038;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:16px;line-height:24px;margin-left:16px}.waffle-assistant-filter-button{margin:0;max-width:100%;min-width:28px;overflow:hidden;padding:0!important;text-overflow:ellipsis;white-space:nowrap}.waffle-assistant-insert-chart-button.jfk-button{position:relative;left:-1px}.waffle-assistant-zoom-button.jfk-button{position:relative;left:1px}.waffle-assistant-chart-preview{cursor:move;height:238px;width:271px}.waffle-assistant-readonly .waffle-assistant-chart-preview{cursor:default}.waffle-assistant-chart-preview.waffle-assistant-dragged-card{background-color:#fff;border:1px solid #e0e0e0;z-index:1000}.waffle-assistant-chart-highlights{border-left:3px solid #0f9d58;color:#616161;cursor:text;padding-left:15px;margin-top:20px;margin-bottom:20px;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text}.waffle-assistant-facet-section{background-color:#fafafa;cursor:default}.waffle-assistant-facet-header{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;padding:8px 16px}.waffle-assistant-facet-content-wrapper{max-height:1000px;position:relative;transition:all .2s}.waffle-assistant-facet-charts-wrapper-hidden,.waffle-assistant-facet-charts-wrapper-hidden .waffle-assistant-facet-charts-container{margin-top:0;margin-bottom:0;max-height:0}.waffle-assistant-facet-charts-container{overflow-y:hidden;margin:24px 16px 0;max-height:1000px;transition:all .2s;width:350px}.waffle-assistant-pie-icon{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -501px 0;display:inline-block;height:24px;margin-right:10px;opacity:.5;vertical-align:middle;width:24px}.waffle-assistant-facet-chart-larger-icon{height:24px;width:24px}.waffle-assistant-facet-top-text{color:#757575;display:inline-block;overflow:hidden;text-overflow:ellipsis;vertical-align:middle;width:185px}.waffle-assistant-facet-title{font-weight:500}.waffle-assistant-facet-toggle{color:#4285f4;cursor:pointer;float:right;font-size:13px;font-weight:normal;line-height:24px;margin-right:0;min-width:initial;outline:none;text-align:right}.waffle-assistant-facet-toggle:hover{box-shadow:none}.waffle-assistant-facet-chart-row{margin-bottom:16px;white-space:nowrap}.waffle-assistant-single-facet{display:inline-block;margin-right:16px;vertical-align:bottom}.waffle-assistant-single-facet-title{color:#757575;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;white-space:normal;width:130px}.waffle-assistant-faceted-chart{border:1px solid #e0e0e0;cursor:move;height:98px;margin-top:5px;outline:none;overflow:hidden;width:134px}.waffle-assistant-facet-by-color-container{padding:15px}.waffle-assistant-facet-by-color{border:none;height:270px;margin-top:0;overflow:hidden;width:271px}.waffle-assistant-facet-white-section{background-color:#fff}.waffle-assistant-readonly .waffle-assistant-faceted-chart{cursor:default}.waffle-assistant-word-cloud-card{padding:16px 16px 24px}.waffle-assistant-word-cloud-content-container{background-color:#fff;color:rgba(0,0,0,.54);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif}.waffle-assistant-word-cloud-title{color:#757575;font-size:13px;margin-bottom:10px}.waffle-assistant-styled-rect{opacity:0.1}.waffle-assistant-answers-logging-message-container{display:flex;background:#f4f4f4;margin:10px 0;padding:7px}.waffle-assistant-answers-logging-message{-ms-flex:1;-webkit-flex:1;flex:1;color:#757575;font-size:11px;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;line-height:20px;margin-left:5px}.waffle-assistant-answers-learn-more,.waffle-assistant-answers-logging-opt-out{padding:0 5px;text-decoration:none}.waffle-assistant-answers-logging-opt-out{border-left:1px solid rgba(0,0,0,0.12)}.waffle-assistant-section-content .waffle-assistant-answers-input{margin:16px 16px 0}.waffle-assistant-suggested-questions{padding-bottom:15px}.waffle-assistant-section-content .waffle-assistant-answers-input{padding-bottom:5px}.waffle-assistant-replaceable-title .waffle-assistant-answers-input{margin:10px 0;padding-bottom:0}.waffle-assistant-answers-query-box{box-shadow:0px 0px 2px 0px rgba(0,0,0,0.12),0px 2px 2px 0px rgba(0,0,0,0.24);display:flex;-webkit-align-items:center;align-items:center;background:#fafafa;border-radius:2px;height:40px;line-height:40px}.waffle-assistant-replaceable-title .waffle-assistant-answers-query-box{background:#fafafa;width:295px}.waffle-assistant-answers-query-box.waffle-assistant-answers-query-box-focused,.waffle-assistant-answers-query-box:hover{background:#fff}.waffle-assistant-replaceable-title .waffle-assistant-answers-query-box-focused,.waffle-assistant-replaceable-title .waffle-assistant-answers-query-box:hover{background:#fafafa}.waffle-assistant-replaceable-title .waffle-assistant-answers-query-box-focused{border-bottom-left-radius:0;border-bottom-right-radius:0}.waffle-assistant-answers-input-container{display:flex;-ms-flex:8;-webkit-flex:8;flex:8}.waffle-assistant-replaceable-title .waffle-assistant-answers-input-box{padding:0 5px 0 10px}.waffle-assistant-answers-input-box{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:transparent;border:none;height:40px;line-height:15px;outline:none;padding:0 5px;width:100%}.waffle-assistant-answers-input-with-icon .waffle-assistant-answers-input-box{padding-left:40px}.waffle-assistant-answers-toolbar-enabled .waffle-assistant-answers-input-box::-webkit-input-placeholder{color:#80868b!important;font:14px 'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif!important}.waffle-assistant-answers-toolbar-enabled .waffle-assistant-answers-input-box::-moz-placeholder{color:#80868b!important;font:14px 'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif!important}.waffle-assistant-answers-toolbar-enabled .waffle-assistant-answers-input-box:-moz-placeholder{color:#80868b!important;font:14px 'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif!important}.waffle-assistant-answers-toolbar-enabled .waffle-assistant-answers-input-box:-ms-input-placeholder{color:#80868b!important;font:14px 'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif!important}.waffle-assistant-answers-input-box::-webkit-input-placeholder{color:#80868b!important;font:14px 'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif!important}.waffle-assistant-answers-input-box::-moz-placeholder{color:#80868b!important;font:14px 'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif!important;line-height:40px!important}.waffle-assistant-answers-input-box:-moz-placeholder{color:#80868b!important;font:14px 'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif!important;line-height:40px!important}.waffle-assistant-answers-input-box:-ms-input-placeholder{color:#80868b!important;font:14px 'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif!important}.waffle-assistant-answers-search-icon{display:none;position:absolute}.waffle-assistant-answers-input-with-icon .waffle-assistant-answers-search-icon{display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center}.waffle-assistant-answers-search-icon,.waffle-assistant-answers-input-controls{height:40px;width:40px}.waffle-assistant-answers-query-box-button{height:40px}.waffle-assistant-answers-search-icon .docs-icon-img,.waffle-assistant-answers-clear-query-button .docs-icon-img{opacity:0.7}.waffle-assistant-answers-spinner-container{display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;height:40px;width:40px}.waffle-assistant-answers-spinner-container .waffle-spinner{height:25px;width:25px}.waffle-assistant-answers-output{background:rgba(0,0,0,0.12)}.waffle-assistant-answers-toolbar-ac-renderer,.waffle-assistant-answers-ac-renderer{box-shadow:0px 0px 2px 0px rgba(0,0,0,0.12),0px 2px 2px 0px rgba(0,0,0,0.24);background:#fafafa;border-bottom-left-radius:2px;border-bottom-right-radius:2px;color:#616161;font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;line-height:20px;position:absolute;width:295px;z-index:10000}.waffle-assistant-answers-toolbar-ac-renderer{-webkit-transform:translate(-1px,-5px);-moz-transform:translate(-1px,-5px);-ms-transform:translate(-1px,-5px);-o-transform:translate(-1px,-5px);transform:translate(-1px,-5px);background:#fff;border-bottom-left-radius:8px;border-bottom-right-radius:8px;width:250px}.waffle-assistant-answers-ac-row{cursor:default;padding:10px}.waffle-assistant-answers-ac-row-suggested-query:first-child,:not(.waffle-assistant-answers-ac-row-suggested-query)+.waffle-assistant-answers-ac-row-suggested-query,.waffle-assistant-answers-ac-row-session-query:first-child,:not(.waffle-assistant-answers-ac-row-session-query)+.waffle-assistant-answers-ac-row-session-query,.waffle-assistant-answers-ac-row-entity:first-child,:not(.waffle-assistant-answers-ac-row-entity)+.waffle-assistant-answers-ac-row-entity{border-top:1px solid rgba(0,0,0,0.12)}.waffle-assistant-answers-ac-active{background:#f5f5f5;cursor:pointer}.waffle-assistant-answers-ac-highlighted{font-weight:700}.waffle-assistant-answers-ac-entity{font-weight:700}.waffle-assistant-answers-ac-suggestion{display:flex}.waffle-assistant-answers-ac-suggestion-icon-container{margin-right:5px;opacity:0.7;width:24px}.waffle-assistant-answers-ac-suggestion-text{-ms-flex:8;-webkit-flex:8;flex:8;overflow:hidden;text-overflow:ellipsis;-webkit-box-orient:vertical;-webkit-line-clamp:3;display:-webkit-box;max-height:60px;overflow:hidden;overflow-wrap:break-word;word-wrap:break-word}.waffle-assistant-answercard-content{-webkit-user-select:auto;-moz-user-select:auto;-ms-user-select:auto;color:#757575}.waffle-assistant-answercard-question-container,.waffle-assistant-answercard-answer-container,.waffle-assistant-answercard-error-container{line-height:20px}.waffle-assistant-answercard-answer-container,.waffle-assistant-answercard-error-container,.waffle-assistant-answercard-question-container{padding:5px 0}.waffle-assistant-answercard-answer-container{margin-top:5px}.waffle-assistant-answercard-question-container.waffle-assistant-button,.waffle-assistant-answercard-error-container{display:flex}.waffle-assistant-answercard-question-container.waffle-assistant-button{-webkit-align-items:initial;align-items:initial;color:#757575;padding:5px 16px;opacity:1;text-align:left;white-space:normal;font-weight:400;font-size:13px}.waffle-assistant-answercard-question-container.waffle-assistant-button-hover,.waffle-assistant-answercard-question-container.waffle-assistant-button-focused{background-color:#f5f5f5;outline:none}.waffle-assistant-answercard-question-header,.waffle-assistant-answercard-answer-header{color:#0f9d58;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;font-weight:500;padding-bottom:3px;text-transform:uppercase}.waffle-assistant-button .waffle-assistant-answercard-question-header{opacity:0.7}.waffle-assistant-button .waffle-assistant-answercard-question-header,.waffle-assistant-answercard-error-image{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;height:18px;margin-right:10px;width:18px}.waffle-assistant-answercard-error-image{opacity:0.5}.waffle-assistant-answercard-question-content,.waffle-assistant-answercard-interpret-content,.waffle-assistant-answercard-answer-content,.waffle-assistant-answercard-error-content{overflow:hidden}.waffle-assistant-answercard-interpret-content{font-style:italic;padding-bottom:6px}.waffle-assistant-button .waffle-assistant-answercard-question-content,.waffle-assistant-answercard-error-content{-ms-flex:1;-webkit-flex:1;flex:1}.waffle-assistant-answercard-question,.waffle-assistant-answercard-interpret,.waffle-assistant-answercard-answer-col,.waffle-assistant-answercard-formula,.waffle-assistant-answercard-error{overflow:hidden;text-overflow:ellipsis}.waffle-assistant-answercard-question,.waffle-assistant-answercard-interpret,.waffle-assistant-errorcard-text{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text}.waffle-assistant-answercard-question-unused-phrase{text-decoration:line-through}.waffle-assistant-answercard-question-used-entity{font-weight:700}.waffle-assistant-answercard-question-error-msg-unused-phrase{font-weight:700;display:block}.waffle-assistant-answercard-answer-rowheader{display:flex;border-bottom:1px solid #979797;font-weight:700;margin-top:0;padding:4px 0 0}.waffle-assistant-answercard-answer-rows{max-height:200px;overflow-x:hidden;overflow-y:auto}.waffle-assistant-answercard-answer-row{display:flex;border-bottom:1px dashed #979797;padding:4px 0}.waffle-assistant-answercard-answer-row:first-child{margin-top:0}.waffle-assistant-answercard-answer-list-row.waffle-assistant-answercard-answer-row{font-weight:400}.waffle-assistant-answercard-answer-list-row.waffle-assistant-answercard-answer-row:last-child{border-bottom:1px dashed #979797}.waffle-assistant-answercard-answer-row:last-child{border:none;margin-bottom:0}.waffle-assistant-answercard-answer-col{-ms-flex:2;-webkit-flex:2;flex:2;margin:0 2px}.waffle-assistant-answercard-answer-col:first-child{margin-left:0}.waffle-assistant-answercard-answer-col:last-child{margin-right:0}.waffle-assistant-answercard-answer-col:nth-child(even){-ms-flex:1;-webkit-flex:1;flex:1;text-align:right}.waffle-assistant-answercard-answer-empty{color:rgba(0,0,0,0.54);font-weight:400;font-style:italic}.waffle-assistant-answercard-answer{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;color:rgba(0,0,0,0.54);font-weight:700}.waffle-assistant-answercard-info-msgs{font-size:12px;color:#949494;line-height:15px;margin:5px 0}.waffle-assistant-answercard-formula-holder{color:#757575;font-size:12px;font-style:italic;line-height:18px;margin-top:10px}.waffle-assistant-answercard-formula{display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;border:1px solid #4285f4;margin-top:5px}.waffle-assistant-readonly-card .waffle-assistant-answercard-formula{border:1px solid transparent}.waffle-assistant-answercard-formula-display{display:flex}.waffle-assistant-answercard-formula-help{background:#4285f4;color:#fff;padding-left:5px}.waffle-assistant-answercard-see-formula-link,.waffle-assistant-answercard-hide-formula-link{color:#757575}.waffle-assistant-answercard-formula-icon{display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;background:rgba(0,0,0,0.12);min-height:28px;width:30px}.waffle-assistant-answercard-formula-text-container{-ms-flex:1;-webkit-flex:1;flex:1;border-radius:3px;overflow-wrap:break-word;word-wrap:break-word;white-space:pre-wrap}.waffle-assistant-answercard-formula-text:hover,.waffle-assistant-answercard-formula-text:focus{outline:none}.waffle-assistant-answercard-formula-text:hover{cursor:move}.waffle-assistant-readonly-card .waffle-assistant-answercard-formula-text:hover{cursor:default}.waffle-assistant-answercard-formula-text{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:#f5f5f5;max-width:257px;padding:5px}.waffle-assistant-answercard-feedback-container{border-top:1px dashed #e0e0e0;padding:0 15px}.waffle-assistant-answercard-feedback-link{color:#757575;line-height:40px}.waffle-assistant-answers-range-styled-rect{opacity:0.20}.waffle-assistant-answers-styled-rect{opacity:0.06}.waffle-assistant-answers-range-styled-rect,.waffle-assistant-answers-styled-rect{background-color:#0f9d58;pointer-events:none}.waffle-assistant-answers-range-styled-border,.waffle-assistant-answers-styled-border{border-color:#0f9d58!important;border-style:dashed!important;line-height:0}.waffle-assistant-answers-suggestioncard{color:#757575}.waffle-assistant-answers-suggestioncard .waffle-assistant-answercard-error-container{padding:15px;padding-bottom:0}.waffle-assistant-suggestionscard-header{color:#0f9d58;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;font-weight:500;line-height:20px;padding-bottom:3px;padding-left:15px;padding-right:15px;padding-top:20px;text-transform:uppercase}.waffle-assistant-errorcard-content,.waffle-assistant-errorcard-text{line-height:20px}.waffle-assistant-answers-previousheadercard{color:#757575;padding:20px 15px 10px;text-transform:uppercase}.waffle-assistant-answercard-chart{height:200px;width:278px}.waffle-assistant-answercard-pivot-content{margin-bottom:10px;max-height:200px;overflow:hidden;width:278px}.waffle-pivottable-pivot-canvas{border:1px solid rgba(0,0,0,0.12)}.waffle-pivottable-pivot-canvas:hover,.waffle-pivottable-pivot-canvas:focus{border:1px solid #4285f4;cursor:pointer}.waffle-assistant-answercard-tabs{-ms-flex-align:center;-moz-box-align:center;-webkit-box-align:center;box-align:center;-webkit-align-items:center;align-items:center;display:flex;box-pack:center;-ms-flex-pack:center;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center;text-align:center}.waffle-assistant-answercard-chart-tab,.waffle-assistant-answercard-formula-tab,.waffle-assistant-answercard-pivot-tab{-ms-flex:1;-webkit-flex:1;flex:1;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;line-height:18px}.waffle-assistant-answercard-chart-tab.goog-tab.goog-tab-selected,.waffle-assistant-answercard-formula-tab.goog-tab.goog-tab-selected,.waffle-assistant-answercard-pivot-tab.goog-tab.goog-tab-selected{background:#9e9e9e;color:#fff;cursor:default;font-weight:500}.waffle-assistant-answercard-chart-tab.goog-tab,.waffle-assistant-answercard-formula-tab.goog-tab,.waffle-assistant-answercard-pivot-tab.goog-tab{border:1px solid rgba(0,0,0,0.1);color:#8f8f8f;cursor:pointer;padding:2px 4px;text-decoration:none}.waffle-assistant-answercard-chart-tab.goog-tab{border-top-right-radius:2px;border-bottom-right-radius:2px}.waffle-assistant-answercard-formula-tab.goog-tab,.waffle-assistant-answercard-pivot-tab.goog-tab{border-top-left-radius:2px;border-bottom-left-radius:2px}.waffle-assistant-answercard-tabs.goog-tab-bar{background:inherit;margin-bottom:10px}.waffle-assistant-answercard-insert-chart,.waffle-assistant-answercard-insert-pivot{color:rgba(0,0,0,0.87);float:right;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;font-weight:500;margin:0 5px}.waffle-assistant-answercard-chart-type-select,.waffle-assistant-answercard-chart-type-select:hover,.waffle-assistant-answercard-chart-type-select:focus{background:none;border-color:transparent;color:rgba(0,0,0,0.87);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;padding:0 18px 0 0}.waffle-assistant-answercard-chart-type-select:hover .goog-flat-menu-button-caption{text-decoration:underline}.waffle-answers-panel{height:100%}.waffle-dbsource-configbar-answers-wrapper{display:flex;-ms-flex:1;-webkit-flex:1;flex:1;-webkit-justify-content:flex-end;justify-content:flex-end;position:relative}.waffle-dbsource-configbar-answers-wrapper .waffle-assistant-answers-input{opacity:0.3}.waffle-dbsource-configbar-answers-wrapper.waffle-assistant-answers-toolbar-enabled .waffle-assistant-answers-input{opacity:1}.waffle-dbsource-configbar-answers-wrapper .waffle-assistant-answers-input{margin:0;padding-bottom:0;width:250px}.waffle-dbsource-configbar-answers-wrapper .waffle-assistant-answers-query-box,.waffle-dbsource-configbar-answers-wrapper.waffle-assistant-answers-toolbar-enabled .waffle-assistant-answers-query-box{box-shadow:none;transition:all 200ms ease-out;background:#f1f3f4;border-radius:8px;height:36px;line-height:36px;width:250px}.waffle-dbsource-configbar-answers-wrapper.waffle-assistant-answers-toolbar-enabled .waffle-assistant-answers-query-box.waffle-assistant-answers-query-box-focused,.waffle-dbsource-configbar-answers-wrapper.waffle-assistant-answers-toolbar-enabled .waffle-assistant-answers-query-box:hover{box-shadow:0px 3px 4px 0px rgba(0,0,0,0.14),0px 3px 3px -2px rgba(0,0,0,0.12),0px 1px 8px 0px rgba(0,0,0,0.2);background:white}.waffle-dbsource-configbar-answers-wrapper .waffle-assistant-answers-query-box.waffle-assistant-answers-query-box-focused,.waffle-dbsource-configbar-answers-wrapper .waffle-assistant-answers-query-box:hover{background:#f1f3f4}.waffle-dbsource-configbar-answers-wrapper .waffle-assistant-answers-search-icon,.waffle-dbsource-configbar-answers-wrapper .waffle-assistant-answers-input-controls,.waffle-dbsource-configbar-answers-wrapper .waffle-assistant-answers-query-box-button{height:36px}.waffle-dbsource-configbar-answers-wrapper .waffle-assistant-answers-input-box{color:#80868b;font-size:14px;height:36px}.waffle-answers-bar .waffle-assistant-answers-query-box{box-shadow:none;border:1px solid #dadce0;border-radius:8px;background:#fff;opacity:0.5}.waffle-dbanswers-answers-bar-controls{-webkit-align-items:center;align-items:center;display:flex}.waffle-dbanswers-answers-bar-enable-button{padding:5px;font-weight:700}.waffle-answers-button.jfk-button{background:none;border:none;border-radius:50%;height:30px;margin:0 9px 0 0;min-width:30px;opacity:0.5;padding:5px}.waffle-answers-button.jfk-button-hover{background-color:rgba(0,0,0,.06)}.waffle-answers-bar.waffle-assistant-answers-toolbar-enabled .waffle-assistant-answers-query-box{opacity:1}.waffle-answers-bar.waffle-assistant-answers-toolbar-enabled .waffle-answers-button{opacity:1}.waffle-answers-bar .waffle-assistant-answers-input{margin:2px 4px 2px;width:250px}.waffle-answers-bar.waffle-assistant-answers-toolbar-enabled .waffle-assistant-answers-query-box.waffle-assistant-answers-query-box-focused,.waffle-answers-bar.waffle-assistant-answers-toolbar-enabled .waffle-assistant-answers-query-box:hover{box-shadow:0px 1px 1px 0px rgba(0,0,0,0.14),0px 2px 1px -1px rgba(0,0,0,0.12),0px 1px 3px 0px rgba(0,0,0,0.2)}.waffle-dbanswers-answers-bar-enable-answers-popup{background:#fff;border-radius:5px;box-shadow:0px 2px 2px 0px rgba(0,0,0,0.14),0px 3px 1px -2px rgba(0,0,0,0.12),0px 1px 5px 0px rgba(0,0,0,0.2);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;padding:20px;position:absolute;width:275px}.waffle-dbanswers-answers-bar-enable-answers-popup-setup-link{font-weight:700}.waffle-dbanswers-answers-bar-message{color:#80868b;font-size:9px}.waffle-assistant-datavalidation-rule-group{margin:16px}.waffle-assistant-datavalidation-rule-holder{border:1px solid #ccc;cursor:pointer;display:block;margin-bottom:5px;padding:1px;width:258px}.waffle-assistant-datavalidation-description{color:rgba(0,0,0,0.54);display:inline-block;text-overflow:ellipsis}.waffle-assistant-datavalidation-apply-button.jfk-button{color:#1a73e8;cursor:pointer;display:inline-block;float:right;font-size:13px;text-align:right;text-transform:uppercase}.waffle-assistant-datavalidation-range{font-weight:500}.waffle-assistant-datavalidation-details{display:inline-block;margin-bottom:12px;width:100%}.waffle-assistant-datavalidation-detail-chip{background-color:#eeeeee;border:1px solid #e0e0e0;border-radius:11px;color:rgba(0,0,0,.87);display:inline-block;line-height:21px;margin:3px;max-width:234px;overflow:hidden;padding:0 16px;text-overflow:ellipsis;white-space:nowrap}.waffle-assistant-conditionalformat-rule-group{margin:16px}.waffle-assistant-conditionalformat-rule-holder{border:1px solid #ccc;cursor:pointer;display:block;margin-bottom:5px;padding:1px;width:258px}.waffle-assistant-conditionalformat-format-preview{border:1px solid transparent;display:inline-table;height:21px;margin:1px;overflow:hidden;text-align:center}.waffle-assistant-conditionalformat-format-preview.one-rule{max-width:254px;width:254px}.waffle-assistant-conditionalformat-format-preview.two-rules{max-width:125px;width:125px}.waffle-assistant-conditionalformat-format-preview.three-rules{max-width:82px;width:82px}.waffle-assistant-conditionalformat-format-preview-label{display:block;height:17px;line-height:17px;max-height:17px;padding:2px;text-overflow:ellipsis}.waffle-assistant-conditionalformat-format-preview.one-rule .waffle-assistant-conditionalformat-format-preview-label{max-width:250px;width:250px}.waffle-assistant-conditionalformat-format-preview.two-rules .waffle-assistant-conditionalformat-format-preview-label{max-width:121px;width:121px}.waffle-assistant-conditionalformat-format-preview.three-rules .waffle-assistant-conditionalformat-format-preview-label{max-width:78px;width:78px}.waffle-assistant-conditionalformat-description{color:#757575;display:inline-block;height:21px;line-height:21px;text-overflow:ellipsis;width:237px}.waffle-assistant-conditionalformat-edit-button.jfk-button{cursor:pointer;width:21px}.waffle-assistant-banding-recommendation{margin:16px;overflow:hidden}.waffle-assistant-banding-color-picker-container{padding-bottom:5px}.waffle-assistant-banding-color-picker-container .waffle-banding-color-picker-table{border-spacing:8px;margin-left:-8px}.waffle-assistant-banding-range-wrapper{border:1px solid transparent;color:#757575;display:inline-block;float:left;line-height:21px;text-align:left}.waffle-assistant-banding-range{font-weight:500}.waffle-assistant-formatting-edit-button{color:#5e97f5;cursor:pointer;display:inline-block;float:right;text-align:right;text-transform:uppercase}.waffle-assistant-insert-pivottable-button.jfk-button{left:-1px}.waffle-assistant-pivottable-rule-group{margin:16px}.waffle-assistant-pivottable-rule-holder{border:1px solid #ccc;cursor:pointer;display:block;margin-bottom:5px;padding:1px;width:258px}.waffle-assistant-pivottable-description{color:#757575;display:inline-block;height:21px;line-height:21px;text-overflow:ellipsis;width:237px}.waffle-assistant-zoom-button.jfk-button{left:1px;position:relative}.waffle-pivottable-preview-pane{display:flex;-ms-flex:1;-webkit-flex:1;flex:1;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;-webkit-justify-content:center;justify-content:center;max-height:80%;max-width:80%}.waffle-pivot-suggestion-preview-insert.jfk-button-focused{border:1px solid #5e97f6!important;outline:none}.waffle-pivottable-canvas{overflow:auto;background:white}.waffle-pivottable-canvas-content{padding:25px}.waffle-pivottable-preview-interpret{-webkit-align-items:left;align-items:left;color:white;max-width:500px;margin-bottom:10px;overflow:visible;overflow-wrap:break-word;padding:5px;text-overflow:ellipsis}.waffle-pivottable-lightbox{-webkit-align-items:center;align-items:center;display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;background-color:rgba(0,0,0,0.85);height:100%;left:0;position:absolute;top:0;width:100%;z-index:1000}.waffle-assistant-tables-recommendation{display:flex;margin-bottom:15px;overflow:hidden}.waffle-assistant-table-range-container{margin-right:20px;width:50%}.waffle-assistant-header-range-container{width:50%}.waffle-assistant-tables-range-wrapper{-ms-flex:1;-webkit-flex:1;flex:1;border:1px solid transparent;border-bottom:1px solid #d0d0d0;color:rgba(0,0,0,.54);font-size:11px;line-height:21px;text-align:left}.waffle-assistant-header-range-container .waffle-assistant-tables-range-wrapper{border-bottom:none}.waffle-assistant-tables-range-wrapper .waffle-range-selection-input,.waffle-assistant-tables-range-wrapper .waffle-range-selection-input-focus,.waffle-assistant-tables-range-wrapper .waffle-range-selection-input:focus{border:1px solid transparent;color:rgba(0,0,0,.87);font-size:13px;line-height:21px;padding:0 4px!important;text-align:left}.waffle-assistant-tables-range-wrapper .waffle-range-selection-container-focus{border:none;box-shadow:none;outline:none}.waffle-assistant-tables-range-wrapper .waffle-range-selection-button{cursor:default;height:26px}.waffle-assistant-tables-range-wrapper input:disabled{background-color:transparent}.waffle-assistant-table-canvas{border:1px solid #dcdcdc;display:block;margin:0 auto}.waffle-assistant-canvas-container{margin-top:10px;overflow:hidden}.waffle-assistant-tables-edit-headers-button{display:flex}.waffle-assistant-tables-edit-headers-button .docs-charts-editor-material-menu-button-caption{font-size:13px;height:24px;overflow:hidden;text-align:left;text-overflow:ellipsis;width:100%}.waffle-assistant-tables-edit-headers-button .docs-charts-editor-material-menu-button{margin:0;width:100%}.waffle-tables-popup{background:white;border-radius:2px;box-shadow:0 2px 10px rgba(0,0,0,0.3);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;margin:0 10px;outline:none;overflow:hidden;position:relative;top:45px}.waffle-tables-popup-answers-enabled{top:38px}.waffle-tables-popup-header{background-color:#eeeeee;padding:12px 15px 12px 20px}.waffle-tables-popup-title{color:rgba(0,0,0,87);font-size:16px;font-weight:500}.waffle-tables-popup-content{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;padding:16px 16px 0}.waffle-tables-popup-buttons{display:flex;flex-direction:row-reverse;padding:8px 8px 8px 24px}.waffle-tables-popup-button{background:none;border:none;border-radius:2px;color:#4285f4;cursor:pointer;display:inline-block;height:36px;margin-left:8px;min-width:64px;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;letter-spacing:0;line-height:36px;overflow:hidden;outline:none;padding:0 8px;position:relative;text-align:center;text-decoration:none;text-transform:uppercase;vertical-align:middle}.waffle-assistant-tables-edit-range-button{border:none;float:right;font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;font-weight:500;height:100%;padding:0 14px;text-transform:uppercase;white-space:nowrap}.waffle-assistant-sidebar-tables-range{float:left;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;padding:12px 0px 12px 12px;position:relative;top:50%;transform:translateY(-50%);-ms-flex:1;-webkit-flex:1;flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.waffle-tables-bar-content{overflow:hidden;text-overflow:ellipsis}.waffle-sidebar-tables-bar{box-shadow:inset 0 -2px 2px rgba(0,0,0,.1);background:#f1f1f1;color:#5f5f5f;height:40px;overflow:hidden;vertical-align:middle;display:flex}.waffle-assistant-tables-range-wrapper .waffle-range-selection-container{border:none}.waffle-sidebar-overlay{background-color:rgba(51,51,51,0.3);bottom:0;left:0;overflow-y:auto;position:absolute;right:0;top:0;z-index:1003}.waffle-assistant-table-bar-range{font-weight:500}.waffle-assistant-table-first-header{display:inline-block;font-weight:500;max-width:95px;overflow:hidden;padding-bottom:2px;text-overflow:ellipsis;vertical-align:middle;white-space:nowrap}.waffle-assistant-tables-scroll-pane{bottom:0;height:auto;left:0;position:absolute;right:0;top:40px}.waffle-assistant-tables-range-error{color:#c53929;font-size:11px;padding-top:2px}.waffle-assistant-tables-range-error-input{border-bottom:1px solid #c53929}.docs-action-new-badge{background-color:#c6dafc;border-radius:2px;color:#2a56c6;display:inline-block;float:right;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:11px;font-weight:500;margin-left:15px;margin-top:-4px;padding:5px 8px;text-transform:uppercase}.docs-gm .docs-action-new-badge{background-color:transparent;border-radius:4px;border:1px solid #188038;box-sizing:border-box;color:#188038;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;height:24px;line-height:24px;margin-top:-2px;padding:0px 8px;text-transform:none;vertical-align:middle}.docs-action-new-badge-submenu .docs-action-new-badge{margin-right:-27px}.docs-action-new-badge-submenu{display:inline-block;margin-bottom:-4px;min-width:100%}.docs-action-new-badge-text-ie{float:left}.docs-action-new-badge-clearfix-ie:after{clear:both;content:"";display:table}.docs-action-updated-dot{background-color:#188038;border-radius:50%;display:inline-block;float:right;height:9px;width:9px;margin-top:5px}.docs-action-updated-dot-submenu .docs-action-updated-dot{margin-right:-15px}.docs-action-updated-dot-submenu{display:inline-block;margin-bottom:-6px;margin-right:-5px;min-width:calc(100% - 40px)}.docs-action-updated-dot-shortcut-keys .docs-action-updated-dot{margin-right:-27px}.docs-action-updated-dot-shortcut-keys{display:inline-block;margin-bottom:-4px;margin-right:12px}.apps-marquee{font:bold 13px Arial,sans-serif;height:0;left:20%;position:fixed;_position:absolute;text-align:center;top:0;width:60%;z-index:1001}.apps-marquee-item{display:inline-block;margin:0 5px 4px;color:#fff999}.apps-marquee-text{background:#fff999;border-color:#fff999;border-style:solid;border-width:0 3px;color:black;padding:2px 5px 2px}.apps-marquee-round-bottom{border-left:3px dotted transparent;border-right:3px dotted transparent;border-top:3px solid}.apps-marquee-round-top{border-left:3px dotted transparent;border-right:3px dotted transparent;border-bottom:3px solid}.apps-marquee-warning{color:#a00}.apps-marquee-warning .apps-marquee-text{background:#a00;border-color:#a00;color:white}.apps-promo{position:absolute;z-index:10000;font-size:11px}.apps-promo-arrow-container{position:relative}.apps-promo-arrow{position:absolute;background:transparent url(//ssl.gstatic.com/docs/common/promo_arrows-0.png) no-repeat}.apps-promo-close{position:relative;top:-5px;width:16px;height:16px;float:right;cursor:pointer;background:transparent url(//ssl.gstatic.com/docs/common/promo_close-0.png) no-repeat}.apps-promo-popup{background:#fff;box-shadow:0 7px 7px #666;-moz-box-shadow:0 7px 7px #666;-webkit-box-shadow:0 7px 7px #666;border:1px solid #ccc;width:275px;padding:15px;padding-right:10px}.apps-promo-header-content{font-weight:bold;font-size:14px}.apps-promo-content{padding-top:15px;font-size:13px}.apps-promo-buttons{padding-top:15px;padding-left:4px}.apps-promo-buttons a{font-size:13px;vertical-align:middle;margin-left:15px}.apps-promo-buttons-inner{display:inline}.apps-promo-buttons-inner .goog-imageless-button-content{white-space:nowrap}.apps-toast{font-size:13px;bottom:-200px;width:227px;display:block;opacity:1;position:absolute;z-index:50}.apps-toast-top{height:18px;width:227px;opacity:1;background:url("//ssl.gstatic.com/docs/common/toastBackTop-ltr-1.png")}.apps-toast-fill{height:92px;width:227px;opacity:1;background:url("//ssl.gstatic.com/docs/common/toastBackFill-0.png");z-index:51}.apps-toast-title{font-weight:bold;padding:0px 20px}.apps-toast-content{padding:0 20px 8px}html{overflow:hidden}.waffle,.grid-fixed-table{font-size:13px;table-layout:fixed;border-collapse:separate;border-style:none;border-spacing:0;width:0;cursor:default}.mimic-overlay{position:absolute;z-index:4}.mimic-overlay-canvas{display:block}.scroll-container{position:absolute;overflow:auto;border-width:0;padding:0;margin:0;z-index:1;top:0;left:0}.native-scrollbar{overflow:auto;position:absolute;border-width:0;padding:0;margin:0;top:0;left:0}.static-overlay-container{z-index:6}.grid-container{background-color:#eee;overflow:hidden;position:relative;z-index:0}.grid-table-container{overflow:hidden;z-index:3;position:relative}.ritz.grid-container table.waffle svg{display:block}.fixed-table-container{overflow:visible;z-index:4}.docs-guides-htmlguiderenderer{z-index:14}.fixed4-inner-container,.fixed4-outer-container,.grid4-inner-container,.grid4-outer-container{position:relative;vertical-align:top}.fixed4-outer-container,.grid4-outer-container{overflow:visible}.fixed4-inner-container,.grid4-inner-container{overflow:hidden}.fixed4-inner-container{z-index:4}.grid4-inner-container{z-index:3}.grid-fixed-wrapper{overflow:hidden;white-space:nowrap}.grid-scrollable-wrapper{white-space:nowrap}.uberlay{position:absolute;height:0;width:0;top:0}.overlay-container-ltr{position:absolute;height:0;width:0;top:0;left:0}.overlay-container-rtl{position:absolute;height:0;width:0;top:0;right:0}.focused-overlay-container{position:absolute;overflow:hidden;pointer-events:none}.grid-vertical-scroll{width:20px}.grid-horizontal-scroll{height:20px;float:right}.header-bg{background-color:#e8eef7}.waffle-measurement-table{position:absolute;width:0;height:0;overflow:hidden}.cell-input{width:100%;height:100%;margin:0;outline:none;cursor:text;-webkit-user-modify:read-write-plaintext-only;white-space:pre-wrap;-webkit-transform:translateZ(0);background-color:white}.waffle-formula-preview-decorator{background:white;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;box-shadow:0 1px 2px rgba(0,0,0,0.5);color:#3266d5;font-family:Inconsolata,monospace,arial,sans,sans-serif;font-size:13px;line-height:17px;padding:3px 2px 3px 7px}.waffle-formula-preview-decorator.waffle-formula-preview-equals-aligned::before,.waffle-formula-preview-decorator.waffle-formula-preview-partial::before{background-color:white;bottom:-4.5px;box-shadow:2px 2px 2px rgba(0,0,0,0.2);content:'\0000a0';display:block;margin-left:-5px;height:10px;position:absolute;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg);width:10px}.waffle-formula-preview-decorator.waffle-formula-preview-partial::before{left:50%}.waffle-formula-preview-result{display:inline-block;max-width:280px;overflow:hidden;text-overflow:ellipsis;vertical-align:top}.waffle-formula-preview-button{display:inline-block;margin:-2px;opacity:.35;-webkit-transform:scale(.6,.6);-moz-transform:scale(.6,.6);-ms-transform:scale(.6,.6);-o-transform:scale(.6,.6);transform:scale(.6,.6)}.waffle-formula-preview-button:hover{opacity:.7}.selection{position:absolute;opacity:0.20;z-index:5}.input-box{border:2px #5292f7 solid;border-color:#1a73e8;box-shadow:0 2px 6px 2px rgba(60,64,67,.15);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;font-style:normal;font-variant:normal;font-weight:400;margin:0;max-height:9900px;max-width:9900px;outline:none;overflow:auto;padding:0 2px;position:absolute;resize:none;text-align:left;top:-10000px;white-space:pre-wrap;word-wrap:break-word;z-index:15}.input-box-disable-box-shadow{box-shadow:none}.IE .input-box{padding-top:1px}.disabled-input{-webkit-user-modify:read-only;color:#777}.text-sizer,.input-capturer{position:absolute;top:-4000px}.range-border{position:absolute;border-width:0;border-style:solid;padding:0;_overflow:hidden}.border-opacity{filter:alpha(opacity=30);opacity:0.3}.cell-border{line-height:1px}.active-cell-border{border-color:#1a73e8;line-height:1px;z-index:7}.selection-border{border-color:#1a73e8;line-height:0;z-index:7}.selection-border-cover{position:absolute;z-index:7}.selection-border-dragging{border-color:#1a73e8;border-style:dashed;line-height:0;z-index:7}.waffle-clipboard-border{border-color:#1a73e8;border-style:dashed;line-height:0}.autofill-border{border-color:gray;border-style:dashed;line-height:0}.array-border{border-color:#1a73e8;border-style:solid;line-height:0}.autofill-handle{_overflow:hidden;background-color:#1a73e8;border:1px solid white;height:6px;margin-top:1px;position:absolute;width:6px;z-index:8}.autofill-handle-rtl{border-width:1px 1px 0 0}.autofill-handle-ltr{border-width:1px 0 0 1px}.autofill-cover{position:absolute;cursor:crosshair;width:8px;height:8px;z-index:9}.postpaste-parent{background:#f5f5f5;border:1px solid #d9d9d9;box-shadow:inset 0 1px 0 0 #fff;background-color:#f5f5f5;background-image:-webkit-linear-gradient(top,#f5f5f5,#eee);background-image:-moz-linear-gradient(top,#f5f5f5,#eee);background-image:-ms-linear-gradient(top,#f5f5f5,#eee);background-image:-o-linear-gradient(top,#f5f5f5,#eee);background-image:linear-gradient(top,#f5f5f5,#eee);position:absolute;z-index:8}.postpaste-parent{background:#fff;border:none;box-shadow:0 1px 3px 1px rgba(60,64,67,.15);border-radius:4px}.goog-toolbar-menu-button.postpaste-container{margin:0;min-width:0px;border-color:transparent!important}.goog-toolbar-menu-button.postpaste-container{border:none!important;height:100%;width:100%}.postpaste-container.goog-toolbar-menu-button-open.goog-toolbar-menu-button-hover{background:#ceead6}.goog-toolbar-menu-button-focused.postpaste-container{border-color:#c6c6c6!important}.goog-toolbar-menu-button-open.postpaste-container{border-color:#c6c6c6!important}.goog-menuitem.postpaste-menu-item{padding-right:26px;padding-left:15px}.post-paste-menu{margin:12px 3px 0 0}.postpaste-clipboard-icon{margin-left:8px;margin-top:4px}.overlay-container-rtl .postpaste-clipboard-icon{margin-right:26px}.postpaste-parent .goog-toolbar-menu-button-dropdown.postpaste-arrow{left:0;margin-left:32px;margin-top:4px;position:absolute;right:0}.overlay-container-rtl .goog-toolbar-menu-button-dropdown.postpaste-arrow{margin-right:10px}.waffle-dbsource-container,.waffle-recommendation-card-overlay,.waffle-texttocolumns-overlay{position:absolute;z-index:8}.waffle-texttocolumns-wrapper{background:#f5f5f5;border:1px solid #d9d9d9;padding:2px}.waffle-texttocolumns-separator-label{font-size:11px;font-weight:500;margin:2px;top:0}.waffle-texttocolumns-custom-input{position:absolute;top:3px;width:120px}.waffle-blameview{background:#fff;border-radius:8px;box-shadow:0 2px 6px 2px rgba(60,64,67,.15);display:flex;outline:none;overflow:hidden;position:absolute;width:240px}.waffle-blameview-cell-ref{font-family:Inconsolata,monospace,arial,sans,sans-serif;font-style:normal}.waffle-blameview-formula-text{font-family:Inconsolata,monospace,arial,sans,sans-serif;font-style:normal}a.waffle-blameview-image-link{color:#1a73e8;font-style:italic;text-decoration:underline}.freezebar .freezebar-drop,.freezebar .freezebar-handle-bar,.resizer,.resizer-hover .resizer-handle-bar,.resizer-drop,.rowcol-dragger .rowcol-dragger-handle,.rowcol-dragger .rowcol-dragger-handle-bar,.rowcol-dragger .rowcol-dragger-drop{display:none;outline:0}.freezebar-active .freezebar-drop,.freezebar-active .freezebar-handle-bar,.resizer-hover,.resizer-active,.resizer-active .resizer-handle-bar,.resizer-active .resizer-drop,.rowcol-dragger-hover .rowcol-dragger-handle,.rowcol-dragger-active .rowcol-dragger-handle,.rowcol-dragger-active .rowcol-dragger-handle-bar,.rowcol-dragger-active .rowcol-dragger-drop{display:block}.resizer{z-index:7;position:absolute}.resizer-handle{position:relative;border-style:none}.resizer-horizontal-handle{height:5px;cursor:n-resize;background:#4d90fe}.resizer-vertical-handle{width:5px;cursor:e-resize;background:#4d90fe}.resizer-rtl .resizer-vertical-handle{cursor:w-resize}.resizer-horizontal-handle-bar{position:absolute;height:1px;background-color:#4d90fe;top:2px;overflow:hidden}.resizer-vertical-handle-bar{position:absolute;width:1px;background-color:#4d90fe;left:2px;border:0;padding:0;overflow:hidden}.freezebar-handle,.freezebar-drop{position:absolute;z-index:6}.freezebar-handle-bar,.freezebar-drop-bar{position:relative;z-index:7}.freezebar-vertical-handle-bar{width:2px;background:#dbe5f7;border-color:#a5c6fe;border-style:solid;border-width:0 1px;opacity:0.45;filter:alpha(opacity=45)}.freezebar-horizontal-handle-bar{height:2px;background:#dbe5f7;border-color:#a5c6fe;border-style:solid;border-width:1px 0;opacity:0.45;filter:alpha(opacity=45)}.freezebar-vertical-handle{width:4px;background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAYCAIAAABSh8vJAAAAEElEQVQYV2PYgwQYRjnEcgDquNOBEawK+wAAAABJRU5ErkJggg==") no-repeat}.overlay-container-rtl .freezebar-vertical-handle{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAYCAIAAABSh8vJAAAAEElEQVQYV2PYgwQYRjnEcgDquNOBEawK+wAAAABJRU5ErkJggg==") no-repeat;background-position:top right}.freezebar-vertical-handle-invisible{width:4px}.freezebar-active .freezebar-vertical-handle{width:5px}.freezebar-hover .freezebar-horizontal-handle{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC4AAAAECAIAAAB+7JowAAAAFUlEQVQY02NYeuzfIEEMo04Z3E4BAHKzu4gtAIWGAAAAAElFTkSuQmCC") no-repeat;z-index:7}.freezebar-hover .freezebar-vertical-handle{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAYCAIAAABSh8vJAAAAE0lEQVQYV2NYeuwfHDGMcojlAADmjOdhimOdggAAAABJRU5ErkJggg==") no-repeat;z-index:7}.overlay-container-rtl .freezebar-hover .freezebar-horizontal-handle{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC4AAAAECAIAAAB+7JowAAAAFUlEQVQY02NYeuzfIEEMo04Z3E4BAHKzu4gtAIWGAAAAAElFTkSuQmCC") no-repeat;background-position:top right}.overlay-container-rtl .freezebar-hover .freezebar-vertical-handle{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAYCAIAAABSh8vJAAAAE0lEQVQYV2NYeuwfHDGMcojlAADmjOdhimOdggAAAABJRU5ErkJggg==") no-repeat;background-position:top right}.freezebar-horizontal-handle{height:4px;background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC4AAAAECAIAAAB+7JowAAAAEklEQVQY02PYM2gAw6hTBrdTAFI0lXC16jX6AAAAAElFTkSuQmCC") no-repeat}.overlay-container-rtl .freezebar-horizontal-handle{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC4AAAAECAIAAAB+7JowAAAAEklEQVQY02PYM2gAw6hTBrdTAFI0lXC16jX6AAAAAElFTkSuQmCC") no-repeat;background-position:top right}.overlay-container-rtl .freezebar-horizontal-drop{background-position:right}.freezebar-horizontal-handle-invisible{height:4px}.freezebar-active .freezebar-horizontal-handle{height:5px}.freezebar-origin-rtl,.freezebar-origin-ltr{height:23px;width:45px;position:absolute;top:0px;border:1px #ccc solid}.freezebar-origin-ltr{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -205px 0;left:0px;border-width:0 1px 1px 0}.freezebar-origin-rtl{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -305px -62px;right:0px;border-width:0 0 1px 1px}.freezebar-vertical-drop{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAYCAIAAABSh8vJAAAAEklEQVQYV2NInfsHjhhGOcRyAFpkv0GBZT1JAAAAAElFTkSuQmCC") no-repeat;width:4px}.freezebar-horizontal-drop{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC4AAAAECAIAAAB+7JowAAAAFUlEQVQoz2NInftnkCCGUacMbqcAAL1HbqBCYk6sAAAAAElFTkSuQmCC") no-repeat;height:4px}.freezebar-vertical-drop-bar{width:4px;background-color:#afbbd1;border-width:2px 1px 2px 2px}.freezebar-horizontal-drop-bar{height:4px;overflow:hidden;background-color:#afbbd1;border-width:2px 2px 1px 2px}.waffle-incelldropdownselect-menu-vertical{overflow-y:auto}.rowcol-dragger{position:absolute;z-index:6}.rowcol-dragger-drop-bar,.rowcol-dragger-handle-bar{z-index:6;position:absolute;background-color:#777;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.rowcol-dragger-handle-bar{border:2px solid #36c;opacity:0.20;filter:alpha(opacity=20)}.rowcol-dragger-horizontal-handle{width:36px}.rowcol-dragger-horizontal-drop-bar{height:2px}.rowcol-dragger-vertical-handle{height:23px}.rowcol-dragger-vertical-drop-bar{width:2px}.rowcol-dragger-handle,.rowcol-dragger-drop{position:absolute;z-index:6}.jfk-freestanding-menu-button.waffle-kennedy-column-menu-button{background:url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNyIgaGVpZ2h0PSI0IiAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBmaWxsPSIjQkRCREJEIiBkPSJNMCAwTDcgMCBMMy41IDR6Ii8+PC9zdmc+") center no-repeat;background-color:#f8f8f8;z-index:7}.jfk-freestanding-menu-button-hover.waffle-kennedy-column-menu-button{background:url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNyIgaGVpZ2h0PSI0IiAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBmaWxsPSIjNjE2MTYxIiBkPSJNMCAwTDcgMCBMMy41IDR6Ii8+PC9zdmc+") center no-repeat;background-color:#f8f8f8}.jfk-freestanding-menu-button-hover.waffle-column-type-button{box-shadow:0px -1px 5px rgba(128,134,139,0.09),0px 3px 5px rgba(128,134,139,0.06),0px 1px 2px rgba(60,64,67,0.3),0px 1px 3px rgba(60,64,67,0.15)}.jfk-freestanding-menu-button-focused.waffle-column-type-button{background:#ffffff;box-shadow:0px -1px 5px rgba(128,134,139,0.09),0px 3px 5px rgba(128,134,139,0.06),0px 1px 2px rgba(60,64,67,0.3),0px 1px 3px rgba(60,64,67,0.15);opacity:0.32}.goog-flat-menu-button-focused.waffle-set-column-type-button,.goog-flat-menu-button-focused.waffle-set-column-type-button:hover{background-color:#80868b;border:1px solid #80868b}a.in-cell-link{text-decoration:underline;cursor:default}.docs-bubble-link.docs-bubble-link-visited{color:#673ab7!important}.docs-link-insertlinkbubble .docs-icon-grid,.docs-link-insertlinkbubble .docs-icon-grid:before{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_green.svg)}.annotation-bubble{position:absolute;z-index:14;margin:0 0 0 -2px;padding:0;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;max-width:200px}.annotation-editable{background-color:white;border:1px solid rgba(60,64,67,.15);border-radius:4px;box-shadow:0 2px 6px 2px rgba(60,64,67,.15);color:#5f6368;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:500;margin:0;outline:none;padding:8px;width:100%}.annotation-attribution{background-color:#fff;border-radius:4px;box-shadow:0 4px 8px 3px rgba(60,64,67,.15);font-size:13px;overflow:scroll;overflow-wrap:break-word;padding:12px;user-select:text}.annotation-attribution strong{display:block;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:700;line-height:20px;margin-bottom:8px}.annotation-attribution span{display:block}.annotation-attribution-error{border-left:4px solid #ea4335}.annotation-attribution-error strong{color:#ea4335}.annotation-attribution-invalid{border-left:4px solid #ea4335}.annotation-attribution-invalid strong{color:#ea4335}.annotation-attribution-help{border-left:4px solid #ea4335}.annotation-attribution-help strong{color:#ea4335}.annotation-importrange{background-color:#ffffff;border:1px solid #ff0000;box-shadow:2px 2px 6px #888;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;margin:0;overflow-x:hidden;text-align:left;vertical-align:top;width:100%}.annotation-importrange-error-msg-box{margin-bottom:10px;text-align:left}.waffle-footer-container{height:4000px;position:relative;z-index:3}.waffle-background-container{background-color:#eee;width:50000px;height:0px;position:absolute;top:0;z-index:-1}.addRowsWidget-ltr{color:#222;float:left;padding:6px 0 0 45px;direction:ltr}.addRowsWidget-rtl{color:#222;float:right;padding:6px 45px 0 0;direction:ltr}div.addRowsButton-ltr{margin-top:0;margin-right:2px;vertical-align:middle}div.addRowsButton-rtl{margin-top:0;margin-left:2px;vertical-align:middle}div.addRowsText{color:#000000;padding-top:5px;vertical-align:middle}.addRowsError-ltr{color:#c00;float:left;padding:13px 0 0 10px}.addRowsError-rtl{color:#c00;float:right;padding:13px 10px 0 0}.addRowsInput{margin:0 4px 0 4px;vertical-align:middle}.waffle-formula-help-popup P{margin-top:0}.waffle-formula-help-popup a:visited{color:#15c}.waffle-formula-help-popup{position:absolute;top:0px;left:0px;-moz-border-radius:2px 2px 2px 2px;border-radius:2px 2px 2px 2px;-moz-box-shadow:0 2px 4px rgba(0,0,0,0.2);-webkit-box-shadow:0 2px 4px rgba(0,0,0,0.2);box-shadow:0 2px 4px rgba(0,0,0,0.2);background-color:#ffffff;border:1px solid #cccccc;padding:16px;width:400px;margin-left:-1px;margin-top:-1px;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;font-weight:400;font-style:normal;color:#333333;white-space:normal}.waffle-input-box-decorator{border-style:none;border-width:0px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;font-weight:500;overflow:visible;position:absolute;white-space:nowrap;z-index:15}.waffle-input-box-locator{background-color:#4589eb;border-radius:1px;box-shadow:0px 1px 2px rgba(0,0,0,0.5);color:white;font-size:12px;line-height:14px;padding:6px 7px 4px 7px}.waffle-input-box-formula-help-decorator{background:#6da1ff;border:2px solid #5790f6;border-right:none;color:white;-webkit-border-radius:2px 0 0 2px;-moz-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px;cursor:pointer;font-size:11px;height:20px;line-height:13px;padding:2px 2px}.waffle-formula-bar-formula-help-decorator{-webkit-border-radius:2px 2px 2px 2px;-moz-border-radius:2px 2px 2px 2px;border-radius:2px 2px 2px 2px;border-right:2px solid #5790f6;height:18px;line-height:11px}.waffle-collab-presence{-moz-box-sizing:border-box;background-color:#65ad89;border-radius:2px;box-sizing:border-box;color:white;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:500;line-height:12px;padding:1px 2px;position:absolute;z-index:7}#waffle-loading-screen{background-color:#fff;width:100%;font-size:15px;display:none}.waffle-loading-rows{width:100%;font-size:12px;padding:5px 30px}.waffle-loading-rows-spinner{vertical-align:text-bottom;width:16px;height:16px;margin:0px 10px}.waffle-hyperlink-icon{display:inline-block;position:absolute}.waffle-hyperlink-icon-visited:after{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -565px -12px;cursor:pointer;width:12px;height:12px;display:block;float:right;content:"";margin-top:4px;margin-bottom:-1px}.waffle-hyperlink-icon:after{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -70px -24px;cursor:pointer;width:12px;height:12px;display:block;float:right;content:"";margin-top:4px;margin-bottom:-1px}.waffle-hyperlink-tooltip:hover{background:#fff;box-shadow:0px 0px 2px 0px rgba(0,0,0,0.20),0px 2px 3px 0px rgba(0,0,0,0.30)}.waffle-hyperlink-tooltip{background:#fcfcfc;box-shadow:0px 0px 2px 0px rgba(0,0,0,0.15),0px 1px 2px 0px rgba(0,0,0,0.40);border-radius:1px;display:inline-block;padding:5px 18px 5px 7px;position:absolute}.waffle-hyperlink-tooltip-link{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;color:#15c;line-height:19px;padding:5px 7px 5px 0;text-decoration:none;white-space:nowrap}a.waffle-hyperlink-tooltip-link{color:#15c}.waffle-hyperlink-tooltip-link:hover{text-decoration:none}.waffle-multilink-tooltip{position:absolute}.waffle-insert-link-selection-overlay{background-color:rgba(140,196,116,0.25);overflow:hidden;position:absolute;z-index:16}.waffle-column-menu-button{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -168px -43px;cursor:pointer;list-style:none;width:12px;height:12px;outline:none;position:absolute;z-index:7}.waffle-column-menu-button-hover,.waffle-column-menu-button-checked,.waffle-column-menu-button-focused{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -83px -34px}.waffle-column-menu-button-disabled{cursor:default;filter:alpha(opacity=30);opacity:0.3}.waffle-column-type-button{background:none;border-radius:2px;cursor:pointer;height:18px;list-style:none;outline:none;position:absolute;width:18px;z-index:7}.waffle-set-column-type-button{background-color:#f8f8f8;border:1px solid #e5e5e5;border-radius:1px;cursor:pointer;height:11px;outline:none;width:11px;z-index:7}.waffle-set-column-type-button:hover{border:1px solid #c6c6c6}.waffle-set-column-type-button .docs-icon{height:12px;left:-2px;top:-3px;width:12px}.waffle-set-column-type-button .docs-icon-img:before{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222.svg)}.waffle-set-column-type-button .docs-icon-gear{left:0;top:-4504px}.waffle-set-column-type-button .docs-icon-gear:hover{left:-40px;top:-5271px}.goog-flat-menu-button-focused.waffle-set-column-type-button .docs-icon-gear:hover{left:0;top:-4504px}.waffle-calculated-column-button{background:#80868b;border:none;cursor:pointer;list-style:none;opacity:0;outline:none;position:absolute;z-index:7}.waffle-calculated-column-button:hover{opacity:1}.waffle-disclaimer{font-size:11px;background-color:#ececec;color:#656565;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;height:20px}#waffle-disclaimer-content{border-bottom:1px solid #c0c0c0;border-left:0 none;border-right:0 none;padding-left:47px}.waffle-disclaimer-link{color:#77c;padding-left:3px}.apps-toast{z-index:16}.apps-toast-fill{z-index:17}.trix-offscreen{position:absolute;left:-10000px;top:-10000px}#promo-target{display:inline}#waffle-grid-container{margin-right:auto;position:relative}#docs-editor-container{touch-action:none;-ms-scroll-chaining:none}.border-style-menu-item-container{background-position:left 15px center;padding-left:30px!important;padding-right:40px!important}.border-style-menu-item{height:12px;min-height:12px!important}.border-style-menu-item .border-style-menu-icon{position:relative;left:15px;top:-4px}@media all and (-ms-high-contrast:none),(-ms-high-contrast:active){.border-style-menu-item .border-style-menu-icon{position:relative;left:15.5px;top:-4.78px}}@media screen and (-moz-windows-theme){.border-style-menu-item .border-style-menu-icon{position:relative;left:15px;top:-4.5px}}#t-border-palette .goog-palette-cell-selected{background-color:#e1e1e1}#t-border-palette .goog-palette-cell{padding:2px}#t-border-palette .goog-palette-table{border-right:1px solid #eee}span.jfk-checkbox{margin-bottom:1px}.match-paren{background-color:#e5e5e5;font-weight:500}.match-string{background-color:#eee}.error-code,.boolean{color:#15c}.active-range{box-shadow:0 0 6px 2px #333;opacity:0.1;pointer-events:none}.inactive{opacity:0.5}.formula-error{color:#dd4b39}.argument-error,.formula-eval-error{color:#dd4b39;text-decoration:underline}.number{color:#15c}.string{color:green}.default-formula-text-color{color:black}.insert-range-indicator{background:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4IiBoZWlnaHQ9IjMiIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiNjY2MiPjxwYXRoIGQ9Ik0wLjUgMEwwLjUgM00wIDIuNUw4IDIuNU03LjUgM0w3LjUgMCIvPjwvc3ZnPg==") bottom no-repeat;background-size:contain;width:8px;margin-left:2px;cursor:default}.insert-range-indicator:after{content:" "}.formula-replace-text{text-decoration:underline}.trix-tooltip-link{color:#4285f4}.trix-tooltip-link:hover{text-decoration:underline}.formula-content{font-family:Inconsolata,monospace,arial,sans,sans-serif;font-size:14px}#apps-debug-tracers{display:none}.jfk-bubble.waffle-error-bubble{background-color:#fff3f2;border:1px solid #db4437;border-radius:1px;box-shadow:0 1px 2px 0 rgba(0,0,0,0.1);color:#c5221f;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:500;letter-spacing:-0.1px;line-height:16px;max-width:200px;padding:8px;transition:opacity 200ms ease-in}.waffle-function-localization-promo{background-color:#fafafa;bottom:100px;box-shadow:1px 2px 5px rgba(0,0,0,0.28);color:#616161;height:180px;padding:20px;position:absolute;right:25px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;width:350px;z-index:1000}.waffle-function-localization-promo-title{font-size:18px;font-weight:500;margin:5px 0 20px 0}.waffle-function-localization-promo-body{font-size:13px;line-height:22px}.waffle-function-localization-promo-button-bar{bottom:25px;right:25px;line-height:22px;position:absolute}.jfk-button.waffle-function-localization-promo-no-button{color:#0f9d58;cursor:pointer;margin-right:10px;padding:5px}.jfk-button.waffle-function-localization-promo-yes-button{background-color:#0f9d58;color:#fafafa;cursor:pointer;padding:5px}.apps-ui-material-slide-toggle-container-checked .apps-ui-material-slide-toggle-track{background-color:#ceead6;opacity:1}.apps-ui-material-slide-toggle-container-checked .apps-ui-material-slide-toggle-thumb{background-color:#188038}.apps-actiondatawidget-shortcut-desc{width:278px}.apps-actiondatawidget-shortcut-key{line-height:17px;width:251px;padding-left:24px}.apps-actiondatawidget-content{width:100%}::-ms-clear,::-ms-reveal{display:none}.waffle-rich-text-link,a.waffle-rich-text-link{color:#15c;text-decoration:underline}.waffle-rich-text-link-popup{background-color:#fff;border:1px solid;border-color:#bbb #bbb #a8a8a8;padding:12px 20px;position:absolute;white-space:nowrap;z-index:15}.waffle-dataconnectormenu-note{color:rgba(0,0,0,0.38);font-size:11px;padding-left:8px}.waffle-assistant-data-cleanup-suggestions-bottom-entry-point-button{align-items:center;background-color:#fff;border-radius:15px;border:1px solid #dadce0;box-sizing:border-box;color:#d93025;cursor:pointer;display:flex;float:right;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;height:30px;margin:4px 8px;outline:none;padding:0 8px}.waffle-assistant-data-cleanup-suggestions-bottom-entry-point-button:hover{background:rgba(217,48,37,.04);color:#a50e0e}.waffle-assistant-data-cleanup-suggestions-bottom-entry-point-button:focus{background:rgba(217,48,37,.12);color:#a50e0e}.waffle-assistant-data-cleanup-suggestions-bottom-entry-point-button:focus{background:rgba(217,48,37,.1);border:1px solid #a50e0e;color:#a50e0e}.waffle-assistant-data-cleanup-suggestions-bottom-entry-point-button .waffle-view-icons-error-filled{height:18px;margin-right:8px;width:18px}.jfk-bubble.jfk-bubble-promo.waffle-assistant-data-cleanup-suggestions-bottom-entry-point-bubble{background:#fff;border:none;border-radius:8px;box-shadow:0 2px 6px 2px rgba(60,64,67,.15);box-sizing:border-box;min-height:140px;padding:8px;width:275px}.jfk-bubble-promo.waffle-assistant-data-cleanup-suggestions-bottom-entry-point-bubble .jfk-bubble-arrowdown .jfk-bubble-arrowimplbefore,.jfk-bubble-promo.waffle-assistant-data-cleanup-suggestions-bottom-entry-point-bubble .jfk-bubble-arrowup .jfk-bubble-arrowimplbefore{border-color:rgba(60,64,67,.15) transparent}.jfk-bubble-promo.waffle-assistant-data-cleanup-suggestions-bottom-entry-point-bubble .jfk-bubble-arrowdown .jfk-bubble-arrowimplafter,.jfk-bubble-promo.waffle-assistant-data-cleanup-suggestions-bottom-entry-point-bubble .jfk-bubble-arrowup .jfk-bubble-arrowimplafter{border-color:#fff transparent}.waffle-assistant-data-cleanup-suggestions-bottom-entry-point-bubble-header{color:#202124;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:16px;line-height:24px;letter-spacing:0.1px;margin:8px}.waffle-assistant-data-cleanup-suggestions-bottom-entry-point-bubble-body{color:#5f6368;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;letter-spacing:0.2px;margin:0 8px 8px 8px}.waffle-assistant-data-cleanup-suggestions-bottom-entry-point-bubble-buttons{display:flex;justify-content:flex-end}.waffle-assistant-data-cleanup-suggestions-bottom-entry-point-bubble-call-to-action,.waffle-assistant-data-cleanup-suggestions-bottom-entry-point-bubble-dismiss-button{margin-right:8px}.waffle-ui-text-link-button{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:transparent;border:none;color:#188038;cursor:pointer;outline:none;padding:8px}.waffle-ui-text-link-button.dense{height:24px;padding:0 8px}.waffle-ui-text-link-button-hover{background:rgba(24,128,56,0.04);color:#0d652d}.waffle-ui-text-link-button-focused{background:rgba(24,128,56,0.12);color:#0d652d}.waffle-ui-text-link-button-active{background:rgba(24,128,56,0.1)}.waffle-ui-text-link-button-disabled{color:rgba(60,64,67,0.38)}.waffle-ui-text-link-with-icon-button-text{display:inline-block;margin-left:2px;margin-top:1px;vertical-align:middle}.docs-gm .docs-material .waffle-ui-text-link-green-icon .docs-icon-img{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_green.svg)}.goog-grey.waffle-ui-text-link-button{color:#5f6368}.goog-grey.waffle-ui-text-link-button-hover{background:rgba(32,33,36,0.04);color:#202124}.goog-grey.waffle-ui-text-link-button-focused{background:rgba(32,33,36,0.12);color:#202124}.goog-grey.waffle-ui-text-link-button-active{background:rgba(32,33,36,0.1);color:#202124}.goog-red.waffle-ui-text-link-button{color:#d93025}.goog-red.waffle-ui-text-link-button-hover{background:rgba(217,48,37,0.04);color:#a50e0e}.goog-red.waffle-ui-text-link-button-focused{background:rgba(217,48,37,0.12);color:#a50e0e}.goog-red.waffle-ui-text-link-button-active{background:rgba(217,48,37,0.1);color:#a50e0e}.docs-charts-editor{margin-right:10px}.docs-charts-editor .docs-charts-editor-toggle-tabs{position:absolute;top:0;width:100%}.docs-charts-editor .docs-charts-editor-scroll-pane{bottom:0;position:absolute;top:43px;overflow:auto;width:100%}.docs-charts-editor .docs-charts-editor-scroll-pane .docs-charts-editor-customize-tab{background-color:#f8f9fa;bottom:0;position:absolute;top:0;width:100%}.docs-charts-editor-control-label{color:#5f6368;display:block;font-size:12px;line-height:15px;margin-bottom:8px;margin-right:2px}.docs-charts-editor-row,.docs-charts-editor-tall-row{font-size:0}.docs-charts-editor-row>.docs-charts-editor-col{font-size:13px;vertical-align:top}.docs-charts-editor-row>.docs-charts-editor-col>div{margin:10px 0 10px 0}.docs-charts-editor-checkboxes-container{margin:10px 0}.docs-charts-editor-checkboxes-container-no-bottom-margin{margin:10px 0 0}.docs-charts-editor-checkboxes-container .docs-material-gm-labeled-checkbox{padding:4px 0}.docs-charts-editor-row>.docs-charts-editor-col>div>.docs-material-labeled-checkbox{margin:0}.docs-charts-editor-tall-row>.docs-charts-editor-col>div{margin:20px 0 20px 0}.docs-charts-editor-tall-row:first-child .docs-charts-editor-col>div{margin-top:10px}.docs-charts-editor-col.col-100{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:100%}.docs-charts-editor-col.col-50{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:inline-block;width:50%}.docs-charts-editor-col.col-50~.docs-charts-editor-col.col-50:first-of-type{padding-right:10px}.docs-charts-editor-col.col-50+.docs-charts-editor-col.col-50:last-of-type{padding-left:10px}.docs-charts-editor-col.col-70-left{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:inline-block;padding-right:10px;width:70%}.docs-charts-editor-col.col-30-right{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:inline-block;padding-left:10px;width:30%}.docs-charts-editor-col.col-60-left{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:inline-block;padding-right:10px;width:60%}.docs-charts-editor-col.col-40-right{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:inline-block;padding-left:10px;width:40%}.docs-charts-editor-col.col-50 .docs-material-gm-labeled-checkbox-content{max-width:80%}.docs-charts-editor-col.col-50>div>.docs-material-labeled-checkbox{margin-top:24px}.docs-charts-editor-scroll-pane.docs-charts-editor-scroll-pane-custom-sidebar::-webkit-scrollbar{width:12px}.docs-charts-editor-scroll-pane.docs-charts-editor-scroll-pane-custom-sidebar::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,0.2);background-clip:padding-box;border:solid transparent;border-width:1px 2px 1px 2px;box-shadow:none;min-height:28px;padding:1px}.docs-charts-editor-scroll-pane.docs-charts-editor-scroll-pane-custom-sidebar::-webkit-scrollbar-thumb:hover{box-shadow:none}.docs-charts-editor-scroll-pane.docs-charts-editor-scroll-pane-custom-sidebar::-webkit-scrollbar-track{background-clip:border-box;background-color:#f5f5f5;border:solid #e0e0e0;border-width:1px;box-shadow:none}.docs-charts-editor-scroll-pane.docs-charts-editor-scroll-pane-custom-sidebar::-webkit-scrollbar-track:hover{background-color:#f5f5f5;background-clip:border-box;box-shadow:none;border:solid #e0e0e0;border-width:1px}.docs-charts-editor-bundle.docs-charts-editor-parent-bundle{border-bottom:1px solid rgba(0,0,0,0.12)}.docs-charts-editor-customize-tab .docs-charts-editor-bundle.docs-charts-editor-parent-bundle{border-bottom:2px solid #f8f9fa}.docs-charts-editor-customize-tab .docs-charts-editor-bundle.docs-charts-editor-parent-bundle>div{border:2px solid #f8f9fa}.docs-charts-editor-bundle.docs-charts-editor-parent-bundle.docs-charts-editor-open-bundle{padding:8px 16px 6px 16px}.docs-charts-editor-selector-bundle-selector-wrapper{padding:0 16px}.docs-charts-editor-selector-bundle-selector-wrapper{padding:8px 16px}.docs-charts-editor-selector-bundle-selector-label{color:rgba(0,0,0,0.54);display:inline-block;line-height:26px;vertical-align:top}.docs-charts-editor-selector-bundle-selector{display:inline-block;max-width:100%;padding-left:0;width:100%}.docs-charts-editor-selector-bundle-selector .docs-material-labeled-select-outer-box{border:none;margin-bottom:0px}.docs-charts-editor-selector-bundle-selector .docs-material-gm-labeled-select-outer-box{box-shadow:0 1px 3px 1px rgba(60,64,67,.15);border:none;margin-bottom:0px}.docs-charts-editor-selector-bundle-selector .docs-material-labeled-select-caption{font-weight:500}.docs-charts-editor-selector-bundle-selector .docs-material-gm-labeled-select-caption{color:#188038;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;letter-spacing:.25px}.docs-charts-editor-selector-bundle-selector .docs-material-labeled-select-content{display:none}.docs-charts-editor-selector-bundle-selector .docs-material-gm-labeled-select-content{display:none}.docs-charts-editor-selector-bundle-selector .docs-material-gm-labeled-select-focused .docs-material-gm-labeled-select-outer-box,.docs-charts-editor-selector-bundle-selector .docs-material-gm-labeled-select-open .docs-material-gm-labeled-select-outer-box{background-color:#f1f3f4}.docs-charts-editor-selector-bundle-selector .docs-material-gm-labeled-select-hover .docs-material-gm-labeled-select-outer-box{background-color:#f8f9fa}.docs-charts-editor-selector-bundle{background:transparent;padding:4px 16px 6px 16px}.docs-charts-editor-selector-bundle .docs-charts-editor-selector-bundle-header{color:#3c4043;font-size:14px;font-weight:500;letter-spacing:.2px;line-height:24px;margin-bottom:-4px;padding:10px 0;padding-top:8px}.docs-charts-editor-bundle-container{padding:0 16px 6px}.docs-charts-editor-basic-bundle .docs-charts-editor-bundle.docs-charts-editor-parent-bundle{border-bottom:none}.docs-charts-editor-basic-bundle .docs-charts-editor-bundle.docs-charts-editor-parent-bundle.docs-charts-editor-open-bundle{padding-bottom:0px}.docs-charts-editor-basic-bundle .docs-charts-editor-row,.docs-charts-editor-data-picker-bundle .docs-charts-editor-row{overflow:hidden}.docs-charts-editor-data-picker-bundle .docs-charts-editor-bundle.docs-charts-editor-parent-bundle{border-bottom:none;padding-top:0}.docs-charts-editor-alert-bundle{color:rgba(0,0,0,0.54);line-height:22px;text-align:center}.docs-charts-editor-alert-bundle .docs-charts-editor-bundle.docs-charts-editor-parent-bundle{-ms-flex-align:center;-moz-box-align:center;-webkit-box-align:center;box-align:center;-webkit-align-items:center;align-items:center;border-bottom:none;bottom:0;display:flex;left:0;position:absolute;right:0;top:0}.docs-charts-editor-alert-bundle .docs-charts-editor-bundle.docs-charts-editor-parent-bundle>div{width:100%}.docs-charts-editor-alert-bundle-icon{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSIjRTBFMEUwIj48cGF0aCBkPSJNOSAxN0g3di03aDJ2N3ptNCAwaC0yVjdoMnYxMHptNCAwaC0ydi00aDJ2NHptMi41IDJoLTE1VjVoMTV2MTR6bTAtMTZoLTE1Yy0xIDAtMiAxLTIgMnYxNGMwIDEgMSAyIDIgMmgxNWMxIDAgMi0xIDItMlY1YzAtMS0xLTItMi0yeiIvPjxwYXRoIGZpbGw9Im5vbmUiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L3N2Zz4=");background-position:center;background-repeat:no-repeat;background-size:100px 100px;height:100px;width:100%}.docs-charts-editor-pill-remove-button{background:none;background-color:#bfbfbf;border:none;border-radius:16px;bottom:2px;float:right;height:16px;margin:8px;position:relative;transition:background-color 0.2s ease;width:auto}.docs-charts-editor-pill-remove-button.jfk-button-hover{background-color:#aaa}.docs-charts-editor-pill{background-color:#fff;border-radius:0;box-shadow:none;padding-left:0;padding-right:0}.docs-charts-editor-pill-remove{position:relative;width:100%}.docs-charts-editor-pill-flex{display:flex}.docs-charts-editor-pill-flex-col{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-ms-flex:50%;-webkit-flex:50%;flex:50%;display:inline-block;padding-left:10px}.docs-charts-editor-pill-flex-col:first-of-type{padding-left:0px}.docs-charts-editor-pill-fixed-col{padding-left:10px}.docs-charts-editor-pill-fixed-col:first-of-type{padding-left:0px}.docs-charts-editor-column-names-menu-wrapper{display:none}.docs-charts-editor-column-names-menu-enabled{width:460px!important}.docs-charts-editor-column-names-menu-enabled .docs-charts-editor-toggle-tabs{border-bottom:1px solid #dadce0}.docs-charts-editor-column-names-menu-enabled .docs-charts-editor-scroll-pane{overflow-y:hidden}.docs-charts-editor-column-names-menu-enabled .docs-charts-editor-basic-tab{display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;height:100%;overflow:hidden}.docs-charts-editor-column-names-menu-enabled .docs-charts-editor-basic-tab-bundle-wrapper{border-right:1px solid #dadce0;height:100%;overflow-y:auto;width:300px}.docs-charts-editor-column-names-menu-enabled .docs-charts-editor-column-names-menu-wrapper{display:block;height:100%;overflow-y:auto;width:160px}.docs-charts-editor-column-names-menu-enabled .docs-charts-editor-customize-tab{overflow-y:auto}.docs-charts-editor-customize-tab hr{background-color:#dadce0;border:0;height:1px;margin:17px -16px}.docs-charts-editor-charttype-select-icon{float:left}.docs-charts-editor-charttype-select-icon>svg{height:18px;width:18px;margin-right:10px;vertical-align:sub}.docs-material-select-disabled .docs-charts-editor-charttype-select-icon{opacity:0.12}.docs-charts-editor-charttype-new{background-color:#000;border:1px solid #fff;border-radius:1px;bottom:1px;color:#fff;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:10px;font-weight:500;height:16px;line-height:17px;opacity:.54;padding:0 4px;position:absolute;right:1px;text-transform:uppercase}.docs-charts-editor-chart-type-select .docs-material-gm-select-caption{width:100%}.docs-charts-editor-charttype-menu{box-shadow:0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12),0px 2px 4px -1px rgba(0,0,0,0.2);background-color:white;margin-left:-12px;margin-top:5px;overflow-x:hidden;overflow-y:scroll;padding:10px 16px;position:absolute;width:270px;z-index:3}.docs-charts-editor-charttype-option{border:1px solid #bdbdbd;cursor:pointer;height:45px;margin:0 23px 10px 0;overflow:hidden;padding:2px;position:relative;width:67px}.docs-charts-editor-palette-label{color:rgba(0,0,0,0.87);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px}.docs-charts-editor-charttype-menu .goog-palette{display:inline-block;margin-bottom:0px;margin-top:10px}.docs-charts-editor-charttype-menu .goog-palette-cell{border:0;cursor:inherit}.docs-charts-editor-charttype-menu .goog-palette-table{border:0;margin:5px 0 0 0}.goog-palette-cell-hover .docs-charts-editor-charttype-option{border:1px solid #9e9e9e}.goog-palette-cell-selected .docs-charts-editor-charttype-option{box-shadow:0 0 0 4px #c6dafc}.docs-charts-editor-charttype-option-canvas{direction:ltr;height:45px;width:67px}.docs-charts-editor-charttype-option-gviz-org-chart{-webkit-transform:scale(0.61,0.68);-moz-transform:scale(0.61,0.68);-ms-transform:scale(0.61,0.68);-o-transform:scale(0.61,0.68);transform:scale(0.61,0.68);background:url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -1428px no-repeat}.docs-charts-editor-charttype-option-gviz-radar-chart{-webkit-transform:scale(0.60,0.60);-moz-transform:scale(0.60,0.60);-ms-transform:scale(0.60,0.60);-o-transform:scale(0.60,0.60);transform:scale(0.60,0.60);background:url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -2233px no-repeat}.docs-charts-editor-charttype-option-gviz-annotated-timeline-chart{-webkit-transform:scale(0.61,0.68);-moz-transform:scale(0.61,0.68);-ms-transform:scale(0.61,0.68);-o-transform:scale(0.61,0.68);transform:scale(0.61,0.68);background:url("//ssl.gstatic.com/charts/static/thumbs17.png") 0 -1895px no-repeat}.docs-charts-editor-charttype-option-gviz-table-chart{-webkit-transform:scale(0.61,0.68);-moz-transform:scale(0.61,0.68);-ms-transform:scale(0.61,0.68);-o-transform:scale(0.61,0.68);transform:scale(0.61,0.68);background:url("//ssl.gstatic.com/charts/static/thumbs17.png") 0 -1351px no-repeat}.docs-charts-editor-charttype-option-gviz-geo-chart{-webkit-transform:scale(0.61,0.68);-moz-transform:scale(0.61,0.68);-ms-transform:scale(0.61,0.68);-o-transform:scale(0.61,0.68);transform:scale(0.61,0.68);background:url("//ssl.gstatic.com/charts/static/thumbs17.png") 0 -2772px no-repeat}.docs-charts-editor-charttype-option-gviz-geo-chart-with-markers{-webkit-transform:scale(0.61,0.68);-moz-transform:scale(0.61,0.68);-ms-transform:scale(0.61,0.68);-o-transform:scale(0.61,0.68);transform:scale(0.61,0.68);background:url("//ssl.gstatic.com/charts/static/thumbs17.png") 0 -612px no-repeat}.docs-charts-editor-charttype-option-disabled-chart{opacity:0.25}.docs-charts-editor-charttype-option-gviz-org-chart,.docs-charts-editor-charttype-option-gviz-radar-chart,.docs-charts-editor-charttype-option-gviz-annotated-timeline-chart,.docs-charts-editor-charttype-option-gviz-table-chart,.docs-charts-editor-charttype-option-gviz-geo-chart,.docs-charts-editor-charttype-option-gviz-geo-chart-with-markers{-webkit-transform-origin:0 0;-moz-transform-origin:0 0;-ms-transform-origin:0 0;-o-transform-origin:0 0;transform-origin:0 0;float:left;height:67px;width:110px}.docs-charts-editor-gauge-colored-range-bundle{border-top:1px dashed #9e9e9e;margin-top:20px;padding-top:5px}.docs-charts-editor-gauge-colored-range-bundle .docs-charts-editor-row>.docs-charts-editor-col>div{margin:0}.docs-charts-editor-gauge-colored-range-bundle .docs-charts-editor-row{margin-top:10px}.docs-charts-editor-number-format-type-container{display:flex;justify-content:space-between}.docs-charts-editor-number-format-type-example{color:#80868b}.docs-material-gm-labeled-select .docs-charts-editor-number-format-type-example{display:none}.docs-charts-editor-number-format-type-header{color:#5f6368;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:11px;font-weight:500;left:38px;line-height:13px;padding:4px 0;text-transform:uppercase}.docs-charts-editor-pie-slice-options hr{background-color:#dadce0;border:0;height:1px;margin:17px -16px}.docs-charts-editor-recommendation-zippy{background-color:#e6f4ea;border:1px solid #ceead6;border-radius:4px}.docs-charts-editor-recommendation-zippy-header{padding:4px 0}.docs-charts-editor-recommendation-zippy-header-icon{display:inline-block;padding:0 8px}.docs-charts-editor-recommendation-zippy-header-text{color:#3c4043;font-weight:500}.docs-charts-editor-recommendation-zippy-toggle{font-weight:400;text-transform:none}.docs-charts-editor-recommendation-zippy-header-left{float:left;line-height:32px}.docs-charts-editor-recommendation-zippy-header-right{float:right}.docs-charts-editor-recommendation-zippy-header:after{content:"";clear:both;display:table}.docs-charts-editor-recommendation-zippy-body{padding:0 4px;text-align:center}.docs-charts-editor-recommendation-zippy .goog-palette-cell{border:0;cursor:inherit}.docs-charts-editor-recommendation-zippy .goog-palette-table{border:0;margin:5px 0 0 0;width:100%}.docs-charts-editor-recommendation-zippy .waffle-charteditor-recommendation-palette.goog-palette{border-bottom:none;display:inline-block;margin:0;padding:0;width:100%}.docs-charts-editor-recommendation-zippy .waffle-charteditor-recommendation-option{background-color:white;height:75px;margin:4px 6px 8px 8px;max-width:114px;padding:0;width:initial}.docs-charts-editor-series-select-color{border-radius:50%;height:15px;left:-15px;margin:0;position:relative;top:3px;width:15px}.docs-charts-editor-series-select .docs-material-gm-labeled-select-caption>div{color:#202124;padding-left:20px}.docs-charts-editor-series-point-shape-icon{fill:rgba(0,0,0,0.87);height:12px;margin-bottom:-1px;margin-right:9px;width:12px}.goog-menuitem-content .docs-charts-editor-series-point-shape-icon{margin-left:-12px}.docs-charts-editor-series-line-dash-type-icon{height:2px;stroke:rgba(0,0,0,0.87);width:75px;vertical-align:middle}.docs-charts-editor-series-item-selection-dialog-input-default-caption{color:#bdbdbd}.docs-charts-editor-series-format-labeledsection .docs-charts-editor-control-label.docs-charts-editor-labeledsection,.docs-charts-editor-series-format-data-point-button .docs-charts-editor-control-label.docs-charts-editor-labeledactionablebutton-label{color:#3c4043;font-size:14px;font-weight:500;letter-spacing:.2px;line-height:24px;margin-bottom:0;padding:10px 0}.docs-charts-editor-series-format-label-hide{display:none}.docs-charts-editor-series-format-data-point-button>div{display:flex;justify-content:space-between}.docs-charts-editor-series-format-data-point-button .docs-charts-editor-labeledactionablebutton{padding:10px 0}.col-50.docs-charts-editor-series-format-data-point-button{padding:10px 0;text-align:right}.docs-charts-editor-series-single-item-style-item-select{max-width:70%}.docs-charts-editor-table-border-container{background:#fdfdfd;border-top:1px solid #e0e0e0;padding:0 16px 6px}.docs-charts-editor-table-border-container .docs-charts-editor-col.col-50>div>.docs-material-labeled-checkbox{margin-top:24px}.docs-charts-editor-textstyle-toolbar{border:1px solid #d8d8d8;border-radius:1px;margin:6px 0;padding:0 4px}#docs-charts-editor-textstyle-font-family .goog-toolbar-menu-button-caption{overflow-x:hidden;text-overflow:ellipsis;white-space:nowrap;width:67px}#docs-charts-editor-textstyle-font-size .goog-toolbar-combo-button-caption{width:32px}#docs-charts-editor-textstyle-font-size .goog-toolbar-combo-button-input{width:12px}.docs-charts-editor-textstyle-container{border:1px solid #dadce0;border-radius:4px;display:inline-block;height:40px;line-height:40px}.docs-charts-editor-textstyle-separator{border-left:1px solid #dadce0;height:25px;margin:7px 1px;vertical-align:top}.docs-charts-editor-textstyle-italic{margin-left:-1px}.docs-charts-editor-col.docs-charts-editor-waterfall-connector-line-color{width:48%}.docs-charts-editor-col.docs-charts-editor-waterfall-connector-line-thickness{width:52%}.docs-charts-editor-waterfall-add-total-button{color:#4285f4;font-weight:500;padding:2px 1px 0px 1px;text-transform:uppercase}.docs-charts-editor-waterfall-add-total-column{margin-bottom:10px}.docs-charts-editor-waterfall-total-column-label{-ms-flex:1;-webkit-flex:1;flex:1}.docs-charts-contextual-editor .docs-charts-editor-customize-tab .docs-charts-editor-bundle.docs-charts-editor-parent-bundle{border-bottom:none}.docs-charts-contextual-editor{bottom:0;left:0;margin-right:0;position:absolute;right:0;top:0}.docs-charts-editor.docs-charts-contextual-editor .docs-charts-editor-scroll-pane .docs-charts-editor-customize-tab{background-color:white}.docs-charts-editor-data-point-format-fill-style-bundle .docs-charts-editor-selector-bundle,.docs-charts-editor-data-point-format-line-style-bundle .docs-charts-editor-selector-bundle{padding:0}.docs-charts-contextual-editor-content .docs-charts-editor-noncollapsible-section .docs-charts-editor-data-point-format-fill-style-bundle .docs-charts-editor-material-toolbar-color-picker,.docs-charts-contextual-editor-content .docs-charts-editor-noncollapsible-section .docs-charts-editor-data-point-format-fill-style-bundle .docs-charts-editor-material-toolbar-color-picker-outer-box,.docs-charts-contextual-editor-content .docs-charts-editor-noncollapsible-section .docs-charts-editor-data-point-format-line-style-bundle .docs-charts-editor-material-toolbar-color-picker,.docs-charts-contextual-editor-content .docs-charts-editor-noncollapsible-section .docs-charts-editor-data-point-format-line-style-bundle .docs-charts-editor-material-toolbar-color-picker-outer-box{width:100%}.waffle-charteditor-domain-grouping-button-container{display:flex}.waffle-charteditor-domain-grouping-button-label{-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;color:#202124;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;letter-spacing:0.2px;line-height:44px}.waffle-charteditor-domain-grouping-chip .docs-charts-editor-chip-label{color:#424242;font-size:14px}.waffle-charteditor-external-menu-button,.waffle-charteditor-external-menu-button-outer-box,.waffle-charteditor-external-menu-button-inner-box,.waffle-charteditor-external-menu-button-caption,.waffle-charteditor-external-menu-button-dropdown{cursor:pointer;display:block}.waffle-charteditor-data-constraint-disabled .waffle-charteditor-external-menu-button,.waffle-charteditor-data-constraint-disabled .waffle-charteditor-external-menu-button-outer-box,.waffle-charteditor-data-constraint-disabled .waffle-charteditor-external-menu-button-inner-box,.waffle-charteditor-data-constraint-disabled .waffle-charteditor-external-menu-button-caption,.waffle-charteditor-data-constraint-disabled .waffle-charteditor-external-menu-button-dropdown{cursor:not-allowed}.waffle-charteditor-external-menu-button{outline:none}.waffle-charteditor-external-menu-button-dropdown{height:0}.docs-charts-editor-chip.waffle-charteditor-external-menu-button-focused:not(.waffle-charteditor-external-menu-button-open) .docs-charts-editor-chip-content,.waffle-charteditor-pickerchip.waffle-charteditor-external-menu-button-focused:not(.waffle-charteditor-external-menu-button-open) .docs-charts-editor-chip-content{outline:5px auto #4285f4;outline-offset:-3px}.waffle-charteditor-filter-button-container{display:flex}.waffle-charteditor-filter-button-label{-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;color:#202124;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;letter-spacing:0.2px;line-height:44px}.waffle-charteditor-filter-cards{margin-bottom:48px}.waffle-charteditor-filter-card{background-color:#f1f3f4;border-radius:8px;padding:0 10px 10px 10px}.waffle-charteditor-filter-card:not(:last-child){margin-bottom:10px}.waffle-charteditor-filter-card-top-row{-webkit-align-items:center;align-items:center;display:flex;padding-bottom:2px}.waffle-charteditor-filter-card-top-row>div{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.waffle-charteditor-filter-card-remove{margin-right:-10px}.waffle-charteditor-filter-card-top-row>.waffle-charteditor-filter-card-label{-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-shrink:1;-ms-flex-negative:1;flex-shrink:1;overflow:hidden;text-overflow:ellipsis}.waffle-charteditor-filter-card-label{color:#424242;font-size:14px;padding-left:8px}.waffle-charteditor-filter-card-select-label{color:#5f6368;font-size:11px;padding-bottom:3px;padding-left:2px}.waffle-charteditor-filter-card-select .jfk-select.goog-flat-menu-button{background-color:#fff;padding-bottom:2px;padding-top:2px;text-align:left;width:100%}.waffle-charteditor-filter-card-select .jfk-select.goog-flat-menu-button-hover{background-color:rgba(60,64,67,0.04);border:1px solid #dadce0}.waffle-charteditor-filter-card-select .jfk-select.goog-flat-menu-button-focused{background-color:rgba(60,64,67,0.06);border:1px solid #dadce0}.waffle-charteditor-filter-card-select .jfk-select .goog-flat-menu-button-caption{font-size:12px}.waffle-charteditor-rangepicker-multiple-domains-bundle{margin:0 -16px}.waffle-charteditor-multiple-domains-bundle-wrapper{margin:0 16px}.waffle-charteditor-multiple-domains-bundle-wrapper hr{background-color:#f1f3f4;border:0;height:4px;margin:16px -16px 8px -16px}.waffle-charteditor-add-multiple-domains-button-label{color:#188038;display:inline-block;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;line-height:250%;margin-left:4px;vertical-align:middle}.waffle-charteditor-multiple-domains-bundle-add-button>div{width:100%}.waffle-charteditor-multiple-domains-bundle-add-button div[role="button"]{cursor:pointer;background:none;outline:none;width:100%}.waffle-charteditor-numeric-group-control-container{-webkit-align-items:center;align-items:center;display:flex}.waffle-charteditor-numeric-group-control-checkbox{-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1}.waffle-charteditor-sort-button-container{display:flex}.waffle-charteditor-sort-button-label{-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;color:#202124;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;letter-spacing:0.2px;line-height:44px}.waffle-charteditor-sort-order-toggle{background:none;border:0;color:#5f6368;cursor:pointer;font-style:italic}.waffle-charteditor-sort-chip .docs-charts-editor-chip-label{color:#424242;font-size:14px}.waffle-charteditor-sidebar.waffle-sidebar-container{width:320px;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;z-index:2}.waffle-charteditor-content{background-color:#fff;height:100%}.waffle-charteditor-rangepicker-modification-disabled{display:none;font-size:14px;margin-top:15px}.waffle-charteditor-rangepicker-checkboxes-container{margin:10px 0}.waffle-charteditor-rangepicker-checkboxes-container .docs-material-gm-labeled-checkbox{padding:4px 0}.waffle-charteditor-rangepicker-labels-as-text{margin-left:28px}.waffle-charteditor-rangepicker-has-external-data .waffle-charteditor-rangepicker-labels-as-text{margin-left:0}.docs-charts-editor-row>.waffle-charteditor-rangepicker-data-picker>div{margin-top:0}.waffle-charteditor-rangepicker-data-picker .waffle-charteditor-date-group-control-bucket-type .docs-material-gm-labeled-select-content{display:none}.waffle-charteditor-rangepicker-data-transformation .waffle-charteditor-rangepicker-modification-disabled{display:block}.waffle-charteditor-rangepicker-data-transformation .waffle-charteditor-rangepicker-checkboxes-container,.waffle-charteditor-rangepicker-data-transformation .waffle-charteditor-rangepicker-merge{display:none}.waffle-charteditor-rangepicker-error-label{color:#db4437;font-size:13px}.waffle-charteditor-unsupported-chart-type{box-shadow:0px 3px 4px 0px rgba(0,0,0,0.14),0px 3px 3px -2px rgba(0,0,0,0.12),0px 1px 8px 0px rgba(0,0,0,0.2);background:#ffebee;color:rgba(0,0,0,0.87);letter-spacing:0.04em;position:absolute;top:0px;z-index:1}.waffle-charteditor-unsupported-chart-type-message{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;font-size:14px;padding:16px}.waffle-charteditor-recommendation-palette.goog-palette{border-bottom:1px solid rgba(0,0,0,0.12);margin-bottom:10px;padding-bottom:20px;width:265px}.waffle-charteditor-recommendation-palette .docs-charts-editor-palette-label{text-transform:uppercase}.waffle-charteditor-recommendation-option{box-shadow:0 0 0 4px #ddd;cursor:pointer;height:80px;margin:3px 12px 10px 0;overflow:hidden;padding:2px;position:relative;width:123px}.goog-palette-cell-hover .waffle-charteditor-recommendation-option{box-shadow:0 0 0 4px #bbc7ed}.goog-palette-cell-selected .waffle-charteditor-recommendation-option{box-shadow:0 0 0 4px #6485f1}.waffle-charteditor-recommendation-option-canvas{direction:ltr}.waffle-charteditor-recommendation-chip{background-color:#4285f4;border:1px solid #fff;bottom:6px;color:#fff;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:10px;font-weight:500;height:13px;line-height:13px;max-width:84px;overflow-x:hidden;padding:2px 7px 0 7px;position:absolute;right:6px;text-overflow:ellipsis;white-space:nowrap}.waffle-charteditor-recommendation-option .waffle-assistant-feedback-button{margin:0;position:absolute;right:0;top:0}.waffle-charteditor-data-constraint-disabled .waffle-charteditor-picker-button-wrapper{cursor:not-allowed}.waffle-charteditor-picker-button-wrapper{-ms-flex-align:center;-moz-box-align:center;-webkit-box-align:center;box-align:center;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;cursor:pointer;display:flex;height:32px;margin-right:12px}.waffle-charteditor-data-constraint-disabled .waffle-charteditor-pickerchip .docs-charts-editor-chip-label{cursor:not-allowed}.waffle-charteditor-pickerchip .docs-charts-editor-chip-content{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background-color:transparent;border:1px solid #dadce0}.waffle-charteditor-data-constraint-disabled .docs-charts-editor-chip-content{opacity:0.5}.waffle-charteditor-pickerchip-button{transition:opacity 200ms cubic-bezier(0.4,0.0,0.2,1);margin-right:8px;margin-top:1px;opacity:.7}.jfk-button-hover .waffle-charteditor-pickerchip-button{opacity:1}.waffle-charteditor-pickerchip.docs-charts-editor-chip-invalid .docs-charts-editor-chip-content{background-color:#f0f0f0}.waffle-charteditor-pickerchip .docs-charts-editor-chip-label{color:#9e9e9e}.waffle-charteditor-pickerchip .docs-charts-editor-chip-label{color:#80868b;cursor:pointer;font-weight:500}.waffle-charteditor-data-constraint-header{-webkit-align-items:center;align-items:center;display:flex}.waffle-charteditor-data-constraint-name,.waffle-charteditor-annotation-chip-label{color:#3c4043;font-size:11px;font-weight:500;letter-spacing:.8px;margin-top:10px;text-transform:uppercase;vertical-align:top}.waffle-charteditor-data-constraint-name{-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;color:#202124;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;letter-spacing:0.2px;line-height:20px;margin-top:10px;overflow:hidden;text-transform:none}.waffle-charteditor-annotation-chip-label{color:#80868b;line-height:16px;margin-right:10px}.waffle-charteditor-data-constraint-aggregate-type .docs-material-gm-labeled-select-outer-box{padding:0 0 0 8px}.waffle-charteditor-data-constraint-chip{color:#424242;font-size:14px;margin-top:8px}.waffle-charteditor-data-constraint{position:relative}.waffle-charteditor-annotation-chip-wrapper{display:block;margin-bottom:15px;margin-left:50px}.waffle-charteditor-annotation-chip{-ms-flex:1;-webkit-flex:1;flex:1}.waffle-charteditor-chip-icon{left:8px;margin-left:15px;margin-top:9px;top:7px}.waffle-charteditor-chip-delete-button{background:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+ICA8cGF0aCBmaWxsPSIjZjBmMGYwIiBkPSJNMTkgNi40MUwxNy41OSA1IDEyIDEwLjU5IDYuNDEgNSA1IDYuNDEgMTAuNTkgMTIgNSAxNy41OSA2LjQxIDE5IDEyIDEzLjQxIDE3LjU5IDE5IDE5IDE3LjU5IDEzLjQxIDEyeiIvPjwvc3ZnPg==");background-color:#5f6368;border:0;border-radius:16px;cursor:pointer;height:16px;margin:10px;transition:background-color 0.2s ease;width:16px}.waffle-charteditor-chip-delete-button:hover{background-color:#aaa}.waffle-charteditor-series-aggregate-type{-webkit-align-items:center;align-items:center;display:flex}.waffle-charteditor-series-aggregate-type-label{color:#616161;font-style:italic;padding:0 10px}.waffle-charteditor-chip-during-dragging.goog-menuitem{box-sizing:border-box;border-radius:16px;cursor:move;margin:0 4px;overflow:hidden;padding-left:8px;padding-right:8px;background:#f8f9fa;box-shadow:0 4px 4px 0px rgba(60,64,67,.3),0 8px 12px 6px rgba(60,64,67,.15);opacity:0.9;width:267px;z-index:2}.waffle-charteditor-chip-during-dragging.goog-menuitem .goog-menuitem-content,.waffle-charteditor-chip-during-dragging.goog-menuitem .goog-menuitem-content span{-ms-flex:1;-webkit-flex:1;flex:1;color:#3c4043;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;line-height:18px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:500}.waffle-charteditor-chip-during-dragging.goog-menuitem .goog-menuitem-content>div{display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-webkit-justify-content:flex-start;justify-content:flex-start}.waffle-charteditor-chip-during-dragging.goog-menuitem .goog-menuitem-icon{margin:0 8px 0 0;position:relative;top:0}.waffle-charteditor-chip-hover-highlight .docs-charts-editor-chip-content{background:#ceead6;border:1px solid #34a853;box-shadow:0 1px 3px 1px rgba(60,64,67,.15)}.waffle-charteditor-chip-hover-highlight.docs-charts-editor-bundle.docs-charts-editor-child-bundle.docs-charts-editor-open-bundle .goog-inline-block.docs-charts-editor-material-textbutton{background-color:#f8fcf9}.waffle-charteditor-chip-hover-highlight.docs-charts-editor-bundle.docs-charts-editor-child-bundle.docs-charts-editor-open-bundle{padding-bottom:56px}.waffle-charteditor-chip-hover-highlight.docs-charts-editor-bundle.docs-charts-editor-child-bundle.docs-charts-editor-open-bundle .waffle-charteditor-filter-card{background:#ceead6;border:1px solid #34a853;box-shadow:0 1px 3px 1px rgba(60,64,67,.15)}#docs-editor.companion-enabled{width:100%}#docs-editor.companion-enabled #waffle-grid-container{width:calc(100% - 56px)}#docs-editor.companion-enabled #grid-bottom-bar{width:calc(100% - 56px)}#docs-editor.companion-enabled #grid-bottom-bar.grid-bottom-bar-rtl-companion-collapsed{width:100%}#docs-editor.companion-enabled #grid-bottom-bar.grid-bottom-bar-rtl{right:56px}#docs-editor.companion-enabled #grid-bottom-bar.grid-bottom-bar-rtl.grid-bottom-bar-rtl-companion-collapsed{right:0}#docs-editor.companion-enabled #grid-bottom-bar.grid-bottom-bar-rtl-companion-open{right:calc(56px + 300px)}.docs-ui-toast.waffle-assistant-toast.waffle-assistant-toast-companion{right:calc(56px + 15px)}.waffle-assistant-entry-expanded.companion-collapsed{border-right:1px solid #c2c2c2}.companion-collapser-button-container.companion-collapser-button-container-elevated{margin-bottom:auto}.docs-companion-app-switcher-container-collapsed .companion-collapser-button-container,.docs-companion-app-switcher-container-collapsed .companion-collapser-button{height:38px}.docs-jfk-styling .companion-collapser-button,.docs-jfk-styling .companion-collapser-button .app-switcher-button-icon-container,.docs-jfk-styling .companion-collapser-button .app-switcher-button-icon-background{transition:all 0s ease 0s}.companion-collapser-button.app-switcher-button-checked{right:0}.companion-collapser-button.app-switcher-button-checked .app-switcher-button-icon-container,.companion-collapser-button.app-switcher-button-checked .app-switcher-button-icon-background{box-shadow:none;margin:8px;padding:10px;top:calc(-1*8px);width:20px}.companion-collapser-button.app-switcher-button-checked .app-switcher-button-icon-background{background-color:transparent;border:transparent 1px solid;border-radius:0}.companion-collapser-button{transition:none}.companion-collapser-button .app-switcher-button-icon-container,.companion-collapser-button .app-switcher-button-icon-background{transition-property:background-color}.companion-collapser-button:not(.app-switcher-button-checked) .app-switcher-button-icon-container,.companion-collapser-button:not(.app-switcher-button-checked) .app-switcher-button-icon-background{transition-property:margin-top}.companion-collapser-button.app-switcher-button-hover.app-switcher-button-checked .app-switcher-button-icon-background{background-color:#f1f3f4}.companion-collapser-button.app-switcher-button-focused.app-switcher-button-checked .app-switcher-button-icon-background{background-color:#e8eaed}.companion-collapser-button.app-switcher-button-checked .app-switcher-button-icon{margin-left:0}.docs-jfk-styling .companion-collapser-button.app-switcher-button-checked .app-switcher-button-icon-container,.docs-jfk-styling .companion-collapser-button.app-switcher-button-checked .app-switcher-button-icon-background{top:-10px}.docs-jfk-styling .companion-collapser-button .app-switcher-button-icon{border:transparent 1px solid;transition:all 0s ease 0s}.docs-jfk-styling .companion-collapser-button.app-switcher-button-hover.app-switcher-button-checked .app-switcher-button-icon-background{background-color:transparent}.docs-jfk-styling .companion-collapser-button.app-switcher-button-hover.app-switcher-button-checked .app-switcher-button-icon{border-color:#c6c6c6}.docs-jfk-styling .companion-collapser-button.app-switcher-button-focused.app-switcher-button-checked .app-switcher-button-icon{outline:-webkit-focus-ring-color auto 5px}.waffle-dashboard-fab-plus-button{bottom:40px;position:absolute;right:55px;z-index:20}.waffle-dashboard-fab-list{bottom:100px;position:absolute;right:55px;z-index:20}.waffle-dashboard-fab-buttons{display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;background-color:#fafafa;border-radius:50%;box-shadow:0 10px 10px #bdbdbd;cursor:pointer;height:60px;margin-top:20px;outline:none;width:60px}.waffle-dashboard-fab-buttons:last-child{margin-bottom:20px}.waffle-dashboard-fab-buttons:hover,.waffle-dashboard-fab-buttons:focus{background-color:#eeeeee}.waffle-dashboard-fab-icons{-webkit-transform:scale(1.3);-moz-transform:scale(1.3);-ms-transform:scale(1.3);-o-transform:scale(1.3);transform:scale(1.3)}.waffle-dataconnector-close-badge{background-color:rgba(0,0,0,0.12);border-radius:50%;box-sizing:border-box;height:18px;position:relative;width:18px}.waffle-dataconnector-close-badge svg{height:80%;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:80%}.waffle-dataconnector-close-badge polygon{fill:#fff}.waffle-dataconnector-close-badge-hover{background-color:rgba(0,0,0,0.38);cursor:pointer}.waffle-dataconnector-connectioncard{display:flex;align-items:center;background:#fff;border-radius:30px;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;padding:12px;width:360px}.waffle-dataconnector-connectioncard-hover{background-color:#f0f0f0}.waffle-dataconnector-connectioncard-focused{background-color:#e8f0fe;outline:none}.waffle-dataconnector-connectioncard-icon{-webkit-transform:scale(1.4,1.4);-moz-transform:scale(1.4,1.4);-ms-transform:scale(1.4,1.4);-o-transform:scale(1.4,1.4);transform:scale(1.4,1.4);background:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgdmlld0JveD0iMCAwIDE4IDE4Ij4KICA8ZyBmaWxsPSIjMDAwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgPGVsbGlwc2UgY3g9IjkiIGN5PSI1IiByeD0iNyIgcnk9IjMiLz4KICAgIDxwYXRoIGQ9Ik0xNiw3IEwxNiw4Ljk5OTk5OTgzIEMxNiwxMC42NTY4NTQyIDEyLjg2NTk5MzIsMTIgOSwxMiBDNS4xMzQwMDY3NSwxMiAyLDEwLjY1Njg1NDIgMiw5IEwyLDcgQzIsOC42NTY4NTQyNSA1LjEzNDAwNjc1LDEwIDksMTAgQzEyLjg2NTk5MzIsMTAgMTYsOC42NTY4NTQyNSAxNiw3IFoiLz4KICAgIDxwYXRoIGQ9Ik0xNiwxMSBMMTYsMTIuOTk5OTk5OCBDMTYsMTQuNjU2ODU0MiAxMi44NjU5OTMyLDE2IDksMTYgQzUuMTM0MDA2NzUsMTYgMiwxNC42NTY4NTQyIDIsMTMgTDIsMTEgQzIsMTIuNjU2ODU0MiA1LjEzNDAwNjc1LDE0IDksMTQgQzEyLjg2NTk5MzIsMTQgMTYsMTIuNjU2ODU0MiAxNiwxMSBaIi8+CiAgPC9nPgo8L3N2Zz4K") no-repeat;background-size:cover;display:inline-block;height:1em;margin-right:12px;width:1em}.waffle-dataconnector-connectioncard-body{border-left:1px solid transparent}.waffle-dataconnector-connectioncard-header{color:rgba(0,0,0,0.87);font-weight:bold;line-height:18px}.waffle-dataconnector-connectioncard-type{color:rgba(0,0,0,0.54)}.waffle-dataconnector-pill{display:flex;background:white;border-radius:40px;box-shadow:0px 1px 1px 0px rgba(0,0,0,0.14),0px 2px 1px -1px rgba(0,0,0,0.12),0px 1px 3px 0px rgba(0,0,0,0.2);box-sizing:border-box;padding:5px 20px;position:absolute}.waffle-dataconnector-pill-info{display:flex}.waffle-dataconnector-pill-timestamp{color:#4285f4;height:36px;line-height:36px;margin-right:10px;white-space:nowrap}.waffle-dataconnector-pill-gm .waffle-dataconnector-pill-timestamp,.waffle-dataconnector-pill-gm .waffle-dataconnector-pill-progress,.waffle-dataconnector-pill-gm .waffle-dataconnector-pill-upgrade-button{color:#188038}.waffle-dataconnector-pill .docs-material-button-flat-default{padding:2px 8px}.waffle-dataconnector-pill-progress{-webkit-align-items:center;align-items:center;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;color:#4285f4;height:36px;line-height:36px}.waffle-dataconnector-pill-error{color:#db4437;height:36px;line-height:36px;margin-right:10px}.waffle-dataconnector-pill-error .waffle-dataconnector-error-icon{height:18px;margin-right:4px;position:relative;top:4px;width:18px}.waffle-dataconnector-pill-menu-button{margin:0;padding:2px 0}.waffle-dataconnector-menu-icon{position:relative;top:3px}.waffle-dataconnector-pill-menu svg{-webkit-transform:scale(1.4,1.4);-moz-transform:scale(1.4,1.4);-ms-transform:scale(1.4,1.4);-o-transform:scale(1.4,1.4);transform:scale(1.4,1.4);bottom:-0.125em;height:1em;margin-right:8px;position:relative;width:1em}.waffle-dataconnector-pill-menuitem{-webkit-align-items:center;align-items:center;display:flex;height:36px;line-height:36px}.waffle-dataconnector-pill-menuitem-refreshquery,.waffle-dataconnector-pill-menuitem-truncation{padding-right:15px!important}.waffle-dataconnector-pill-menuitem-accel{margin-left:auto;padding:0 20px 0 40px;text-align:center;color:#9e9e9e}.waffle-dataconnector-pill-menuitem-refreshquery-info svg{margin:0}.waffle-dataconnector-pill-menuitem-refreshquery-info-progress{font-style:italic}.waffle-dataconnector-pill-menuitem-refreshquery-info-error-button{color:#db4437;text-decoration:underline}.waffle-dataconnector-pill-spinner{border-radius:50%;box-shadow:inset 0 0 0 2px;color:#4285f4;display:inline-block;height:18px;margin:7px 0;position:relative;width:18px;margin-right:7px}.waffle-dataconnector-pill-gm .waffle-dataconnector-pill-spinner{border-radius:50%;box-shadow:inset 0 0 0 2px;color:#188038;display:inline-block;height:18px;margin:7px 0;position:relative;width:18px;margin-right:7px}.waffle-dataconnector-pill-spinner:before{-webkit-animation:waffle-dataconnector-pill-spinner-animation 2s infinite ease 1.5s;-moz-animation:waffle-dataconnector-pill-spinner-animation 2s infinite ease 1.5s;-o-animation:waffle-dataconnector-pill-spinner-animation 2s infinite ease 1.5s;animation:waffle-dataconnector-pill-spinner-animation 2s infinite ease 1.5s;-webkit-transform-origin:11px 10px;-moz-transform-origin:11px 10px;-ms-transform-origin:11px 10px;-o-transform-origin:11px 10px;transform-origin:11px 10px;background:#fff;border-radius:20px 0 0 20px;content:"";height:20px;left:-1px;position:absolute;top:-1px;width:11px}.waffle-dataconnector-pill-spinner:after{-webkit-animation:waffle-dataconnector-pill-spinner-animation 2s infinite ease;-moz-animation:waffle-dataconnector-pill-spinner-animation 2s infinite ease;-o-animation:waffle-dataconnector-pill-spinner-animation 2s infinite ease;animation:waffle-dataconnector-pill-spinner-animation 2s infinite ease;-webkit-transform-origin:0 10px;-moz-transform-origin:0 10px;-ms-transform-origin:0 10px;-o-transform-origin:0 10px;transform-origin:0 10px;background:#fff;border-radius:0 20px 20px 0;content:"";height:20px;left:10px;position:absolute;top:-1px;width:11px}@keyframes waffle-dataconnector-pill-spinner-animation{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}.grid-shim-bottom{background-color:#f8f8f8;border-top:1px solid #e5e5e5}.grid-shim-end-ltr,.grid-shim-end-rtl{background:#f8f8f8;height:100%;position:absolute;top:0}.grid-shim-end-ltr{border-left:1px solid #e5e5e5}.grid-shim-end-rtl{border-right:1px solid #e5e5e5}.grid-shim-end-ltr{right:0}.grid-shim-end-rtl{left:0}.grid-bottom-bar{background-color:#eee;z-index:18}.docs-gm .grid-bottom-bar{background-color:#f1f3f4;border-top:1px solid #e8eaed}.docs-gm .grid-bottom-bar td{line-height:0}.docs-gm .grid-bottom-bar .goog-toolbar{min-height:0}.grid-bottom-bar,.grid-shim-bottom{width:100%}.docs-sheet-active-tab .docs-sheet-tab-dropdown{background:none}.docs-sheet-add .docs-sheet-button-inner-box,.docs-sheet-add .docs-sheet-button-icon{background-position:-180px -37px}.docs-sheet-add.docs-sheet-button-hover .docs-sheet-button-inner-box,.docs-sheet-add.docs-sheet-button-hover .docs-sheet-button-icon{background-position:-642px 0}.docs-sheet-left .docs-sheet-button-inner-box,.docs-sheet-left .docs-sheet-button-icon{background-position:-430px -62px}.docs-sheet-left.docs-sheet-button-hover .docs-sheet-button-inner-box,.docs-sheet-left.docs-sheet-button-hover .docs-sheet-button-icon{background-position:-757px -44px}.docs-sheet-left.docs-sheet-button-disabled .docs-sheet-button-inner-box,.docs-sheet-left.docs-sheet-button-disabled .docs-sheet-button-icon{background-position:-430px -62px}.docs-sheet-right .docs-sheet-button-inner-box,.docs-sheet-right .docs-sheet-button-icon{background-position:-509px -62px}.docs-sheet-right.docs-sheet-button-hover .docs-sheet-button-inner-box,.docs-sheet-right.docs-sheet-button-hover .docs-sheet-button-icon{background-position:-597px -37px}.docs-sheet-right.docs-sheet-button-disabled .docs-sheet-button-inner-box,.docs-sheet-right.docs-sheet-button-disabled .docs-sheet-button-icon{background-position:-509px -62px}.docs-sheet-all .docs-sheet-button-inner-box,.docs-sheet-all .docs-sheet-button-icon{background-position:-791px -67px}.docs-sheet-all.docs-sheet-button-hover .docs-sheet-button-inner-box,.docs-sheet-all.docs-sheet-button-hover .docs-sheet-button-icon{background-position:-217px -62px}.docs-sheet-button-inner-box:hover,.docs-sheet-button-outer-box:hover{border-color:#c6c6c6!important}.docs-sheet-button-inner-box{background:none}.docs-sheet-button-icon{background:url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") no-repeat;margin:2px}.docs-sheet-comment-indicator{background:none;color:white;font-size:11px;font-weight:500;text-align:center}.docs-sheet-outer-container{vertical-align:top}.docs-sheet-container{height:30px;overflow:hidden;top:-1px}.docs-gm .docs-sheet-container{height:40px;line-height:normal;margin-top:-1px;top:0}div.docs-sheet-container-bar{background:none;border:none;font-size:13px;padding:0 0 0 0.5em;margin:0 2px 2px 2px;overflow-x:auto;overflow-y:hidden;white-space:nowrap}.docs-sheet-container-bar .docs-sheet-tab-open{border-top:none;-moz-box-shadow:0 2px 4px rgba(0,0,0,0.2)!important;-webkit-box-shadow:0 2px 4px rgba(0,0,0,0.2)!important;box-shadow:0 2px 4px rgba(0,0,0,0.2)!important;z-index:1004}.docs-sheet-tab-open{border-top:1px solid #fff}div.docs-sheet-button-bar{background:none;border:none;padding:2px 4px 4px 0;margin:0 0 0 2px;overflow:hidden;white-space:nowrap}.docs-sheet-tab{text-decoration:none;list-style:none;vertical-align:top;outline:none;height:24px;z-index:1003;color:#666;background-color:#e9e9e9;border-style:solid;border-width:1px;border-color:#ccc;border-top-color:#aaa;cursor:pointer;padding:2px;margin:0 0 2px 0;min-width:30px;border-radius:0 0 2px 2px}.docs-gm .docs-sheet-tab{align-items:center;background-color:#f1f3f4;border-bottom:none;border-left:1px solid #e8eaed;border-radius:0;border-right:1px solid #e8eaed;border-top:1px solid #e8eaed;display:inline-flex;height:39px;margin-right:-1px;padding:0 12px 0 16px}.docs-sheet-tab.docs-sheet-tab-selected{background-color:#fff;color:#222}.docs-sheet-tab-hover{color:#444;background-color:#f1f1f1;margin:0 0 2px 0}.docs-gm .docs-sheet-tab-hover{background-color:#e8eaed;border-top-color:#e8eaed}.docs-sheet-active-tab{color:#222;cursor:default;background-color:#fff;border-color:#aaa;border-top-color:#fff;border-width:0 1px 1px 1px;box-shadow:0 1px 1px rgba(0,0,0,0.15);font-weight:500;margin:0 0 2px 0;z-index:1004}.docs-gm .docs-sheet-active-tab{background-color:#fff;border-top-color:#f1f3f4;box-shadow:0 1px 3px 1px rgba(60,64,67,.15)}.docs-sheet-tab-menu{border-color:#aaa!important}.docs-gm .docs-sheet-tab-menu{border-color:transparent!important}.docs-sheet-tab-outer-box{border-color:#e4e4e4}.docs-sheet-active-tab .docs-sheet-tab-outer-box{border-color:#d8d8d8}.docs-sheet-tab-outer-box{border-width:1px 0;padding:0;margin:0 -1px;white-space:nowrap;padding:3px 0 3px 5px}.docs-gm .docs-sheet-tab-outer-box{margin-top:-2px;padding:0}.docs-sheet-button-outer-box{margin:0;border-width:1px 0;padding:0}.docs-sheet-button-inner-box{margin:0 -1px;border-width:0 1px;white-space:nowrap}.docs-sheet-menu-inner-box{padding:1px 2px}.docs-gm .docs-sheet-button-outer-box,.docs-gm .docs-sheet-button-inner-box{border:none}.docs-gm .docs-sheet-button-disabled{opacity:.38}::root .docs-sheet-tab,::root .docs-sheet-tab-outer-box{line-height:0}::root .docs-sheet-tab-caption,::root .docs-sheet-tab-dropdown{line-height:normal}.docs-sheet-tab-color{height:3px;margin:3px -20px 0 -5px}.docs-gm .docs-sheet-tab-outer-box,.docs-gm .docs-sheet-tab-inner-box,.docs-gm .docs-sheet-tab-caption{position:static}.docs-gm .docs-sheet-tab-color{bottom:0;height:4px;left:0;margin:0;position:absolute;right:0}.docs-sheet-active-tab .docs-sheet-tab-dropdown{display:inline-block}.docs-sheet-tab .docs-sheet-tab-dropdown{display:inline-block;margin-top:-7px}.docs-gm .docs-sheet-tab .docs-sheet-tab-dropdown{border-radius:2px;margin:0;opacity:1}.docs-sheet-tab-dropdown{opacity:0.3;filter:alpha(opacity=30);margin:-2px -1px -2px -2px}.docs-sheet-active-tab .docs-sheet-tab-dropdown:hover{cursor:pointer;opacity:1;filter:alpha(opacity=100)}.docs-sheet-tab-dropdown{vertical-align:middle}.docs-gm .docs-sheet-active-tab .docs-sheet-tab-dropdown{border:1px solid transparent;margin-left:-1px;margin-right:-1px;opacity:1.0}.docs-gm .docs-sheet-active-tab .docs-sheet-tab-dropdown:hover{background-color:#e6f4ea}.docs-gm .docs-sheet-active-tab .docs-sheet-tab-dropdown:active{background-color:#ceead6}.docs-gm .docs-sheet-tab-open .docs-sheet-tab-dropdown,.docs-gm .docs-sheet-tab-open .docs-sheet-tab-dropdown:hover{background-color:#e6f4ea}.docs-gm .docs-sheet-tab-edit .docs-sheet-tab-dropdown{display:none}.docs-sheet-tab-caption{margin-right:2px;vertical-align:middle;white-space:pre}.docs-gm .docs-sheet-tab-caption{margin-right:3px}.docs-sheet-tab-rtl .docs-sheet-tab-caption{margin-right:0;margin-left:2px}.docs-gm .docs-sheet-tab-rtl .docs-sheet-tab-caption{margin-left:3px}.docs-material .docs-sheet-tab-caption .docs-icon{float:none;margin:-3px 5px 0 0}.docs-gm .docs-material.docs-sheet-tab .docs-icon .docs-icon-arrow-dropdown{left:-52px;top:-3064px}.docs-gm .docs-material.docs-sheet-tab .docs-icon .docs-icon-comment-blank{left:-20px;top:-5619px}.docs-gm .docs-material.docs-sheet-tab .docs-icon .docs-icon-database{left:0;top:-2404px}.docs-gm .docs-material.docs-sheet-tab .docs-icon .docs-icon-locked{left:0;top:-5415px}.docs-gm .docs-material.docs-sheet-active-tab .docs-icon .docs-icon-arrow-dropdown{left:-40px;top:-732px}.docs-gm .docs-material.docs-sheet-active-tab .docs-icon .docs-icon-comment-blank{left:0;top:-4681px}.docs-gm .docs-material.docs-sheet-active-tab .docs-icon .docs-icon-database{left:0;top:-2726px}.docs-gm .docs-material.docs-sheet-active-tab .docs-icon .docs-icon-locked{left:0;top:-4464px}.docs-sheet-tab-name{padding:3px 1px;font-size:13px;font-size:var(--docs-material-font-size-normal,13px)}.docs-gm .docs-sheet-tab-name{color:#80868b;display:inline-block;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;letter-spacing:.025rem}.docs-gm .docs-sheet-active-tab .docs-sheet-tab-name{color:#188038}.docs-sheet-tab-name[contenteditable="true"]{border:1px solid #d9d9d9;display:inline-block;height:16px;min-width:8px;margin:-4px -1px;-moz-user-modify:read-write-plaintext-only;-webkit-user-modify:read-write-plaintext-only;-moz-user-select:text!important;-ms-user-select:text!important;-webkit-user-select:text!important}.docs-gm .docs-sheet-tab-name[contenteditable="true"]{border:2px solid #1a73e8;border-radius:4px;color:#222;height:auto;margin:0 -5px 0 -5px;padding:4px 22px 4px 4px}.docs-sheet-tab-name[contenteditable="true"]:focus{box-shadow:inset 0 1px 2px rgba(0,0,0,0.3);border:1px solid #4d90fe;outline:none}.docs-gm .docs-sheet-tab-name[contenteditable="true"]:focus{border:2px solid #1a73e8;box-shadow:none}.docs-sheet-tab-name-error{border-color:red!important}.docs-sheet-button-inner-box{width:25px;height:25px}.docs-sheet-button,.docs-sheet-menu-button{margin:0 3px;cursor:pointer}.docs-gm .docs-sheet-button{border:1px solid transparent;border-radius:2px;outline:none}.docs-gm .docs-sheet-button-hover{background-color:#f1f3f4}.docs-gm .docs-sheet-button-active{background-color:#e8eaed}.docs-gm .docs-sheet-button-open{background-color:#e6f4ea}.docs-sheet-button-outer-box,.docs-sheet-button-inner-box{border-style:solid;vertical-align:top;border-color:transparent}.docs-sheet-button-disabled,.docs-sheet-button-disabled .docs-sheet-button-outer-box,.docs-sheet-button-disabled .docs-sheet-button-inner-box{cursor:default}.docs-sheet-tab .docs-icon-locked{margin-left:-3px}.docs-material .docs-sheet-tab .docs-icon-locked{margin-left:0}.docs-icon.docs-sheet-lock-container{float:left;margin-top:-3px;width:16px}.docs-sheet-comment-indicator-container{float:left;margin-top:-3px;width:22px}.docs-icon-img-container.docs-sheet-database-icon{width:18px;height:18px;margin-top:2px}.docs-material .docs-icon-img-container.docs-sheet-database-icon{margin-top:0}.docs-sheet-database-icon{background:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgdmlld0JveD0iMCAwIDE4IDE4Ij4KICA8ZyBmaWxsPSIjMDAwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgPGVsbGlwc2UgY3g9IjkiIGN5PSI1IiByeD0iNyIgcnk9IjMiLz4KICAgIDxwYXRoIGQ9Ik0xNiw3IEwxNiw4Ljk5OTk5OTgzIEMxNiwxMC42NTY4NTQyIDEyLjg2NTk5MzIsMTIgOSwxMiBDNS4xMzQwMDY3NSwxMiAyLDEwLjY1Njg1NDIgMiw5IEwyLDcgQzIsOC42NTY4NTQyNSA1LjEzNDAwNjc1LDEwIDksMTAgQzEyLjg2NTk5MzIsMTAgMTYsOC42NTY4NTQyNSAxNiw3IFoiLz4KICAgIDxwYXRoIGQ9Ik0xNiwxMSBMMTYsMTIuOTk5OTk5OCBDMTYsMTQuNjU2ODU0MiAxMi44NjU5OTMyLDE2IDksMTYgQzUuMTM0MDA2NzUsMTYgMiwxNC42NTY4NTQyIDIsMTMgTDIsMTEgQzIsMTIuNjU2ODU0MiA1LjEzNDAwNjc1LDE0IDksMTQgQzEyLjg2NTk5MzIsMTQgMTYsMTIuNjU2ODU0MiAxNiwxMSBaIi8+CiAgPC9nPgo8L3N2Zz4K") no-repeat}.docs-sheet-database-icon-container{float:left;margin-top:-3px;width:20px}.docs-sheet-form-icon-container{float:left;margin-top:-3px;opacity:0.5;width:22px}.docs-sheet-active-tab .docs-sheet-form-icon-container{opacity:1}.docs-sheet-comment-indicator{display:block;height:16px;line-height:12px;width:16px;position:absolute;top:4px;left:3px;margin-top:0px}.docs-material .docs-sheet-comment-indicator{height:12px;left:1px;line-height:12px;top:2px}.docs-sheet-all-sheet-menu-item{white-space:nowrap}.docs-sheet-all-sheet-menu-item-hidden .goog-menuitem-content{color:#888}.docs-sheet-all-sheet-menu-item-swatch{border-radius:9px;display:inline-block;height:9px;margin-right:8px;width:9px}.docs-sheet-button-bar-container.fit-content{width:1em}.docs-sheet-button-bar-container:last-child,.docs-sheet-button-bar-container.fit-content:last-child{width:100%}.docs-sheet-status-container{width:158px;overflow:hidden;padding:0;border-left:1px solid #ccc}.docs-sheet-status-container-avs{overflow:hidden;padding:0}.docs-sheet-status{max-width:150px;float:right;margin-right:8px;overflow:hidden}.docs-sheet-status-avs{max-width:150px;float:right;margin-right:8px;overflow:hidden;position:relative;top:3px}.docs-gm .docs-sheet-status-avs{top:4px;max-width:170px}.docs-sheet-status>.jfk-select{line-height:29px;margin:0 3px 0 6px;max-width:119px}.docs-sheet-status-avs>.jfk-select{line-height:29px;max-width:119px}.docs-gm .docs-sheet-status-avs .goog-flat-menu-button{border:1px solid #dadce0;border-radius:4px;box-sizing:border-box;cursor:pointer;padding:8px 6px 8px 8px;width:100%;align-items:center;background:white;color:#3c4043;display:inline-flex;justify-content:space-between;outline:none;padding:4px;position:relative;max-width:139px;width:auto;width:unset}.docs-gm .docs-sheet-status-avs .goog-flat-menu-button-disabled{color:#5f6368;opacity:.38;cursor:default}.docs-gm .docs-sheet-status-avs .goog-flat-menu-button:active{background-color:#fff;border:1px solid transparent;box-shadow:0 2px 6px 2px rgba(60,64,67,.15)}.docs-gm .docs-sheet-status-avs .goog-flat-menu-button-hover{background-color:rgba(60,64,67,0.04);border:1px solid #dadce0;box-shadow:none}.docs-gm .docs-sheet-status-avs .goog-flat-menu-button-focused{background-color:rgba(60,64,67,0.06);border:1px solid #dadce0}.docs-gm .docs-sheet-status-avs .goog-flat-menu-button-open{background-color:rgba(60,64,67,0.04);border:1px solid transparent}.docs-gm .docs-sheet-status-avs .goog-flat-menu-button-hover.goog-flat-menu-button-open{background-color:rgba(60,64,67,0.06)}.docs-gm .docs-sheet-status-avs .goog-flat-menu-button-focused.goog-flat-menu-button-open{background-color:rgba(60,64,67,0.08)}.docs-gm .docs-sheet-status-avs .goog-flat-menu-button-disabled{border:1px solid #dadce0;box-shadow:none;cursor:default}.docs-gm .docs-sheet-status-avs .goog-flat-menu-button-caption{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;color:#202124;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;height:20px;line-height:20px;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:11px}.docs-gm .docs-sheet-status-avs .goog-flat-menu-button-disabled .goog-flat-menu-button-caption{color:#5f6368;opacity:.38;cursor:default}.docs-gm .docs-sheet-status-avs .goog-flat-menu-button-dropdown{background:no-repeat url(//ssl.gstatic.com/docs/common/material_common_sprite222_grey_medium.svg) -40px -732px;height:18px;width:18px;border:none;margin-top:0;position:relative;right:0;top:0}.docs-gm .docs-sheet-status-avs .goog-flat-menu-button-disabled .goog-flat-menu-button-dropdown{opacity:.38}.docs-gm .docs-sheet-status-avs .goog-flat-menu-button-disabled.goog-flat-menu-button:active{border:1px solid #dadce0;box-shadow:none;cursor:default;box-shadow:none}.docs-gm .docs-sheet-status-avs .goog-flat-menu-button-open .goog-flat-menu-button-dropdown{-moz-transform:rotate(180deg);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.docs-gm .docs-sheet-status-avs .jfk-radiobutton-disabled .jfk-radiobutton-label{color:#5f6368;opacity:.38;cursor:default}.docs-sheet-status .goog-flat-menu-button-caption,.docs-sheet-status-avs .goog-flat-menu-button-caption{text-overflow:ellipsis}.waffle-quicksum-container{color:#333;font-size:11px;font-weight:500;height:30px;line-height:30px;margin-right:22px;overflow:hidden;text-align:right}.waffle-autovis-quicksum{height:34px;margin:1px}.jfk-button.waffle-autovis-quicksum-button{border:1px solid transparent;cursor:pointer;height:28px;margin:0;padding:2px;position:relative;width:154px}.docs-sheet-fade{position:absolute;display:block;top:0;width:6px;height:100%;z-index:1005}.docs-sheet-fade div{background-color:#d7d7d7;width:2px;float:right;position:relative;height:100%}.docs-sheet-fade-left{left:0}.docs-sheet-fade-right{right:0}.docs-sheet-fade1{opacity:0.82;filter:alpha(opacity=82)}.docs-sheet-fade2{opacity:0.62;filter:alpha(opacity=62)}.docs-sheet-fade3{opacity:0.4;filter:alpha(opacity=40)}.waffle-slicereditor-sidebar.waffle-sidebar-container{width:320px;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;z-index:2}.waffle-slicer-editor-send-feedback-container{text-align:end}.waffle-slicer-editor-style-tab .waffle-slicer-editor-style-format-option,.waffle-slicer-editor-style-color-option-non-gm .docs-charts-editor-material-toolbar-color-picker-outer-box{background-color:#f1f3f4}.goog-menu-vertical .waffle-slicer-editor-column-selector-menu-seperator{margin-left:0}.waffle-slicer-editor-column-selector-menu-item{display:flex;border:1px solid transparent;line-height:20px;margin:0;padding:5px;width:286px}.waffle-slicer-editor-column-selector-menu-item-name{-ms-flex:1;-webkit-flex:1;flex:1;margin:0 20px 0 10px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.waffle-slicer-editor-column-selector-menu-item-range{display:flex;opacity:0.5;max-width:143px}.waffle-slicer-editor-column-selector-menu-item-rect{-ms-flex:1;-webkit-flex:1;flex:1}.waffle-slicer-editor-column-selector-menu-item-sheet-name{overflow:hidden;text-overflow:ellipsis}.waffle-slicer-editor-setup-tab .waffle-slicer-editor-style-tab{width:100%}.waffle-slicer-editor-sidebar-col{width:50%;margin-right:10px}.waffle-slicer-editor-sidebar-col:last-child{margin-right:0}.waffle-slicer-editor-sidebar-control-label{color:#616161;font-size:11px;line-height:16px;margin-bottom:8px;margin-right:2px}.waffle-slicer-editor-sidebar-custom-row{display:flex}.waffle-slicer-editor-sidebar-title-input-box{width:100%}.waffle-slicer-editor-sidebar-title-input-box>input{border-left:none;border-right:none;border-top:none;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:18px;height:100%;padding:0;width:100%}.waffle-slicer-editor-sidebar-title-input-box>input:disabled{opacity:0.75}.waffle-slicer-editor-sidebar-title-input-box>input:focus{border:none;border-bottom:2px solid #4285f4}.waffle-slicer-editor-sidebar-row{padding:10px 16px}.waffle-slicer-editor-sidebar-align .goog-toolbar-menu-button-dropdown{margin:0}.waffle-slicer-editor-sidebar-align-menu-items .goog-palette-table{border:0;margin:0 4px}.waffle-slicer-editor-sidebar-align-menu-items .goog-palette-cell{border:0;padding:2px}.waffle-slicer-editor-sidebar-align-menu-items .goog-palette-cell-hover{background:#eeeeee}.waffle-slicer-editor-sidebar-rangepicker-error-label{color:#db4437;font-size:13px}.waffle-slicer-editor-apply-to-pivot-table-row{display:flex;-webkit-align-items:center;align-items:center}.waffle-slicer-editor-apply-to-pivot-table-checkbox{display:flex}.waffle-slicer-editor-apply-to-pivot-table-checkbox-label{-ms-flex:1;-webkit-flex:1;flex:1;margin:0 5px}.waffle-slicer-editor-sidebar-title-format{border:1px solid #dadce0;border-radius:4px;display:inline-block;height:40px;line-height:40px}.waffle-slicer-editor-textstyle-separator{border-left:1px solid #dadce0;height:25px;margin:7px 1px;vertical-align:top}.waffle-slicer-editor-sidebar-title-input{transition:border-color 0.3s ease;color:#3c4043;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;height:42px;line-height:36px;margin-bottom:0;min-height:42px;resize:none}.waffle-slicer-editor-sidebar-title-input-label{color:#5f6368;font-size:12px;line-height:15px;margin-bottom:8px}.docs-multi-menu-col{float:left}.docs-multi-menu-col .goog-menuheader{color:#777;font-size:11px;padding:.3em .5em .3em 0.5em;text-transform:uppercase}.dialog-separator{border-bottom:1px solid #e5e5e5;margin:0 -42px 20px}.nfd-inputall,.nfd-input,.nfd-apply,.nfd-inner-input-content{display:inline-block}.nfd-input{min-height:18px;position:relative}.nfd-input span:focus{outline:none}.nfd-date-time-left-most{display:inline-block;min-width:1px}.nfd-inner-input-content{text-align:right}.nfd-date-time-input{position:relative;transform:translateZ(0)}.nfd-date-time-input .goog-flat-menu-button{margin:1px 2px}.nfd-input .jfk-select .goog-flat-menu-button-dropdown{background:no-repeat url(//ssl.gstatic.com/docs/common/material_common_sprite222.svg) 0 -3598px;left:0}.nfd-input table{border-spacing:0;width:100%}.nfd-dialog-content ul{list-style:none;margin:0;padding:0}.nfd-format-pill{border-bottom:1px solid #e5e5e5;border-left:1px solid transparent;font-size:15px;padding:16px;position:relative}.nfd-format-pill:focus{border-left:1px solid #4d90fe;outline:none}.nfd-format-pill:hover{background-color:#f1f1f1}.nfd-format-display{display:inline-block}.nfd-format-sample{color:#777;display:inline-block;position:absolute;right:20px}.nfd-pill-container li:last-child{border-bottom:none}.cnf-sample-table{border-spacing:0;display:inline-table}.cnf-sample-wrapper{position:relative}.cnf-help-link{position:absolute;right:0}td.nfd-sample-label{color:#777;padding-left:0;padding-right:5px}.number-format-menu .goog-menuitem{padding-right:1em}.nfd-date-time-menu-button:focus{outline:none}.nfd-input.nfd-invalid{border:1px solid #dd4b39}.nfd-date-time-menu .goog-menuitem{padding-left:6px;padding-right:4em}.nfd-dialog .nfd-inputall .nfd-input{font-size:13px;height:initial;margin-top:0;min-height:36px;overflow-x:auto;padding:2px 8px;width:366px}.nfd-dialog.modal-dialog{padding:24px}.nfd-dialog .dialog-separator{display:none}.nfd-input input{border:none;font-size:inherit;margin:0;outline:none;padding:0;width:100%}.nfd-input>input{height:18px;padding:6px 0}.nfd-inner-input{height:16px;line-height:16px;min-width:25px;padding:7px 0;width:100%}.nfd-input.nfd-input-focus{border:2px solid #1a73e8;box-shadow:none;padding:0px 7px;box-shadow:none;outline:none}.nfd-input.nfd-input-focus>input{padding:7px 0}.nfd-input.nfd-input-focus .nfd-inner-input{padding:8px 0}.nfd-dialog.modal-dialog-content{min-width:464px;width:auto;width:unset}.nfd-dialog-content{border:1px solid #e5e5e5;cursor:pointer;height:400px;margin-top:8px;overflow-y:scroll;-webkit-tap-highlight-color:transparent}.nfd-input .goog-flat-menu-button{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:white;border:1px solid #dadce0!important;color:#188038;height:24px;padding:3px 12px 5px;border-radius:24px;color:#3c4043;font-size:12px;line-height:17px;padding:3px 24px 3px 10px}.nfd-input .goog-flat-menu-button-caption{font-weight:500}.nfd-input .goog-flat-menu-button.goog-flat-menu-button-hover{background:#f8f9fa}.nfd-date-time-pill{margin:2px 0}.nfd-input .nfd-currency-other-formats{padding-top:4px;margin-right:0}.nfd-date-time-menu-button{background:no-repeat url(//ssl.gstatic.com/docs/common/material_common_sprite222.svg) 0 -712px;border:none;float:right;height:18px;margin:6px 0;position:fixed;right:108px;top:2px;width:18px}.nfd-input .goog-flat-menu-button-dropdown{background:no-repeat url(//ssl.gstatic.com/docs/common/material_common_sprite222.svg) 0 -3598px;height:18px;left:18px;top:0;width:18px}.jfk-button.nfd-apply{margin-left:9px;margin-right:0;vertical-align:top}.goog-palette{cursor:default;outline:none}.goog-palette-table{border:1px solid #666;border-collapse:collapse;margin:5px}.goog-palette-cell{border:0;border-right:1px solid #666;cursor:pointer;height:18px;margin:0;text-align:center;vertical-align:middle;width:18px}.goog-palette-cell .goog-palette-colorswatch{border:none;font-size:x-small;height:18px;position:relative;width:18px}.goog-palette-cell-hover .goog-palette-colorswatch{border:1px solid #fff;height:16px;width:16px}.goog-palette-cell-selected .goog-palette-colorswatch{background:url(//ssl.gstatic.com/editor/editortoolbar.png) no-repeat -368px 0;border:1px solid #333;color:#fff;font-weight:bold;height:16px;width:16px}.goog-palette-customcolor{background-color:#fafafa;border:1px solid #eee;color:#666;font-size:x-small;height:15px;position:relative;width:15px}.goog-palette-cell-hover .goog-palette-customcolor{background-color:#fee;border:1px solid #f66;color:#f66}.goog-color-menu-button-indicator{border-bottom:4px solid #f0f0f0}.goog-color-menu-button .goog-menu-button-inner-box,.goog-toolbar-color-menu-button .goog-toolbar-menu-button-inner-box{padding-top:2px!important;padding-bottom:2px!important}.goog-tab{position:relative;padding:4px 8px;color:#00c;text-decoration:underline;cursor:default}.goog-tab-bar-top .goog-tab{margin:1px 4px 0 0;border-bottom:0;float:left}.goog-tab-bar-top:after,.goog-tab-bar-bottom:after{content:" ";display:block;height:0;clear:both;visibility:hidden}.goog-tab-bar-bottom .goog-tab{margin:0 4px 1px 0;border-top:0;float:left}.goog-tab-bar-start .goog-tab{margin:0 0 4px 1px;border-right:0}.goog-tab-bar-end .goog-tab{margin:0 1px 4px 0;border-left:0}.goog-tab-hover{background:#eee}.goog-tab-disabled{color:#666}.goog-tab-selected{color:#000;background:#fff;text-decoration:none;font-weight:bold;border:1px solid #6b90da}.goog-tab-bar-top{padding-top:5px!important;padding-left:5px!important;border-bottom:1px solid #6b90da!important}.goog-tab-bar-top .goog-tab-selected{top:1px;margin-top:0;padding-bottom:5px}.goog-tab-bar-bottom .goog-tab-selected{top:-1px;margin-bottom:0;padding-top:5px}.goog-tab-bar-start .goog-tab-selected{left:1px;margin-left:0;padding-right:9px}.goog-tab-bar-end .goog-tab-selected{left:-1px;margin-right:0;padding-left:9px}.goog-tab-bar{margin:0;border:0;padding:0;list-style:none;cursor:default;outline:none;background:#ebeff9}.goog-tab-bar-clear{clear:both;height:0;overflow:hidden}.goog-tab-bar-start{float:left}.goog-tab-bar-end{float:right}* html .goog-tab-bar-start{margin-right:-3px}* html .goog-tab-bar-end{margin-left:-3px}.jfk-scrollbar::-webkit-scrollbar{height:16px;overflow:visible;width:16px}.jfk-scrollbar::-webkit-scrollbar-button{height:0;width:0}.jfk-scrollbar::-webkit-scrollbar-track{background-clip:padding-box;border:solid transparent;border-width:0 0 0 4px}.jfk-scrollbar::-webkit-scrollbar-track:horizontal{border-width:4px 0 0}.jfk-scrollbar::-webkit-scrollbar-track:hover{background-color:rgba(0,0,0,.05);box-shadow:inset 1px 0 0 rgba(0,0,0,.1)}.jfk-scrollbar::-webkit-scrollbar-track:horizontal:hover{box-shadow:inset 0 1px 0 rgba(0,0,0,.1)}.jfk-scrollbar::-webkit-scrollbar-track:active{background-color:rgba(0,0,0,.05);box-shadow:inset 1px 0 0 rgba(0,0,0,.14),inset -1px 0 0 rgba(0,0,0,.07)}.jfk-scrollbar::-webkit-scrollbar-track:horizontal:active{box-shadow:inset 0 1px 0 rgba(0,0,0,.14),inset 0 -1px 0 rgba(0,0,0,.07)}.jfk-scrollbar-dark.jfk-scrollbar::-webkit-scrollbar-track:hover{background-color:rgba(255,255,255,.1);box-shadow:inset 1px 0 0 rgba(255,255,255,.2)}.jfk-scrollbar-dark.jfk-scrollbar::-webkit-scrollbar-track:horizontal:hover{box-shadow:inset 0 1px 0 rgba(255,255,255,.2)}.jfk-scrollbar-dark.jfk-scrollbar::-webkit-scrollbar-track:active{background-color:rgba(255,255,255,.1);box-shadow:inset 1px 0 0 rgba(255,255,255,.25),inset -1px 0 0 rgba(255,255,255,.15)}.jfk-scrollbar-dark.jfk-scrollbar::-webkit-scrollbar-track:horizontal:active{box-shadow:inset 0 1px 0 rgba(255,255,255,.25),inset 0 -1px 0 rgba(255,255,255,.15)}.jfk-scrollbar::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.2);background-clip:padding-box;border:solid transparent;border-width:1px 1px 1px 6px;min-height:28px;padding:100px 0 0;box-shadow:inset 1px 1px 0 rgba(0,0,0,.1),inset 0 -1px 0 rgba(0,0,0,.07)}.jfk-scrollbar::-webkit-scrollbar-thumb:horizontal{border-width:6px 1px 1px;padding:0 0 0 100px;box-shadow:inset 1px 1px 0 rgba(0,0,0,.1),inset -1px 0 0 rgba(0,0,0,.07)}.jfk-scrollbar::-webkit-scrollbar-thumb:hover{background-color:rgba(0,0,0,.4);box-shadow:inset 1px 1px 1px rgba(0,0,0,.25)}.jfk-scrollbar::-webkit-scrollbar-thumb:active{background-color:rgba(0,0,0,0.5);box-shadow:inset 1px 1px 3px rgba(0,0,0,0.35)}.jfk-scrollbar-dark.jfk-scrollbar::-webkit-scrollbar-thumb{background-color:rgba(255,255,255,.3);box-shadow:inset 1px 1px 0 rgba(255,255,255,.15),inset 0 -1px 0 rgba(255,255,255,.1)}.jfk-scrollbar-dark.jfk-scrollbar::-webkit-scrollbar-thumb:horizontal{box-shadow:inset 1px 1px 0 rgba(255,255,255,.15),inset -1px 0 0 rgba(255,255,255,.1)}.jfk-scrollbar-dark.jfk-scrollbar::-webkit-scrollbar-thumb:hover{background-color:rgba(255,255,255,.6);box-shadow:inset 1px 1px 1px rgba(255,255,255,.37)}.jfk-scrollbar-dark.jfk-scrollbar::-webkit-scrollbar-thumb:active{background-color:rgba(255,255,255,.75);box-shadow:inset 1px 1px 3px rgba(255,255,255,.5)}.jfk-scrollbar-borderless.jfk-scrollbar::-webkit-scrollbar-track{border-width:0 1px 0 6px}.jfk-scrollbar-borderless.jfk-scrollbar::-webkit-scrollbar-track:horizontal{border-width:6px 0 1px}.jfk-scrollbar-borderless.jfk-scrollbar::-webkit-scrollbar-track:hover{background-color:rgba(0,0,0,.035);box-shadow:inset 1px 1px 0 rgba(0,0,0,.14),inset -1px -1px 0 rgba(0,0,0,.07)}.jfk-scrollbar-borderless.jfk-scrollbar-dark.jfk-scrollbar::-webkit-scrollbar-track:hover{background-color:rgba(255,255,255,.07);box-shadow:inset 1px 1px 0 rgba(255,255,255,.25),inset -1px -1px 0 rgba(255,255,255,.15)}.jfk-scrollbar-borderless.jfk-scrollbar::-webkit-scrollbar-thumb{border-width:0 1px 0 6px}.jfk-scrollbar-borderless.jfk-scrollbar::-webkit-scrollbar-thumb:horizontal{border-width:6px 0 1px}.jfk-scrollbar::-webkit-scrollbar-corner{background:transparent}body.jfk-scrollbar::-webkit-scrollbar-track-piece{background-clip:padding-box;background-color:#f5f5f5;border:solid #fff;border-width:0 0 0 3px;box-shadow:inset 1px 0 0 rgba(0,0,0,.14),inset -1px 0 0 rgba(0,0,0,.07)}body.jfk-scrollbar::-webkit-scrollbar-track-piece:horizontal{border-width:3px 0 0;box-shadow:inset 0 1px 0 rgba(0,0,0,.14),inset 0 -1px 0 rgba(0,0,0,.07)}body.jfk-scrollbar::-webkit-scrollbar-thumb{border-width:1px 1px 1px 5px}body.jfk-scrollbar::-webkit-scrollbar-thumb:horizontal{border-width:5px 1px 1px}body.jfk-scrollbar::-webkit-scrollbar-corner{background-clip:padding-box;background-color:#f5f5f5;border:solid #fff;border-width:3px 0 0 3px;box-shadow:inset 1px 1px 0 rgba(0,0,0,.14)}#docs-toolbar-wrapper{border-top:1px solid #d9d9d9;border-bottom:1px solid #d9d9d9;min-height:35px;box-shadow:inset 0 1px 0 0 #fff;background-color:#f5f5f5;background-image:-webkit-linear-gradient(top,#f5f5f5,#eee);background-image:-moz-linear-gradient(top,#f5f5f5,#eee);background-image:-ms-linear-gradient(top,#f5f5f5,#eee);background-image:-o-linear-gradient(top,#f5f5f5,#eee);background-image:linear-gradient(top,#f5f5f5,#eee);padding:0 44px 0 58px;position:relative}#docs-toolbar-wrapper.docs-hub-appbar{border:none}#docs-toolbar{background:none;border-width:0!important;display:inline;min-height:35px;padding:0}#docs-primary-toolbars{display:block}#docs-omnibox-toolbar{background:none;border-width:0!important;display:inline-block;padding:0;vertical-align:middle;width:182px;overflow:hidden}#docs-side-toolbar{background:none;border:0;margin:0 44px 0 0;padding:0;position:absolute;right:0;top:0}.goog-toolbar{margin-bottom:0;outline:0}.goog-toolbar-button,.goog-toolbar-menu-button{margin:4px 0 0 -1px}.goog-toolbar-button-inner-box,.goog-toolbar-menu-button-inner-box{height:25px;min-width:25px;padding:0;text-align:center}.docs-toolbar-button-split-left .goog-toolbar-button-inner-box{min-width:23px}.goog-toolbar-button-inner-box .docs-icon,.goog-toolbar-menu-button-caption .docs-icon,.goog-toolbar-menu-button-caption .goog-color-menu-button-indicator .docs-icon{margin-top:-3px}.goog-toolbar-menu-button .goog-toolbar-menu-button-outer-box .goog-toolbar-menu-button-inner-box,.goog-toolbar-button .goog-toolbar-menu-button-outer-box .goog-toolbar-menu-button-inner-box{margin:0 1px}.goog-toolbar-menu-button-dropdown{margin-left:4px;margin-right:0;margin-top:9px}.goog-toolbar-color-menu-button .goog-toolbar-menu-button-dropdown{margin-top:7px}.goog-toolbar-separator.goog-inline-block{border-left:1px solid #d9d9d9;height:35px;margin:0 5px 0 4px;vertical-align:top}.goog-toolbar-select .goog-toolbar-menu-button-outer-box .goog-toolbar-menu-button-inner-box{margin:0;margin-right:1px}.goog-color-menu-button-indicator{position:relative;height:19px}.goog-toolbar-color-menu-button .goog-toolbar-menu-button-caption{top:-2px}.docs-toolbar-small-separator.goog-toolbar-separator{border-left:1px solid #ccc;display:inline;font-size:11px;height:17px;line-height:normal;list-style:none;margin:0 -3px 0 -1px;outline:none;overflow:hidden;padding:0 0 3px 0;text-decoration:none;vertical-align:middle;width:0}.docs-toolbar-small-separator.goog-toolbar-separator,.docs-toolbar-small-separator.goog-toolbar-separator{display:inline-block;height:35px;margin:0 5px 0 4px;padding:0;vertical-align:top}.docs-toolbar-small-separator.goog-toolbar-separator+.docs-toolbar-small-separator.goog-toolbar-separator{display:none}.goog-toolbar-button+div.docs-toolbar-small-separator,div.goog-toolbar-separator+div.docs-toolbar-small-separator,div.goog-toolbar-menu-button+div.docs-toolbar-small-separator{margin-left:3px}.docs-toolbar-small-separator+div.goog-toolbar-button,.docs-toolbar-small-separator+div.goog-toolbar-menu-button,.docs-toolbar-small-separator+div[class~=goog-toolbar-select]{margin-left:-1px}div[class~="goog-toolbar-select"]+div.docs-toolbar-small-separator{margin-left:-1px}.docs-toolbar-small-separator+div.goog-toolbar-select{margin-left:-3px}.docs-toolbar-inset-separator.docs-toolbar-small-separator{border-left:1px solid 1px solid #d9d9d9;height:20px;margin:5px 5px 0 4px;vertical-align:middle}.goog-toolbar-toggle-button.goog-toolbar-button-checked+.goog-toolbar-toggle-button.goog-toolbar-button-checked{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0;margin-left:-1px}.goog-toolbar-toggle-button.goog-toolbar-button-checked+.goog-toolbar-toggle-button.goog-toolbar-button-checked .goog-toolbar-button-outer-box .goog-toolbar-button-inner-box,.goog-toolbar-toggle-button.goog-toolbar-button-checked+.goog-toolbar-toggle-button.goog-toolbar-button-checked.goog-toolbar-button-hover .goog-toolbar-button-outer-box .goog-toolbar-button-inner-box{margin-left:1px}.goog-toolbar-button .docs-icon,.goog-toolbar-menu-button .docs-icon{opacity:.70}.goog-toolbar-button-hover .docs-icon,.goog-toolbar-button-selected .docs-icon,.goog-toolbar-button-checked .docs-icon,.goog-toolbar-menu-button-hover .docs-icon,.goog-toolbar-menu-button-selected .docs-icon,.goog-toolbar-menu-button-checked .docs-icon{opacity:0.9}.goog-toolbar-button-active .docs-icon,.goog-toolbar-menu-button-open .docs-icon{opacity:1.0}.goog-toolbar-select .goog-toolbar-menu-button-outer-box .goog-toolbar-menu-button-inner-box .goog-toolbar-menu-button-caption{margin-left:10px;text-align:left}.goog-toolbar-select .goog-toolbar-menu-button-outer-box .goog-toolbar-menu-button-inner-box .goog-toolbar-menu-button-dropdown{margin-left:5px;margin-right:4px}.docs-toolbar-button-split-left,.docs-toolbar-button-split-left *{border-top-right-radius:0!important;border-bottom-right-radius:0!important}.docs-toolbar-button-split-right,.docs-toolbar-button-split-right *{border-top-left-radius:0!important;border-bottom-left-radius:0!important;min-width:5px!important}.docs-toolbar-button-split-right .goog-toolbar-menu-button-dropdown{margin-left:3px}.docs-toolbar-button-split-sympathy-hover{border-color:#c6c6c6}.docs-toolbar-button-split-left .goog-toolbar-button-hover,.docs-toolbar-button-split-right .goog-toolbar-button-hover{z-index:1}.docs-toolbar-split-create-button.goog-toolbar-menu-button{margin-right:4px}.docs-toolbar-split-create-button .goog-toolbar-menu-button-dropdown{background:url(//ssl.gstatic.com/ui/v1/disclosure/small-grey-disclosure-arrow-down.png) center no-repeat;height:7px;margin-top:9px;opacity:1}.docs-toolbar-split-create-button{background-color:#f5f5f5;background-image:-webkit-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:-moz-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:-ms-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:-o-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:linear-gradient(top,#f5f5f5,#f1f1f1);border-color:#c6c6c6!important}.docs-toolbar-split-create-button.goog-toolbar-button-disabled{border-right-color:#fff!important}.docs-toolbar-split-create-button.goog-toolbar-button-hover,.docs-toolbar-split-create-button.goog-toolbar-menu-button-hover{background-color:#f8f8f8;background-image:-webkit-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-moz-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-ms-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-o-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:linear-gradient(top,#f8f8f8,#f1f1f1);border-color:#c6c6c6!important}.docs-toolbar-split-create-button.goog-toolbar-button-active,.docs-toolbar-split-create-button.goog-toolbar-menu-button-active{background-color:#f8f8f8;background-image:-webkit-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-moz-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-ms-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-o-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:linear-gradient(top,#f8f8f8,#f1f1f1);border-color:#c6c6c6!important}.docs-toolbar-split-create-button .docs-icon{opacity:1}.docs-toolbar-text-button .goog-toolbar-button-outer-box,.docs-toolbar-text-button .goog-toolbar-menu-button-outer-box{padding-left:4px}.docs-toolbar-text-button .goog-toolbar-button-outer-box{padding-right:4px}.goog-toolbar-menu-button-outer-box{padding-right:3px}.goog-toolbar-menu-button-arrow-hidden.goog-toolbar-menu-button-outer-box{padding-right:0px}.jfk-bubble.docs-toolbar-more-bubble{padding:0px;z-index:902!important}.docs-toolbar-more-bubble .jfk-bubble-arrowup .jfk-bubble-arrowimplafter{border-color:#eee transparent}.docs-toolbar-more-toolbar{background:#eee;border:0;min-height:35px;padding:0 0 0 10px}.docs-collapsable-toolbar{white-space:nowrap}.docs-collapsable-toolbar-control{white-space:normal}.docs-hc-gecko .docs-icon-img{filter:invert(100%)}.docs-hc-gecko .docs-icon-img.docs-icon-document,.docs-hc-gecko .docs-icon-img.docs-icon-punch,.docs-hc-gecko .docs-icon-img.docs-icon-presentation,.docs-hc-gecko .docs-icon-img.docs-icon-spreadsheet,.docs-hc-gecko .docs-icon-img.docs-icon-form,.docs-hc-gecko .docs-icon-img.docs-icon-drawing,.docs-hc-gecko .docs-icon-img.docs-icon-script,.docs-hc-gecko .docs-icon-img.docs-icon-site{filter:none}.docs-hc-ie .docs-icon-img{-ms-high-contrast-adjust:none;background-color:white}.docs-icon-toolbar-button-with-text{padding-left:4px;padding-right:4px}.docs-icon-toolbar-button-with-text .docs-icon-toolbar-button-with-text-icon-container{margin-right:4px}.google-visualization-clickeditor-bubble.jfk-bubble{padding:3px;z-index:inherit!important;background-color:#f5f5f5;font-family:Arial,san-serif;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;border-color:#dadada}.google-visualization-clickeditor-bubble .jfk-bubble-arrowdown .jfk-bubble-arrowimplafter,.google-visualization-clickeditor-bubble .jfk-bubble-arrowup .jfk-bubble-arrowimplafter{border-color:#f5f5f5 transparent}.google-visualization-clickeditor-combobox .goog-toolbar-combo-button-input{width:28px;padding:0 0 0 3px;position:relative}.goog-menuitem .google-visualization-clickeditor-combobox-icon{position:absolute;top:4px;left:100px}.google-visualization-charteditor-menu .goog-menuheader{padding-left:10px;color:#888}.google-visualization-clickeditor-combobox .google-visualization-clickeditor-combobox-icon{position:absolute;height:100%;width:34px;top:0;left:0;background-color:#f5f5f5}.goog-toolbar-combo-button-open .google-visualization-clickeditor-combobox-icon{filter:alpha(opacity=0);opacity:0}.google-visualization-clickeditor-combobox-icon .docs-icon{margin:0 0 0 7px;filter:alpha(opacity=60);opacity:0.6}.google-visualization-clickeditor-bubble .goog-toolbar-combo-button,.google-visualization-clickeditor-bubble .goog-toolbar-menu-button,.google-visualization-clickeditor-bubble .goog-toolbar-button{margin:0;top:auto}.google-visualization-clickeditor-bubble .goog-toolbar-color-menu-button .goog-toolbar-menu-button-dropdown{top:-2px}.google-visualization-clickeditor-color .goog-color-menu-button-indicator{width:14px;height:0;border-bottom-width:14px;margin:6px;outline:1px solid #bbb}.google-visualization-clickeditor-tooltip{font-family:Arial,sans-serif;font-weight:normal;-webkit-transition:background-color .5s;-moz-transition:background-color .5s;-ms-transition:background-color .5s;-o-transition:background-color .5s;transition:background-color .5s}.google-visualization-clickeditor-bubble .goog-toolbar-separator{height:20px;vertical-align:middle;border-color:#ccc}.google-visualization-clickeditor-separator{width:98%;height:0;border:1px solid #f8f8f8;margin:3px}.google-visualization-clickeditor-input-box{padding:5px}.google-visualization-clickeditor-enter-msg{font-size:11px;color:#555;padding:4px}.google-visualization-clickeditor-bubble .google-visualization-charteditor-input:focus{outline-color:#008df0}.google-visualization-clickeditor-bubble .google-visualization-charteditor-input-inline-x,.google-visualization-clickeditor-bubble .google-visualization-charteditor-input-inline-y,.google-visualization-clickeditor-bubble .google-visualization-charteditor-input-inline-right{font-size:12px;margin:4px}.google-visualization-clickeditor-bubble .google-visualization-charteditor-input-inline-x{width:79px}.google-visualization-clickeditor-bubble .google-visualization-charteditor-input-inline-y,.google-visualization-clickeditor-bubble .google-visualization-charteditor-input-inline-right{width:52px}.google-visualization-clickeditor-bubble .google-visualization-charteditor-combobox,.google-visualization-clickeditor-bubble .goog-flat-menu-button{margin:0}.goog-flat-menu-button-disabled .goog-flat-menu-button-dropdown{border-color:#b8b8b8 transparent}.google-visualization-clickeditor-entity-cover{position:absolute;visibility:hidden;overflow:hidden;cursor:pointer}.google-visualization-clickeditor-entity-cover-stripes{position:absolute;top:0;width:100%;height:100%;background:url("//ssl.gstatic.com/charts/static/stripes.png") repeat;visibility:visible;filter:alpha(opacity=10);opacity:0.1}.google-visualization-clickeditor-entity-cover-top,.google-visualization-clickeditor-entity-cover-bottom,.google-visualization-clickeditor-entity-cover-left,.google-visualization-clickeditor-entity-cover-right{visibility:visible;background-color:#008ef1;width:1px;height:1px;position:absolute}.google-visualization-clickeditor-entity-cover-top,.google-visualization-clickeditor-entity-cover-bottom{width:100%}.google-visualization-clickeditor-entity-cover-left,.google-visualization-clickeditor-entity-cover-right{height:100%}.google-visualization-clickeditor-entity-cover-right{right:0}.google-visualization-clickeditor-entity-cover-left{left:0}.google-visualization-clickeditor-entity-cover-bottom{bottom:0}.google-visualization-clickeditor-entity-cover .google-visualization-clickeditor-mid-input{width:98%;filter:alpha(opacity=0);opacity:0}.google-visualization-clickeditor-entity-cover .google-visualization-clickeditor-mid-input:focus{filter:alpha(opacity=100);opacity:1}.google-visualization-clickeditor-header{height:30px;background-color:white;padding:3px;overflow:hidden}.google-visualization-clickeditor-header-text{margin-left:5px;font-family:Arial,sans-serif;font-size:12px;color:#999;white-space:nowrap}.jfk-button.google-visualization-clickeditor-header-view,.jfk-button.google-visualization-clickeditor-header-edit{z-index:0}.jfk-button.jfk-button-disabled.google-visualization-clickeditor-header-view,.jfk-button.jfk-button-disabled.google-visualization-clickeditor-header-edit{background:transparent;border:none;box-shadow:none;margin-top:1px;margin-left:1px;opacity:0.5}.google-visualization-clickeditor-header-view .docs-icon,.google-visualization-clickeditor-header-edit .docs-icon{margin-top:-3px;margin-left:-2px;filter:alpha(opacity=60);opacity:0.6}.jfk-button.google-visualization-clickeditor-header-edit{margin-right:5px}.google-visualization-clickeditor-context-icon{position:absolute;right:10px;padding:0 5px;top:2px}.jfk-button.jfk-button-disabled.google-visualization-clickeditor-resize,.jfk-button.jfk-button-disabled.google-visualization-clickeditor-fit-area{background:#f5f5f5}.google-visualization-clickeditor-resize,.google-visualization-clickeditor-fit-area{height:24px;line-height:24px;border-color:transparent;margin-right:2px}.google-visualization-clickeditor-resize .docs-icon,.google-visualization-clickeditor-fit-area .docs-icon{margin-top:-3px;filter:alpha(opacity=60);opacity:0.6}.google-visualization-clickeditor-resize-text,.google-visualization-clickeditor-fit-area-text{font-size:11px;font-weight:bold;color:#555;margin:0 5px}.google-visualization-resizer-overlay{position:absolute;visibility:hidden}.google-visualization-resizer-bar{background:url("//ssl.gstatic.com/charts/static/stripes.png") #ffffff;position:absolute;opacity:0.1;visibility:visible;width:100%;height:100%}.google-visualization-resizer-bar:hover{opacity:0.2}.google-visualization-resizer-bar-center{height:100%;width:100%;cursor:crosshair;position:absolute;top:0}.google-visualization-resizer-bar-north{height:10px;cursor:n-resize;top:0}.google-visualization-resizer-bar-south{height:10px;cursor:s-resize;position:absolute;bottom:0}.google-visualization-resizer-bar-east{width:10px;cursor:e-resize;position:absolute;right:0}.google-visualization-resizer-bar-west{width:10px;cursor:w-resize;position:absolute;left:0}.google-visualization-charteditor-dialog{height:508px;width:917px}.google-visualization-charteditor-dialog .modal-dialog-title{font-family:Arial,sans-serif}#google-visualization-charteditor-layout-table,.google-visualization-charteditor-custom-panel,#google-visualization-clickeditor,.google-visualization-charteditor-menu{color:#222;font-family:Arial,sans-serif;font-size:12px}.google-visualization-charteditor-small-input,.google-visualization-charteditor-mid-input,.google-visualization-charteditor-input{-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;border:1px solid #d9d9d9;border-top:1px solid silver;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;font-size:13px;height:16px;padding:5px 2px}.google-visualization-charteditor-dialog .goog-flat-menu-button-dropdown,.google-visualization-clickeditor-bubble .goog-flat-menu-button-dropdown,.google-visualization-charteditor-custom-panel .goog-flat-menu-button-dropdown{background:url(//ssl.gstatic.com/ui/v1/disclosure/small-grey-disclosure-arrow-down.png) center no-repeat;border-width:0;height:7px;opacity:0.8;position:absolute;top:10px;width:5px}.google-visualization-charteditor-dialog .goog-flat-menu-button,.google-visualization-clickeditor-bubble .goog-flat-menu-button,.google-visualization-charteditor-custom-panel .goog-flat-menu-button{height:14px;line-height:normal;margin:0 0 0 5px;min-width:0;padding:6px 0 6px 6px;text-align:left}#google-visualization-clickeditor .goog-flat-menu-button{min-width:34px}#google-visualization-charteditor-series-select-div.goog-flat-menu-button,#google-visualization-charteditor-axes-select-div.goog-flat-menu-button{margin:0;width:100%}#google-visualization-charteditor-select-legend-position{margin-left:0}.google-visualization-charteditor-axis-select-scale.goog-select{margin-left:0;margin-right:36px}#google-visualization-charteditor-select-legend-position .goog-flat-menu-button-caption{width:74px}#google-visualization-charteditor-layout-table,#google-visualization-clickeditor,.google-visualization-charteditor-custom-panel{border:0;font-size:12px;margin:0;padding:0}.google-visualization-charteditor-settings-td,.google-visualization-charteditor-custom-panel{overflow:hidden;padding:0 0 0 4px;position:relative;left:-4px;vertical-align:top;width:288px}.google-visualization-charteditor-custom-panel{height:420px;line-height:1.4em}.google-visualization-charteditor-preview-td{height:411px;left:346px;overflow:hidden;padding:0 0 0 6px;position:absolute;top:81px;vertical-align:top;width:602px}#google-visualization-charteditor-preview-example-template{color:#15c}#google-visualization-charteditor-help-link{color:#1111cc;float:right;font-size:12px;font-weight:normal}.google-visualization-charteditor-dialog-spinner-div{height:370px;position:relative;text-align:center}.google-visualization-charteditor-dialog-spinner{background:url('//ssl.gstatic.com/docs/spreadsheets/spinner.gif') no-repeat;height:20px;position:relative;top:155px;width:20px}#google-visualization-charteditor-panel-wrapper{float:left;height:373px;width:300px}#google-visualization-charteditor-preview-div-wrapper{border:1px solid #e4e4e4;padding:0;position:relative;top:8px}#google-visualization-charteditor-preview-div-chart{overflow:hidden}.google-visualization-charteditor-panel{height:100%;width:100%}.google-visualization-charteditor-panel-scroll{overflow:auto;position:relative}.google-visualization-charteditor-panel .goog-menu-button{cursor:default}#google-visualization-charteditor-custom-data-input{position:relative}#google-visualization-charteditor-custom-data-input .sites-gviz-datasource-control{outline:none}#google-visualization-charteditor-panel-navigate-div{border-bottom:1px solid #ccc;font-size:13px;line-height:1.5em;margin-bottom:15px;padding:5px 0 0 10px;width:900px}#google-visualization-charteditor-panel-navigate-div.goog-tab-bar{background:none;cursor:default;list-style:none;outline:none}.google-visualization-charteditor-panel-navigation-cell.goog-tab{background:white;border:none;color:#666;cursor:default;padding:3px 10px;position:relative;text-decoration:none}.google-visualization-charteditor-panel-navigation-cell.goog-tab-hover{color:#222;cursor:pointer}.google-visualization-charteditor-panel-navigation-cell.goog-tab-selected{color:#202020;border:1px solid #ccc;border-bottom-color:white;-webkit-border-top-left-radius:2px;-webkit-border-top-right-radius:2px;-moz-border-radius-topleft:2px;-moz-border-radius-topright:2px;border-top-left-radius:2px;border-top-right-radius:2px;cursor:default;font-weight:700;margin-bottom:-1px;text-decoration:none}.google-visualization-charteditor-panel-navigation-cell.goog-tab-selected.goog-tab-hover{cursor:default;text-decoration:none}.google-visualization-charteditor-panel-title{font-size:13px;font-weight:800;padding-bottom:6px;position:relative}.google-visualization-charteditor-section{position:relative}#google-visualization-charteditor-options-panel .google-visualization-charteditor-section{background:white;border:1px solid #e5e5e5;margin-top:-1px;padding:10px 10px 20px;width:260px}.google-visualization-charteditor-multi-section-gap{height:4px}.google-visualization-charteditor-item-gap{height:15px}.google-visualization-charteditor-title-gap{height:10px}.google-visualization-charteditor-multi-section-title{background:whiteSmoke;border:1px #e5e5e5 solid;color:#d14836;display:table;font-size:13px;font-weight:bold;padding:6px 10px;text-align:left;width:260px}.google-visualization-charteditor-multi-section-title-text{display:table-cell;padding-right:7px}.google-visualization-charteditor-multi-section-chooser{display:table-cell;width:100%}.google-visualization-charteditor-section-title{color:#222;font-size:13px;font-weight:normal;padding:5px 0}.google-visualization-charteditor-data-range{color:#222;font-size:13px;font-weight:bold;padding:5px 0}.google-visualization-charteditor-short-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:88px}.google-visualization-charteditor-section>div>table{border:0;border-collapse:collapse;border-spacing:0;margin:0;padding:0;table-layout:fixed;width:250px}.google-visualization-charteditor-section>tbody>tr>td{margin:0;padding:0;vertical-align:top;width:125px}#google-visualization-charteditor-select-series{margin:0!important}.google-visualization-charteditor-select-series-color{height:10px;left:-15px;margin:0;position:relative;top:1px;width:10px}.google-visualization-charteditor-series-color-palette .goog-palette-cell{border-right:1px solid #333}.google-visualization-charteditor-menu-item-global{margin-left:10px}.google-visualization-charteditor-color .goog-flat-menu-button{min-width:38px}.google-visualization-charteditor-color .goog-flat-menu-button-disabled{background-image:none}.google-visualization-charteditor-color .goog-flat-menu-button-disabled .goog-flat-menu-button-dropdown{opacity:0.4}.google-visualization-charteditor-color .goog-flat-menu-button-disabled .goog-flat-menu-button-indicator{opacity:0.5}.google-visualization-charteditor-color .goog-flat-menu-button-indicator{height:14px;margin-left:4px;outline:1px solid #bbb;width:14px}.google-visualization-charteditor-inherit-color{height:25px}.google-visualization-charteditor-inherit-color .jfk-palette-colorswatch{background-color:#f3f3f3!important}.google-visualization-charteditor-inherit-color-header{margin:5px;top:-4px}.google-visualization-charteditor-none-color.goog-option-selected .goog-menuitem-checkbox{border:1px solid transparent;outline:1px solid black}.google-visualization-charteditor-none-color.goog-menuitem{color:#333;font-family:Arial,sans-serif;font-size:12px;padding-left:20px}.google-visualization-charteditor-none-color.goog-option-selected{background-image:none}.google-visualization-charteditor-theme-header.goog-menuheader{color:#333;font-family:Arial,sans-serif;font-size:12px;margin-top:4px;padding:5px 0 0 0}.google-visualization-charteditor-colormenu .jfk-palette-table{margin:3px 0 0 0;padding:0}.google-visualization-charteditor-colormenu.jfk-colormenu{padding:10px}.google-visualization-charteditor-none-color .goog-menuitem-checkbox{background:url(//ssl.gstatic.com/ui/v1/dialog/close-x.png) no-repeat 50% 50%!important;height:13px;margin:0;top:7px;width:13px}.google-visualization-charteditor-color-full .goog-menu-button-caption{padding:0}.google-visualization-charteditor-color-full .goog-menu-button-inner-box{padding:2px!important}.google-visualization-charteditor-link{color:blue;font-weight:bold}.google-visualization-charteditor-link:hover{cursor:pointer;text-decoration:underline}.google-visualization-charteditor-input{width:98%}.google-visualization-charteditor-input-disabled{background-color:#f3f3f3;border:1px solid #dadada;color:#ccc}.google-visualization-charteditor-input-label-disabled{color:#ccc}.google-visualization-charteditor-mid-input{width:138px}.google-visualization-charteditor-glasspane{background-color:#eee;filter:alpha(opacity=0.6);opacity:0.6}.google-visualization-charteditor-help-text{color:#ccc;font-size:12px}#google-visualization-charteditor-data-preview{display:none}#google-visualization-charteditor-data-preview-arrow{background:url(//ssl.gstatic.com/editor/editortoolbar.png) no-repeat -422px center;cursor:default;display:none;height:10px;top:50%;width:10px}.google-visualization-charteditor-data-mismatch{color:#555;font-size:13px;line-height:1em;padding:10px}.google-visualization-charteditor-data-mismatch-header{color:black;font-size:16px;margin-bottom:10px;margin-left:10px}.google-visualization-charteditor-mismatch-icon{background:url("//ssl.gstatic.com/charts/static/alert.png") no-repeat;height:18px;width:20px}#google-visualization-charteditor-preview-mismatch-thumbnail{float:right;height:68px;margin:0 0 0 2px;width:110px}.google-visualization-charteditor-tooltip{font-family:Arial,sans-serif}.google-visualization-charteditor-link{color:#333;font-weight:normal;text-decoration:none}.google-visualization-charteditor-link:hover{cursor:pointer;text-decoration:underline}.google-visualization-charteditor-checkbox{cursor:default;display:inline-block;margin:2px 2px 2px 0;overflow:hidden;padding:0;position:relative;white-space:nowrap}.google-visualization-charteditor-checkbox-container .google-visualization-charteditor-checkbox{width:120px}.google-visualization-charteditor-combobox.google-visualization-charteditor-combobox-closed{background-color:whiteSmoke;background-image:-webkit-linear-gradient(top,whiteSmoke,#f1f1f1);background-image:-moz-linear-gradient(top,whiteSmoke,#f1f1f1);background-image:-ms-linear-gradient(top,whiteSmoke,#f1f1f1);background-image:-o-linear-gradient(top,whiteSmoke,#f1f1f1);background-image:linear-gradient(top,whiteSmoke,#f1f1f1);border:1px solid gainsboro;border:1px solid rgba(0,0,0,0.1)}.google-visualization-charteditor-combobox.google-visualization-charteditor-combobox-disabled{background-color:white;border:1px solid #f2f2f2;opacity:1}.google-visualization-charteditor-combobox .goog-toolbar-combo-button-input{padding:0 0 0 3px;position:relative;width:28px}.google-visualization-charteditor-combobox-disabled .goog-toolbar-combo-button-input{color:#b8b8b8}.google-visualization-charteditor-combobox-disabled .goog-toolbar-combo-button-dropdown{opacity:0.4}.google-visualization-charteditor-combobox.goog-toolbar-combo-button{margin-left:4px;padding:1px 0;top:auto}.google-visualization-charteditor-checkbox-disabled{color:#666}.google-visualization-charteditor-checkbox .goog-checkbox{cursor:default}.google-visualization-charteditor-toggle{min-width:24px;margin:0}.google-visualization-charteditor-toggle.jfk-button{height:26px;line-height:24px;padding:0;z-index:auto}.google-visualization-charteditor-toggle-disabled{opacity:0.3}.google-visualization-charteditor-toggle-bold-content{background:url(//ssl.gstatic.com/docs/common/jfk_sprite40.png) -23px -466px no-repeat;height:16px;top:2px;width:16px}.google-visualization-charteditor-toggle-italic-content{background:url(//ssl.gstatic.com/docs/common/jfk_sprite40.png) -2px -2176px no-repeat;height:16px;top:2px;width:16px}.google-visualization-charteditor-name-input{border:1px solid transparent;color:#202020;font-family:Arial,sans-serif;font-size:13px;font-weight:800;height:14px;padding:4px;width:400px}.google-visualization-charteditor-name-input.google-visualization-charteditor-help-text{color:#666;font-weight:normal}.google-visualization-charteditor-name-input:hover,.google-visualization-charteditor-name-input:focus{border:1px solid #e4e4e4}.google-visualization-charteditor-small-input{width:118px}.google-visualization-charteditor-chart-img-div{border:1px solid #ddd;margin-top:5px;padding:2px;text-align:center;width:45px}.google-visualization-charteditor-chart-type-table{background-color:#f6f6f6;width:100%}.google-visualization-charteditor-type-select-button .goog-custom-button-inner-box{border-width:1px;margin:0;padding:1px;vertical-align:middle}.google-visualization-charteditor-type-select-button .goog-custom-button-outer-box{border-width:1px;margin:0;padding:0.5px;vertical-align:middle}.google-visualization-charteditor-type-select-label{border:0;font-size:10px;height:10px;margin:0;margin-top:-4px;padding:0;text-align:center;vertical-align:text-top}.google-visualization-charteditor-thumbnail .jfk-radiobutton-radio{-webkit-border-radius:0px;-moz-border-radius:0px;border-radius:0px;border:none;left:0;margin:0;position:static;top:0}.google-visualization-charteditor-thumbnail .jfk-radiobutton-radio::after{content:none}.google-visualization-charteditor-thumbnail.jfk-radiobutton{border:4px solid #ddd;display:block;margin:4px 12px 8px 0;padding:0px;height:68px;width:110px}.google-visualization-charteditor-thumbnail.jfk-radiobutton-checked{border:4px solid #6688ee;height:68px;outline-color:#fff;width:110px}.google-visualization-charteditor-thumbnail:focus{border:4px solid #c1d9ff;cursor:pointer}.google-visualization-charteditor-thumbnail.jfk-radiobutton-checked:focus{border:4px solid #6688ee}#google-visualization-charteditor-chart-type-categories{border-right:2px dotted #dcdcdc;float:left;width:105px}#google-visualization-charteditor-chart-type-categories.goog-tab-bar{background:none;cursor:default;list-style:none;outline:none}.google-visualization-charteditor-category.goog-tab{background:white;border:none;cursor:default;font-weight:normal;height:25px;margin-bottom:5px;padding:2px 0;position:relative;text-decoration:none}.google-visualization-charteditor-category.goog-tab-hover{cursor:pointer;background-color:#f2f2f2}.google-visualization-charteditor-category.goog-tab-hover .google-visualization-charteditor-category-label{text-decoration:underline}.google-visualization-charteditor-category.goog-tab-selected{background-color:#ddd!important;font-weight:bold}.google-visualization-charteditor-category.goog-tab-selected.goog-tab-hover{cursor:default;background-color:#ddd}.google-visualization-charteditor-category.goog-tab-selected.goog-tab-hover .google-visualization-charteditor-category-label{text-decoration:none}.google-visualization-charteditor-category-label{color:#666;font-size:13px;font-family:Arial,sans-serif;margin-left:15px;position:relative;top:-7px}.google-visualization-charteditor-category-label{text-decoration:inherit}.google-visualization-charteditor-mini{margin:2px}.google-visualization-charteditor-chart-type-subtypes{display:block;height:100%;overflow-y:scroll;max-height:372px}#google-visualization-charteditor-chart-type-subtypes{float:right;width:155px}.google-visualization-charteditor-combobox-icon{height:12px;left:9px;position:absolute;top:7px;width:12px}.google-visualization-charteditor-horizontal-menu{padding:1px 5px 5px 5px}.google-visualization-charteditor-float-start{float:left}.google-visualization-charteditor-float-end{float:right}.google-visualization-charteditor-float-clear{clear:both}.google-visualization-charteditor-align-end{text-align:right}.google-visualization-charteditor-align-start{text-align:left}.google-visualization-charteditor-display-none{display:none}.annotationsdiv .goog-custom-button-outer-box,.annotationsdiv .goog-custom-button-inner-box{border:0;margin:0;padding:0}.google-visualization-charteditor-mini-area{background:no-repeat url("//ssl.gstatic.com/charts/static/mini3.png") 0 -105px;width:21px;height:21px}.google-visualization-charteditor-mini-bar{background:no-repeat url("//ssl.gstatic.com/charts/static/mini3.png") 0 -168px;width:21px;height:21px}.google-visualization-charteditor-mini-column{background:no-repeat url("//ssl.gstatic.com/charts/static/mini3.png") 0 0;width:21px;height:21px}.google-visualization-charteditor-mini-combo{background:no-repeat url("//ssl.gstatic.com/charts/static/mini3.png") 0 -42px;width:21px;height:21px}.google-visualization-charteditor-mini-line{background:no-repeat url("//ssl.gstatic.com/charts/static/mini3.png") 0 -126px;width:21px;height:21px}.google-visualization-charteditor-mini-map{background:no-repeat url("//ssl.gstatic.com/charts/static/mini3.png") 0 -21px;width:21px;height:21px}.google-visualization-charteditor-mini-more{background:no-repeat url("//ssl.gstatic.com/charts/static/mini3.png") 0 -63px;width:21px;height:21px}.google-visualization-charteditor-mini-pie{background:no-repeat url("//ssl.gstatic.com/charts/static/mini3.png") 0 -84px;width:21px;height:21px}.google-visualization-charteditor-mini-scatter{background:no-repeat url("//ssl.gstatic.com/charts/static/mini3.png") 0 -147px;width:21px;height:21px}.google-visualization-charteditor-mini-step{background:no-repeat url("//ssl.gstatic.com/charts/static/mini3.png") 0 -210px;width:21px;height:21px}.google-visualization-charteditor-mini-trend{background:no-repeat url("//ssl.gstatic.com/charts/static/mini3.png") 0 -189px;width:21px;height:21px}.google-visualization-charteditor-mini-histogram{background:no-repeat url("//ssl.gstatic.com/charts/static/mini3.png") 0 -231px;width:21px;height:21px}.google-visualization-charteditor-thumbs-annotatedtimeline-disabled{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -612px;width:110px;height:68px}.google-visualization-charteditor-thumbs-annotatedtimeline{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -2507px;width:110px;height:68px}.google-visualization-charteditor-thumbs-areachart-disabled{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -3391px;width:110px;height:68px}.google-visualization-charteditor-thumbs-areachart{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -2779px;width:110px;height:68px}.google-visualization-charteditor-thumbs-areachart-stacked-disabled{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -408px;width:110px;height:68px}.google-visualization-charteditor-thumbs-areachart-stacked{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -2031px;width:110px;height:68px}.google-visualization-charteditor-thumbs-barchart-disabled{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -4124px;width:110px;height:68px}.google-visualization-charteditor-thumbs-barchart{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -3187px;width:110px;height:68px}.google-visualization-charteditor-thumbs-barchart-stacked-disabled{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -3527px;width:110px;height:68px}.google-visualization-charteditor-thumbs-barchart-stacked{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -816px;width:110px;height:68px}.google-visualization-charteditor-thumbs-bubblechart-disabled{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -136px;width:110px;height:68px}.google-visualization-charteditor-thumbs-bubblechart{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -1020px;width:110px;height:68px}.google-visualization-charteditor-thumbs-candlestickchart-disabled{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -1156px;width:110px;height:68px}.google-visualization-charteditor-thumbs-candlestickchart{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -3255px;width:110px;height:68px}.google-visualization-charteditor-thumbs-columnchart-disabled{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -3784px;width:110px;height:68px}.google-visualization-charteditor-thumbs-columnchart{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -2099px;width:110px;height:68px}.google-visualization-charteditor-thumbs-columnchart-stacked-disabled{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -2983px;width:110px;height:68px}.google-visualization-charteditor-thumbs-columnchart-stacked{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -1088px;width:110px;height:68px}.google-visualization-charteditor-thumbs-combochart-disabled{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -340px;width:110px;height:68px}.google-visualization-charteditor-thumbs-combochart{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 0;width:110px;height:68px}.google-visualization-charteditor-thumbs-donutchart-disabled{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -1360px;width:110px;height:68px}.google-visualization-charteditor-thumbs-donutchart{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -2371px;width:110px;height:68px}.google-visualization-charteditor-thumbs-gauge-disabled{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -1496px;width:110px;height:68px}.google-visualization-charteditor-thumbs-gauge{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -476px;width:110px;height:68px}.google-visualization-charteditor-thumbs-geochart-disabled{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -2575px;width:110px;height:68px}.google-visualization-charteditor-thumbs-geochart-markers-disabled{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -68px;width:110px;height:68px}.google-visualization-charteditor-thumbs-geochart-markers{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -2439px;width:110px;height:68px}.google-visualization-charteditor-thumbs-geochart{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -4192px;width:110px;height:68px}.google-visualization-charteditor-thumbs-histogram-disabled{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -3323px;width:110px;height:68px}.google-visualization-charteditor-thumbs-histogram{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -1564px;width:110px;height:68px}.google-visualization-charteditor-thumbs-imageradarchart-disabled{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -3051px;width:110px;height:68px}.google-visualization-charteditor-thumbs-imageradarchart{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -2235px;width:110px;height:68px}.google-visualization-charteditor-thumbs-imagesparkline-disabled{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -2643px;width:110px;height:68px}.google-visualization-charteditor-thumbs-imagesparkline{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -2167px;width:110px;height:68px}.google-visualization-charteditor-thumbs-linechart-disabled{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -1632px;width:110px;height:68px}.google-visualization-charteditor-thumbs-linechart{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -544px;width:110px;height:68px}.google-visualization-charteditor-thumbs-linechart-smooth-disabled{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -1963px;width:110px;height:68px}.google-visualization-charteditor-thumbs-linechart-smooth{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -3119px;width:110px;height:68px}.google-visualization-charteditor-thumbs-map-disabled{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -4056px;width:110px;height:68px}.google-visualization-charteditor-thumbs-map-normal{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -1904px;width:100px;height:59px}.google-visualization-charteditor-thumbs-map{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -1292px;width:110px;height:68px}.google-visualization-charteditor-thumbs-map-satellite{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -3595px;width:100px;height:60px}.google-visualization-charteditor-thumbs-map-street-disabled{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -2915px;width:110px;height:68px}.google-visualization-charteditor-thumbs-map-street{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -680px;width:110px;height:68px}.google-visualization-charteditor-thumbs-map-terrain{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -3723px;width:100px;height:61px}.google-visualization-charteditor-thumbs-motionchart-disabled{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -2711px;width:110px;height:68px}.google-visualization-charteditor-thumbs-motionchart{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -1836px;width:110px;height:68px}.google-visualization-charteditor-thumbs-orgchart-disabled{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -884px;width:110px;height:68px}.google-visualization-charteditor-thumbs-orgchart{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -1428px;width:110px;height:68px}.google-visualization-charteditor-thumbs-piechart-3d-disabled{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -952px;width:110px;height:68px}.google-visualization-charteditor-thumbs-piechart-3d{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -3655px;width:110px;height:68px}.google-visualization-charteditor-thumbs-piechart-disabled{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -2303px;width:110px;height:68px}.google-visualization-charteditor-thumbs-piechart{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -3852px;width:110px;height:68px}.google-visualization-charteditor-thumbs-scatterchart-disabled{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -272px;width:110px;height:68px}.google-visualization-charteditor-thumbs-scatterchart{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -3988px;width:110px;height:68px}.google-visualization-charteditor-thumbs-steppedareachart-disabled{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -2847px;width:110px;height:68px}.google-visualization-charteditor-thumbs-steppedareachart{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -3920px;width:110px;height:68px}.google-visualization-charteditor-thumbs-table-disabled{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -1768px;width:110px;height:68px}.google-visualization-charteditor-thumbs-table{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -204px;width:110px;height:68px}.google-visualization-charteditor-thumbs-timeline-disabled{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -1224px;width:110px;height:68px}.google-visualization-charteditor-thumbs-timeline{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -3459px;width:110px;height:68px}.google-visualization-charteditor-thumbs-treemap-disabled{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -1700px;width:110px;height:68px}.google-visualization-charteditor-thumbs-treemap{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -748px;width:110px;height:68px}.google-visualization-atl.container{}.google-visualization-atl .border{border:1px solid #808080;background-color:#ffffff}.google-visualization-atl .containerTable{display:table;table-layout:fixed;width:100%;height:100%;border:0;padding:0}.google-visualization-atl .containerTableRow{display:table-row}.google-visualization-atl .containerTable .td{display:table-cell;vertical-align:top;padding:0}.google-visualization-atl .chartTdContainer{}.google-visualization-atl .outerChartContainer{overflow:hidden}.google-visualization-atl .chartControls{display:table;border-spacing:0;border-collapse:collapse;height:auto;width:100%;white-space:nowrap}.google-visualization-atl .chartControls.twoRows{height:41px}.google-visualization-atl .zoomControls{display:table-cell;padding:4px 7px 1px;font-size:10px;white-space:nowrap;overflow:hidden}.google-visualization-atl .zoomControls button.zoomButton{margin-right:0.33em}.google-visualization-atl button{padding:0 2px;font-size:9px;line-height:10px}.google-visualization-atl .legend{display:table-cell;padding:4px 7px 1px;font-size:10px;text-align:right;white-space:nowrap;overflow:hidden}.google-visualization-atl .legend-dot{display:inline-block;height:8px;width:8px;border-radius:4px;margin-right:2px;-webkit-box-shadow:0px 0px 1px 1px rgba(206,206,195,0.75);-moz-box-shadow:0px 0px 1px 1px rgba(206,206,195,0.75);box-shadow:0px 0px 1px 1px rgba(206,206,195,0.75)}.google-visualization-atl .rangeControl{overflow:hidden}.google-visualization-atl .annotationsTdContainer{height:0;border-left:1px solid #808080}.google-visualization-atl .annotationsFilterContainer{padding:4px;font-size:10px;white-space:nowrap;overflow:hidden}.google-visualization-atl .annotationsFilterContainer input{font-size:10px;width:15em}.google-visualization-atl .annotationsContainer{}.google-visualization-atl .annotationsContainer .google-visualization-table-tr-head{display:none}.google-visualization-atl .annotationsContainer .google-visualization-table-tr-odd,.google-visualization-atl .annotationsContainer .google-visualization-table-tr-odd td{background:none}.google-visualization-atl .annotationsContainer .google-visualization-table-tr-even,.google-visualization-atl .annotationsContainer .google-visualization-table-tr-even td{background:none}.google-visualization-atl .annotationsContainer .google-visualization-table-tr-sel,.google-visualization-atl .annotationsContainer .google-visualization-table-tr-sel td{background-color:#eeeeee}.google-visualization-atl .annotationsContainer .google-visualization-table-td{border-width:0;border-bottom-width:1px;vertical-align:top;font-size:0.75em}.google-visualization-atl .annotationsContainer .title{font-weight:bold}.google-visualization-atl .annotationsContainer .date{color:#666666;font-size:0.75em;white-space:nowrap}.google-visualization-table{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;display:inline-block;vertical-align:bottom}.google-visualization-table *{-moz-box-sizing:inherit;-webkit-box-sizing:inherit;box-sizing:inherit}.google-visualization-table>div:first-child{border:solid #eee;border-width:0}.google-visualization-table>div:first-child.scrolling .google-visualization-table-table th,.google-visualization-table>div:first-child.scrolling .google-visualization-table-table .frozen-column{visibility:hidden;opacity:0;color:transparent}.google-visualization-table>div:first-child.doneScrolling .google-visualization-table-table th{-webkit-transition:opacity .25s ease-in .1s;-o-transition:opacity .25s ease-in .1s;transition:opacity 0.25s ease-in 0.1s}.google-visualization-table>div:first-child.doneScrolling .google-visualization-table-table .frozen-column{-webkit-transition:visibility,opacity .15s ease-in .15s;-o-transition:visibility,opacity .15s ease-in .15s;transition:visibility,opacity 0.15s ease-in 0.15s}.google-visualization-table-table{font-family:arial,helvetica;font-size:10pt;cursor:default;margin:0;background:white;border-spacing:0;border-collapse:separate}.google-visualization-table-table *{margin:0}.google-visualization-table .gradient{background-image:url("//ssl.gstatic.com/charts/static/table-title-bg.gif") repeat-x left bottom;background-image:-moz-linear-gradient(top,rgba(255,255,255,0.8) 0%,rgba(255,255,255,0.7) 30%,rgba(255,255,255,0.5) 60%,rgba(255,255,255,0) 100%);background-image:-webkit-linear-gradient(top,rgba(255,255,255,0.8) 0%,rgba(255,255,255,0.7) 30%,rgba(255,255,255,0.5) 60%,rgba(255,255,255,0) 100%);background-image:-o-linear-gradient(top,rgba(255,255,255,0.8) 0%,rgba(255,255,255,0.7) 30%,rgba(255,255,255,0.5) 60%,rgba(255,255,255,0) 100%);background-image:-ms-linear-gradient(top,rgba(255,255,255,0.8) 0%,rgba(255,255,255,0.7) 30%,rgba(255,255,255,0.5) 60%,rgba(255,255,255,0) 100%);background-image:linear-gradient(to bottom,rgba(255,255,255,0.8) 0%,rgba(255,255,255,0.7) 30%,rgba(255,255,255,0.5) 60%,rgba(255,255,255,0) 100%)}.google-visualization-table-tr-head{background-color:rgb(228,233,244);font-weight:bold;text-align:center}.google-visualization-table-sorthdr{cursor:pointer}.google-visualization-table-sortind{color:#ccc;padding-left:4px}.unsorted .google-visualization-table-sortind{display:none}.unsorted .google-visualization-table-sortind:after{content:"\002003"}.sort-ascending .google-visualization-table-sortind:after{content:"\0025b2"}.sort-descending .google-visualization-table-sortind:after{content:"\0025bc"}.google-visualization-table-th{cursor:pointer;white-space:nowrap}.google-visualization-table-td{overflow:hidden}.google-visualization-table-th,.google-visualization-table-td{padding:2px 0.35em;background-color:inherit;background-clip:padding-box}.google-visualization-table-table td,.google-visualization-table-table th{border:solid #eee;border-width:0 1px 1px 0;padding:2px 0.35em}.google-visualization-table-table th{position:relative;z-index:10}.google-visualization-table-table td.frozen-column{position:relative;z-index:5}.google-visualization-table-table thead th.frozen-column{z-index:15}.google-visualization-table-table .last-frozen-column{border-right:2px ridge #eee}.google-visualization-table-tr-even{background-color:#fff}.google-visualization-table-tr-odd{background-color:#fafafa}.google-visualization-table-tr-sel{background-color:#d6e9f8}.google-visualization-table-tr-over{background-color:#e7e9f9}.google-visualization-table-td.google-visualization-table-type-bool{text-align:center;font-family:"Arial Unicode MS",Arial,Helvetica}.google-visualization-table-td.google-visualization-table-type-date{text-align:center}.google-visualization-table-td.google-visualization-table-type-number{text-align:right;white-space:nowrap}.google-visualization-table-seq{text-align:right;color:#666}.google-visualization-table-div-page{display:inline-block;width:100%;padding:1px 0 0 1px;border:0;background-color:rgb(228,233,244);font-family:Arial,sans-serif}.google-visualization-table-div-page [role="button"]{display:inline-block;cursor:pointer;margin-top:2px;margin-bottom:2px;font-family:"Arial Unicode MS",Arial,Helvetica;font-size:10px;line-height:10px}.google-visualization-table-div-page [role="button"] .goog-custom-button-inner-box{padding:1px 1px 2px 1px}.google-visualization-table-page-prev,.google-visualization-table-page-next{}.google-visualization-table-page-prev:before{content:"\0025c4"}.google-visualization-table-page-next:before{content:"\0025ba"}.google-visualization-table-page-numbers{display:inline-block;zoom:1;margin:0;vertical-align:middle}.ie8 .google-visualization-table-page-numbers{display:inline}.google-visualization-table-page-number{display:inline-block;background-color:rgb(228,233,244);border:1px ButtonShadow outset;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;color:black;font-size:10px;min-width:10px;margin:2px;padding:0 2px;text-align:center;text-decoration:none;vertical-align:middle}.google-visualization-table-page-number.current{font-weight:bold;font-size:11px;background:#fefefe;border-style:inset}.google-visualization-table-page-number:hover{background:#fefefe;border-style:inset}.google-visualization-table .transparent{background-image:none;background-color:transparent;border-color:transparent}.google-visualization-table .transparentIE6{background:none}.google-visualization-table th .transparent,.google-visualization-table td .transparent{color:transparent;opacity:0}.google-visualization-table .google-visualization-hidden{visibility:hidden;pointer-events:none}.google-visualization-table-loadtest{padding-left:6px}.google-visualization-sparkline-default{background-color:#ffffff;border-spacing:0px;font-size:small;color:gray}.google-visualization-sparkline-selected{background-color:#d6e9f8;padding:1px;border-spacing:0px;font-size:small;color:gray}.google-visualization-sparkline-over{background-color:#e7e9f9;padding:1px;border-spacing:0px;font-size:small;color:gray}.google-visualization-sparkline-image{display:block}.google-visualization-orgchart-table{border:0;text-align:center}.google-visualization-orgchart-table *{margin:0;padding:2px}.google-visualization-orgchart-space-small{width:4px;height:1px;border:0}.google-visualization-orgchart-space-medium{width:10px;height:1px;border:0}.google-visualization-orgchart-space-large{width:16px;height:1px;border:0}.google-visualization-orgchart-noderow-small{height:12px;border:0}.google-visualization-orgchart-noderow-medium{height:30px;border:0}.google-visualization-orgchart-noderow-large{height:46px;border:0}.google-visualization-orgchart-connrow-small{height:2px;font-size:1px}.google-visualization-orgchart-connrow-medium{height:6px;font-size:4px}.google-visualization-orgchart-connrow-large{height:10px;font-size:8px}.google-visualization-orgchart-node{text-align:center;vertical-align:middle;font-family:arial,helvetica;cursor:default;border:2px solid #b5d9ea;-moz-border-radius:5px;-webkit-border-radius:5px;-webkit-box-shadow:rgba(0,0,0,0.5) 3px 3px 3px;-moz-box-shadow:rgba(0,0,0,0.5) 3px 3px 3px;background-color:#edf7ff;background:-webkit-gradient(linear,left top,left bottom,from(#edf7ff),to(#cde7ee))}.google-visualization-orgchart-nodesel{border:2px solid #e3ca4b;background-color:#fff7ae;background:-webkit-gradient(linear,left top,left bottom,from(#fff7ae),to(#eee79e))}.google-visualization-orgchart-node-small{font-size:0.6em}.google-visualization-orgchart-node-medium{font-size:0.8em}.google-visualization-orgchart-node-large{font-size:1.2em;font-weight:bold}.google-visualization-orgchart-linenode{border:0}.google-visualization-orgchart-lineleft{border-left:1px solid #3388dd}.google-visualization-orgchart-lineright{border-right:1px solid #3388dd}.google-visualization-orgchart-linebottom{border-bottom:1px solid #3388dd}.waffle-charteditor-chart-area-resizer .docs-squarehandleselectionbox-border{transition:opacity 250ms cubic-bezier(0.4,0.0,1,1);border:1px solid #9e9e9e;opacity:0}.waffle-charteditor-chart-area-resizer .docs-squarehandleselectionbox-handle{transition:opacity 250ms cubic-bezier(0.4,0.0,1,1);background:#fff;border:1px solid #9e9e9e;opacity:0}.waffle-charteditor-chart-area-resizer:hover .docs-squarehandleselectionbox-border,.waffle-charteditor-chart-area-resizer:hover .docs-squarehandleselectionbox-handle,.waffle-charteditor-chart-area-resizer-active .docs-squarehandleselectionbox-border,.waffle-charteditor-chart-area-resizer-active .docs-squarehandleselectionbox-handle,.waffle-charteditor-chart-area-resizer-dragging .docs-squarehandleselectionbox-border,.waffle-charteditor-chart-area-resizer-dragging .docs-squarehandleselectionbox-handle{opacity:1}.waffle-charteditor-edit-context-menu{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif}.waffle-charteditor-edit-context-menu .goog-menuitem{padding-left:30px;padding-right:110px}.waffle-charteditor-edit-context-menu-header{color:rgba(0,0,0,0.38);font-weight:bold;padding:2px 8px 6px 8px;text-transform:uppercase}.waffle-charteditor-edit-context-menu-submenu-label{float:left}.waffle-charteditor-select-to-zoom{background-color:rgba(0,0,255,0.1);border:1px dashed #9e9e9e;position:absolute}.waffle-charteditor-text-edit-overlay{background-color:#fff;border:1px solid #44a3fa;cursor:text;color:rgba(0,0,0,0.54);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:16px;line-height:1;outline:3px solid rgba(68,163,250,.3);outline-offset:0;position:absolute;resize:none;z-index:1}.waffle-charteditor-text-edit-overlay-vertical{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg);-webkit-transform-origin:top left;-moz-transform-origin:top left;-ms-transform-origin:top left;-o-transform-origin:top left;transform-origin:top left}.docs-ui-toast.waffle-charts-customizable-toast{bottom:10px;left:10px;position:absolute}.waffle-charts-switching-chart-component-gviz-backed{background:white}.waffle-dataconnector-dbrecord-projection-column-selection-type-buttons{margin-top:12px}.waffle-dataconnector-dbrecord-projection-column-selection-type-buttons .jfk-radiobutton{margin-left:16px;padding:0}.waffle-dataconnector-dbrecord-projection-column-selection-type-buttons .jfk-radiobutton-label{color:#202124;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;letter-spacing:0.2px;line-height:20px;margin-left:32px;text-decoration-line:none}.waffle-dataconnector-dbrecord-projection-column-selection-type-buttons .jfk-radiobutton-radio{left:0;height:20px;width:20px;top:0}.waffle-dataconnector-dbrecord-projection-column-selection-type-buttons .jfk-radiobutton-checked .jfk-radiobutton-radio::after{height:10px;margin:3px;width:10px}.waffle-dataconnector-dbrecord-projection-column-selection-type-sync-all-helper{color:#5f6368;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;letter-spacing:0.3px;line-height:16px;margin:8px 16px 16px 48px;max-width:200px}.waffle-dataconnector-dbrecord-projection-column-selection-type .goog-menu-filter{margin-left:48px;max-width:184px}.waffle-dataconnector-dbrecord-projection-column-selection-type .waffle-dbsource-column-filtered-menu-select-all-and-clear{margin-left:48px}.waffle-dataconnector-dbrecord-projection-column-selection-type .goog-menu-content{margin-left:16px;margin-bottom:8px}.waffle-dataconnector-dbrecord-projection-column-selection-type .waffle-dbsource-column-filtered-menu-item-icon{margin-left:28px}.waffle-dataconnector-dbrecord-projection-column-selection-type .goog-menuitem .goog-menuitem-content{margin-left:24px}.waffle-dbsource-column-filtered-menu.waffle-dataconnector-dbrecord-projection-column-selection-type .goog-menuitem.goog-option-selected{background-position:left center}.waffle-sidebar-container.waffle-filter-by-value-sidebar{width:460px}.waffle-filter-by-value-sidebar-footer-button-bar{border-top:1px solid #dadce0;display:flex;justify-content:flex-end;padding:16px 0}.waffle-filter-by-value-sidebar .waffle-sidebar-footer-container{background-color:white}.waffle-filter-by-value-cancel-button-wrapper{margin-right:4px}.waffle-filter-by-value-ok-button-wrapper{margin-right:12px}.waffle-filter-by-value-menu .goog-menu,.waffle-filter-by-value-additional-values-menu .goog-menu{position:relative;width:100%}.waffle-filter-by-value-item-value{left:90px;position:absolute}.waffle-filter-by-value-sidebar .waffle-filter-by-value-search-container .waffle-filter-by-value-search-input{border:none;width:100%}.waffle-filter-by-value-search-container{border-bottom:1px solid #dadce0}.waffle-filter-by-value-additional-values-menu-item{font-size:14px;font-weight:bold}.waffle-filter-by-value-separator{border-left:1px solid #dadce0;height:20px;margin-right:16px}.waffle-dataconnector-dbrecord-sidebar-widget{padding:20px 16px 0}.waffle-dataconnector-dbrecord-sidebar-widget-header{display:flex;align-items:center;justify-content:space-between}.waffle-dataconnector-dbrecord-sidebar-widget-header-label{color:#202124;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;line-height:40px}.waffle-dataconnector-dbrecord-sidebar .docs-charts-editor-material-textbutton.docs-material:focus{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#e7f5eb;border:1px solid #bbe2c6!important;height:24px;padding:3px 12px 5px}.waffle-dataconnector-dbrecord-sidebar-sort-widget-chip,.waffle-dataconnector-dbrecord-sidebar-projection-widget-chip{margin-top:8px}.waffle-dataconnector-dbrecord-sidebar-sort-widget-chip .docs-charts-editor-chip-content,.waffle-dataconnector-dbrecord-sidebar-projection-widget-chip .docs-charts-editor-chip-content{display:flex;align-items:center}.waffle-dataconnector-dbrecord-sidebar-projection-widget-chip .docs-charts-editor-chip-content,.waffle-dataconnector-dbrecord-sidebar-projection-widget-chip .docs-charts-editor-chip-label,.waffle-dataconnector-dbrecord-sidebar-sort-widget-chip .docs-charts-editor-chip-content,.waffle-dataconnector-dbrecord-sidebar-sort-widget-chip .docs-charts-editor-chip-label{cursor:move}.waffle-dataconnector-dbrecord-chip-nodrag .docs-charts-editor-chip-content,.waffle-dataconnector-dbrecord-chip-nodrag .docs-charts-editor-chip-label,.waffle-dataconnector-dbrecord-chip-nodrag{cursor:default}.waffle-dataconnector-dbrecord-sidebar-sort-widget-chip-icon,.waffle-dataconnector-dbrecord-sidebar-projection-widget-chip-icon{margin-left:15px}.waffle-dataconnector-dbrecord-sidebar .waffle-dbsource-table-icon{height:24px;width:24px}.waffle-dataconnector-dbrecord-sidebar-filter-widget .waffle-filter-filtercard{background-color:#f1f3f4}.waffle-dataconnector-dbrecord-sidebar-filter-widget .waffle-filter-filtercard .waffle-filter-filtercard-delete-button{background-color:#5f6368}.waffle-dataconnector-dbrecord-sidebar-filter-widget .waffle-filter-filtercard .waffle-filter-filtercard-select .jfk-select{width:100%}.waffle-dataconnector-dbrecord-sidebar-truncation-widget-row-limit-label{color:#5f6368;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;padding-bottom:5px}.waffle-dataconnector-dbrecord-sidebar-truncation-widget-repeated-values{align-items:center;display:flex;margin-top:8px}.docs-calendar-select{background-color:#f1f3f4;border-radius:8px;outline:none}.docs-calendar-select-disabled{color:#5f6368;opacity:.38;cursor:default}.docs-calendar-select-outer-box{border-radius:4px;cursor:pointer;padding:8px 6px 8px 8px}.docs-calendar-select-outer-box:active{background-color:#fff;border:1px solid transparent;box-shadow:0 2px 6px 2px rgba(60,64,67,.15)}.docs-calendar-select-hover .docs-calendar-select-outer-box{background-color:rgba(60,64,67,0.04)}.docs-calendar-select-open .docs-calendar-select-outer-box{background-color:rgba(60,64,67,0.04);border:1px solid transparent}.docs-calendar-select-open.docs-calendar-select-hover .docs-calendar-select-outer-box{background-color:rgba(60,64,67,0.04)}.docs-calendar-select-inner-box{align-items:center;display:flex;justify-content:space-between;position:relative;width:100%}.docs-calendar-select-caption{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;color:#202124;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;height:20px;line-height:20px;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.docs-calendar-select-dropdown{align-items:center;display:flex;height:24px;justify-content:center;width:24px}.docs-calendar-select-dropdown-icon{background:no-repeat url(//ssl.gstatic.com/docs/common/material_common_sprite222_grey_medium.svg) -40px -732px;height:18px;width:18px}.docs-calendar-select-open .docs-calendar-select-dropdown-icon{-moz-transform:rotate(180deg);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.waffle-dataconnector-refresh-all-dbobject-item{display:inline-block;height:35px;width:100%}.waffle-dataconnector-refresh-all-dbobject-item-enabled:focus{outline:none}.waffle-dataconnector-refresh-all-dbobject-item-enabled.valid-highlight:hover{background-color:#f1f3f4;border-radius:20px;box-sizing:border-box}.waffle-dataconnector-refresh-all-dbobject-item-enabled.valid-highlight:focus{background-color:#e8eaed;border-radius:20px;box-sizing:border-box;outline:none}.waffle-dataconnector-refresh-all-dbobject-item-enabled.error-highlight:hover{background-color:#fce8e6;border-radius:20px;box-sizing:border-box}.waffle-dataconnector-refresh-all-dbobject-item-enabled.error-highlight:focus{background-color:#fad2cf;border-radius:20px;box-sizing:border-box;outline:none}.waffle-dataconnector-refresh-all-dbobject-item-disabled{color:#80868b;cursor:default}.waffle-dataconnector-refresh-all-dbobject-item-icon-wrapper{float:left;margin-left:16px;margin-right:16px;margin-top:8px}.waffle-dataconnector-refresh-all-dbobject-item-title{color:#3c4043;float:left;font:400 14px/20px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;letter-spacing:0.2px;margin-top:8px}.waffle-dataconnector-refresh-all-dbobject-item-status-wrapper{float:right;font:400 12px/16px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;letter-spacing:0.3px;margin-right:16px;margin-top:8px}.waffle-dataconnector-refresh-all-dbobject-item-timestamp{color:#80868b}.waffle-dataconnector-refresh-all-dbobject-item-loading,.waffle-dataconnector-refresh-all-dbobject-item-running{color:#202124}.waffle-dataconnector-refresh-all-dbobject-item-error{color:#d93025;font-weight:bold}.waffle-dataconnector-refresh-all-dbobject-list-footer-button-wrapper{float:right;margin-right:7px}.waffle-dataconnector-refresh-all-dbobject-list-footer{display:inline-block;margin-bottom:10px;margin-top:10px;width:100%}.waffle-dataconnector-refresh-all-dbobject-list-footer-bytes-wrapper{float:left;margin-left:21px;margin-top:9px}.waffle-dataconnector-refresh-all-dbobject-item-icon-spinner .waffle-spinner{height:18px;width:18px}.waffle-dataconnector-refresh-all-dbobject-item-icon-spinner .waffle-spinner-circle{border-width:2px}.waffle-dataconnector-refresh-sidebar-backdrop{background-color:#000;left:0;position:absolute;top:0;z-index:1002;height:100%;opacity:.6;width:100%}.waffle-dataconnector-refresh-all-dbobject-list-single-datasource-title{font-family:Google Sans;font-size:14px;font-weight:500;letter-spacing:0.25px;overflow:hidden;padding:20px 20px 12px;text-overflow:ellipsis}.waffle-dataconnector-refresh-sidebar-refresh-widget{background-color:#f8f9fa;overflow-x:hidden;overflow-y:auto}.waffle-dataconnector-refresh-all-pane{height:100%}.waffle-dataconnector-refresh-all-datasources-container{bottom:0;height:100%;left:0;position:relative;right:0;top:0}.waffle-dataconnector-refresh-all-datasources-container.waffle-dataconnector-refresh-all-single-datasource-container{background-color:white}.waffle-dataconnector-refresh-all-datasources-container .waffle-dataconnector-refresh-all-dbobject-list-collapsible{border:2px solid transparent}.waffle-dataconnector-refresh-all-datasources-container .waffle-dataconnector-refresh-all-dbobject-list-collapsible.docs-charts-editor-collapsible-opened{box-shadow:0 1px 3px 1px rgba(60,64,67,.15);border:2px solid #fff;border-radius:8px}.waffle-dataconnector-refresh-all-dbobject-list-parent{border-bottom:2px solid #f8f9fa}.waffle-dataconnector-refreshall-highlight-valid::after{background-color:#000000;bottom:0;position:absolute;content:"";left:0;opacity:.2;right:0;top:0}.waffle-dataconnector-refreshall-highlight-error::after{background-color:#f6aea9;bottom:0;position:absolute;content:"";left:0;opacity:.2;right:0;top:0}.waffle-dataconnector-refresh-all-datasources-container .docs-charts-editor-collapsible-opened .docs-charts-editor-collapsible-header .docs-charts-editor-collapsible-title{color:#202124}.waffle-dataconnector-refresh-schedules-new-widget{background-color:#fff;border-top:1px solid #dadce0;bottom:65px;position:absolute;width:100%}.waffle-dataconnector-refresh-schedules-new-header{display:flex;flex-direction:column;height:64px;justify-content:center;padding:0 16px}.waffle-dataconnector-refresh-schedules-new-widget-opened .waffle-dataconnector-refresh-schedules-new-header{height:auto}.waffle-dataconnector-refresh-schedules-new-top-section{align-items:center;display:flex;justify-content:space-between;padding-bottom:4px}.waffle-dataconnector-refresh-schedules-new-widget-opened .waffle-dataconnector-refresh-schedules-new-top-section{height:50px}.waffle-dataconnector-refresh-schedules-new-fullview-section{color:#5f6368;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px}.waffle-dataconnector-refresh-schedules-new-fullview-text{color:#202124;font-size:14px;font-weight:500;line-height:20px}.waffle-dataconnector-refresh-schedules-new-header .goog-link-button{color:#1a73e8;text-decoration:none}.waffle-dataconnector-refresh-schedules-new-header-title{color:#3c4043;display:flex;font:500 14px "Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;line-height:20px}.waffle-dataconnector-refresh-schedules-new-info-icon{padding-left:4px}.waffle-dataconnector-refresh-schedules-new-edit-section{padding:16px}.waffle-dataconnector-refresh-schedules-new-edit-section-row{margin-bottom:16px}.waffle-dataconnector-refresh-schedules-new-select .docs-material-gm-labeled-select.docs-material-gm-labeled-select-focused .docs-material-gm-labeled-select-outer-box{background-color:#f1f3f4}.waffle-dataconnector-refresh-schedules-new-select .docs-material-gm-labeled-select{align-items:center;display:flex;justify-content:space-between}.waffle-dataconnector-refresh-schedules-new-select .docs-material-gm-labeled-select-content{margin-bottom:0px}.waffle-dataconnector-refresh-schedules-new-select .docs-material-gm-labeled-select-label{color:#3c4043;font:500 12px "Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;line-height:20px}.waffle-dataconnector-refresh-schedules-new-select .docs-material-gm-labeled-select-outer-box{padding:0;width:176px}.waffle-dataconnector-refresh-schedules-new-select .docs-material-gm-labeled-select-caption{font-size:13px;height:auto;line-height:16px;padding:4px 0 4px 8px}.waffle-dataconnector-refresh-schedules-new-btns{align-items:center;display:flex;justify-content:flex-end}.waffle-dataconnector-refresh-schedules-new-overview-section{font-size:12px}.waffle-dataconnector-refresh-schedules-new-overview-text{color:#5f6368}.waffle-dataconnector-refresh-schedules-new-edit-btn{padding-left:2px}.waffle-dataconnector-refresh-schedules-new-save-btn .docs-material-button{text-transform:none}.waffle-dataconnector-refresh-schedules-new-owner-info{color:#5f6368;font-size:12px;margin:32px 0 16px 0}.waffle-dataconnector-refresh-schedules-new-widget-opened{animation-name:waffle-dataconnector-refresh-schedules-new-widget-open;animation-duration:300ms;border-radius:8px 8px 0 0;border-top:none;bottom:0;box-shadow:0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12),0px 2px 4px -1px rgba(0,0,0,0.2);z-index:1002}@keyframes waffle-dataconnector-refresh-schedules-new-widget-open{from{bottom:-300px}to{bottom:0px}}.waffle-dataconnector-refresh-schedules-new-resume-prompt{max-width:420px}.waffle-dataconnector-refresh-schedules-new-resume-prompt .waffle-dataconnector-prompt-content{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;padding:0 24px 24px}.waffle-dataconnector-refresh-schedules-new-resume-prompt h4{margin:20px 0 4px 0}.waffle-dataconnector-refresh-schedules-new-label{font-weight:bold;padding-bottom:6px}.waffle-dataconnector-refresh-schedules-new-start-date-select{width:89px}.waffle-dataconnector-refresh-schedules-widget{background-color:#fff;border-top:1px solid #dadce0;bottom:65px;position:absolute;width:100%}.waffle-dataconnector-refresh-schedules-header{display:flex;flex-direction:column;height:64px;justify-content:center;padding:0 16px}.waffle-dataconnector-refresh-schedules-widget-opened .waffle-dataconnector-refresh-schedules-header{height:auto}.waffle-dataconnector-refresh-schedules-top-section{align-items:center;display:flex;justify-content:space-between;padding-bottom:4px}.waffle-dataconnector-refresh-schedules-widget-opened .waffle-dataconnector-refresh-schedules-top-section{height:50px}.waffle-dataconnector-refresh-schedules-fullview-section{color:#5f6368;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px}.waffle-dataconnector-refresh-schedules-fullview-text{color:#202124;font-size:14px;font-weight:500;line-height:20px}.waffle-dataconnector-refresh-schedules-header .goog-link-button{color:#1a73e8;text-decoration:none}.waffle-dataconnector-refresh-schedules-header-title{color:#3c4043;display:flex;font:500 14px "Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;line-height:20px}.waffle-dataconnector-refresh-schedules-info-icon{padding-left:4px}.waffle-dataconnector-refresh-schedules-edit-section{padding:16px}.waffle-dataconnector-refresh-schedules-edit-section-row{margin-bottom:16px}.waffle-dataconnector-refresh-schedules-select .docs-material-gm-labeled-select.docs-material-gm-labeled-select-focused .docs-material-gm-labeled-select-outer-box{background-color:#f1f3f4}.waffle-dataconnector-refresh-schedules-select .docs-material-gm-labeled-select{align-items:center;display:flex;justify-content:space-between}.waffle-dataconnector-refresh-schedules-select .docs-material-gm-labeled-select-content{margin-bottom:0px}.waffle-dataconnector-refresh-schedules-select .docs-material-gm-labeled-select-label{color:#3c4043;font:500 12px "Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;line-height:20px}.waffle-dataconnector-refresh-schedules-select .docs-material-gm-labeled-select-outer-box{padding:0;width:176px}.waffle-dataconnector-refresh-schedules-select .docs-material-gm-labeled-select-caption{font-size:13px;height:auto;line-height:16px;padding:4px 0 4px 8px}.waffle-dataconnector-refresh-schedules-btns{align-items:center;display:flex;justify-content:flex-end}.waffle-dataconnector-refresh-schedules-overview-section{font-size:12px}.waffle-dataconnector-refresh-schedules-overview-text{color:#5f6368}.waffle-dataconnector-refresh-schedules-edit-btn{padding-left:2px}.waffle-dataconnector-refresh-schedules-save-btn .docs-material-button{text-transform:none}.waffle-dataconnector-refresh-schedules-owner-info{color:#5f6368;font-size:12px;margin:32px 0 16px 0}.waffle-dataconnector-refresh-schedules-widget-opened{animation-name:waffle-dataconnector-refresh-schedules-widget-open;animation-duration:300ms;border-radius:8px 8px 0 0;border-top:none;bottom:0;box-shadow:0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12),0px 2px 4px -1px rgba(0,0,0,0.2);z-index:1002}@keyframes waffle-dataconnector-refresh-schedules-widget-open{from{bottom:-300px}to{bottom:0px}}.waffle-dataconnector-refresh-schedules-resume-prompt{max-width:420px}.waffle-dataconnector-refresh-schedules-resume-prompt .waffle-dataconnector-prompt-content{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;padding:0 24px 24px}.waffle-dataconnector-refresh-schedules-resume-prompt h4{margin:20px 0 4px 0}.waffle-dataconnector-refresh-weekday-select{display:contents;width:24px}.waffle-dataconnector-refresh-weekday-toggle{align-items:center;background-color:#f1f3f4;border-radius:50%;color:#80868b;cursor:pointer;display:inline-flex;font-size:12px;height:30px;justify-content:center;margin-right:8px;width:30px}.waffle-dataconnector-refresh-weekday-toggle-focused{background-color:rgba(95,99,104,0.122)}.waffle-dataconnector-refresh-weekday-toggle-focused{outline:none}.waffle-dataconnector-refresh-weekday-toggle-checked{background-color:#1e8e3e;color:white}.waffle-dataconnector-refresh-weekday-toggle-checked.waffle-dataconnector-refresh-weekday-toggle-focused{background-color:#188038}.waffle-dbsource-advanced-options-menuitem-change-billing-project svg{height:18px;left:10px;position:absolute;width:18px}.waffle-dbsource-advanced-options-menuitem-change-billing-project-short-caption{color:#80868b;font-size:12px}.waffle-bigquery-change-billing-project-dialog{display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;box-sizing:border-box;height:495px;width:512px}.waffle-bigquery-change-billing-project-dialog .waffle-dataconnector-modal-header{border-bottom:none;box-sizing:border-box;height:73px;padding:24px 24px 25px 24px}.waffle-bigquery-change-billing-project-dialog .waffle-dataconnector-modal-title{line-height:24px;opacity:1}.waffle-bigquery-change-billing-project-dialog .waffle-dataconnector-modal-close-button{height:34px;margin-right:-5px;margin-top:-5px;width:34px}.waffle-bigquery-change-billing-project-dialog .waffle-dataconnector-modal-close-button svg{height:24px;width:24px}.waffle-bigquery-change-billing-project-dialog .waffle-dataconnector-modal-body{height:338px;padding:0;z-index:0}.waffle-bigquery-change-billing-project-dialog-project-header{color:#5f6368;font-size:14px;letter-spacing:0.29px;margin:0;opacity:1;padding:10px 24px}.waffle-bigquery-change-billing-project-dialog .waffle-dataconnector-modal-footer{border-top:none;box-shadow:0 2px 6px 2px rgba(60,64,67,.15);padding:24px;z-index:1}.waffle-bigquery-change-billing-project-dialog-footer-wrapper{display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row}.waffle-bigquery-change-billing-project-dialog-footer-wrapper .docs-material-button{margin:0}.waffle-bigquery-change-billing-project-dialog-footer-wrapper .docs-material-button:first-child{margin-left:auto}.waffle-bigquery-change-billing-project-dialog .waffle-dataconnector-tablepicker-menuitem-content-nexticon{display:none}.waffle-bigquery-change-billing-project-dialog .waffle-dataconnector-tablepicker-menuitem-content-id{margin-left:auto}.waffle-bigquerydbsourceediterror-error-text{color:#3c4043;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;margin-bottom:24px}.waffle-bigquerydbsourceediterror .waffle-dataconnector-modal{max-width:600px}.waffle-bigquerydbsourceediterror .waffle-dataconnector-modal-header{border:none;padding-bottom:0}.waffle-bigquerydbsourceediterror .waffle-dataconnector-modal-footer{border:none;display:flex;-ms-flex-direction:row-reverse;-webkit-flex-direction:row-reverse;flex-direction:row-reverse;padding-top:0}.waffle-bigquerydbsourcesettingsdialog{display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;box-sizing:border-box;height:495px;width:512px}.waffle-bigquerydbsourcesettingsdialog .waffle-dataconnector-modal-header{border-bottom:none;box-sizing:border-box;height:73px;padding:24px 24px 25px 24px}.waffle-bigquerydbsourcesettingsdialog .waffle-dataconnector-modal-title{line-height:24px;opacity:1}.waffle-bigquerydbsourcesettingsdialog .waffle-dataconnector-modal-close-button{height:34px;margin-right:-5px;margin-top:-5px;width:34px}.waffle-bigquerydbsourcesettingsdialog .waffle-dataconnector-modal-close-button svg{height:24px;width:24px}.waffle-bigquerydbsourcesettingsdialog .waffle-dataconnector-modal-body{height:376px;padding:0;z-index:0}.waffle-bigquerydbsourcesettingsdialog-project-header{font:500 16px/20px "Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;letter-spacing:0.29px;margin:0;opacity:1;padding:10px 24px}.waffle-bigquerydbsourcesettingsdialog-transition-out .waffle-dataconnector-modal-title,.waffle-bigquerydbsourcesettingsdialog-transition-out .waffle-bigquerydbsourcesettingsdialog-project-header{opacity:0;transition:opacity 150ms cubic-bezier(0.0,0.0,0.2,1)}.waffle-bigquerydbsourcesettingsdialog-error-caption{padding:16px 32px}.waffle-bigquerydbsourcesettingsdialog .waffle-dataconnector-modal-footer{border-top:none;box-shadow:0 2px 6px 2px rgba(60,64,67,.15);z-index:1}.waffle-bigquerydbsourcesettingsdialog-footer-wrapper{display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row}.waffle-bigquerydbsourcesettingsdialog-footer-message{-webkit-box-flex:2;box-flex:2;-ms-flex-positive:2;-webkit-flex-grow:2;flex-grow:2;color:#5f6368;font-size:12px;line-height:16px;margin:0 24px 0 0;width:329px}.waffle-bigquerydbsourcesettingsdialog-footer-wrapper .docs-material-button{margin:0}.waffle-bigquerytabledatasourceviewonly-footer-wrapper{display:flex;-ms-flex-direction:row-reverse;-webkit-flex-direction:row-reverse;flex-direction:row-reverse}.waffle-bigquerytableinfopanel-configuration-wrapper{border-bottom:1px solid rgba(0,0,0,0.12);height:68px;margin-bottom:16px}.waffle-bigquerytableinfopanel-configuration-title{color:#202124;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:11px;font-weight:500;letter-spacing:0.8px;line-height:20px;padding-bottom:4px;text-transform:uppercase;vertical-align:top}.waffle-bigquerytableinfopanel-configuration-wrapper .waffle-dataconnector-tablepicker-menuitem-content-schemaicon{margin-bottom:auto;margin-top:auto}.waffle-bigquerytablepickermodal{display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;box-sizing:border-box;height:495px;width:512px}.waffle-bigquerytablepickermodal .waffle-dataconnector-modal-header{border-bottom:none;box-sizing:border-box;height:73px;padding:19px 24px 20px}.waffle-bigquerytablepickermodal-back-button{background:transparent;border-radius:50%;cursor:pointer;display:block;height:33px;margin-left:-5px;opacity:0;position:relative;transition:background-color 0.28s cubic-bezier(0.0,0.0,0.2,1),opacity 150ms cubic-bezier(0.0,0.0,0.2,1);width:33px}.waffle-bigquerytablepickermodal-cloud-project-edit-button{background:transparent;border-radius:50%;cursor:pointer;display:block;height:33px;margin-left:-5px;margin-top:5px;position:relative;width:33px}.waffle-bigquerytablepickermodal-transition-in .waffle-bigquerytablepickermodal-back-button{opacity:1}.waffle-bigquerytablepickermodal-back-button .docs-icon{margin:5px}.waffle-bigquerytablepickermodal-back-button-focused{opacity:1.0;background-color:rgba(0,0,0,0.12);outline:none}.waffle-bigquerytablepickermodal-back-button-hover{opacity:1.0}.waffle-bigquerytablepickermodal .waffle-dataconnector-modal-title{box-sizing:border-box;line-height:34px;opacity:0;padding-right:0;width:400px}.waffle-bigquerytablepickermodal .waffle-dataconnector-modal-close-button{height:34px;margin-right:-5px;width:34px}.waffle-bigquerytablepickermodal .waffle-dataconnector-modal-close-button svg{height:24px;width:24px}.waffle-bigquerytablepickermodal .waffle-dataconnector-modal-body{height:338px;padding:0;z-index:0}.waffle-bigquerytablepickermodal-project-menu-header-wrapper{display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;align-items:center;height:40px;-webkit-justify-content:space-between;justify-content:space-between}.waffle-bigquerytablepickermodal-project-menu-header{-webkit-box-flex:2;box-flex:2;-ms-flex-positive:2;-webkit-flex-grow:2;flex-grow:2;font:500 16px/20px "Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;letter-spacing:0.29px;margin:0;opacity:0;padding:10px 24px}.waffle-bigquerytablepickermodal-project-menu-billing-project-edit-button{background:transparent;border:1px solid transparent;border-radius:4px;box-shadow:none;color:#202124;cursor:pointer;font:500 14px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;line-height:20px;margin-right:24px;max-width:40%;overflow:hidden;padding:8px;text-overflow:ellipsis;vertical-align:middle;white-space:nowrap}.waffle-bigquerytablepickermodal-project-menu-billing-project-edit-button svg{margin-right:6px;vertical-align:middle}.waffle-bigquerytablepickermodal-project-menu-billing-project-edit-button:hover{background-color:#f1f3f4}.waffle-bigquerytablepickermodal-project-menu-billing-project-edit-button:active{background-color:#e8eaed;outline:none}.waffle-bigquerytablepickermodal-project-menu-billing-project-edit-button:focus{background-color:#e8eaed;outline:none}.waffle-bigquerytablepickermodal-project-menu-billing-project-text{font:400 14px Roboto,RobotoDraft,Helvetica,Arial,sans-serif}.waffle-bigquerytablepickermodal-transition-in .waffle-dataconnector-modal-title,.waffle-bigquerytablepickermodal-transition-in .waffle-bigquerytablepickermodal-project-menu-header{opacity:1;transition:opacity 150ms cubic-bezier(0.4,0.0,1,1)}.waffle-bigquerytablepickermodal-breadcrumbnavigator-wrapper{background-color:#f8f9fa;padding:8px 26px}.waffle-bigquerytablepickermodal .waffle-dataconnector-modal-footer{border-top:none;box-shadow:0 2px 6px 2px rgba(60,64,67,.15);padding:24px;z-index:1}.waffle-bigquerytablepickermodal-footer-wrapper{display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-webkit-justify-content:space-between;justify-content:space-between}.waffle-bigquerytablepickermodal-footer-wrapper .docs-material-button{margin:0}.waffle-bigquerytablepickermodal-write-query-button .goog-flat-button{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:white;color:#188038;outline:none;text-transform:none}.waffle-bigquerytablepickermodal-write-query-button .goog-flat-button-hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#f8fcf9;color:#188038}.waffle-bigquerytablepickermodal-write-query-button .goog-flat-button-active{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#dff2e4;color:#188038;box-shadow:0 2px 6px 2px rgba(60,64,67,.15)}.waffle-bigquerytablepickermodal-write-query-button .goog-flat-button-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#e7f5eb;color:#188038}.waffle-dataconnector-modal.waffle-bigquerywrongskudialog{box-sizing:border-box;height:240px;width:360px}.waffle-bigquerywrongskudialog .waffle-dataconnector-modal-body{padding-right:56px;padding-top:0}.waffle-bigquerywrongskudialog .waffle-dataconnector-modal-header{border-bottom:none}.waffle-bigquerywrongskudialog .waffle-dataconnector-modal-footer{border-top:none;padding-right:24px;padding-top:32px}.waffle-bigquerywrongskudialog-footer-wrapper{display:flex;-ms-flex-direction:row-reverse;-webkit-flex-direction:row-reverse;flex-direction:row-reverse}.waffle-bigquerywrongskudialog-message{color:#3c4043;font-family:Roboto;font-size:14px;font-weight:400;text-align:left;vertical-align:top}.waffle-dbsource-flat-default{color:#188038;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;height:36px;line-height:36px;padding:0 8px;text-transform:none}.waffle-dbsource-flat-default.docs-material-button-flat-default.docs-material-button.docs-material-button-hover{background-color:rgba(52,168,83,0.04)}.waffle-dbsource-flat-default.docs-material-button-flat-default.docs-material-button.docs-material-button-active{background-color:rgba(52,168,83,0.16);color:#188038;line-height:36px}.waffle-dbsource-flat-default.docs-material-button-flat-default.docs-material-button.docs-material-button-focused{background-color:rgba(52,168,83,0.12);border:none;line-height:36px;padding:0 8px}.waffle-dbsource-flat-default.docs-material-button-flat-default.docs-material-button.docs-material-button-no-focus-border{line-height:36px}.waffle-dbsource-flat-default>.docs-material-button-ripple-element{background-color:rgba(52,168,83,0.10)}.waffle-dbobject-estimated-bytes-info{display:flex}.waffle-dbobject-estimated-bytes-spinner .waffle-spinner{height:18px;width:18px}.waffle-dbobject-estimated-bytes-spinner .waffle-spinner-circle{border-width:2px}.waffle-dbobject-estimated-bytes-icon{margin-right:8px}.waffle-dbobject-estimated-bytes-error{color:#db4437;text-decoration:underline}.waffle-dbobject-estimated-bytes-error:focus{outline:none}.waffle-dbobject-estimated-bytes-details{color:#80868b;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;letter-spacing:0.3px;line-height:16px}.waffle-dbobject-estimated-bytes-details-tooltip{display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;align-items:center;background-color:#000000;color:white;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:500;height:24px;text-align:center}.waffle-dbsource-column-filtered-menu .goog-menu-filter{display:flex;border-bottom:1px solid #e0e0e0;padding:6px 6px 12px 10px}.waffle-dbsource-column-filtered-menu input{-ms-flex:1;-webkit-flex:1;flex:1;border:0;color:rgba(0,0,0,0.87);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;min-width:0;outline:0}.waffle-dbsource-column-filtered-menu .waffle-charteditor-picker-button-wrapper{height:24px;margin-right:0}.waffle-dbsource-column-filtered-menu .goog-menu-filter:before{content:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNHB4IiBoZWlnaHQ9IjI0cHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0iIzc1NzU3NSI+CiAgICA8cGF0aCBkPSJNMTUuNSAxNGgtLjc5bC0uMjgtLjI3QzE1LjQxIDEyLjU5IDE2IDExLjExIDE2IDkuNSAxNiA1LjkxIDEzLjA5IDMgOS41IDNTMyA1LjkxIDMgOS41IDUuOTEgMTYgOS41IDE2YzEuNjEgMCAzLjA5LS41OSA0LjIzLTEuNTdsLjI3LjI4di43OWw1IDQuOTlMMjAuNDkgMTlsLTQuOTktNXptLTYgMEM3LjAxIDE0IDUgMTEuOTkgNSA5LjVTNy4wMSA1IDkuNSA1IDE0IDcuMDEgMTQgOS41IDExLjk5IDE0IDkuNSAxNHoiLz4KICAgIDxwYXRoIGQ9Ik0wIDBoMjR2MjRIMHoiIGZpbGw9Im5vbmUiLz4KPC9zdmc+Cg==');height:24px;margin-right:6px;width:24px}.waffle-dbsource-column-filtered-menu-item-icon{margin-left:5px;margin-top:3px}.goog-menuitem-highlight .waffle-dbsource-column-filtered-menu-item-icon{margin-top:2px}.waffle-dbsource-column-filtered-menu-item-icon.docs-hc-ie{background-color:white;-ms-high-contrast-adjust:none}.waffle-dbsource-column-filtered-menu-item-icon.docs-hc-gecko{filter:invert(1)}.waffle-dbsource-column-filtered-menu.docs-hc-ie .goog-menu-filter:before{background-color:white;padding-top:12px;-ms-high-contrast-adjust:none}.waffle-dbsource-column-filtered-menu.docs-hc-gecko .goog-menu-filter:before{filter:url("data:image/svg+xml;utf8,\00003csvg%20xmlns=\000027http://www.w3.org/2000/svg\000027\00003e\00003cfilter%20id=\000027invertColor\000027\00003e\00003cfeColorMatrix%20type=\000027matrix\000027%20values=\000027-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0\000027/\00003e\00003c/filter\00003e\00003c/svg\00003e#invertColor")}.waffle-filterable-by-text-contains-menu-item-match{font-weight:500}.waffle-dbsource-column-filtered-menu .goog-menuitem{padding-right:20px}.waffle-dbsource-column-filtered-menu-select-all-and-clear{margin:6px 0 0 10px}.waffle-dbsource-column-filtered-menu-select-all{color:#1a73e8;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;letter-spacing:0.3px;line-height:16px;text-decoration-line:none}.waffle-dbsource-column-filtered-menu-select-all-and-clear-separator{color:#dadce0;display:inline-block;font-size:10px;line-height:16px;margin:0 8px 0 8px;vertical-align:text-bottom}.waffle-dbsource-column-filtered-menu-clear{color:#1a73e8;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;letter-spacing:0.3px;line-height:16px;text-decoration-line:none}.waffle-dbsource-column-filtered-menu .goog-menuitem.goog-option-selected{background-position:right 5px center}.waffle-dbsource-configbar-wrapper{background:#e8eaed;border-bottom:1px solid #dadce0;height:110px;padding-top:16px;position:relative}.waffle-dbsource-configbar{background:white;border-bottom:none;border-radius:8px 8px 0 0;box-sizing:border-box;box-shadow:0 2px 6px 2px rgba(60,64,67,.15);height:100%;overflow-x:auto;overflow-y:hidden;padding:16px 28px}.waffle-dbsource-configbar-header{align-items:center;display:flex;flex-direction:row;font-family:Google Sans,Arial,sans-serif;font-weight:400;margin-left:4px;white-space:nowrap}.waffle-dbsource-configbar-header-icon{height:24px;margin-left:0;margin-right:8px;min-width:24px;position:relative}.waffle-dbsource-configbar-header-title{color:#202124;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:18px;font-weight:400;line-height:24px}.waffle-dbsource-configbar-header-subtitle{color:#5f6368;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;letter-spacing:0.3px;line-height:16px;margin-right:12px}.waffle-dbsource-configbar-schedules-widget{-webkit-align-items:center;align-items:center;border-radius:16px;color:#202124;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;height:32px;letter-spacing:0.3px;line-height:16px}.waffle-dbsource-configbar-schedules-widget-content{-webkit-align-items:center;align-items:center;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row}.waffle-dbsource-configbar-schedules-widget-edit-button-wrapper .goog-link-button{color:#188038;text-decoration:none}.waffle-dbsource-configbar-schedules-widget-highlight{background-color:#f1f3f4;padding:0 12px}.waffle-dbsource-configbar-schedules-widget-content svg,.waffle-dbsource-configbar-schedules-widget-last-refresh-content,.waffle-dbsource-configbar-schedules-widget-last-refresh-divider,.waffle-dbsource-configbar-schedules-widget-next-refresh-content{margin-right:8px}.waffle-dbsource-configbar-schedules-widget-last-refresh-divider{border-right:1px solid #dadce0}.waffle-dbsource-configbar-actions{display:flex;flex-direction:row;padding:16px 0}.waffle-dbsource-configbar-button-wrapper{padding:0}.waffle-dbsource-configbar-button-wrapper .docs-material-button{margin:0}.waffle-dbsource-configbar-button-wrapper .docs-material-button-content>div>span{vertical-align:middle}.waffle-dbsource-configbar-columns-menu-button{background:#e6f4ea;border-color:#e6f4ea;border-radius:8px;height:36px;line-height:36px;padding:0 10px;margin-right:12px}.waffle-dbsource-configbar-columns-menu-button.docs-material-menu-button-flat-default,.waffle-dbsource-configbar-columns-menu-button.docs-material-menu-button-flat-default-focused{border:none}.waffle-dbsource-configbar-columns-menu-button .docs-material-menu-button-flat-default-dropdown{margin-left:10px;margin-top:5px}.goog-menu .goog-menuitem.waffle-datasource-configbar-columns-menu-loading{padding:6px 15px}.waffle-dbsource-configbar-options-wrapper{display:flex;-ms-flex:1;-webkit-flex:1;flex:1;-webkit-justify-content:flex-end;justify-content:flex-end}.waffle-dbsource-configbar .waffle-dbsource-configbar-secondary-button .docs-material-button-content span{-webkit-align-items:center;align-items:center;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row}.waffle-dbsource-configbar .waffle-dbsource-configbar-secondary-button .docs-material-button-content .waffle-dbsource-configbar-secondary-button-content span,.waffle-dbsource-configbar .waffle-dbsource-configbar-secondary-button .docs-material-menu-button-flat-default-caption .waffle-dbsource-configbar-secondary-button-content span{color:#5f6368;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;line-height:24px;text-transform:none}.waffle-dbsource-configbar .waffle-dbsource-configbar-secondary-button.docs-material-button-hairline-primary.docs-material-button,.waffle-dbsource-configbar .waffle-dbsource-configbar-secondary-button.docs-material-menu-button-flat-default{border:none!important;height:24px;line-height:24px;margin-right:0;padding:0}.waffle-dbsource-configbar .waffle-dbsource-configbar-secondary-button.docs-material-button-hairline-primary.docs-material-button.docs-material-button-hover,.waffle-dbsource-configbar .waffle-dbsource-configbar-secondary-button.docs-material-menu-button-flat-default-hover,.waffle-dbsource-configbar-connection-settings-button.docs-material-button.docs-material-button-hover{background-color:#f8f9fa}.waffle-dbsource-configbar .waffle-dbsource-configbar-secondary-button.docs-material-button-hairline-primary.docs-material-button.docs-material-button-focused{background-color:#f1f3f4}.waffle-dbsource-configbar-secondary-button.docs-material-button-hairline-primary.docs-material-button .waffle-dbsource-configbar-secondary-button-content,.waffle-dbsource-configbar .waffle-dbsource-configbar-secondary-button.docs-material-menu-button-flat-default .waffle-dbsource-configbar-secondary-button-content{padding:0 8px;text-decoration:none}.waffle-dbsource-configbar .waffle-dbsource-configbar-secondary-button .docs-material-button-content svg{margin-right:5px}.waffle-dbsource-configbar .docs-material-button-hairline-primary.docs-material-button{margin-left:0;margin-right:16px;padding-left:12px;padding-right:16px;white-space:nowrap}.waffle-dbsource-configbar .waffle-dbsource-configbar-secondary-button.docs-material-button-hairline-primary.docs-material-button,.waffle-dbsource-configbar .waffle-dbsource-configbar-secondary-button.docs-material-menu-button-flat-default{margin-left:8px}.waffle-dbsource-configbar .docs-material-button-content svg{margin-right:8px;vertical-align:middle}.waffle-dbsource-configbar-overflow-menu{width:252px}.goog-menu.waffle-dbsource-configbar-overflow-menu .goog-menuitem,.goog-menu.waffle-dbsource-configbar-overflow-menu .goog-menuitem.goog-menuitem-disabled,.goog-menu.waffle-dbsource-configbar-overflow-menu .goog-menuitem.goog-menuitem-disabled.goog-menuitem:hover{padding:6px 12px}.goog-menu.waffle-dbsource-configbar-overflow-menu .goog-menuitem:hover{padding:5px 12px}.waffle-dbsource-configbar-overflow-menu-button.docs-material-menu-button-flat-default{height:24px;line-height:24px;margin-left:16px;opacity:0.4;padding:0;width:24px}.waffle-dbsource-configbar-overflow-menu-button.docs-hc-ie.docs-material-menu-button-flat-default .docs-material-menu-button-flat-default-caption{background-color:white}.waffle-dbsource-configbar-overflow-menu-button.docs-hc-gecko.docs-material-menu-button-flat-default .docs-material-menu-button-flat-default-caption{filter:url("data:image/svg+xml;utf8,\00003csvg%20xmlns=\000027http://www.w3.org/2000/svg\000027\00003e\00003cfilter%20id=\000027invertColor\000027\00003e\00003cfeColorMatrix%20type=\000027matrix\000027%20values=\000027-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0\000027/\00003e\00003c/filter\00003e\00003c/svg\00003e#invertColor")}.waffle-dbsource-configbar-separator{border-left:1px #dadce0 solid;height:20px;margin-left:16px;margin-right:16px}.waffle-dbsource-flat-default.waffle-dbsource-configbar-refresh-options-button,.waffle-dbsource-flat-default.waffle-dbsource-configbar-schedules-widget-main-button{border-radius:4px;font-size:14px;height:20px;letter-spacing:.25px;line-height:20px}.waffle-dbsource-flat-default.waffle-dbsource-configbar-refresh-options-button.docs-material-button-flat-default.docs-material-button.docs-material-button-no-focus-border,.waffle-dbsource-flat-default.waffle-dbsource-configbar-refresh-options-button.docs-material-button-flat-default.docs-material-button.docs-material-button-focused{line-height:24px}.waffle-dbsource-configbar-overflow-menu-button .docs-material-menu-button-flat-default-dropdown{display:none}.waffle-dbsource-configbar-connection-settings-button,.waffle-dbsource-configbar-connection-settings-button.docs-material-button.docs-material-button-no-focus-border,.waffle-dbsource-configbar-connection-settings-button.docs-material-button.docs-material-button-focused{height:24px;line-height:24px}.waffle-dbsource-configbar-connection-settings-button.docs-material-button.docs-material-button-focused{background-color:#f1f3f4;border:none;outline:none;outline-offset:0;padding:0 8px}.waffle-dbsource-configbar-column-insights-icon{margin-right:8px}.waffle-dbsource-configbar-column-insights-icon .docs-icon-img{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_green.svg)!important}.waffle-dbsource-configbar-secondary-button-icon{margin:0 5px 0 0!important}.waffle-dbsource-pill-menuitem.waffle-dbsource-configbar-watch-tutorial-menuitem{align-items:start;height:auto}.waffle-dbsource-pill-menuitem.waffle-dbsource-configbar-watch-tutorial-menuitem svg{height:36px}.waffle-dbsource-configbar-watch-tutorial-menuitem-caption{color:#5f6368;font-size:12px;line-height:16px;white-space:break-spaces;width:150px}.waffle-create-datasheet-welcome-dialog{display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;box-sizing:border-box;height:558px;text-align:center;width:512px}.waffle-create-datasheet-welcome-dialog .waffle-dataconnector-modal-header{border-bottom:none;justify-content:flex-end;padding:24px 24px 0px}.waffle-create-datasheet-welcome-dialog .waffle-dataconnector-modal-title{display:none}.waffle-create-datasheet-welcome-dialog .waffle-dataconnector-modal-body{padding:0}.waffle-create-datasheet-welcome-dialog .waffle-dataconnector-modal-close-button{height:34px;margin-right:-5px;width:34px}.waffle-create-datasheet-welcome-dialog .waffle-dataconnector-modal-close-button svg{height:24px;width:24px}.waffle-create-datasheet-welcome-dialog-image{height:222px;user-select:none}.waffle-create-datasheet-welcome-dialog-welcome-message{display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-webkit-justify-content:center;justify-content:center;color:#202124;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:22px;font-weight:400}.waffle-create-datasheet-welcome-dialog-welcome-description{color:#5f6368;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;letter-spacing:0.2px;line-height:20px;margin:0 auto;max-width:392px}.waffle-create-datasheet-welcome-dialog-button-wrapper{padding-top:36px;padding-bottom:16px}.waffle-create-datasheet-welcome-dialog .waffle-dataconnector-modal-footer{border-top:none}.waffle-create-datasource-sheet-loading-dialog{display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;box-sizing:border-box;height:558px;text-align:center;width:512px}.waffle-create-datasource-sheet-loading-dialog .waffle-dataconnector-modal-header{border-bottom:none;justify-content:flex-end;padding:24px 24px 0px}.waffle-create-datasource-sheet-loading-dialog .waffle-dataconnector-modal-title{display:none}.waffle-create-datasource-sheet-loading-dialog .waffle-dataconnector-modal-body{padding:0;margin-top:-30px}.waffle-create-datasource-sheet-loading-dialog .waffle-dataconnector-modal-close-button{height:34px;margin-right:-5px;width:34px}.waffle-create-datasource-sheet-loading-dialog .waffle-dataconnector-modal-close-button svg{height:24px;width:24px}.waffle-create-datasource-sheet-loading-dialog-tip{color:#202124;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:22px;font-weight:400;height:32px;letter-spacing:0.2px;line-height:20px;margin:32px auto;max-width:392px}.waffle-create-datasource-sheet-loading-dialog-image{height:400px;user-select:none}.waffle-create-datasource-sheet-loading-dialog .waffle-dataconnector-modal-footer{border-top:none}.waffle-create-datasource-sheet-success-dialog{display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;box-sizing:border-box;height:558px;text-align:center;width:512px}.waffle-create-datasource-sheet-success-dialog .waffle-dataconnector-modal-header{border-bottom:none;justify-content:flex-end;padding:24px 24px 0px}.waffle-create-datasource-sheet-success-dialog .waffle-dataconnector-modal-title{display:none}.waffle-create-datasource-sheet-success-dialog .waffle-dataconnector-modal-body{padding:0}.waffle-create-datasource-sheet-success-dialog .waffle-dataconnector-modal-close-button{height:34px;margin-right:-5px;width:34px}.waffle-create-datasource-sheet-success-dialog .waffle-dataconnector-modal-close-button svg{height:24px;width:24px}.waffle-create-datasource-sheet-success-dialog-image{height:185px}.waffle-create-datasource-sheet-success-dialog-success-message{color:#202124;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:22px;font-weight:400;max-width:328px;margin:22px auto 16px auto}.waffle-create-datasource-sheet-success-dialog-success-description{color:#5f6368;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;letter-spacing:0.2px;line-height:20px;margin:8px auto 16px auto;max-width:392px}.waffle-create-datasource-sheet-success-dialog-datasource-info{color:#188038;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;letter-spacing:0.2px;line-height:20px}.waffle-create-datasource-sheet-success-dialog-metadata-wrapper{margin:auto}.waffle-create-datasource-sheet-success-dialog-delegation-wrapper{margin-bottom:16px}.waffle-create-datasource-sheet-success-dialog-start-analyze-button-wrapper{margin-bottom:16px}.waffle-create-datasource-sheet-success-dialog-watch-tutorial{color:#1a73e8;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;letter-spacing:0.3px;line-height:16px;text-decoration-line:none}.waffle-create-datasource-sheet-success-dialog .waffle-dataconnector-modal-footer{border-top:none}.waffle-dbobject-sidebar-footer-estimated-bytes-wrapper{display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;align-items:center;margin-left:16px;margin-right:16px}.waffle-dbobject-sidebar-footer{display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-webkit-justify-content:space-between;justify-content:space-between;align-items:center;background-color:white;border-top:1px solid #dadce0;color:#5f6368;height:64px}.waffle-dbobject-sidebar-footer-refresh-button-wrapper{margin-right:12px}.waffle-dbobject-sidebar-footer-refresh-button{text-transform:none}.waffle-filter-by-value-sidebar-header,.waffle-dbobject-sidebar-header{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;align-items:center;background-color:#fff;border-bottom:1px solid #dadce0;display:flex;flex-direction:row;height:33px;padding-left:18px}.waffle-filter-by-value-sidebar-header-column-name,.waffle-dbobject-sidebar-header-datasource-name{color:#3c4043;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;letter-spacing:0.3px;margin-left:8px;max-width:241px;overflow:hidden;padding-top:1px;text-overflow:ellipsis;white-space:nowrap}.waffle-dataconnector-delegation-widget-toggle{align-items:center;display:flex;justify-content:center}.waffle-dataconnector-delegation-widget-toggle-label{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px}.apps-ui-material-slide-toggle-container{margin-left:8px}.waffle-dbsource-endofpreview{border-top:1px solid #dadce0;box-sizing:border-box;display:block;height:160px;padding:24px;text-align:center;width:100%}.waffle-dbsource-endofpreview-wrapper{display:inline-block;max-width:550px}.waffle-dbsource-endofpreview.hc-enabled-gecko{background-color:black}.waffle-dbsource-endofpreview-enable-endofwaffle{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxIiBoZWlnaHQ9IjgiIHZpZXdCb3g9IjAgMCAxIDgiPiAgPGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSI+ICAgIDxwYXRoIGZpbGw9IiNEQURDRTAiIGQ9Ik0wIDNoMXYxSDB6TTAgN2gxdjFIMHoiLz4gICAgPHBhdGggZmlsbD0iI0YxRjNGNCIgZD0iTTAgMGgxdjNIMHpNMCA0aDF2M0gweiIvPiAgPC9nPjwvc3ZnPg==);background-repeat:repeat-x}.waffle-dbsource-endofpreview-enable-endofwaffle::before{background-color:#f3f3f3;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOSIgaGVpZ2h0PSI4IiB2aWV3Qm94PSIwIDAgMTkgOCI+ICA8ZyBmaWxsPSJub25lIj4gICAgPHBhdGggZmlsbD0iI0YxRjNGNCIgZD0iTTE4LjUgN2guNVY0aC02LjVjMS40IDEuOCAzLjYgMyA2IDN6Ii8+ICAgIDxwYXRoIGZpbGw9IiNEQURDRTAiIGQ9Ik0xOC41IDcuNWMtMi43IDAtNS4yLTEuNC02LjYtMy41aC0uNmMxLjUgMi40IDQuMiA0IDcuMiA0aC41di0uNWgtLjV6Ii8+ICAgIDxwYXRoIGZpbGw9IiNEQURDRTAiIGQ9Ik0xOC41IDcuNWguNVY3aC0uNWMtMi40IDAtNC42LTEuMi02LTNoLS42YzEuNCAyLjEgMy45IDMuNSA2LjYgMy41eiIvPiAgICA8cGF0aCBmaWxsPSIjRjFGM0Y0IiBkPSJNNy41IDNIMTlWMEgxLjVjMS40IDEuOCAzLjYgMyA2IDN6Ii8+ICAgIDxwYXRoIGZpbGw9IiNEQURDRTAiIGQ9Ik03LjUgMy41QzQuOCAzLjUgMi4zIDIuMS45IDBILjNjMS41IDIuNCA0LjIgNCA3LjIgNEgxOXYtLjVINy41eiIvPiAgICA8cGF0aCBmaWxsPSIjREFEQ0UwIiBkPSJNNy41IDMuNUgxOVYzSDcuNWMtMi40IDAtNC42LTEuMi02LTNILjljMS40IDIuMSAzLjkgMy41IDYuNiAzLjV6Ii8+ICA8L2c+PC9zdmc+);content:"";display:block;height:8px;left:0;position:absolute;top:1px;width:19px}.waffle-dbsource-endofpreview-enable-endofwaffle::after{background-color:#f3f3f3;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOSIgaGVpZ2h0PSI4IiB2aWV3Qm94PSIwIDAgMTkgOCI+ICA8ZyBmaWxsPSJub25lIj4gICAgPHBhdGggZmlsbD0iI0YxRjNGNCIgZD0iTTE4LjUgN2guNVY0aC02LjVjMS40IDEuOCAzLjYgMyA2IDN6Ii8+ICAgIDxwYXRoIGZpbGw9IiNEQURDRTAiIGQ9Ik0xOC41IDcuNWMtMi43IDAtNS4yLTEuNC02LjYtMy41aC0uNmMxLjUgMi40IDQuMiA0IDcuMiA0aC41di0uNWgtLjV6Ii8+ICAgIDxwYXRoIGZpbGw9IiNEQURDRTAiIGQ9Ik0xOC41IDcuNWguNVY3aC0uNWMtMi40IDAtNC42LTEuMi02LTNoLS42YzEuNCAyLjEgMy45IDMuNSA2LjYgMy41eiIvPiAgICA8cGF0aCBmaWxsPSIjRjFGM0Y0IiBkPSJNNy41IDNIMTlWMEgxLjVjMS40IDEuOCAzLjYgMyA2IDN6Ii8+ICAgIDxwYXRoIGZpbGw9IiNEQURDRTAiIGQ9Ik03LjUgMy41QzQuOCAzLjUgMi4zIDIuMS45IDBILjNjMS41IDIuNCA0LjIgNCA3LjIgNEgxOXYtLjVINy41eiIvPiAgICA8cGF0aCBmaWxsPSIjREFEQ0UwIiBkPSJNNy41IDMuNUgxOVYzSDcuNWMtMi40IDAtNC42LTEuMi02LTNILjljMS40IDIuMSAzLjkgMy41IDYuNiAzLjV6Ii8+ICA8L2c+PC9zdmc+);content:"";display:block;height:8px;position:absolute;right:0;top:1px;transform:scaleX(-1);width:19px}.waffle-dbsource-endofpreview-header{color:#3c4043;font:400 16px/20px "Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;letter-spacing:0.17px;padding-bottom:8px;text-align:center}.waffle-dbsource-endofpreview-message-line{color:#5f6368;font:400 12px/16px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;letter-spacing:0.3px;text-align:center}.waffle-dbsource-endofpreview-link-button{font:400 12px/16px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;text-decoration:none}.waffle-dbsource-pill{display:flex;background:white;border-radius:8px;box-shadow:0 4px 8px 3px rgba(60,64,67,.15);box-sizing:border-box;color:#4285f4;padding:6px;position:fixed;white-space:nowrap}.waffle-dbsource-pill-info{display:flex;font:400 14px/36px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;letter-spacing:0.2px}.waffle-dbsource-pill-preview-icon .waffle-dataconnector-preview-icon{margin-left:10px;position:relative;vertical-align:middle}.waffle-dbsource-pill-updated-icon .waffle-dataconnector-updated-icon{margin-left:10px;position:relative;vertical-align:middle}.waffle-dbsource-pill-status{color:#202124;margin-left:8px}.waffle-dbsource-pill-timestamp{color:#5f6368;height:36px;line-height:36px;margin:0 16px;white-space:nowrap}.waffle-dbsource-pill-progress{-webkit-align-items:center;align-items:center;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;height:36px;line-height:36px;margin:0 18px 0 10px}.waffle-dbsource-pill-progress .waffle-dataconnector-pill-spinner{border-radius:50%;box-shadow:inset 0 0 0 2px;color:#188038;display:inline-block;height:18px;margin:7px 0;position:relative;width:18px;margin-right:7px}.waffle-dbsource-pill-progress-message{color:#202124}.waffle-dbsource-pill-error-icon{margin-left:10px;width:24px}.waffle-dbsource-pill-error-icon .waffle-dataconnector-error-icon-filled{padding-left:2px;vertical-align:middle}.waffle-dbsource-pill .docs-material-button{font-size:14px;letter-spacing:0.25px}.waffle-dbsource-pill-refresh-button-apply{margin:0 8px 0 0;text-transform:none}.waffle-dbsource-pill-refresh-button-error{color:#202124}.waffle-dbsource-pill-edit-button{border-left:1px #dadce0 solid;padding-top:4px}.waffle-dbsource-pill-refresh-button-error.docs-material-button-flat-default.docs-material-button.docs-material-button-hover{background-color:rgba(60,64,67,0.04)}.waffle-dbsource-pill-refresh-button-error.docs-material-button-flat-default.docs-material-button.docs-material-button-active{background-color:rgba(60,64,67,0.16);color:#202124;line-height:36px}.waffle-dbsource-pill-refresh-button-error>.docs-material-button-ripple-element{background-color:rgba(60,64,67,0.10)}.waffle-dbsource-pill-showerror-button{color:#d93025;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;height:36px;line-height:36px;text-transform:none}.waffle-dbsource-pill-showerror-button.docs-material-button-flat-default.docs-material-button.docs-material-button-hover{background-color:rgba(234,67,53,0.04)}.waffle-dbsource-pill-showerror-button.docs-material-button-flat-default.docs-material-button.docs-material-button-active{background-color:rgba(234,67,53,0.16)}.waffle-dbsource-pill-showerror-button.docs-material-button-flat-default.docs-material-button.docs-material-button-no-focus-border{line-height:36px}.waffle-dbsource-pill-showerror-button.docs-material-button-flat-default.docs-material-button.docs-material-button-focused{border:none;line-height:36px;padding:0 8px}.waffle-dbsource-pill-showerror-button>.docs-material-button-ripple-element{background-color:rgba(234,67,53,0.10)}.waffle-dbsource-pill-menu-button{border:none;height:36px;margin:0;padding:0 6px}.waffle-dbsource-pill-menu-button .waffle-dataconnector-menu-icon{top:5px}.waffle-dbsource-pill-menu-button.docs-material-menu-button-flat-default-hover{background-color:#f8f9fa}.waffle-dbsource-pill-menu-button.docs-material-menu-button-flat-default-active,.waffle-dbsource-pill-menu-button.docs-material-menu-button-flat-default-focused{background-color:#f1f3f4;border:none;line-height:36px}.waffle-dbsource-pill-menu .goog-menuseparator{margin-bottom:0;margin-top:0}.waffle-dbsource-pill-menu.goog-menu .goog-menuitem{padding-left:11px}.waffle-dbsource-pill-menu svg{height:20px;margin-right:8px;position:relative;width:20px}.waffle-dbsource-pill-menuitem{-webkit-align-items:center;align-items:center;display:flex;height:36px;line-height:36px}.waffle-dbsource-pill-menuitem-generic-action{padding-left:27px}.waffle-dbsource-pill-menuitem-accel{margin-left:auto;padding:0 20px 0 40px;text-align:center;color:#9e9e9e}.waffle-dbsource-pill-menuitem-refreshquery-info svg{margin:0}.waffle-dbsource-pill-menuitem-refreshquery-info-progress{font-style:italic}.waffle-dbsource-pill-menuitem-refreshquery-info-error-button{color:#db4437;text-decoration:underline;white-space:nowrap}.waffle-dbsource-pill-menuitem-refreshquery-info-error-button:focus{outline:none}.waffle-dbsource-pill-menuitem-refreshquery-info-message{white-space:nowrap}.waffle-filter-filtercard{background-color:#f0f0f0;border-radius:8px;padding:8px}.waffle-filter-filtercard:not(:last-child){margin-bottom:8px}.waffle-filter-filtercard-top-row{-webkit-align-items:center;align-items:center;display:flex;padding-bottom:8px}.waffle-filter-filtercard-top-row>div{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.waffle-filter-filtercard-top-row>.waffle-filter-filtercard-label{-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-shrink:1;-ms-flex-negative:1;flex-shrink:1;overflow:hidden;text-overflow:ellipsis}.waffle-filter-filtercard-label{color:#424242;font-size:14px;padding-left:8px}.waffle-filter-filtercard-delete-button{transition:background-color 0.2s ease;background:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+ICA8cGF0aCBmaWxsPSIjZjBmMGYwIiBkPSJNMTkgNi40MUwxNy41OSA1IDEyIDEwLjU5IDYuNDEgNSA1IDYuNDEgMTAuNTkgMTIgNSAxNy41OSA2LjQxIDE5IDEyIDEzLjQxIDE3LjU5IDE5IDE5IDE3LjU5IDEzLjQxIDEyeiIvPjwvc3ZnPg==");background-color:#bfbfbf;border:0;border-radius:16px;cursor:pointer;height:16px;margin:8px;width:16px}.waffle-filter-filtercard-delete-button:hover{background-color:#aaa}.waffle-filter-filtercard .waffle-filter-filtercard-select .jfk-select{text-align:left;width:100%}.waffle-filterbox-container{color:#202124;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;line-height:32px;vertical-align:middle}.waffle-filterdropdown-filter-color{border:1px solid rgba(0,0,0,0.1);border-radius:50%;box-sizing:border-box;height:calc(10px*2);left:-15px;margin-top:calc(-1*10px);position:absolute;top:50%;width:calc(10px*2)}.waffle-filterdropdown-filter-color-text{padding-left:18px}.goog-menu.waffle-filterdropdown-filter-colors-menu{max-height:50vh;overflow-x:hidden;overflow-y:auto}.waffle-filterdropdown-filter-color-checkbox::after{content:"\002713";left:6px;position:absolute}.waffle-types-number-icon:after{content:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0wIDV2MmgydjhoMlY1SDB6bTUgMHYyaDR2Mkg3YTIgMiAwIDAwLTIgMnY0aDZ2LTJIN3YtMmgyYTIgMiAwIDAwMi0yVjdhMiAyIDAgMDAtMi0ySDV6bTcgMGg0YTIgMiAwIDAxMiAydjEuNWExLjUgMS41IDAgMDEtMS41IDEuNSAxLjUgMS41IDAgMDExLjUgMS41VjEzYTIgMiAwIDAxLTIgMmgtNHYtMmg0di0yaC0yVjloMlY3aC00VjV6IiBmaWxsPSIjNUY2MzY4Ii8+PC9zdmc+)}.waffle-types-text-icon:after{content:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0yIDRoMTB2Mkg4djlINlY2SDJWNHptOCA0aDZ2MmgtMnY1aC0ydi01aC0yVjh6IiBmaWxsPSIjNUY2MzY4Ii8+PC9zdmc+)}.waffle-types-date-icon:after{content:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xMyAzLjY2N2guNjY3QzE0LjQgMy42NjcgMTUgNC4yNjcgMTUgNXY5LjMzM2MwIC43MzQtLjYgMS4zMzQtMS4zMzMgMS4zMzRINC4zMzNjLS43NCAwLTEuMzMzLS42LTEuMzMzLTEuMzM0TDMuMDA3IDVjMC0uNzMzLjU4Ni0xLjMzMyAxLjMyNi0xLjMzM0g1VjIuMzMzaDEuMzMzdjEuMzM0aDUuMzM0VjIuMzMzSDEzdjEuMzM0ek00LjMzMyAxNC4zMzNoOS4zMzRWN0g0LjMzM3Y3LjMzM3oiIGZpbGw9IiM1RjYzNjgiLz48L3N2Zz4=)}.waffle-types-boolean-icon:after{content:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTkiIGhlaWdodD0iMTgiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbD0iIzVGNjM2OCIgZD0iTTkgM2gxLjV2MTJIOXoiLz48cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTcuOTUzIDQuOTgybC0uOTk0LS45OTRMNC45NyA1Ljk3NiAyLjk4MiAzLjk4OGwtLjk5NC45OTQgMS45ODkgMS45ODktMS45ODkgMS45ODguOTk0Ljk5NCAxLjk4OS0xLjk4OCAxLjk4OCAxLjk4OC45OTQtLjk5NEw1Ljk2NSA2Ljk3bDEuOTg4LTEuOTg5ek0xOC4wOCAxMC40ODVsLS45OTUtLjk5NC0zLjYgMy42LTEuNDktMS40OTEtLjk5NS45OTQgMi40ODUgMi40ODUuMTIxLS4xMiA0LjQ3My00LjQ3NHoiIGZpbGw9IiM1RjYzNjgiLz48L3N2Zz4=)}.waffle-types-boolean-icon:after,.waffle-types-date-icon:after,.waffle-types-number-icon:after,.waffle-types-text-icon:after{background:none;height:18px;width:18px}.goog-menu.waffle-dataconnector-tablepicker-filtered-menu{border:none;border-radius:0;box-shadow:none;box-sizing:border-box;max-height:auto;overflow-x:hidden;padding-top:2px;width:100%}.goog-menu.waffle-dataconnector-tablepicker-filtered-menu .goog-menu-filter{display:flex;background-color:#f8f9fa;border-radius:8px;height:40px;margin:0 24px 16px 24px;position:relative}.goog-menu.waffle-dataconnector-tablepicker-filtered-menu .goog-menu-filter:after{background:#e8eaed;bottom:-16px;content:'';display:block;height:1px;left:0;position:absolute;width:464px}.waffle-dataconnector-tablepicker-filtered-menu-icon-search{border-bottom:none;padding:11px 0 11px 13px;position:absolute}.waffle-dataconnector-tablepicker-filtered-menu-icon-info{border-bottom:none;border-radius:50%;box-sizing:border-box;height:24px;position:absolute;right:13px;top:8px;width:24px}.waffle-dataconnector-tablepicker-filtered-menu-icon-info:hover{background-color:#f1f3f4}.waffle-dataconnector-tablepicker-filtered-menu-icon-info:active{background-color:#e8eaed}.waffle-dataconnector-tablepicker-filtered-menu-icon-info .docs-material .docs-icon{margin:3px}.goog-menu.waffle-dataconnector-tablepicker-filtered-menu input{-ms-flex:1;-webkit-flex:1;flex:1;background:white;border:1px solid transparent;border-radius:8px;box-shadow:0 1px 3px 1px rgba(60,64,67,.15);font:400 14px/20px "Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;letter-spacing:0.17px;outline:0;padding:0 37px}.goog-menu.waffle-dataconnector-tablepicker-filtered-menu .goog-menu-content{max-height:223px;opacity:0;outline:none;overflow-x:hidden;overflow-y:auto;padding:16px 0 0 16px;position:relative}.waffle-bigquerydbsourcesettingsdialog-project-menu-wrapper .goog-menu.waffle-dataconnector-tablepicker-filtered-menu .goog-menu-content{max-height:261px}.waffle-dataconnector-tablepicker-filtered-menu-loading-bar-wrapper{height:4px;margin-top:-1px;position:absolute;width:100%}.waffle-dataconnector-tablepicker-filtered-menu-loading-bar-wrapper .docs-indeterminate-loading-bar{background-color:#e6f4ea;height:100%;overflow:hidden}.waffle-dataconnector-tablepicker-filtered-menu-loading-bar-wrapper .docs-indeterminate-loading-bar>div{-webkit-animation:loading-bar-animation 1.3s ease-in-out infinite;-moz-animation:loading-bar-animation 1.3s ease-in-out infinite;-o-animation:loading-bar-animation 1.3s ease-in-out infinite;animation:loading-bar-animation 1.3s ease-in-out infinite;background-color:#34a853;border-radius:2px;height:100%;left:0;position:absolute;right:0;top:0;transform:none}@keyframes loading-bar-animation{0%{transform:translateX(-50%) scaleX(0)}23%,54%{transform:translateX(0) scaleX(1)}77%,100%{transform:translateX(50%) scaleX(0)}}.waffle-dataconnector-tablepicker-filtered-menu-error-message{color:#5f6368;font-size:14px;line-height:20px;margin-left:8px;margin-right:24px;text-align:center}.waffle-info-icon-bubble.waffle-dataconnector-tablepicker-filtered-menu-info-bubble{background-color:#3c4043;border-radius:0;opacity:.9;padding:4px 8px}.waffle-dataconnector-tablepicker-filtered-menu-info-bubble .jfk-bubble-arrowup .jfk-bubble-arrowimplbefore,.waffle-dataconnector-tablepicker-filtered-menu-info-bubble .jfk-bubble-arrowup .jfk-bubble-arrowimplafter,.waffle-dataconnector-tablepicker-filtered-menu-info-bubble .jfk-bubble-arrowdown .jfk-bubble-arrowimplbefore,.waffle-dataconnector-tablepicker-filtered-menu-info-bubble .jfk-bubble-arrowdown .jfk-bubble-arrowimplafter{border-color:#3c4043 transparent}.waffle-dataconnector-tablepicker-filtered-menu-info-bubble-content{color:#fff;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:12px;line-height:14px;max-width:200px;text-align:center}.goog-menu .waffle-dataconnector-tablepicker-menuitem.goog-menuitem{border-radius:24px;box-sizing:border-box;line-height:36px;padding:0 16px;transition:background-color 100ms linear;white-space:nowrap;width:480px}.waffle-dataconnector-tablepicker-menuitem.goog-menuitem.goog-menuitem-highlight,.waffle-dataconnector-tablepicker-menuitem.goog-menuitem:focus{border-bottom:none;background-color:#e6f4ea;border-top:none;outline:none}.waffle-dataconnector-tablepicker-menuitem.goog-menuitem.goog-menuitem-highlight.goog-menuitem-active{background-color:#ceead6;border-top:none}.waffle-dataconnector-tablepicker-menuitem.goog-menuitem.goog-menuitem-highlight.goog-menuitem-active.goog-option-selected,.waffle-dataconnector-tablepicker-menuitem.goog-menuitem.goog-option-selected{background-color:#e6f4ea;background-image:none;cursor:auto}.docs-hc-gecko.waffle-dataconnector-tablepicker-menuitem.goog-menuitem.goog-menuitem-highlight,.docs-hc-ie.waffle-dataconnector-tablepicker-menuitem.goog-menuitem.goog-menuitem-highlight,.docs-hc-gecko.waffle-dataconnector-tablepicker-menuitem.goog-menuitem.goog-menuitem-highlight.goog-menuitem-active,.docs-hc-ie.waffle-dataconnector-tablepicker-menuitem.goog-menuitem.goog-menuitem-highlight.goog-menuitem-active,.docs-hc-gecko.waffle-dataconnector-tablepicker-menuitem.goog-menuitem.goog-menuitem-highlight.goog-menuitem-active.goog-option-selected,.docs-hc-ie.waffle-dataconnector-tablepicker-menuitem.goog-menuitem.goog-menuitem-highlight.goog-menuitem-active.goog-option-selected,.docs-hc-gecko.waffle-dataconnector-tablepicker-menuitem.goog-menuitem.goog-option-selected,.docs-hc-ie.waffle-dataconnector-tablepicker-menuitem.goog-menuitem.goog-option-selected{border:1px solid transparent}.waffle-dataconnector-tablepicker-menu-bottom-border .waffle-dataconnector-tablepicker-menuitem.goog-menuitem{padding-right:12px}.waffle-dataconnector-tablepicker-menuitem .goog-menuitem-content{font-size:13px}.waffle-dataconnector-tablepicker-menuitem-content-wrapper{display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;position:relative}.waffle-dataconnector-tablepicker-menuitem-content-wrapper .goog-menuitem-checkbox{display:none}.waffle-dataconnector-tablepicker-menuitem-content-name,.waffle-dataconnector-tablepicker-menuitem-content-id{display:inline-block;font:400 14px/24px Roboto,RobotoDraft,Helvetica,Arial,sans-serif}.waffle-dataconnector-tablepicker-menuitem-content-name{color:rgba(0,0,0,0.87);line-height:36px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.waffle-dataconnector-tablepicker-menuitem-content-wrapper-project .waffle-dataconnector-tablepicker-menuitem-content-name{padding-right:22px;width:176px}.waffle-dataconnector-tablepicker-menuitem-content-wrapper-dataset .waffle-dataconnector-tablepicker-menuitem-content-name{width:389px}.waffle-dataconnector-tablepicker-menuitem-content-id{color:rgba(0,0,0,0.54);line-height:36px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:191px}.waffle-dataconnector-tablepicker-menuitem-content-schemaicon{margin-right:8px;min-width:18px;width:18px}.waffle-dataconnector-tablepicker-menuitem-content-schemaicon svg{margin-right:5px;vertical-align:middle}.waffle-dataconnector-tablepicker-menuitem-content-schemaicon .waffle-dataconnector-tablepicker-filtered-menu-icon-search{padding:0px}.waffle-dataconnector-tablepicker-menuitem-content-nexticon{margin-left:auto;width:18px}.waffle-dataconnector-tablepicker-menuitem-content-nexticon svg{vertical-align:middle}.goog-menuitem-rtl .waffle-dataconnector-tablepicker-menuitem-content-nexticon{transform:rotateY(180deg)}.waffle-dataconnector-tablepicker-multilevelmenu{position:relative}.waffle-dataconnector-tablepicker-multilevelmenu,.waffle-dataconnector-tablepicker-multilevelmenu .goog-menu.waffle-dataconnector-tablepicker-menu{height:286px}.waffle-dataconnector-breadcrumbnavigator{display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;overflow:hidden;vertical-align:middle}.waffle-dataconnector-breadcrumbnavigator-entry{border:1px solid transparent;border-radius:4px;box-shadow:none;color:#202124;cursor:pointer;font-size:22px;letter-spacing:.2px;line-height:24px;overflow:hidden;padding:4px;text-overflow:ellipsis;transition:background-color 100ms linear;vertical-align:middle;white-space:nowrap}.waffle-dataconnector-breadcrumbnavigator-entry{flex:0 1 25%;min-width:45px}.waffle-dataconnector-breadcrumbnavigator-entry-condensed{flex:0 1 10%}.waffle-dataconnector-breadcrumbnavigator-entry:last-of-type{flex:none}.waffle-dataconnector-breadcrumbnavigator-entry.goog-control-hover,.waffle-dataconnector-breadcrumbnavigator-entry.goog-control-focused{background-color:#f1f3f4;outline:none}.waffle-dataconnector-breadcrumbnavigator-entry.goog-control-active{background-color:#e8eaed;outline:none}.waffle-dataconnector-breadcrumbnavigator-entry.goog-control-disabled{cursor:auto}.waffle-dataconnector-breadcrumbnavigator-separator{vertical-align:middle}.waffle-dataconnector-modal-title .waffle-dataconnector-breadcrumbnavigator-separator svg{bottom:unset;height:18px;margin-right:0;transform:unset;vertical-align:middle;width:18px}.waffle-dataconnector-modal-title .waffle-dataconnector-breadcrumbnavigator-separator polygon{fill:#5f6368}.waffle-dataconnector-prompt{background:#fff;border-radius:2px;border:none;box-shadow:0px 16px 24px 2px rgba(0,0,0,0.14),0px 6px 30px 5px rgba(0,0,0,0.12),0px 8px 10px -5px rgba(0,0,0,0.2);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;position:absolute;z-index:1302}.waffle-dataconnector-prompt-bg{left:0;position:absolute;top:0;z-index:1300}.waffle-dataconnector-prompt:focus{outline:none}.waffle-dataconnector-prompt-title{padding:24px 24px 20px 24px}.waffle-dataconnector-prompt-title-text{font:500 21px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;padding-right:38px}.waffle-dataconnector-prompt-title-close{background-size:cover;background:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgdmlld0JveD0iMCAwIDE4IDE4Ij4KICA8ZyBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgPHBhdGggZD0iTTAsMCBMMTgsMCBMMTgsMTggTDAsMTggTDAsMCBaIE0wLDAgTDE4LDAgTDE4LDE4IEwwLDE4IEwwLDAgWiIvPgogICAgPHBvbHlnb24gZmlsbD0iIzAwMCIgcG9pbnRzPSIxNC41MyA0LjUzIDEzLjQ3IDMuNDcgOSA3Ljk0IDQuNTMgMy40NyAzLjQ3IDQuNTMgNy45NCA5IDMuNDcgMTMuNDcgNC41MyAxNC41MyA5IDEwLjA2IDEzLjQ3IDE0LjUzIDE0LjUzIDEzLjQ3IDEwLjA2IDkiLz4KICA8L2c+Cjwvc3ZnPgo=") no-repeat;display:block;height:20px;position:absolute;right:24px;top:26px;width:20px}.waffle-dataconnector-prompt-content{padding:0 24px}.waffle-dataconnector-prompt-buttons{float:right;padding:8px 4px 14px 4px}.waffle-dataconnector-prompt-buttons:after{clear:both;content:"";display:block;height:0;width:0}.waffle-dataconnector-modal{background:#fff;border-radius:2px;border:none;box-shadow:0px 16px 24px 2px rgba(0,0,0,0.14),0px 6px 30px 5px rgba(0,0,0,0.12),0px 8px 10px -5px rgba(0,0,0,0.2);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;position:absolute;z-index:1003}.waffle-dataconnector-modal.docs-material-gm-dialog{border-radius:8px;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif}.waffle-dataconnector-modal-bg{background-color:rgba(0,0,0,0.54);z-index:1002}.waffle-dataconnector-modal:focus{outline:none}.waffle-dataconnector-modal-header{display:flex;-webkit-justify-content:space-between;justify-content:space-between;border-bottom:1px solid rgba(0,0,0,0.12);padding:24px;user-select:none}.waffle-dataconnector-modal-title{font-weight:500;font-size:18px;padding-right:38px}.docs-material-gm-dialog .waffle-dataconnector-modal-title{color:#202124;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:400;font-size:22px}.waffle-dataconnector-modal-title svg{-webkit-transform:scale(1.4,1.4);-moz-transform:scale(1.4,1.4);-ms-transform:scale(1.4,1.4);-o-transform:scale(1.4,1.4);transform:scale(1.4,1.4);bottom:-0.125em;font-size:18px;height:1em;margin-right:8px;position:relative;width:1em}.docs-material-gm-dialog .waffle-dataconnector-modal-title svg path{fill:#5f6368}.waffle-dataconnector-modal-close-button{background:transparent;border-radius:50%;cursor:pointer;display:block;height:28px;opacity:0.54;position:relative;transition:background-color 0.28s ease-out,opacity 0.28s ease-out;width:28px}.waffle-dataconnector-modal-close-button svg{height:18px;margin:5px;width:18px}.waffle-dataconnector-modal-close-button:focus{opacity:1.0;background-color:rgba(0,0,0,0.12);outline:none}.waffle-dataconnector-modal-close-button:hover{opacity:1.0}.waffle-dataconnector-modal-body{padding:24px}.waffle-dataconnector-modal-footer{border-top:1px solid rgba(0,0,0,0.12);padding:15px 12px 15px 24px}.docs-hc-gecko.waffle-dataconnector-modal-close-button polygon,.docs-hc-ie.waffle-dataconnector-modal-close-button polygon{fill:#fff}.waffle-dataconnector-bigqueryquerysettingsdialog{width:512px}.waffle-dataconnector-bigqueryquerysettingsdialog .waffle-dataconnector-modal-body{height:283px;padding:0}.waffle-dataconnector-bigqueryquerysettingsdialog-project-select-wrapper{width:100%}.waffle-dataconnector-bigqueryquerysettingsdialog-project-select-header{font-weight:700;margin:16px 0}.waffle-dataconnector-bigqueryquerysettingsdialog-project-section{padding:24px}.waffle-dataconnector-bigqueryquerysettingsdialog-project-select .docs-material-labeled-select-label{color:rgba(0,0,0,0.87);font-size:14px;font-weight:500}.waffle-dataconnector-bigqueryquerysettingsdialog-error-caption{color:#e06055;margin-top:8px}.waffle-dataconnector-bigqueryquerysettingsdialog-project-select .docs-material-labeled-select-outer-box{margin-top:16px}.waffle-dataconnector-bigqueryquerysettingsdialog .waffle-dataconnector-modal-footer{border-top:none;padding:0}.waffle-dataconnector-bigqueryquerysettingsdialog-continue-button-wrapper{display:flex}.waffle-dataconnector-bigqueryquerysettingsdialog-continue-button-wrapper>p{color:rgba(0,0,0,0.54);flex:1;margin:14px 24px}.waffle-dataconnector-bigqueryquerysettingsdialog-continue-button{margin:16px 24px}.waffle-dataconnector-bigqueryquerysettingsdialog-continue-button-wrapper:after{clear:both;content:"";display:block;height:0;width:0}.waffle-dataconnector-footer-sharing-message{background-color:#fafafa;color:rgba(0,0,0,0.54);padding:16px 24px 24px 60px;position:relative}.waffle-dataconnector-footer-sharing-message:after{background-size:contain;background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNHB4IiBoZWlnaHQ9IjI0cHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0iIzAwMDAwMCI+CiAgICA8cGF0aCBkPSJNMCAwaDI0djI0SDB6IiBmaWxsPSJub25lIi8+CiAgICA8cGF0aCBkPSJNMTggOGgtMVY2YzAtMi43Ni0yLjI0LTUtNS01UzcgMy4yNCA3IDZ2Mkg2Yy0xLjEgMC0yIC45LTIgMnYxMGMwIDEuMS45IDIgMiAyaDEyYzEuMSAwIDItLjkgMi0yVjEwYzAtMS4xLS45LTItMi0yem0tNiA5Yy0xLjEgMC0yLS45LTItMnMuOS0yIDItMiAyIC45IDIgMi0uOSAyLTIgMnptMy4xLTlIOC45VjZjMC0xLjcxIDEuMzktMy4xIDMuMS0zLjEgMS43MSAwIDMuMSAxLjM5IDMuMSAzLjF2MnoiLz4KPC9zdmc+Cg==");content:"";display:block;height:18px;left:27px;opacity:0.54;position:absolute;top:23px;width:18px}.waffle-dataconnector-dialog{background:#fff;border-radius:2px;border:none;box-shadow:0px 16px 24px 2px rgba(0,0,0,0.14),0px 6px 30px 5px rgba(0,0,0,0.12),0px 8px 10px -5px rgba(0,0,0,0.2);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;position:absolute;z-index:1003}.waffle-dataconnector-dialog-bg{background-color:#000;left:0;position:absolute;top:0;z-index:1002}.waffle-dataconnector-dialog:focus{outline:none}.waffle-dataconnector-dialog-title{border-bottom:1px solid rgba(0,0,0,0.12);padding:24px}.waffle-dataconnector-dialog-title-draggable{cursor:move}.waffle-dataconnector-dialog-title-text{font:500 21px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;padding-right:38px}.waffle-dataconnector-dialog-title-close{border-radius:50%;cursor:pointer;display:block;height:28px;opacity:0.54;position:absolute;right:18px;top:22px;transition:background-color 0.28s ease-out,opacity 0.28s ease-out;width:28px}.waffle-dataconnector-dialog-title-close svg{-webkit-transform:translate(-50%,-50%);-moz-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);-o-transform:translate(-50%,-50%);transform:translate(-50%,-50%);position:absolute;left:50%;top:50%}.waffle-dataconnector-dialog-title-close:focus{opacity:1.0;background-color:rgba(0,0,0,0.12);outline:none}.waffle-dataconnector-dialog-title-close:hover{background-color:rgba(0,0,0,0.26);opacity:1.0}.waffle-dataconnector-dialog-content{padding:24px}.waffle-dataconnector-dialog-buttons{padding:15px 12px 15px 24px}.waffle-dataconnector-dialog-button-wrapper{float:right}.waffle-dataconnector-dialog-button-wrapper>.docs-material-button{float:left}.waffle-dataconnector-dialog-buttons:after{clear:both;content:'';display:block;height:0;width:0}.waffle-dataconnector-dialog-error-message,.waffle-dataconnector-dialog-info-message{color:rgba(0,0,0,0.87);display:block;font:500 13px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;line-height:18px;margin:7px 0 7px 0px;position:relative;vertical-align:middle}.waffle-dataconnector-dialog-error-message{padding-left:24px;color:#db4437}.waffle-dataconnector-dialog-error-message:before{background-size:cover;background:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgdmlld0JveD0iMCAwIDE4IDE4Ij4KICA8ZyBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgPHBvbHlnb24gcG9pbnRzPSIwIDAgMTggMCAxOCAxOCAwIDE4Ii8+CiAgICA8cGF0aCBmaWxsPSIjZGI0NDM3IiBkPSJNMTUuNDk5ODkzOCwxNiBDMTYuNjA0NTIyLDE2IDE3LjA1NDk3MDgsMTUuMjE0NjU0MyAxNi41MTY2MzgyLDE0LjI2NDY1NTcgTDkuOTgzMzYxNzYsMi43MzUzNDQyOCBDOS40NDAyNjYwNiwxLjc3Njk0MDEgOC41NTQ5NzA3OSwxLjc4NTM0NTY2IDguMDE2NjM4MjQsMi43MzUzNDQyOCBMMS40ODMzNjE3NiwxNC4yNjQ2NTU3IEMwLjk0MDI2NjA1NSwxNS4yMjMwNTk5IDEuMzkwMDU4NDEsMTYgMi41MDAxMDYxOCwxNiBMMTUuNDk5ODkzOCwxNiBaIE0xMCwxNCBMOCwxNCBMOCwxMiBMMTAsMTIgTDEwLDE0IEwxMCwxNCBaIE0xMCwxMSBMOCwxMSBMOCw3IEwxMCw3IEwxMCwxMSBMMTAsMTEgWiIvPgogIDwvZz4KPC9zdmc+Cg==") no-repeat;content:'';display:inline-block;height:18px;left:0px;position:absolute;top:0;width:18px}.waffle-dataconnector-dialog-message-container{float:left;min-height:32px;min-width:200px;width:calc(100% - 260px)}.waffle-dataconnector-dialog-progress-message{margin-left:20px}.waffle-dataconnector-dialog-progress-label{font:13px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;line-height:18px}.waffle-dataconnector-dialog-progress-bar{height:5px;width:450px}.waffle-dataconnector-error-popup{max-width:780px;min-width:480px}.waffle-dataconnector-error-popup .waffle-dataconnector-prompt-content{padding:0 24px;overflow:auto}.waffle-dataconnector-error-popup .waffle-dataconnector-error-message-main{font:500 15px Roboto,RobotoDraft,Helvetica,Arial,sans-serif}.waffle-dataconnector-query-parameter-prompt.waffle-dataconnector-modal{width:320px;z-index:calc(1003 + 300)}.waffle-dataconnector-query-parameter-prompt .waffle-dataconnector-modal-body{padding:0 24px}.waffle-dataconnector-query-parameter-prompt-name-field input{text-transform:uppercase}.waffle-dataconnector-query-parameter-prompt-toggle-row{display:flex;height:21px;margin-top:16px}.waffle-dataconnector-query-parameter-prompt-toggle-label{line-height:21px;margin-left:8px}.waffle-dataconnector-query-parameter-prompt .waffle-dataconnector-modal-header{border-bottom:none}.waffle-dataconnector-query-parameter-prompt .waffle-dataconnector-modal-footer{border-top:none;float:right}.waffle-dataconnector-query-parameter-prompt-rangepicker{border-radius:50%;bottom:6px;height:29px;position:relative;right:0;width:29px}.waffle-dataconnector-query-parameter-prompt-rangepicker .docs-icon{margin:4px auto 4px 3px}.waffle-dataconnector-query-parameter-prompt-rangepicker-focused{background:rgba(0,0,0,0.12);outline:none}.waffle-dataconnector-simple-text-input-prompt-text-field{width:400px}.waffle-dataconnector-bigquery-query-settings-widget-project-section-header{color:rgba(0,0,0,0.54);margin-bottom:4px;whitespace:nowrap}.waffle-dataconnector-bigquery-query-settings-widget-alert{color:#e06055;font-size:11px;font-weight:500}.waffle-dataconnector-bigquery-query-settings-widget-alert .waffle-dataconnector-error-icon{bottom:-0.325em;height:1.4em;margin-right:4px;position:relative;width:1.4em}.waffle-dataconnector-bigquery-query-settings-widget-alert-description{color:#e06055;margin-top:4px}.waffle-dataconnector-bigquery-query-validation-widget-open-button{border-radius:50%;bottom:8px;box-sizing:border-box;cursor:pointer;height:20px;position:absolute;right:8px;width:20px;z-index:10}.waffle-dataconnector-bigquery-query-validation-widget-open-button .waffle-dataconnector-info-icon{height:100%;width:100%}.waffle-dataconnector-bigquery-query-validation-widget-open-button-hover,.waffle-dataconnector-bigquery-query-validation-widget-open-button-focused{background:rgba(66,133,244,0.26)}.waffle-dataconnector-bigquery-query-validation-widget-bar{display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between;background:rgba(66,133,244,0.12);border-top:1px solid rgba(0,0,0,0.12);bottom:0;box-sizing:border-box;color:#4285f4;display:none;font:inherit;font-weight:500;max-height:60px;min-height:40px;padding:8px;padding-left:16px;position:relative;right:0;width:100%}.waffle-dataconnector-bigquery-query-validation-widget-message{max-height:44px;max-width:calc(100% - 30px);overflow-x:hidden;overflow-y:auto}.waffle-dataconnector-bigquery-query-validation-widget-visible>.waffle-dataconnector-bigquery-query-validation-widget-bar{display:flex}.waffle-dataconnector-bigquery-query-validation-widget-visible>.waffle-dataconnector-bigquery-query-validation-widget-open-button{display:none}.waffle-dataconnector-bigquery-query-validation-widget-bar .waffle-dataconnector-error-icon-filled{height:20px;margin-right:8px;min-width:20px;width:20px}.waffle-dataconnector-bigquery-query-validation-widget-valid>.waffle-dataconnector-bigquery-query-validation-widget-bar{background:rgba(15,157,88,0.12);color:#0f9d58}.waffle-dataconnector-bigquery-query-validation-widget-bar .waffle-dataconnector-info-icon{height:20px;margin-right:8px;min-width:20px;width:20px}.waffle-dataconnector-bigquery-query-validation-widget-valid .waffle-dataconnector-info-icon,.waffle-dataconnector-bigquery-query-validation-widget-invalid .waffle-dataconnector-info-icon{display:none}.waffle-dataconnector-bigquery-query-validation-widget .waffle-dataconnector-error-icon-filled{display:none}.waffle-dataconnector-bigquery-query-validation-widget-bar .waffle-dataconnector-error-icon-filled{margin-right:8px}.waffle-dataconnector-bigquery-query-validation-widget .waffle-dataconnector-valid-icon{display:none}.waffle-dataconnector-bigquery-query-validation-widget-bar .waffle-dataconnector-valid-icon{height:20px;margin-right:8px;min-width:20px;width:20px}.waffle-dataconnector-bigquery-query-validation-widget-invalid .waffle-dataconnector-bigquery-query-validation-widget-bar{background:rgba(219,68,55,0.12);color:#db4437}.waffle-dataconnector-bigquery-query-validation-widget-invalid .waffle-dataconnector-error-icon-filled{display:block}.waffle-dataconnector-bigquery-query-validation-widget-valid .waffle-dataconnector-valid-icon{display:block}.waffle-dataconnector-bigquery-query-validation-widget-close-button{border-radius:50%;cursor:pointer;height:24px;margin-left:auto;width:24px}.waffle-dataconnector-bigquery-query-validation-widget-close-button svg{height:20px;margin:2px;width:20px}.waffle-dataconnector-bigquery-query-validation-widget .waffle-dataconnector-close-icon polygon{fill:#4285f4}.waffle-dataconnector-bigquery-query-validation-widget-close-button-hover,.waffle-dataconnector-bigquery-query-validation-widget-close-button-focused{background:rgba(66,133,244,0.26);outline:none}.waffle-dataconnector-bigquery-query-validation-widget-invalid .waffle-dataconnector-bigquery-query-validation-widget-close-button-hover,.waffle-dataconnector-bigquery-query-validation-widget-invalid .waffle-dataconnector-bigquery-query-validation-widget-close-button-focused{background:rgba(219,68,55,0.26)}.waffle-dataconnector-bigquery-query-validation-widget-valid .waffle-dataconnector-bigquery-query-validation-widget-close-button-hover,.waffle-dataconnector-bigquery-query-validation-widget-valid .waffle-dataconnector-bigquery-query-validation-widget-close-button-focused{background:rgba(15,157,88,0.26)}.waffle-dataconnector-bigquery-query-validation-widget-valid .waffle-dataconnector-close-icon polygon{fill:#0f9d58}.waffle-dataconnector-bigquery-query-validation-widget-invalid .waffle-dataconnector-close-icon polygon{fill:#db4437}.waffle-dataconnector-codemirrorquerytexteditor{-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;height:100%;position:relative}.waffle-dataconnector-codemirrorquerytexteditor,.waffle-dataconnector-codemirrorquerytexteditor .CodeMirror{font-family:'Roboto Mono','Consolas',monospace;height:100%}.waffle-dataconnector-codemirrorquerytexteditor .CodeMirror-gutters{border-right:1px solid rgba(0,0,0,0.12)}.waffle-dataconnector-codemirrorquerytexteditor>.CodeMirror-focused .CodeMirror-gutters{border-right:1px solid #4285f4}.waffle-dataconnector-codemirrorquerytexteditor .CodeMirror-linenumbers{background:#f5f5f5;color:rgba(0,0,0,0.54);font:500 14px Roboto,RobotoDraft,Helvetica,Arial,sans-serif}.waffle-dataconnector-codemirrorquerytexteditor .CodeMirror-gutter-elt{min-width:0;padding:0 20px}.waffle-dataconnector-codemirrorquerytexteditor .CodeMirror-lines{padding:16px 0}.waffle-dataconnector-codemirrorquerytexteditor .CodeMirror-line{padding-left:16px}.waffle-dataconnector-queryeditor-collapsible-sidebar-widget{border-bottom:1px solid rgba(0,0,0,0.12)}.waffle-dataconnector-queryeditor-collapsible-sidebar-widget .docs-charts-editor-collapsible-header{color:rgba(0,0,0,0.87)}.waffle-dataconnector-queryeditor-query-settings-icon{margin-right:8px}.waffle-dataconnector-queryeditor-collapsible-sidebar-widget .docs-charts-editor-collapsible-title{width:calc(100% - 50px)}.waffle-dataconnector-queryeditor-collapsible-sidebar-widget .docs-charts-editor-collapsible-summary{display:none}.waffle-dataconnector-queryeditor-collapsible-sidebar-widget .docs-charts-editor-collapsible-content>div{padding:8px 16px 16px}.waffle-dataconnector-queryeditor-collapsible-sidebar-widget .docs-charts-editor-collapsible-header{border:1px solid transparent}.waffle-dataconnector-queryeditor-collapsible-sidebar-widget .docs-charts-editor-collapsible-header.goog-control-focused{border:1px solid #4285f4}.waffle-dataconnector-dbschematreenode-label{cursor:pointer;display:flex;height:22px;position:relative;width:100%}.waffle-dataconnector-dbschematreenode-title{height:22px;line-height:22px;max-width:calc(100% - 18px - 10px);overflow:hidden;text-overflow:ellipsis;vertical-align:middle;white-space:nowrap}.waffle-dataconnector-dbschematreenode .waffle-dataconnector-expand-icon{width:18px;height:18px;margin:2px 10px 2px 2px;transform:rotate(-90deg);transition:transform .2s cubic-bezier(0.4,0.0,1,1)}.waffle-dataconnector-dbschematreenode-rtl .waffle-dataconnector-expand-icon{transform:rotate(90deg)}.waffle-dataconnector-dbschematreenode .waffle-spinner{height:14px;margin:4px 12px 4px 4px;width:14px}.waffle-dataconnector-dbschematreenode .waffle-spinner-circle{border-width:2px}.waffle-dataconnector-dbschematreenode>.waffle-dataconnector-dbschematreenode-label>.waffle-dataconnector-dbschematreenode-spinner-container{display:none}.waffle-dataconnector-dbschematreenode-loading>.waffle-dataconnector-dbschematreenode-label>.waffle-dataconnector-dbschematreenode-spinner-container{display:block}.waffle-dataconnector-dbschematreenode-loading>.waffle-dataconnector-dbschematreenode-label>.waffle-dataconnector-expand-icon{display:none}.waffle-dataconnector-dbschematreenode-open>.waffle-dataconnector-dbschematreenode-label>.waffle-dataconnector-expand-icon{transform:rotate(0deg)}.waffle-dataconnector-dbschematreenode-leaf>.waffle-dataconnector-dbschematreenode-label>.waffle-dataconnector-expand-icon{visibility:hidden}.waffle-dataconnector-dbschematreenode-label:hover,.waffle-dataconnector-dbschematreenode-selected>.waffle-dataconnector-dbschematreenode-label{color:#4285f4}.waffle-dataconnector-dbschematreenode-child-container{display:none;margin-left:16px}.waffle-dataconnector-dbschematreenode-open>.waffle-dataconnector-dbschematreenode-child-container{display:block}.waffle-dataconnector-dbschematreenode-error .waffle-dataconnector-dbschematreenode-title{color:#e06055;font-size:11px;padding-left:13px}.waffle-dataconnector-dbschematreenode-error .waffle-dataconnector-expand-icon{display:none}.waffle-dataconnector-draggablebar{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:rgba(0,0,0,0.12);bottom:0;position:absolute}.waffle-dataconnector-draggablebar-horizontal{width:100%}.waffle-dataconnector-draggablebar-vertical{height:100%}.waffle-dataconnector-draggablebar-handle{background:#fff;border:1px solid rgba(0,0,0,0.12);box-sizing:border-box;z-index:100}.waffle-dataconnector-draggablebar-horizontal .waffle-dataconnector-draggablebar-handle{cursor:row-resize;height:9px;left:calc(50% - 32px/2);position:absolute;top:calc(50% - 9px/2);width:32px}.waffle-dataconnector-draggablebar-vertical .waffle-dataconnector-draggablebar-handle{background:transparent;border:1px solid rgba(0,0,0,0.12);cursor:col-resize;height:32px;left:calc(50% - 9px/2);position:absolute;top:calc(50% - 32px/2);width:9px}.waffle-dataconnector-draggablebar-handle-icon{background:rgba(0,0,0,0.12);border:3px solid #fff;box-sizing:border-box;height:100%;width:100%}.waffle-dataconnector-textarea-editor{-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;height:100%;position:relative}.waffle-dataconnector-textarea-editor-textareawrapper{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border-radius:0;border:none;height:100%;margin:0;overflow:hidden;position:absolute;width:100%}.waffle-dataconnector-textarea-editor-textarea{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background-color:white;border-radius:0;border:none;color:#000;display:block;font-family:'Roboto Mono','Consolas',monospace;font-size:13px;height:100%;line-height:20px;margin:0 0 0 48px;outline:none;overflow:auto;overflow-wrap:normal;padding:8px;resize:none;white-space:pre;width:calc(100% - 48px);word-wrap:normal}.waffle-dataconnector-textarea-editor-linegutter{background:#f5f5f5;border-right:1px solid rgba(0,0,0,0.12);height:100%;left:0;position:absolute;top:0;width:48px}.waffle-dataconnector-textarea-editor-focused .waffle-dataconnector-textarea-editor-linegutter{border-right:1px solid #4285f4}.waffle-dataconnector-textarea-editor-linenumber-container{left:0;padding-top:8px;position:absolute;width:100%}.waffle-dataconnector-textarea-editor-linenumber{height:20px;line-height:20px;text-align:center;user-select:none;vertical-align:middle}.waffle-dataconnector-jdbc-query-settings-widget-connection-name-section{font-family:inherit}.waffle-dataconnector-jdbc-query-settings-widget-connection-name-section{margin-top:8px}.waffle-dataconnector-jdbc-query-settings-widget-connection-name-label{color:rgba(0,0,0,0.54)}.waffle-dataconnector-jdbc-query-settings-widget-connection-name{color:rgba(0,0,0,0.87);font-weight:500;margin-top:8px}.waffle-dataconnector-jdbc-query-settings-widget-connection-name-error{color:#e06055}.waffle-dataconnector-jdbc-query-settings-widget-change-button{left:-8px;margin:8px 0;position:relative}.waffle-dataconnector-plx-query-settings-widget{font:inherit}.waffle-dataconnector-plx-query-settings-widget-engine-section{margin-top:8px}.waffle-dataconnector-plx-query-settings-widget-script-section{margin-top:16px}.waffle-dataconnector-plx-query-settings-widget-script-section .waffle-dataconnector-removable-chip{margin-top:8px}.waffle-dataconnector-plx-query-settings-widget-script-label{font-size:11px}.waffle-dataconnector-plx-query-settings-widget-link-script-button{margin:8px 0 0 0}.waffle-dataconnector-modal.waffle-dataconnector-newqueryeditor{display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;height:calc(100% - 16px);max-height:640px;min-height:400px;width:832px}.waffle-dataconnector-modal.waffle-dataconnector-newqueryeditor.docs-material-gm-dialog{width:880px}.waffle-dataconnector-newqueryeditor .waffle-dataconnector-modal-body{display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;max-height:457px;padding:0}.waffle-dataconnector-newqueryeditor.docs-material-gm-dialog .waffle-dataconnector-modal-body{padding:0 24px 24px}.waffle-dataconnector-newqueryeditor.docs-material-gm-dialog .waffle-dataconnector-modal-header{border:none}.waffle-dataconnector-newqueryeditor .waffle-dataconnector-newqueryeditor-container{display:flex;-ms-flex-direction:row-reverse;-webkit-flex-direction:row-reverse;flex-direction:row-reverse;-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;-webkit-justify-content:space-between;justify-content:space-between;height:100%;overflow:hidden;position:relative}.waffle-dataconnector-newqueryeditor.docs-material-gm-dialog .waffle-dataconnector-newqueryeditor-container{border:1px solid rgba(0,0,0,0.12);border-radius:4px}.waffle-dataconnector-newqueryeditor-main{border-right:1px solid rgba(0,0,0,0.12);overflow:hidden;position:relative;width:576px}.waffle-dataconnector-newqueryeditor-sidebar{box-sizing:border-box;overflow-x:hidden;overflow-y:auto;width:calc(100% - 576px)}.waffle-dataconnector-newqueryeditor-preview-pane{bottom:0;height:0;position:absolute;overflow:hidden;width:100%}.waffle-dataconnector-newqueryeditor-info-pane:after{clear:both;content:"";display:block;height:0;width:0}.waffle-dataconnector-newqueryeditor .waffle-dataconnector-modal-footer{display:flex;align-items:center;border-top:1px solid rgba(0,0,0,0.12);padding:16px}.waffle-dataconnector-newqueryeditor-footer-message-container{display:flex;-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;align-items:center;height:48px;margin:0 8px;overflow:auto}.waffle-dataconnector-newqueryeditor-footer-message{color:rgba(0,0,0,0.54)}.waffle-dataconnector-newqueryeditor-footer-message .waffle-dataconnector-error-message:before{content:"";display:block;height:20px}.waffle-dataconnector-newqueryeditor-footer-message .waffle-dataconnector-error-message:after{content:"";display:block;height:20px}.waffle-dataconnector-newqueryeditor-footer-message-container .waffle-dataconnector-error-icon{display:none;margin-right:8px;height:24px;min-width:24px;width:24px}.waffle-dataconnector-newqueryeditor-footer-message-container.waffle-dataconnector-newqueryeditor-unhandled-error>.waffle-dataconnector-newqueryeditor-footer-message{color:#db4437}.waffle-dataconnector-newqueryeditor-footer-message-container.waffle-dataconnector-newqueryeditor-unhandled-error .waffle-dataconnector-error-icon{display:block}.waffle-dataconnector-newqueryeditor-preview-query-button,.waffle-dataconnector-newqueryeditor-execute-query-button{min-width:140px;white-space:nowrap}.waffle-dataconnector-newqueryeditor-preview-query-button .waffle-dataconnector-refresh-icon{height:24px;margin:4px;width:24px}.waffle-dataconnector-newqueryeditor-preview-query-button .waffle-dataconnector-refresh-icon path{fill:#4285f4}.waffle-dataconnector-newqueryeditor-preview-query-button.docs-material-button-disabled .waffle-dataconnector-refresh-icon path{fill:rgba(0,0,0,0.26)}.waffle-dataconnector-newqueryeditor-editor-pane{display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;height:100%;position:relative;overflow:hidden}.waffle-dataconnector-newqueryeditor-sidebar::-webkit-scrollbar-thumb{background:rgba(0,0,0,0.12);min-height:0;width:8px}.waffle-dataconnector-newqueryeditor-sidebar::-webkit-scrollbar-track{border:none;padding:0;width:8px}.waffle-dataconnector-newqueryeditor-sidebar::-webkit-scrollbar{width:8px;border-left:1px solid rgba(0,0,0,0.12)}.waffle-dataconnector-queryeditor-queryparameterchip-name{font-weight:700}.waffle-dataconnector-queryeditor-removable-chip-error .waffle-dataconnector-queryeditor-queryparameterchip-name{color:#db4437}.waffle-dataconnector-queryeditor-queryparameterwidget .waffle-dataconnector-queryeditor-removable-chip{margin:8px 0}.waffle-dataconnector-queryeditor-queryparameterwidget-header{display:flex;-webkit-align-items:center;align-items:center;height:100%}.waffle-dataconnector-queryeditor-queryparameterwidget-header .waffle-dataconnector-query-parameters-icon{height:18px;margin-right:8px;min-width:18px;width:18px}.waffle-dataconnector-queryeditor-queryparameterwidget .waffle-dataconnector-queryeditor-removable-chip{margin-bottom:0}.waffle-dataconnector-queryeditor-queryparameterwidget-add-parameter-button{margin:8px 0 0 0}.waffle-dataconnector-querypreviewrenderer{height:100%;width:100%}.waffle-dataconnector-querypreviewrenderer-canvas-viewport{background:#f3f3f3;direction:ltr;height:100%;overflow:scroll;width:100%}.waffle-dataconnector-querypreviewrenderer-canvas-viewport.native-scrollbar{position:static}.waffle-dataconnector-querypreviewrenderer-preview-overlay{background:rgba(0,0,0,0.12);height:100%;left:0;line-height:80px;opacity:0;position:absolute;text-align:center;top:0;transition:opacity 0.3s ease-in,visibility 0s linear 0.3s;vertical-align:middle;visibility:hidden;width:100%;z-index:2}.waffle-dataconnector-querypreviewrenderer-preview-overlay-text{-webkit-transform:translate(-50%,-50%);-moz-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);-o-transform:translate(-50%,-50%);transform:translate(-50%,-50%);background:rgba(0,0,0,0.54);border-radius:4px;box-shadow:0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12),0px 2px 4px -1px rgba(0,0,0,0.2);color:white;font:500 21px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;left:50%;max-width:80%;padding:20px;position:absolute;top:50%}.waffle-dataconnector-querypreviewrenderer-preview-overlay.visible{opacity:1;transition-delay:0s;visibility:visible}.waffle-dataconnector-querypreviewrenderer-preview-inactive>.waffle-dataconnector-querypreviewrenderer-canvas-viewport{overflow:hidden}.waffle-dataconnector-querypreviewrenderer-canvas-viewport>canvas{height:100%;width:100%}.waffle-dataconnector-querypreviewrenderer-a11y-region{position:absolute;top:-10000px;left:-10000px}.waffle-dataconnector-queryeditor-query-settings-header .docs-icon{margin-right:8px}.waffle-dataconnector-querytexteditor{position:relative}.waffle-dataconnector-querytexteditor-editor-container{height:100%;position:absolute;width:100%}.waffle-dataconnector-querytexteditor-overlay{background-color:#fff;height:100%;left:0;position:absolute;top:0;width:100%;width:100%;z-index:10000}.waffle-dataconnector-querytexteditor-overlay-message{-webkit-transform:translateY(-50%);-moz-transform:translateY(-50%);-ms-transform:translateY(-50%);-o-transform:translateY(-50%);transform:translateY(-50%);color:rgba(0,0,0,0.54);font:500 13px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;position:absolute;text-align:center;top:50%;width:100%}.waffle-dataconnector-querytexteditor-overlay-message a{color:inherit;text-decoration:underline}.waffle-dataconnector-queryeditor-removable-chip-inner{display:inline-block;max-width:100%;position:relative}.waffle-dataconnector-queryeditor-removable-chip-button{background:#f0f0f0;border-radius:16px;border:2px solid transparent;cursor:pointer;display:block;height:32px;line-height:32px;padding:0 32px 0 12px}.waffle-dataconnector-queryeditor-removable-chip-chip-content{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.waffle-dataconnector-queryeditor-removable-chip-error .waffle-dataconnector-queryeditor-removable-chip-button{background:#fff;border:2px solid #db4437;overflow:hidden}.waffle-dataconnector-queryeditor-removable-chip-view-only .waffle-dataconnector-queryeditor-removable-chip-button{padding-right:12px}.waffle-dataconnector-queryeditor-removable-chip-button-hover{background:#e0e0e0}.waffle-dataconnector-queryeditor-removable-chip-button-active{background:#d0d0d0}.waffle-dataconnector-queryeditor-removable-chip-button-focused{border:2px solid #4285f4;outline:none}.waffle-dataconnector-queryeditor-removable-chip-button a{color:inherit}.waffle-dataconnector-queryeditor-removable-chip-remove-button{-webkit-transform:translateY(-50%);-moz-transform:translateY(-50%);-ms-transform:translateY(-50%);-o-transform:translateY(-50%);transform:translateY(-50%);background-color:rgba(0,0,0,0.12);border-radius:50%;box-sizing:border-box;height:18px;position:absolute;right:9px;top:50%;width:18px}.waffle-dataconnector-queryeditor-removable-chip-remove-button .waffle-dataconnector-close-icon{height:14px;margin:2px;width:14px}.waffle-dataconnector-queryeditor-removable-chip-remove-button .waffle-dataconnector-close-icon polygon{fill:#fff}.waffle-dataconnector-queryeditor-removable-chip-remove-button-hover{background-color:rgba(0,0,0,0.38);cursor:pointer}.waffle-dataconnector-queryeditor-removable-chip-remove-button-focused{background-color:rgba(0,0,0,0.38);outline:none}.waffle-dataconnector-schema-menu{min-height:30px;position:relative}.waffle-dataconnector-schema-menu .waffle-dataconnector-schema-menu-spinner{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}.waffle-dataconnector-schema-menu-error-message{color:rgba(0,0,0,0.54)}.waffle-dataconnector-queryeditor-schemamenuwidget-header{display:flex;-webkit-align-items:center;align-items:center;height:100%}.waffle-dataconnector-queryeditor-schemamenuwidget-header .waffle-dataconnector-database-icon{height:18px;margin-right:8px;min-width:18px;width:18px}.waffle-dataconnector-queryeditor-sidebaraccordion{box-sizing:border-box;display:flex;flex-direction:column;min-width:200px}.waffle-dataconnector-queryeditor-sidebaraccordion:focus{outline-color:#4285f4}.waffle-dataconnector-upgrade-loading-dialog{display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;box-sizing:border-box;height:558px;text-align:center;width:512px}.waffle-dataconnector-upgrade-loading-dialog .waffle-dataconnector-modal-header{border-bottom:none;justify-content:flex-end;padding:24px 24px 0px}.waffle-dataconnector-upgrade-loading-dialog .waffle-dataconnector-modal-title{display:none}.waffle-dataconnector-upgrade-loading-dialog .waffle-dataconnector-modal-body{padding:0;margin-top:-30px}.waffle-dataconnector-upgrade-loading-dialog .waffle-dataconnector-modal-close-button{height:34px;margin-right:-5px;width:34px}.waffle-dataconnector-upgrade-loading-dialog .waffle-dataconnector-modal-close-button svg{height:24px;width:24px}.waffle-dataconnector-upgrade-loading-dialog-tip{color:#202124;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:22px;font-weight:400;height:32px;letter-spacing:0.2px;line-height:20px;margin:32px auto;max-width:392px}.waffle-dataconnector-upgrade-loading-dialog-image{height:350px;user-select:none}.waffle-dataconnector-upgrade-loading-dialog-description{color:#5f6368;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;letter-spacing:0.2px;line-height:20px;margin:4px auto 4px auto;max-width:392px}.waffle-dataconnector-upgrade-loading-dialog .waffle-dataconnector-modal-footer{border-top:none}.waffle-dataconnector-upgrade-prompt-dialog{display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;box-sizing:border-box;height:558px;text-align:center;width:512px;height:630px}.waffle-dataconnector-upgrade-prompt-dialog .waffle-dataconnector-modal-header{border-bottom:none;justify-content:flex-end;padding:24px 24px 0px}.waffle-dataconnector-upgrade-prompt-dialog .waffle-dataconnector-modal-title{display:none}.waffle-dataconnector-upgrade-prompt-dialog .waffle-dataconnector-modal-body{padding:0}.waffle-dataconnector-upgrade-prompt-dialog .waffle-dataconnector-modal-close-button{height:34px;margin-right:-5px;width:34px}.waffle-dataconnector-upgrade-prompt-dialog .waffle-dataconnector-modal-close-button svg{height:24px;width:24px}.waffle-dataconnector-upgrade-prompt-dialog-image{height:185px}.waffle-dataconnector-upgrade-prompt-dialog-title{color:#202124;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:22px;font-weight:400;max-width:428px;margin:22px auto 16px auto}.waffle-dataconnector-upgrade-prompt-dialog-description{color:#5f6368;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;letter-spacing:0.2px;line-height:20px;margin:4px auto 4px auto;max-width:392px}.waffle-dataconnector-upgrade-prompt-dialog-bullet-point{font-weight:bold;padding-right:4px}.waffle-dataconnector-upgrade-prompt-dialog-upgrade-button-wrapper{margin-top:20px}.waffle-dataconnector-upgrade-prompt-dialog .waffle-dataconnector-modal-footer{border-top:none}.waffle-dataconnector-upgrade-success-dialog{display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;box-sizing:border-box;height:558px;text-align:center;width:512px;height:545px}.waffle-dataconnector-upgrade-success-dialog .waffle-dataconnector-modal-header{border-bottom:none;justify-content:flex-end;padding:24px 24px 0px}.waffle-dataconnector-upgrade-success-dialog .waffle-dataconnector-modal-title{display:none}.waffle-dataconnector-upgrade-success-dialog .waffle-dataconnector-modal-body{padding:0}.waffle-dataconnector-upgrade-success-dialog .waffle-dataconnector-modal-close-button{height:34px;margin-right:-5px;width:34px}.waffle-dataconnector-upgrade-success-dialog .waffle-dataconnector-modal-close-button svg{height:24px;width:24px}.waffle-dataconnector-upgrade-success-dialog-image{height:185px}.waffle-dataconnector-upgrade-success-dialog-title{color:#202124;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:22px;font-weight:400;max-width:428px;margin:22px auto 16px auto}.waffle-dataconnector-upgrade-success-dialog-description{color:#5f6368;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;letter-spacing:0.2px;line-height:20px;margin:4px auto 8px auto;max-width:400px}.waffle-dataconnector-upgrade-success-dialog-start-analyze-button-wrapper{margin-top:30px}.waffle-dataconnector-upgrade-success-dialog .waffle-dataconnector-modal-footer{border-top:none}.trix-data-prep-highlight-styled-rect{background-color:#0f9d58;opacity:0.06;pointer-events:none}.range-border.trix-data-prep-highlight-styled-border{border-color:#0f9d58;border-style:dashed}.trix-data-prep-active-column-label{overflow:hidden;padding:6px 12px 0;text-overflow:ellipsis;white-space:nowrap}.trix-data-prep-insights-cta{background:red;border-radius:8px;height:8px;margin:4px;width:8px}.trix-data-prep-column-label-container{align-items:center;background-color:#f1f3f4;border-radius:8px;display:flex;height:40px;padding:0 8px}.trix-data-prep-column-label{color:#202124;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;letter-spacing:0.2px;overflow:hidden;padding-left:12px;text-overflow:ellipsis;width:210px}.trix-data-prep-column-navigation-arrows{display:flex;direction:ltr;margin-left:auto}.trix-data-prep-select-column-menu-button,.trix-data-prep-column-right-button,.trix-data-prep-column-left-button{align-items:center;background-color:transparent;border:none;border-radius:50%;display:flex;height:18px;justify-content:center;outline:none;padding:0;width:18px}.trix-data-prep-select-column-menu-button .docs-icon,.trix-data-prep-column-right-button .docs-icon,.trix-data-prep-column-left-button .docs-icon{left:-3px;margin:0;top:-3px}.trix-data-prep-column-left-button{margin-right:4px}.trix-data-prep-select-column-menu-button:hover,.trix-data-prep-select-column-menu-button:focus,.trix-data-prep-column-right-button:hover,.trix-data-prep-column-right-button:focus,.trix-data-prep-column-left-button:hover,.trix-data-prep-column-left-button:focus{background:#e8eaed;cursor:pointer}.trix-data-prep-select-column-menu-button:active,.trix-data-prep-column-right-button:active,.trix-data-prep-column-left-button:active{background:#dadce0}.trix-data-prep-headers-count{overflow:hidden;padding:6px 12px 0;text-overflow:ellipsis;white-space:nowrap}.trix-data-prep-headers-count-container{align-items:center;border-radius:8px;color:#5f6368;display:flex;float:right;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:normal;justify-content:flex-end}.trix-data-prep-headers-count-prompt{align-content:center;height:24px;letter-spacing:0.3px;line-height:24px;padding:5px 3px}.trix-data-prep-headers-count-select{direction:ltr;display:flex;padding:5px}.trix-data-prep-headers-count-decrement,.trix-data-prep-headers-count-increment{background-color:white;border:0;margin:0;padding:0}.trix-data-prep-headers-count-decrement .goog-toolbar-button,.trix-data-prep-headers-count-increment .goog-toolbar-button{border-color:#dadce0!important}.trix-data-prep-headers-count-decrement .goog-toolbar-button{border-radius:2px 0 0 2px;border-right:0;margin-right:0}.trix-data-prep-headers-count-increment .goog-toolbar-button{border-radius:0 2px 2px 0;border-left:0;margin-left:0}.trix-data-prep-headers-count-decrement .goog-toolbar-button,.trix-data-prep-headers-count-decrement .goog-toolbar-button-outer-box,.trix-data-prep-headers-count-decrement .goog-toolbar-button-inner-box,.trix-data-prep-headers-count-decrement .docs-icon,.trix-data-prep-headers-count-increment .goog-toolbar-button,.trix-data-prep-headers-count-increment .goog-toolbar-button-outer-box,.trix-data-prep-headers-count-increment .goog-toolbar-button-inner-box,.trix-data-prep-headers-count-increment .docs-icon{box-sizing:border-box;height:24px;margin:0;padding:0;width:24px}.waffle-insights-headers-count-combo-box .waffle-insights-headers-count-combo-box-input.jfk-textinput{border-radius:0;height:24px;margin:0;padding:0;text-align:center;width:41px}.goog-inline-block.waffle-insights-headers-count-combo-box-dropdown{display:none}.waffle-insights-headers-count-combo-box-hover .waffle-insights-headers-count-combo-box-input{background-color:#f1f3f4}.trix-data-prep-insights-tab .trix-data-prep-insights-container .docs-charts-editor-material-togglebutton{border:none;display:table;height:inherit;line-height:inherit;text-align:unset;width:100%}.trix-data-prep-sidebar-survey-container{align-items:center;background-color:#f8f9fa;display:flex;height:40px;padding:0 8px}.trix-data-prep-sidebar-survey-link{color:#188038!important;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;letter-spacing:0.25px}.trix-data-prep-sidebar-survey-link:hover{text-decoration:none}.trix-data-prep-sidebar-survey-container:hover,.trix-data-prep-sidebar-survey-container:focus{background:rgba(0,0,0,.06)}.trix-data-prep-sidebar-survey-container:active{background:rgba(0,0,0,0.12)}.trix-data-prep-insight-row,.trix-data-prep-actionable-insight-row{box-sizing:border-box;display:flex;font-size:14px;height:40px;justify-content:space-between;line-height:40px;vertical-align:middle}.trix-data-prep-actionable-insight-row{padding:0 24px 0 11px}.trix-data-prep-actionable-insight-row:hover{background-color:#e6f4ea}.trix-data-prep-actionable-insight-row:hover .docs-icon-img{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_green.svg)}.trix-data-prep-actionable-insight-icon{margin-right:8px}.trix-data-prep-insight-row{margin:0 3px;padding:0 9px}.trix-data-prep-insights-frequency-separator{background:#dadce0;height:1px;margin:0 12px}.trix-data-prep-insight-row-value{color:#80868b;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:400;margin-right:4px;margin-top:2px;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap;width:50%}.trix-data-prep-insights-toggle-separator{background:#dadce0;height:16px;margin:0 15px;width:1px}.trix-data-prep-insight-row-name{color:#3c4043;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;overflow:hidden;padding-right:5px;text-overflow:clip;white-space:nowrap}.trix-data-prep-insight-frequency-row-name{color:#3c4043;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:400;overflow:hidden;padding-right:5px;text-overflow:clip;white-space:nowrap}.trix-data-prep-insight-row:hover{background:#e8eaed;border-radius:32px}.trix-data-prep-insights-container{padding-top:12px}.trix-data-prep-insights-chart-container,.trix-data-prep-insights-frequency-tables,.trix-data-prep-insights-section{border:1px solid #dadce0;border-radius:8px;box-sizing:border-box;margin:0 12px;overflow:hidden}.trix-data-prep-insights-toggle-container{box-sizing:border-box;display:flex;justify-content:flex-end;padding:16px;width:100%}.trix-data-prep-insights-label-active,.trix-data-prep-insights-label-inactive{flex-shrink:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.trix-data-prep-insights-label-active{color:#188038;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;letter-spacing:0.25px;line-height:20px;text-align:center}.docs-gm .docs-material .trix-data-prep-insights-label-active .docs-icon-img{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_green.svg)}.trix-data-prep-insights-label-inactive{color:#80868b;cursor:pointer;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;letter-spacing:0.25px;line-height:20px;outline:none;text-align:center}.trix-data-prep-insights-label-inactive:hover,.trix-data-prep-insights-label-inactive:focus{background-color:#f1f3f4}.trix-data-prep-insights-label-inactive:active{background-color:#e8eaed}.goog-control-disabled.trix-data-prep-insights-label-inactive{color:#dadce0;cursor:default;font-size:14px}.goog-control-disabled.trix-data-prep-insights-label-inactive:hover,.goog-control-disabled.trix-data-prep-insights-label-inactive:focus{background-color:transparent}.trix-data-prep-insights-section-label{color:#3c4043;font-family:Google Sans;font-size:14px;font-weight:500;letter-spacing:0.25px;line-height:20px;margin-left:12px;padding-bottom:8px}.trix-data-prep-insights-chart,.trix-data-prep-insights-value-most-frequent-table,.trix-data-prep-insights-value-least-frequent-table{overflow:auto}.trix-data-prep-insights-separator{height:24px}.trix-data-prep-type-button,.trix-data-prep-date-time-input-dropdown,.trix-data-prep-currency-input-dropdown,.trix-data-prep-min-box,.trix-data-prep-max-box,.trix-data-prep-blank-checkbox,.trix-data-prep-duplicate-checkbox,.trix-data-prep-dropdown-list-input,.trix-data-prep-dropdown-type-input{margin:16px}.trix-data-prep-insights-hidden-data-message{color:#5f6368;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;padding:16px 0 40px 0;text-align:center}.trix-data-prep-db-insights .trix-data-prep-insights-local-only{display:none}.trix-column-insights-sidebar-column-selector-menu{margin-left:10px;width:270px}.trix-column-insights-sidebar-column-selector-menu-scrollable-wrapper{max-height:270px;overflow-y:auto}.trix-column-insights-sidebar-column-selector-menuitem{-webkit-align-items:center;align-items:center;display:flex;font-family:Roboto;font-size:14px;font-weight:500;height:32px;letter-spacing:0.2px;line-height:20px;overflow:hidden;padding:0 8px;text-overflow:ellipsis;width:230px;white-space:nowrap}.trix-column-insights-sidebar-column-selector-menuitem-accel{color:#9e9e9e;margin-left:auto;padding-left:20px;text-align:center}.trix-column-insights-sidebar-column-selector-menuitem-refreshquery-info{font-style:italic}.trix-column-insights-sidebar-column-selector-menuitem-refreshquery-info-error-button{color:#db4437;text-decoration:underline}.trix-column-insights-sidebar-column-selector-menuitem-refreshquery-estimate-placeholder{font-style:italic}.trix-data-prep-column-insights-sidebar-refresh-label{overflow:hidden;padding:0 12px 12px;text-overflow:ellipsis;white-space:nowrap}.trix-data-prep-column-insights-sidebar-refresh-label-container{align-items:center;background-color:#f1f3f4;border-radius:8px;display:flex;height:40px}.trix-data-prep-column-insights-sidebar-refresh-label-last-updated{align-items:center;color:#202124;display:flex;font-family:Roboto;font-size:12px;font-weight:500;letter-spacing:0.2px;overflow:hidden;padding:0 12px;text-overflow:ellipsis;width:170px}.trix-data-prep-column-insights-sidebar-refresh-label-last-updated-loaded-msg{overflow:hidden;padding-left:5px;text-overflow:ellipsis}.trix-data-prep-column-insights-sidebar-refresh-label-last-updated-time{overflow:hidden;padding-left:4px;text-overflow:ellipsis}.trix-data-prep-column-insights-sidebar-refresh-label-button{color:#188038;background-color:transparent;border:none;border-radius:50%;font-family:Roboto;font-size:12px;justify-content:center;outline:none;padding:0 12px;width:60px}.trix-data-prep-column-insights-sidebar-refresh-label-separator{border-left:1px #dadce0 solid;height:20px}.trix-data-prep-column-insights-sidebar-refresh-label-last-updated-icon{height:17px;width:17px}.trix-data-prep-column-insights-sidebar-refresh-label-button-wrapper{padding:0}.trix-data-prep-column-insights-sidebar-refresh-label-button-wrapper .docs-material-button{margin:0;text-transform:none}.trix-data-prep-column-insights-sidebar-refresh-label-button-wrapper .docs-material-button-content>div>span{vertical-align:middle}.waffle-dataprep-column-insights-sidebar-icon .docs-icon-img{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_green.svg)!important}.waffle-dataprep-column-insights .waffle-sidebar-title .docs-gm-sidebar-icon{margin-right:0}.trix-data-prep-column-insights-refresh-placeholder-container{align-items:center;display:flex;flex-direction:column;font-family:Roboto;font-size:12px;font-weight:500;letter-spacing:0.2px;padding:60px 65px}.trix-data-prep-column-insights-refresh-placeholder-retrieving-data{align-items:center;display:flex;height:35px}.trix-data-prep-column-insights-refresh-placeholder-retrieving-data-spinner .waffle-spinner{height:12px;width:12px}.trix-data-prep-column-insights-refresh-placeholder-retrieving-data-msg{padding:0 5px}.trix-data-prep-column-insights-refresh-placeholder-load-time-msg{color:#80868b;text-align:center}.trix-data-prep-column-insights-refresh-placeholder-retrieving-data-msg{color:#188038;text-align:center}.docs-material-button-hairline-primary.docs-material-button.waffle-datavalidation-add-rule-button{align-items:center;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;padding:6px 14px}.docs-material-button-hairline-primary.docs-material-button.waffle-datavalidation-delete-all-button{color:#5f6368}.waffle-boolean-condition-picker-checked-text-holder,.waffle-boolean-condition-picker-unchecked-text-holder{align-items:baseline;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-webkit-justify-content:space-between;justify-content:space-between}.waffle-boolean-condition-picker-checked-text-description,.waffle-boolean-condition-picker-unchecked-text-description{float:left}.waffle-boolean-condition-picker-checked-text-input-wrapper,.waffle-boolean-condition-picker-unchecked-text-input-wrapper{float:right}.waffle-boolean-condition-picker-checked-text-input,.waffle-boolean-condition-picker-unchecked-text-input{width:168px}.waffle-datavalidation-add-rule-button-wrapper,.waffle-datavalidation-delete-all-button-wrapper{float:right}.waffle-datavalidation-add-rule-plus{font-size:24px;font-weight:100;line-height:20px;margin-right:8px;vertical-align:text-bottom}.waffle-datavalidation-edit-pill-invalid-type-buttons .jfk-radiobutton-label{margin-bottom:13px}.waffle-datavalidation-edit-pill-button-bar{align-items:center;border-top:1px solid #dadce0;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;padding:16px 0 16px 60px;position:relative;text-align:right}.waffle-datavalidation-edit-pill-cancel-button,.waffle-datavalidation-edit-pill-done-button{cursor:pointer;margin-left:16;text-transform:none}.waffle-datavalidation-edit-pill-section{padding:0 0 24px 0}.waffle-datavalidation-edit-pill-invalid-type-buttons{margin-top:12px}.waffle-datavalidation-edit-pill-invalid-type-buttons .jfk-radiobutton{margin-left:2px;padding:0}.waffle-datavalidation-edit-pill-invalid-type-buttons .jfk-radiobutton-label{color:#202124;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;letter-spacing:0.2px;line-height:20px;margin-left:32px;text-decoration-line:none}.waffle-datavalidation-edit-pill-invalid-type-buttons .jfk-radiobutton-radio{height:20px;left:0;top:0;width:20px}.waffle-datavalidation-edit-pill-invalid-type-buttons .jfk-radiobutton-checked .jfk-radiobutton-radio::after{height:10px;margin:3px;width:10px}.waffle-datavalidation-edit-pill-condition-pane,.waffle-datavalidation-slide-frame{position:relative;width:268px}.waffle-datavalidation-edit-pill-help-text-input{width:208px}.waffle-datavalidation-edit-pill-help-text-input-wrapper{align-items:center;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-webkit-justify-content:space-between;justify-content:space-between}.waffle-datavalidation-edit-pill-help-text-reset-button-wrapper:hover,.waffle-datavalidation-edit-pill-help-text-reset-button-wrapper:focus{outline:none}.waffle-datavalidation-edit-pill-help-text-reset-button-wrapper{color:#5f6368;cursor:pointer;display:inline;margin:8px}.waffle-datavalidation-edit-pill-range-picker{border-bottom:none;padding:16px 16px 12px 16px}.waffle-datavalidation-edit-pill-boolean-condition-picker{margin-bottom:12px}.waffle-datavalidation-edit-pill-section-header{color:#3c4043;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;margin-bottom:8px}.waffle-datavalidation-one-of-range-wrapper{padding:8px 0}.waffle-datavalidation-sidebar-button-bar{align-items:center;border-top:1px solid #dadce0;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;padding:16px;position:relative}.waffle-datavalidation-sidebar-scroll-pane{overflow-x:hidden;overflow-y:auto}.waffle-datavalidation-sidebar-widget{padding:20px 16px 0}.waffle-datavalidation-sidebar-widget-header{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;align-items:center;justify-content:space-between}.waffle-datavalidation-slide-frame{padding:12px 16px 8px 16px;position:relative;width:268px}.waffle-datavalidation-view-pill{background-color:#fff;border-bottom:1px solid #dadce0;cursor:pointer;display:flex;height:56px;padding:10px;position:relative}.waffle-datavalidation-view-pill:focus,.waffle-datavalidation-view-pill:hover{background-color:#f1f3f4;outline:none}.waffle-datavalidation-view-pill-condition{color:#202124;font-size:14px;font-weight:500;letter-spacing:0.15px;line-height:16px;max-height:30px;margin-bottom:4px;overflow:hidden;text-overflow:ellipsis;width:142px}.waffle-datavalidation-view-pill-delete-button-wrapper{height:56px;right:16px;line-height:56px;position:absolute;opacity:0.5}.waffle-datavalidation-view-pill-delete-button-wrapper:hover{opacity:1}.waffle-datavalidation-view-pill-delete-button-wrapper .docs-icon{width:21px;height:21px}.waffle-datavalidation-view-pill-range{color:#3c4043;height:20px;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:20px;letter-spacing:0.2px;overflow:hidden;text-overflow:ellipsis;width:142px}.range-border.waffle-datavalidation-view-pill-highlight-styled-border{border-color:#34a853;border-style:solid;line-height:0}.waffle-datavalidation-view-pill-highlight-styled-rect{background-color:#34a853;opacity:0.06;pointer-events:none}.waffle-datavalidation-view-pill-summary{margin:auto 8px auto 14px;position:relative;width:142px}.waffle-datavalidation-edit-pill-error-bubble{z-index:1000!important}.waffle-datavalidation-edit-pill-boolean-condition-picker-body .waffle-conditionalformat-edit-pill-section-body .jfk-select:focus{border:2px solid #1a73e8!important}.waffle-assistant-overlay-informational-card{background-color:#ffffff;border-radius:8px;box-shadow:0px -3px 11px rgba(128,134,139,0.09),0px 6px 11px rgba(128,134,139,0.06),0px 1px 3px rgba(60,64,67,0.3),0px 4px 8px rgba(60,64,67,0.15);min-height:108px;min-width:220px}.waffle-assistant-overlay-informational-card-content-wrapper{padding:8px 12px 0 12px}.waffle-assistant-overlay-informational-card-headline-message{color:#188038;float:left;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:16px;font-weight:400;letter-spacing:0.1px;line-height:24px;white-space:normal;width:100%;word-break:break-word}.waffle-assistant-overlay-informational-card-send-feedback-cta{color:#80868b;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;letter-spacing:0.3px;line-height:16px;max-height:40px;overflow-y:scroll;text-overflow:clip;white-space:normal;width:100%;word-wrap:break-word}.waffle-assistant-overlay-informational-card-footer-wrapper{padding:8px 12px}.waffle-assistant-overlay-informational-card-buttons-wrapper{display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row}.waffle-assistant-overlay-informational-card-button{align-items:center;background:#ffffff;border-radius:16px;box-sizing:border-box;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;height:24px;margin-right:8px;mix-blend-mode:normal;width:24px}.waffle-assistant-overlay-informational-card-send-feedback-button{border:1px solid #a8dab5}.waffle-assistant-overlay-informational-card-feedback-icon{display:flex;margin:auto}.waffle-assistant-overlay-informational-decorator{background-color:#188038;border-radius:8px 8px 0 0;color:#fff;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;letter-spacing:0.25px;padding:1px 8px;position:absolute}.waffle-assistant-overlay-informational-range-highlighter-border{border-color:#188038;border-style:solid}.waffle-assistant-overlay-informational-range-highlighter-rect{background-color:#e6f4ea;opacity:0.50;pointer-events:none}.waffle-assistant-overlay-recommendation-card{background-color:#ffffff;border-radius:8px;box-shadow:0px -3px 11px rgba(128,134,139,0.09),0px 6px 11px rgba(128,134,139,0.06),0px 1px 3px rgba(60,64,67,0.3),0px 4px 8px rgba(60,64,67,0.15);min-height:134px;width:240px}.waffle-assistant-overlay-recommendation-card-header-wrapper{align-items:center;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-webkit-justify-content:space-between;justify-content:space-between;min-height:32px;padding:8px 12px 0 12px}.waffle-assistant-overlay-recommendation-card-title{color:#5f6368;float:left;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:500;letter-spacing:0.8px;line-height:16px;text-transform:uppercase}.waffle-assistant-overlay-recommendation-card-info-icon{float:right}.waffle-assistant-overlay-recommendation-card-content-wrapper{min-height:58px;padding:0 12px}.waffle-assistant-overlay-recommendation-card-recommendation-wrapper{align-items:center;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row}.waffle-assistant-overlay-recommendation-card-recommendation{color:#188038;float:left;overflow-x:hidden;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:16px;font-weight:400;letter-spacing:0.1px;line-height:24px;white-space:normal;width:100%;word-break:break-word}.waffle-assistant-overlay-recommendation-card-additional-information{color:#80868b;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;letter-spacing:0.3px;line-height:16px;overflow-y:scroll;text-overflow:clip;white-space:normal}.waffle-assistant-overlay-recommendation-card-show-more-information{color:#1a73e8}.waffle-assistant-overlay-recommendation-card-footer-wrapper{padding:8px 12px}.waffle-assistant-overlay-recommendation-card-buttons-wrapper{display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row}.waffle-assistant-overlay-recommendation-card-button{align-items:center;background:#ffffff;border-radius:16px;box-sizing:border-box;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;height:24px;margin-right:8px;mix-blend-mode:normal;width:24px}.waffle-assistant-overlay-recommendation-card-accept-button-icon .docs-icon-img{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_green.svg)!important}.waffle-assistant-overlay-recommendation-card-button-icon{margin:1px}.waffle-assistant-overlay-recommendation-card-accept-button{border:1px solid #a8dab5}.waffle-assistant-overlay-recommendation-card-reject-button{border:1px solid #dadce0}.waffle-assistant-overlay-recommendation-card-menu-button{padding:0}.waffle-autofill-previews-range-highlighter-border{border-color:#188038;border-style:solid}.waffle-autofill-previews-range-highlighter-rect{background-color:#e6f4ea;opacity:0.50;pointer-events:none}.waffle-db-object-formula-tooltip-help-button{box-sizing:border-box;display:inline-block;height:20px;outline:none;padding:2px;vertical-align:bottom;width:20px}.waffle-db-object-formula-tooltip-help-button-hover{background:#f1f3f4;border-radius:75%}.waffle-db-object-formula-tooltip-help-bubble-visible .waffle-db-object-formula-tooltip-help-button,.waffle-db-object-formula-tooltip-help-button-focused,.waffle-db-object-formula-tooltip-help-button-active{background:#e6f4ea;border-radius:75%}.waffle-db-object-formula-tooltip-help-icon{height:100%;width:100%}.waffle-db-object-formula-tooltip-help-bubble-visible .waffle-db-object-formula-tooltip-help-button .waffle-db-object-formula-tooltip-help-icon,.waffle-db-object-formula-tooltip-help-button-focused .waffle-db-object-formula-tooltip-help-icon,.waffle-db-object-formula-tooltip-help-button-active .waffle-db-object-formula-tooltip-help-icon{fill:#188038}.waffle-db-object-formula-tooltip-help-bubble{border:none;border-radius:8px;box-shadow:0 4px 8px 3px rgba(60,64,67,.15);font-size:12px;padding:16px 16px 16px 18px;max-width:280px;width:280px}.waffle-db-object-formula-tooltip-help-bubble:focus{outline:1px solid transparent}.waffle-db-object-formula-tooltip-help-bubble-title{color:#3c4043;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;letter-spacing:0.25px;line-height:20px;margin-bottom:19px}.waffle-db-object-formula-tooltip-help-bubble-subtitle{color:#3c4043;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;letter-spacing:0.3px;line-height:16px}.waffle-db-object-formula-tooltip-help-bubble-example{background-color:#f1f3f4;border-radius:3px;color:#202124;display:inline-block;font-family:'Roboto Mono','Consolas',monospace;font-size:14px;letter-spacing:0.25px;line-height:20px;margin:9px 0 16px 0;opacity:70%;padding:3px 8px 2px 7px}.waffle-db-object-formula-tooltip-help-bubble-link{color:#1a73e8;display:block;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;letter-spacing:0.25px;line-height:20px}.waffle-dv-table .waffle-data-validation-dialog{min-width:672px}.waffle-data-validation-dialog .waffle-dv-table .waffle-dv-list-options-textarea{margin:0;max-width:251px;padding:7px}.waffle-data-validation-dialog .waffle-dv-table .waffle-dv-editbox-number{margin:0;width:50px}.waffle-data-validation-dialog .waffle-dv-table .waffle-dv-editbox-text{margin:0}.waffle-data-validation-dialog .waffle-dv-table .waffle-dv-editbox-date{margin:0;width:72px}.waffle-data-validation-dialog .waffle-input-error-butter-container{margin-left:180px;margin-top:-50px;z-index:999;width:auto}.waffle-dv-table .waffle-dv-customcheckboxlabel{padding-top:14px}.waffle-dv-table .docs-material-gm-labeled-checkbox{padding:0}.waffle-dv-table{width:672px}.waffle-dv-table.jfk-select{margin-right:8px}.waffle-dv-table.goog-flat-menu-button{margin-left:0;height:36px}.waffle-dv-table .waffle-dv-on-invalid-data .jfk-radiobutton-radio{left:2px}.waffle-dv-table .waffle-dv-on-invalid-data .jfk-radiobutton:not(:last-child){padding-right:20px}.waffle-db-object-formula-dialog{height:505px;max-width:670px;min-width:510px}.waffle-db-object-formula-dialog .modal-dialog-title{margin-bottom:12px}.waffle-db-object-formula-dialog .modal-dialog-title-text{height:24px}.waffle-db-object-formula-description{color:#3c4043;display:inline-block;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;height:40px;letter-spacing:0.25px;line-height:20px;margin:0 0 16px 0}.waffle-db-object-formula-tooltip{display:inline-block}.waffle-db-object-formula-display-name-title{color:#3c4043;display:inline-block;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;letter-spacing:0.25px;line-height:20px;margin-bottom:7px}.docs-dialog.waffle-db-object-formula-dialog .waffle-db-object-formula-display-name-input{display:inline-block;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;letter-spacing:0.17px;margin:0}.docs-dialog.waffle-db-object-formula-dialog .waffle-db-object-formula-display-name-input-invalid,.docs-dialog.waffle-db-object-formula-dialog .waffle-db-object-formula-display-name-input-invalid:focus{border:2px solid #d93025;padding:0 7px}.docs-dialog.waffle-db-object-formula-dialog .waffle-db-object-formula-display-name-error{color:#d93025;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;height:16px;letter-spacing:0.3px;line-height:16px;margin:4px 0 8px 0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.docs-dialog.waffle-db-object-formula-dialog .waffle-db-object-formula-formula-editor{display:inline-block;position:relative}.waffle-db-object-formula-display-name-title,.waffle-db-object-formula-display-name-error,.waffle-db-object-formula-display-name-input,.waffle-db-object-formula-formula-editor{width:calc(100% - 212px)}.waffle-db-object-formula-dialog-view-only .waffle-db-object-formula-display-name-title,.waffle-db-object-formula-dialog-view-only .waffle-db-object-formula-display-name-input,.waffle-db-object-formula-dialog-view-only .waffle-db-object-formula-formula-editor{width:100%}.docs-dialog.waffle-db-object-formula-dialog .waffle-db-object-formula-toggle-tabs{display:inline-block;float:right;height:27px;line-height:27px;margin-left:7px;min-width:205px;width:205px}.waffle-db-object-formula-dialog .waffle-db-object-formula-toggle-tabs.waffle-gm-sidebar .docs-sidebar-toggle-tabs .jfk-button.docs-sidebar-toggle-tab,.waffle-db-object-formula-dialog .waffle-db-object-formula-toggle-tabs.waffle-gm-sidebar .docs-sidebar-toggle-tabs .jfk-button.docs-sidebar-toggle-tab:hover{height:27px;line-height:27px;margin-top:0}.waffle-db-object-formula-dialog .waffle-db-object-formula-toggle-tabs.waffle-gm-sidebar .docs-sidebar-toggle-tabs .jfk-button.docs-sidebar-toggle-tab-active{color:#188038}.waffle-db-object-formula-dialog .waffle-db-object-formula-toggle-tabs.waffle-gm-sidebar .docs-sidebar-toggle-tabs .jfk-button.docs-sidebar-toggle-tab-active>div:after{border-bottom:3px solid #188038}.waffle-db-object-formula-dialog .waffle-db-object-formula-toggle-tabs.waffle-gm-sidebar .docs-sidebar-toggle-tabs .jfk-button-focused.docs-sidebar-toggle-tab-inactive>div:after{border-bottom:2px dotted #188038}.docs-dialog.waffle-db-object-formula-dialog .waffle-db-object-formula-column-menu-tab,.docs-dialog.waffle-db-object-formula-dialog .waffle-db-object-formula-function-menu-tab{display:inline;float:right;height:319px;margin-bottom:24px;margin-left:7px;margin-top:0;min-width:205px;position:relative;width:205px}.docs-dialog.waffle-db-object-formula-dialog .waffle-db-object-formula-column-menu-tab .goog-menu.waffle-dbsource-column-filtered-menu,.docs-dialog.waffle-db-object-formula-dialog .waffle-db-object-formula-function-menu-tab .goog-menu.waffle-function-filtered-menu{border:1px solid #dadce0;box-shadow:none;box-sizing:border-box;display:inline-block;height:319px;min-width:205px;overflow-x:hidden;position:absolute;width:205px}.waffle-db-object-formula-webkit-tab-override{position:absolute!important;margin-top:27px!important}.docs-dialog.waffle-db-object-formula-dialog .waffle-db-object-formula-column-menu-tab .goog-menu.waffle-dbsource-column-filtered-menu::-webkit-scrollbar-thumb{min-height:70px}.docs-dialog.waffle-db-object-formula-dialog .waffle-db-object-formula-column-menu-tab .goog-menu.waffle-dbsource-column-filtered-menu .goog-menu-filter{padding:4px 4px 10px 7px}.docs-dialog.waffle-db-object-formula-dialog .waffle-db-object-formula-column-menu-tab .goog-menu.waffle-dbsource-column-filtered-menu .goog-menu-filter input{line-height:24px;padding:0}.docs-dialog.waffle-db-object-formula-dialog .waffle-db-object-formula-column-menu-tab .goog-menu.waffle-dbsource-column-filtered-menu .goog-menu-filter:before{margin-right:7px;transform:scale(0.75)}.waffle-db-object-formula-dialog .modal-dialog-buttons{margin-top:0}.waffle-db-object-formula-editor-container-overall{display:flex;flex-direction:column;height:255px!important;margin-bottom:24px}.waffle-db-object-formula-editor-container{border:1px solid #dadce0;border-radius:4px;box-sizing:border-box;display:flex;flex-direction:column;height:100%;overflow:hidden;position:relative}.waffle-db-object-formula-editor-container-focus{border:2px solid #1a73e8;border-radius:4px}.waffle-db-object-formula-editor-container-invalid{border:2px solid #d93025;border-radius:4px}.waffle-db-object-formula-editor-container .waffle-db-object-formula-editor-input-container{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;height:100%;position:relative;width:100%}.waffle-db-object-formula-editor-container .waffle-db-object-formula-editor-input-container .waffle-db-object-formula-editor-input,.waffle-db-object-formula-editor-container .waffle-db-object-formula-editor-input-container .waffle-db-object-formula-editor-input:focus{border:none;font-family:'Roboto Mono','Consolas',monospace;font-size:14px;font-weight:500;height:100%!important;letter-spacing:0.2px;margin:0;outline:none;resize:none;width:100%}.waffle-db-object-formula-editor-container .waffle-db-object-formula-editor-input-container .waffle-db-object-formula-editor-input::placeholder{font-weight:400}.waffle-db-object-formula-editor-container .waffle-db-object-formula-editor-input-container .waffle-db-object-formula-editor-input{padding:7px 8px}.waffle-db-object-formula-editor-container-invalid .waffle-db-object-formula-editor-input-container .waffle-db-object-formula-editor-input,.waffle-db-object-formula-editor-container-focus .waffle-db-object-formula-editor-input-container .waffle-db-object-formula-editor-input{padding:6px 7px}.waffle-db-object-formula-editor-summarize-function-containter{height:40px;margin-top:10px}.waffle-db-object-formula-editor-summarize-function-label{color:#5f6368;display:inline;line-height:40px;padding-right:5px;font-size:14px;vertical-align:middle}.waffle-db-object-formula-editor-summarize-function-menu{display:inline}.waffle-db-object-formula-editor-summarize-function-menu .goog-flat-menu-button.jfk-select{width:100px}.waffle-material-confirm-dialog{background:#fff;border-radius:2px;border:none;box-shadow:0px 16px 24px 2px rgba(0,0,0,0.14),0px 6px 30px 5px rgba(0,0,0,0.12),0px 8px 10px -5px rgba(0,0,0,0.2);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;position:absolute;z-index:1002}.waffle-material-confirm-dialog-bg{background-color:rgba(0,0,0,.6);left:0;position:absolute;top:0;z-index:1001}.waffle-material-confirm-dialog-header{font-size:18px;height:18px;line-height:18px;padding:24px 24px 20px 24px}.waffle-material-confirm-dialog-content{padding:0 24px}.waffle-material-confirm-dialog-footer{display:flex;-webkit-justify-content:flex-end;justify-content:flex-end;padding:8px 14px 14px 14px}.waffle-source-destination-selection-dialog{min-width:350px;border-radius:10px}.waffle-source-destination-selection-dialog .docs-material-dialog-title{border-bottom:0}.waffle-source-destination-selection-dialog .docs-material-gm-dialog-title-close{cursor:pointer}.waffle-sdsd-source-container .waffle-sdsd-rangepicker-container{padding:0 0 16px}.waffle-sdsd-destination-container .waffle-sdsd-rangepicker-container{padding:0 0 16px 22px}.waffle-sdsd-rangepicker-label{color:rgba(0,0,0,0.54)}.waffle-sdsd-rangepicker-error-label{color:#d23f31;font-size:13px}.waffle-sdsd-destination-selection{padding:10px 0}.waffle-sdsd-destination-selection .jfk-radiobutton{padding:5px 0}.waffle-sdsd-destination-selection .jfk-radiobutton-radio{left:0}.waffle-range-selection-container{border:1px solid #dadce0;border-radius:4px;box-sizing:border-box;color:#3c4043;padding:1px 8px;font-size:14px;height:36px;margin:8px 0;align-items:center;background:#fff;display:flex;margin:0;min-width:20px;padding:1px;width:100%}.waffle-range-selection-input,.waffle-range-selection-input:focus{background:transparent;border:none;box-sizing:border-box;box-shadow:none;height:25px;color:inherit;font:inherit;margin:0;outline:none;padding:1px 8px;width:calc(100% - 34px)}.waffle-range-selection-button-container{overflow:hidden;padding:0;text-align:right;width:34px}.waffle-range-selection-button:hover,.waffle-range-selection-button:focus{opacity:0.9}.waffle-range-selection-container.waffle-range-selection-container-focus{border:2px solid #1a73e8;box-shadow:none;padding:0px 7px;padding:0}.modal-dialog .waffle-range-selection-container .waffle-range-selection-button,.modal-dialog .waffle-range-selection-container .waffle-range-selection-button:hover,.modal-dialog .waffle-range-selection-container .waffle-range-selection-button:focus,.modal-dialog .waffle-range-selection-container .waffle-range-selection-button:hover:focus,.modal-dialog .waffle-range-selection-container .waffle-range-selection-button:active,.waffle-range-selection-container .waffle-range-selection-button{background:transparent!important;border:transparent!important;cursor:pointer;line-height:34px;padding:0;white-space:nowrap}.waffle-range-selection-button{line-height:33px;margin:0;opacity:.70}.waffle-dialog-validation-widget-open-button{border-radius:50%;bottom:8px;box-sizing:border-box;cursor:pointer;height:20px;position:absolute;right:8px;width:20px;z-index:10}.waffle-dialog-formula-editor-container-focus .waffle-dialog-validation-widget-open-button,.waffle-dialog-formula-editor-container-invalid .waffle-dialog-validation-widget-open-button{bottom:7px;right:7px}.waffle-dialog-validation-widget-open-button .waffle-dataconnector-info-icon{height:100%;width:100%}.waffle-dialog-validation-widget-open-button-hover,.waffle-dialog-validation-widget-open-button-focused{background:rgba(66,133,244,0.26)}.waffle-dialog-validation-widget-loading>.waffle-dialog-validation-widget-bar .waffle-dialog-validation-widget-spinner{display:block;height:20px;margin-right:8px;min-width:20px;width:20px}.waffle-dialog-validation-widget-bar .waffle-dialog-validation-widget-spinner,.waffle-dialog-validation-widget-spinner{display:none}.waffle-dialog-validation-widget-loading .waffle-dialog-validation-widget-spinner{display:block}.waffle-dialog-validation-widget-loading .waffle-dialog-validation-widget-spinner .waffle-spinner,.waffle-dialog-validation-widget-loading .waffle-dialog-validation-widget-bar .waffle-dialog-validation-widget-spinner .waffle-spinner{height:18px;width:18px}.waffle-dialog-validation-widget-loading .waffle-dialog-validation-widget-spinner .waffle-spinner-circle,.waffle-dialog-validation-widget-loading .waffle-dialog-validation-widget-bar .waffle-dialog-validation-widget-spinner .waffle-spinner-circle{border-width:2px}.waffle-dialog-validation-widget-bar{display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between;background:rgba(66,133,244,0.12);bottom:0;box-sizing:border-box;color:#4285f4;display:none;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:400;max-height:76px;min-height:40px;padding:8px 8px 8px 16px;position:relative;right:0;width:100%}.waffle-dialog-formula-editor-container-focus .waffle-dialog-validation-widget-bar,.waffle-dialog-formula-editor-container-invalid .waffle-dialog-validation-widget-bar{max-height:75px;min-height:39px;padding:8px 7px 7px 15px}.waffle-dialog-validation-widget-visible>.waffle-dialog-validation-widget-bar{display:flex}.waffle-dialog-validation-widget-visible>.waffle-dialog-validation-widget-open-button{display:none}.waffle-dialog-validation-widget-bar .waffle-dataconnector-error-icon-filled{height:20px;margin-right:8px;min-width:20px;width:20px}.waffle-dialog-validation-widget-valid>.waffle-dialog-validation-widget-bar{background:rgba(15,157,88,0.12);color:#0f9d58}.waffle-dialog-validation-widget-bar .waffle-dataconnector-info-icon{height:20px;margin-right:8px;min-width:20px;width:20px}.waffle-dialog-validation-widget-valid .waffle-dataconnector-info-icon,.waffle-dialog-validation-widget-invalid .waffle-dataconnector-info-icon,.waffle-dialog-validation-widget-loading .waffle-dataconnector-info-icon{display:none}.waffle-dialog-validation-widget .waffle-dataconnector-error-icon-filled{display:none}.waffle-dialog-validation-widget-bar .waffle-dataconnector-error-icon-filled{margin-right:8px}.waffle-dialog-validation-widget .waffle-dataconnector-valid-icon{display:none}.waffle-dialog-validation-widget-bar .waffle-dataconnector-valid-icon{height:20px;margin-right:8px;min-width:20px;width:20px}.waffle-dialog-validation-widget-invalid .waffle-dialog-validation-widget-bar{background:rgba(219,68,55,0.12);color:#db4437}.waffle-dialog-validation-widget-invalid .waffle-dataconnector-error-icon-filled{display:block}.waffle-dialog-validation-widget-valid .waffle-dataconnector-valid-icon{display:block}.waffle-dialog-validation-widget-message{line-height:20px;max-height:60px;max-width:calc(100% - 30px);overflow:auto}.waffle-dialog-validation-widget-close-button{border-radius:50%;cursor:pointer;height:24px;margin-left:auto;width:24px}.waffle-dialog-validation-widget-close-button svg{height:20px;margin:2px;width:20px}.waffle-dialog-validation-widget .waffle-dataconnector-close-icon polygon{fill:#4285f4}.waffle-dialog-validation-widget-close-button-hover,.waffle-dialog-validation-widget-close-button-focused{background:rgba(66,133,244,0.26);outline:none}.waffle-dialog-validation-widget-invalid .waffle-dialog-validation-widget-close-button-hover,.waffle-dialog-validation-widget-invalid .waffle-dialog-validation-widget-close-button-focused{background:rgba(219,68,55,0.26)}.waffle-dialog-validation-widget-valid .waffle-dialog-validation-widget-close-button-hover,.waffle-dialog-validation-widget-valid .waffle-dialog-validation-widget-close-button-focused{background:rgba(15,157,88,0.26)}.waffle-dialog-validation-widget-valid .waffle-dataconnector-close-icon polygon{fill:#0f9d58}.waffle-dialog-validation-widget-invalid .waffle-dataconnector-close-icon polygon{fill:#db4437}.waffle-name-box-container{background-color:#fff;display:inline-flex;height:24px}.waffle-name-box{border:none;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;height:19px;margin:2px 0 2px 2px;padding:0 8px 0 6px;width:69px}.waffle-name-box:disabled,.waffle-name-box-menu-active .waffle-name-box:focus,.waffle-name-box-container:hover .waffle-name-box:focus,.waffle-name-box-container:hover .waffle-name-box:disabled,.waffle-name-box-container:hover .waffle-name-box:disabled+.name-box-dropdown,.waffle-name-box-menu-active.waffle-name-box-container:hover .waffle-name-box:focus{background:#fff}.waffle-name-box:focus{border:2px solid #4d90fe;margin:0;padding:0 6px}.name-box-dropdown.goog-toolbar-menu-button{cursor:pointer;height:18px;margin:2px 2px 2px 0;opacity:1}.name-box-dropdown.goog-toolbar-menu-button .goog-toolbar-menu-button-dropdown{margin-top:6px}.name-box-dropdown.goog-toolbar-menu-button:focus{background:#e8eaed}.goog-menu.waffle-named-box-menu{padding:2px 0 0 0;width:340px}.waffle-named-box-menu-open-sidebar-button-container{padding:4px 0}.waffle-named-box-menu-open-sidebar-button-focus,.waffle-named-box-menu-open-sidebar-button-hover,.waffle-name-box-menu-item-active{background:#f5f5f5}.waffle-named-box-menu-open-sidebar-button{color:#5f6368;cursor:pointer;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;padding:8px 0 6px 32px}.waffle-named-box-menu-open-sidebar-button:focus{outline:none}.waffle-named-box-menu-open-sidebar-button-disabled{background:white;cursor:default;opacity:0.38}.waffle-name-box-menu-open-sidebar-button-title{padding-bottom:4px}.waffle-name-box-menu-open-sidebar-button-subtext{color:#80868b;font-size:12px;letter-spacing:0.3px;line-height:16px;padding-right:4px}.goog-menu.waffle-named-box-menu .waffle-function-autocomplete-row{width:auto}.goog-menu.waffle-named-box-menu .waffle-function-autocomplete-row-name,.goog-menu.waffle-named-box-menu .waffle-named-range-autocomplete-row-content{color:#5f6368;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;overflow:hidden}.goog-menu.waffle-named-box-menu .waffle-function-autocomplete-row-description{color:#80868b;display:flex;font-size:12px;padding:7px 0 4px}.goog-menu.waffle-named-box-menu .waffle-named-range-autocomplete-row-icon-container{margin:4px}.goog-menu.waffle-named-box-menu .waffle-named-range-autocomplete-row-content{margin:4px 0}.waffle-named-box-menu-scrollable-wrapper{max-height:324px;overflow-y:auto}.waffle-name-box-menu-open-sidebar-button-separator{border-top:1px solid #dadce0;margin-left:30px}.waffle-name-box-container:hover .waffle-name-box,.waffle-name-box-container:hover .name-box-dropdown,.waffle-name-box-menu-active .waffle-name-box,.waffle-name-box-menu-active .name-box-dropdown,.waffle-name-box-menu-active.waffle-name-box-container:hover .waffle-name-box,.waffle-name-box-menu-active.waffle-name-box-container:hover .name-box-dropdown,.waffle-name-box-menu-active .name-box-dropdown.goog-toolbar-menu-button:focus,.waffle-name-box-container:hover .name-box-menu-separator-container,.waffle-name-box-menu-active .name-box-menu-separator-container,.waffle-name-box-menu-active.waffle-name-box-container:hover .name-box-menu-separator-container{background:#f5f5f5;display:inline-flex}.waffle-name-box-container:hover .waffle-name-box,.waffle-name-box-menu-active .waffle-name-box{width:67px}.waffle-histogram-grouping-box-input{background:white;border:1px solid #dadce0;border-radius:2px;box-sizing:border-box;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;height:28px;width:105px}.waffle-histogram-grouping-box-input-with-label{display:inline-block;margin:0 4px;vertical-align:top}.waffle-histogram-grouping-box-container{padding:8px 12px}.waffle-histogram-grouping-box-input-caption{color:#5f6368;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:11px;line-height:13px;padding-bottom:4px}.waffle-histogram-grouping-box-button-container{display:flex;justify-content:flex-end;padding-top:8px}.waffle-histogram-grouping-box-min-max-row{padding-top:8px}.waffle-histogram-grouping-box-input-error{color:#d93025;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;min-height:15px;padding-top:4px}.waffle-histogram-grouping-box-button-container .waffle-histogram-grouping-box-remove-button .docs-icon{height:24px;width:24px}.waffle-histogram-grouping-box-button-container .waffle-histogram-grouping-box-remove-button .docs-material-button{border-radius:18px;height:36px;margin:0;padding:2px 5px;width:36px}.waffle-histogram-grouping-box-button-container .waffle-histogram-grouping-box-remove-button .docs-material-button.docs-material-button-focused,.waffle-histogram-grouping-box-button-container .waffle-histogram-grouping-box-remove-button .docs-material-button.docs-material-button-no-focus-border{border:none;line-height:36px;padding:0 5px}.waffle-histogram-grouping-box-button-container .waffle-histogram-grouping-box-remove-button .docs-material-button.docs-material-button-focused{background-color:rgba(0,0,0,0.12)}.waffle-db-column-insights-menuitem{-webkit-align-items:center;align-items:center;height:auto;line-height:20px;white-space:nowrap}.waffle-db-column-insights-menuitem-accel{color:#9e9e9e;margin-left:auto;text-align:left}.waffle-db-column-insights-menuitem-refreshquery-info-progress{font-style:italic}.waffle-db-column-insights-menuitem-refreshquery-info-error-button{color:#db4437;text-decoration:underline}.waffle-material-labeledinput{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;position:relative}.waffle-material-labeledinput-inputwrapper{height:46px;position:relative}.waffle-material-labeledinput-inputrow{display:flex;bottom:6px;color:rgba(0,0,0,0.87);height:20px;left:0;position:absolute;vertical-align:top;width:100%;z-index:100}.waffle-material-labeledinput-input{-webkit-box-flex:100;box-flex:100;-ms-flex-positive:100;-webkit-flex-grow:100;flex-grow:100;background:transparent;border:none;color:rgba(0,0,0,0.87);display:block;font-size:13px;height:18px;line-height:18px;outline:none;vertical-align:top}.waffle-material-labeledinput-label{transition:transform 0.2s cubic-bezier(0.4,0.0,1,1);bottom:6px;color:rgba(0,0,0,0.54);font-size:13px;position:absolute;transform-origin:left bottom;width:100%}.waffle-material-labeledinput-errorcontainer{font-size:11px;height:11px;line-height:11px;margin-top:3px;text-align:right}.waffle-material-labeledinput-underline{background:rgba(0,0,0,.42);bottom:3px;height:1px;padding:0;position:absolute;width:100%}.waffle-material-labeledinput-accentunderline{transition:transform 0.2s cubic-bezier(0.4,0.0,1,1);background:#4285f4;bottom:2px;height:2px;padding:0;position:absolute;transform:scaleX(.6);visibility:hidden;width:100%}.waffle-material-labeledinput.waffle-material-labeledinput-focus .waffle-material-labeledinput-accentunderline{transform:scaleX(1);visibility:visible}.waffle-material-labeledinput.waffle-material-labeledinput-focus .waffle-material-labeledinput-label{color:#4285f4}.waffle-material-labeledinput.waffle-material-labeledinput-float .waffle-material-labeledinput-label{transform:translateY(-21px) scale(.846,.846)}.waffle-material-labeledinput.waffle-material-labeledinput-error .waffle-material-labeledinput-accentunderline{background:#db4437;transform:scaleX(1);visibility:visible}.waffle-material-labeledinput.waffle-material-labeledinput-error .waffle-material-labeledinput-label,.waffle-material-labeledinput-errormessage{color:#db4437}.waffle-material-labeledinput-embedded-control{position:relative}.waffle-material-selectioninput .waffle-range-selection-container{border:none;color:rgba(0,0,0,0.87);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;height:33px;line-height:33px;outline:none;padding:0;position:relative;width:100%}.waffle-material-selectioninput .waffle-range-selection-container:after{background-color:rgba(0,0,0,0.12);content:'';height:1px;left:0;position:absolute;top:100%;transition:background-color 0.3s ease;width:100%}.waffle-material-selectioninput:hover .waffle-range-selection-container:after{background-color:rgba(0,0,0,0.38)}.waffle-material-selectioninput .waffle-range-selection-container-focus.waffle-range-selection-container:after{background-color:#4285f4;height:2px}.waffle-material-selectioninput .waffle-range-selection-container.waffle-range-selection-container-focus{box-shadow:none;outline:none}.waffle-material-selectioninput .waffle-range-selection-input,.waffle-material-selectioninput .waffle-range-selection-container-focus .waffle-range-selection-input{padding:0!important}.waffle-material-toolbar-menu-button{color:rgba(0,0,0,0.87);cursor:pointer;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;height:26px;line-height:26px;margin:4px;outline:0}.waffle-material-toolbar-menu-button-disabled{color:rgba(0,0,0,0.12);cursor:default}.waffle-material-toolbar-menu-button-outer-box{border-radius:2px;height:26px;line-height:26px}.waffle-material-toolbar-menu-button-inner-box{height:100%;opacity:.54;width:100%}.waffle-material-toolbar-menu-button-inner-box svg{height:18px;margin:4px 0 4px 4px;width:18px}.waffle-material-toolbar-menu-button-dropdown svg{margin-left:0}.waffle-material-toolbar-menu-button-caption,.waffle-material-toolbar-menu-button-dropdown{display:inline-block;height:26px;line-height:26px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.waffle-material-toolbar-menu-button-hover .waffle-material-toolbar-menu-button-outer-box,.waffle-material-toolbar-menu-button-focused .waffle-material-toolbar-menu-button-outer-box{background-color:rgba(0,0,0,.06)}.waffle-material-toolbar-menu-button-active .waffle-material-toolbar-menu-button-outer-box{background-color:rgba(0,0,0,.12)}.waffle-material-toolbar-menu-button-hover .waffle-material-toolbar-menu-button-inner-box,.waffle-material-toolbar-menu-button-focused .waffle-material-toolbar-menu-button-inner-box,.waffle-material-toolbar-menu-button-active .waffle-material-toolbar-menu-button-inner-box{opacity:0.87}.jfk-bubble.jfk-bubble-promo.waffle-promo-bubble{box-shadow:0px 3px 4px 0px rgba(0,0,0,0.14),0px 3px 3px -2px rgba(0,0,0,0.12),0px 1px 8px 0px rgba(0,0,0,0.2);background:#eeeeee;border:none;color:rgba(0,0,0,0.87);font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;max-width:265px;padding:18px 30px}.jfk-bubble.jfk-bubble-promo.waffle-promo-bubble .jfk-bubble-arrowimplbefore{border-color:transparent #eeeeee}.jfk-bubble.jfk-bubble-promo.waffle-promo-bubble .jfk-bubble-arrowimplafter{border-color:transparent #eeeeee}.waffle-promo-bubble-icon{background:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNHB4IiBoZWlnaHQ9IjI0cHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0iIzAwMDAwMCI+PHBhdGggZD0iTTIzIDEybC0yLjQ0LTIuNzguMzQtMy42OC0zLjYxLS44Mi0xLjg5LTMuMThMMTIgMyA4LjYgMS41NCA2LjcxIDQuNzJsLTMuNjEuODEuMzQgMy42OEwxIDEybDIuNDQgMi43OC0uMzQgMy42OSAzLjYxLjgyIDEuODkgMy4xOEwxMiAyMWwzLjQgMS40NiAxLjg5LTMuMTggMy42MS0uODItLjM0LTMuNjhMMjMgMTJ6bS0xMCA1aC0ydi0yaDJ2MnptMC00aC0yVjdoMnY2eiIvPjwvc3ZnPg==');display:inline-block;height:24px;margin-right:8px;position:relative;top:6px;width:24px}.waffle-promo-bubble-header{display:inline-block;font-size:18px;font-weight:500;line-height:14px}.waffle-promo-bubble-description{font-size:14px;line-height:22px}.waffle-promo-bubble-content .jfk-button{transition:color 200ms cubic-bezier(0.4,0.0,0.2,1);cursor:pointer;font-size:14px;letter-spacing:0.04em;padding-right:15px;padding-top:5px;text-transform:uppercase}.jfk-button.waffle-promo-bubble-close{color:rgba(0,0,0,0.54)}.jfk-button-hover.waffle-promo-bubble-close{color:rgba(0,0,0,0.87)}.jfk-button.waffle-promo-bubble-continue{color:rgba(66,133,244,0.87);font-weight:500}.jfk-button-hover.waffle-promo-bubble-continue{color:rgba(66,133,244,1)}.docs-colormenuitems .goog-menuitem.goog-inline-block.waffle-colormenuitems-scheme-header-edit-button{border-radius:4px;border-width:1px 0;height:22px;margin-left:4px;padding:0;width:24px}.goog-menuitem.goog-inline-block.waffle-colormenuitems-scheme-header-edit-button.goog-menuitem-highlight{border-width:0}.waffle-ui-floating-toast{box-shadow:0px 2px 2px 0px rgba(0,0,0,0.14),0px 3px 1px -2px rgba(0,0,0,0.12),0px 1px 5px 0px rgba(0,0,0,0.2);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;bottom:60px;color:rgba(255,255,255,0.87);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;left:15px;line-height:20px;padding:14px 24px}.waffle-ui-floating-toast-action{transition:opacity 250ms cubic-bezier(0.4,0.0,0.2,1);color:#a1c2fa;font-weight:400;opacity:0.87;text-transform:uppercase}.waffle-ui-floating-toast-action:hover{opacity:1}.waffle-function-filtered-menu .goog-menu-filter{display:flex;border-bottom:1px solid #dadce0;padding:4px 4px 10px 7px}.waffle-function-filtered-menu .goog-menu-filter:before{content:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNHB4IiBoZWlnaHQ9IjI0cHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0iIzc1NzU3NSI+CiAgICA8cGF0aCBkPSJNMTUuNSAxNGgtLjc5bC0uMjgtLjI3QzE1LjQxIDEyLjU5IDE2IDExLjExIDE2IDkuNSAxNiA1LjkxIDEzLjA5IDMgOS41IDNTMyA1LjkxIDMgOS41IDUuOTEgMTYgOS41IDE2YzEuNjEgMCAzLjA5LS41OSA0LjIzLTEuNTdsLjI3LjI4di43OWw1IDQuOTlMMjAuNDkgMTlsLTQuOTktNXptLTYgMEM3LjAxIDE0IDUgMTEuOTkgNSA5LjVTNy4wMSA1IDkuNSA1IDE0IDcuMDEgMTQgOS41IDExLjk5IDE0IDkuNSAxNHoiLz4KICAgIDxwYXRoIGQ9Ik0wIDBoMjR2MjRIMHoiIGZpbGw9Im5vbmUiLz4KPC9zdmc+Cg==');height:24px;margin-right:7px;transform:scale(0.75);width:24px}.waffle-function-filtered-menu .goog-menu-filter input{border:0;color:#202124;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;line-height:24px;min-width:0;outline:0;padding:0}.waffle-function-filtered-menu-item{border-bottom:1px solid #dadce0;padding:10px 10px 10px 15px}.waffle-function-filtered-menu-item:hover,.waffle-function-filtered-menu-item.goog-menuitem-highlight{border-top-width:0}.waffle-function-filtered-menu-item .waffle-filterable-by-text-contains-menu-item-label{color:#3c4043;display:block;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500}.waffle-function-filtered-menu-item .waffle-function-filtered-menu-item-description{color:#80868b;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:400}.waffle-function-filtered-menu-item .waffle-filterable-by-text-contains-menu-item-match{font-weight:700}.waffle-function-filtered-menu-item .waffle-function-filtered-menu-item-description-match{font-weight:500}.waffle-function-filtered-menu::-webkit-scrollbar-thumb{min-height:70px}.waffle-insert-function-row>.goog-menuitem-content{min-width:125px}.waffle-function-category-row{background:#fff;color:#333;cursor:pointer;font-size:13px;font-weight:normal;margin:0;padding:6px 10px;text-overflow:ellipsis;white-space:nowrap;width:250px}.waffle-function-category-row-name,.waffle-function-category-row-description{-ms-flex:1;-webkit-flex:1;flex:1;max-width:95%}.waffle-function-category-row-name{overflow:hidden;text-overflow:ellipsis}.waffle-function-category-row-description{color:#666;display:none;font-size:11px;overflow:hidden;padding:2px 0;text-overflow:ellipsis;white-space:nowrap}.waffle-function-category-active .waffle-function-category-row-description{display:block}.waffle-function-category-active{background:#eee;border-top:1px solid #eee;border-bottom:1px solid #eee;padding:1px 10px}.waffle-info-icon-bubble{border-radius:8px;box-shadow:0 4px 8px 3px rgba(60,64,67,.15);font-size:12px;max-width:200px}.waffle-ui-input-with-edit-button-container{border:1px solid #dadce0;border-radius:4px;box-sizing:border-box;color:#3c4043;padding:1px 8px;font-size:14px;height:36px;margin:8px 0;align-items:center;background:#fff;display:flex;height:24px;margin:0;min-width:20px;padding:1px;width:100%}.waffle-ui-input-with-edit-button-input,.waffle-ui-input-with-edit-button-input:focus{background:transparent;border:none;box-shadow:none;box-sizing:border-box;color:#3c4043;font-size:12px;padding:4px 0 4px 8px;text-overflow:ellipsis;width:calc(100% - 24px)}.waffle-ui-input-with-edit-button-button-container{overflow:hidden;padding:0;text-align:right;width:24px}.waffle-ui-input-with-edit-button-button:hover,.waffle-ui-input-with-edit-button-button:focus{opacity:0.9}.waffle-ui-input-with-edit-button-container.waffle-ui-input-with-edit-button-container-focus{padding:0}.waffle-input-with-edit-button-button-container{box-sizing:border-box;height:24px;padding:2px;width:24px}.waffle-ui-input-with-edit-button-container .waffle-ui-input-with-edit-button-button,.waffle-ui-input-with-edit-button-container .waffle-ui-input-with-edit-button-button:hover,.waffle-ui-input-with-edit-button-container .waffle-ui-input-with-edit-button-button:focus,.waffle-ui-input-with-edit-button-container .waffle-ui-input-with-edit-button-button:hover:focus,.waffle-ui-input-with-edit-button-container .waffle-ui-input-with-edit-button-button:active,.waffle-ui-input-with-edit-button-container .waffle-ui-input-with-edit-button-button{box-shadow:none;cursor:pointer;height:20px;line-height:20px;min-width:20px;padding:0;white-space:nowrap;width:20px}.waffle-ui-input-with-edit-button-container .waffle-ui-input-with-edit-button-button .jfk-button{height:20px;line-height:20px;margin:0;min-width:20px;opacity:.70;width:20px}.waffle-ui-input-with-edit-button-button .waffle-dataconnector-edit-outline-icon{height:20px;width:20px}.waffle-legacy-mnemonics-toast{background-color:#323232;border-radius:2px;bottom:70px;box-shadow:2px 2px 10px 0 rgba(0,0,0,0.4);color:white;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:15px;left:60px;padding:17px 24px;position:absolute}.waffle-legacy-mnemonics-toast-container{display:-webkit-inline-box;display:-moz-inline-box;display:-ms-inline-flexbox;display:-webkit-inline-flex;display:inline-flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row}.waffle-legacy-mnemonics-toast-content{display:-webkit-inline-box;display:-moz-inline-box;display:-ms-inline-flexbox;display:-webkit-inline-flex;display:inline-flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row}.waffle-legacy-mnemonics-toast-text{font-weight:bold;padding-left:4px}.waffle-legacy-mnemonics-toast-cancel{color:#1a73e8;cursor:pointer;font-weight:bold;padding-left:35px;text-transform:uppercase}.waffle-progress-bar.progress-bar-horizontal{background:#c6dafc;height:100%}.waffle-progress-bar>.progress-bar-thumb{background:#4285f4;height:100%}.waffle-indeterminate-progress-bar>.progress-bar-thumb{-webkit-animation:waffle-indeterminate-progress-bar-animation 2s linear infinite;-moz-animation:waffle-indeterminate-progress-bar-animation 2s linear infinite;-o-animation:waffle-indeterminate-progress-bar-animation 2s linear infinite;animation:waffle-indeterminate-progress-bar-animation 2s linear infinite;position:relative;transition:width .2s cubic-bezier(.4,0,.2,1)}@keyframes waffle-indeterminate-progress-bar-animation{0%{left:0%;width:0}50%{left:25%;width:75%}75%{left:100%;width:0%}}.waffle-printing-select-list{background-color:#fafafa;box-shadow:0 0 8px 0 rgba(0,0,0,0.12),0 8px 8px 0 rgba(0,0,0,0.24);border-radius:0 2px 2px 0 2px 2px;left:0;overflow-y:auto;padding:18px 32px;position:absolute;top:0;width:204px;z-index:1003}.waffle-printing-select-list>div{outline:none}.waffle-printing-select-list-checkboxes{margin-bottom:10px}.waffle-printing-select-list-checkboxes .waffle-printing-checkbox-label{line-height:28px;margin-left:12px}.waffle-printing-select-list-cancel{margin-left:0}.goog-menu.waffle-sidebar-draglist-menu{border:none;border-radius:none;box-shadow:none;height:calc(100% - 13px);padding-bottom:12px;padding-top:0;width:160px;z-index:0}.goog-menu.waffle-sidebar-draglist-menu .goog-menu-filter::before{margin-left:2px;margin-right:1px;transform:scale(0.75)}.goog-menu.waffle-sidebar-draglist-menu .goog-menu-filter{padding-bottom:8px;padding-top:8px}.goog-menu.waffle-sidebar-draglist-menu .goog-menu-filter input{line-height:18px}.goog-menu.waffle-sidebar-draglist-menu .goog-menu-content{margin-top:8px;width:100%}.goog-menu.waffle-sidebar-draglist-menu .goog-menuitem{box-sizing:border-box;border-radius:16px;cursor:move;margin:0 4px;overflow:hidden;padding-left:8px;padding-right:8px;margin-bottom:2px;max-width:160px}.waffle-sidebar-draglist-menu .goog-menuitem-highlight{background:#f8f9fa;border-radius:16px;box-shadow:0 1px 2px 0px rgba(60,64,67,.3),0 1px 3px 1px rgba(60,64,67,.15)}.goog-menu.waffle-sidebar-draglist-menu .goog-menuitem-content,.goog-menu.waffle-sidebar-draglist-menu .goog-menuitem-content span{-ms-flex:1;-webkit-flex:1;flex:1;color:#3c4043;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;line-height:18px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.goog-menu.waffle-sidebar-draglist-menu .goog-menuitem-content>div{display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-webkit-justify-content:flex-start;justify-content:flex-start}.goog-menu.waffle-sidebar-draglist-menu .goog-menuitem-icon{margin:0 8px 0 0;position:relative;top:0}.waffle-column-error-button{background:white;border:none;border-radius:2px;box-shadow:0 -1px 5px rgba(128,134,139,0.09),0 3px 5px rgba(128,134,139,0.06),0 1px 2px rgba(60,64,67,0.3),0 1px 3px rgba(60,64,67,0.15);box-sizing:border-box;cursor:pointer;list-style:none;outline:none;overflow:hidden;padding:0;position:absolute;z-index:7}.waffle-column-error-button .waffle-view-icons-error-filled{height:100%;transform:scale(.9);width:100%;z-index:2}.waffle-column-error-button-shim{border-radius:50%;background-color:#fff;height:100%;position:absolute;transform:scale(.5);width:100%}.waffle-column-error-button-ripple{border-radius:50%;background-color:#d93025;height:100%;position:absolute;transform:scale(.5);transition:transform 0.5s;width:100%}.waffle-column-error-button-hover{box-shadow:0 4px 8px 3px rgba(60,64,67,.15)}.waffle-column-error-button-hover>.waffle-column-error-button-ripple{transform:scale(1.5)}.waffle-column-error-button-active>.waffle-column-error-button-ripple{background-color:#c5221f}.waffle-column-error-button-active>.waffle-column-error-button-icon{fill:#c5221f}.docs-charts-component:focus{outline:none}.docs-charts-component-canvas{direction:ltr}.docs-charts-tooltip{box-shadow:0px 2px 2px 0px rgba(0,0,0,0.14),0px 3px 1px -2px rgba(0,0,0,0.12),0px 1px 5px 0px rgba(0,0,0,0.2);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;background-color:#ffffff;border:1px solid #c1c1c1;border-radius:2px;color:rgba(0,0,0,0.87);cursor:default;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;font-weight:500;padding:3px 12px;pointer-events:none;position:absolute}.docs-charts-tooltip-label,.docs-charts-tooltip-value{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.docs-charts-tooltip-entry{margin-bottom:3px;margin-top:3px}.docs-charts-tooltip-symbol-value{white-space:nowrap}.docs-charts-tooltip-entry .docs-charts-tooltip-label{color:rgba(0,0,0,0.54)}.docs-charts-tooltip-entry .docs-charts-tooltip-symbol{margin-right:6px}.docs-charts-tooltip-entry .docs-charts-tooltip-symbol .docs-charts-tooltip-symbol-icon{height:12px;stroke:rgba(0,0,0,0.54);stroke-width:1px;width:12px}.docs-charts-tooltip-entry-single .docs-charts-tooltip-label{margin-bottom:3px}.docs-charts-tooltip-entry-single .docs-charts-tooltip-value{font-size:1.1em;font-weight:700}.docs-charts-tooltip-entry-domain .docs-charts-tooltip-value{color:rgba(0,0,0,0.54)}.docs-charts-tooltip-entry-range .docs-charts-tooltip-value{font-weight:700}.docs-charts-tooltip-entry-range .docs-charts-tooltip-symbol .docs-charts-tooltip-symbol-icon{margin-bottom:-1px}.prof-feedback-bank-xframe-docos-autocomplete-row{box-sizing:border-box;padding:8px 4px;word-wrap:break-word}.docs-ml-icon{direction:ltr;display:inline-block;text-align:left;overflow:hidden;position:relative;vertical-align:middle}.docs-ml-img:before{content:url("//ssl.gstatic.com/docs/common/mobileweb_sprite1.png")}.docs-ml-img-container{height:156px;position:absolute;width:36px}.docs-ml-docs-logo-icon{left:0;top:-36px}.docs-ml-sheets-logo-icon{left:0;top:0}.docs-ml-slides-logo-icon{left:0;top:-96px}.docs-ml-arrow-back-icon{left:0;top:-132px}.docs-ml-edit-icon{left:0;top:-72px}@media screen and (-webkit-min-device-pixel-ratio:2.0){.docs-ml-img{content:url(//ssl.gstatic.com/docs/common/mobileweb_sprite1.png)}.docs-ml-img-container{height:156px;position:absolute;width:36px}.docs-ml-docs-logo-icon{left:0;top:-36px}.docs-ml-sheets-logo-icon{left:0;top:0}.docs-ml-slides-logo-icon{left:0;top:-96px}.docs-ml-arrow-back-icon{left:0;top:-132px}.docs-ml-edit-icon{left:0;top:-72px}}.docs-ml-header{background:#fafafa;border-bottom:1px solid #cbcbcb;box-shadow:0 1px 1px rgba(0,0,0,.1);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;font-family:Roboto,"Helvetica Neue",Helvetica,Arial,sans-serif;padding:4px 0;position:fixed;left:0;top:0;width:100%}.docs-ml-header-icon{height:24px;opacity:0.6;width:24px}.docs-ml-header-icon-container{padding:12px}.docs-ml-header-item{display:inline-block;vertical-align:middle}.docs-ml-header-drive-link{padding-left:4px}body[dir="rtl"] .docs-ml-arrow-back-dir{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.docs-ml-header-document-title{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;line-height:24px;padding:0 12px;width:60%;width:calc(100% - 104px)}.docs-ml-header-document-title-text{font-size:20px;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.docs-ml-header-edit-button{float:right;padding-right:4px}.docs-ml-promotion{background:white;bottom:0;box-shadow:0 4px 12px rgba(0,0,0,0.4);font-family:Arial,Helvetica,sans-serif;left:0;position:fixed;width:100%}.docs-ml-promotion-off-screen{-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}.docs-ml-promotion-shown{-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0);-webkit-transition:-webkit-transform 333ms cubic-bezier(0.4,0.0,0.2,1);transition:transform 333ms cubic-bezier(0.4,0.0,0.2,1)}.docs-ml-promotion-dismissed{-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%);box-shadow:none}.docs-ml-promotion-no-horizontal-scroll{overflow-x:hidden}.docs-ml-promotion-header{display:table;padding:24px 24px 0 24px}.docs-ml-promotion-app-icon-container{display:table-cell}.docs-ml-promotion-app-icon{height:36px;width:36px}@media (min-width:600px){.docs-ml-promotion-app-icon{-webkit-transform:scale(1.33);-moz-transform:scale(1.33);-ms-transform:scale(1.33);-o-transform:scale(1.33);transform:scale(1.33)}}.docs-ml-promotion-text{display:table-cell;padding-left:20px;vertical-align:top}.docs-ml-promotion-text-heading{color:rgba(0,0,0,0.87);font-size:16px;font-weight:bold;padding-bottom:7px}.docs-ml-promotion-text-body{color:rgba(0,0,0,0.87);font-size:14px}.docs-ml-promotion-action-row{float:right;margin-top:6px;padding:8px 24px}.docs-ml-promotion-action-row-desktop{margin-top:6px}.docs-ml-promotion-action-container{display:inline-block;height:48px;margin:6px 4px;vertical-align:middle}.docs-ml-promotion-action-button{display:inline-block;font-size:14px;font-weight:500;padding:9px 12px;vertical-align:middle}.docs-ml-promotion-action-button-wrapper:focus{outline-color:#d6d6d6}.docs-ml-promotion-action-button.docs-ml-promotion-yes-button{background-color:#4285f4;border-radius:4px;color:#fafafa;border:1px solid transparent}.docs-ml-promotion-action-button.docs-ml-promotion-yes-button:active{background-color:#1967d2}.docs-ml-promotion-action-button.docs-ml-promotion-no-button{background-color:#fafafa;color:#5f6368;border-radius:4px;border:1px solid #dadce0}.docs-ml-promotion-action-button.docs-ml-promotion-no-button:active{background-color:#f5f5f5}.docs-ml-promotion.desktop{text-align:center}@media (orientation:portrait){.docs-ml-promotion.desktop{padding-top:56px;padding-bottom:80px}}@media (orientation:landscape){.docs-ml-promotion.desktop{padding-top:36px;padding-bottom:56px}}.docs-ml-promotion-heading-desktop{font-family:'Google Sans';font-size:18px;font-weight:bold;color:#202124;padding-top:18px;padding-bottom:10px;line-height:1.5;max-width:360px;margin:0px auto}@media (orientation:landscape){.docs-ml-promotion-heading-desktop{padding-top:0px;max-width:none}}.docs-ml-promotion-text-body-desktop{font-size:14px;line-height:1.5;color:#5f6368;padding-bottom:10px}.docs-icon.docs-ml-promotion-desktop-icon{height:40px;width:40px;-webkit-transform:scale(2.5);-moz-transform:scale(2.5);-ms-transform:scale(2.5);-o-transform:scale(2.5);transform:scale(2.5);-webkit-transform-origin:top;-moz-transform-origin:top;-ms-transform-origin:top;-o-transform-origin:top;transform-origin:top}.docs-icon-ml-promotion-icon-container-desktop{height:100px;width:100px;margin-left:auto;margin-right:auto}@media (orientation:landscape){.docs-icon-ml-promotion-icon-container-desktop{display:inline-block;vertical-align:top}.docs-ml-promotion-description-desktop{display:inline-block;vertical-align:top;text-align:left;padding-left:39px;max-width:645px}}@media (orientation:landscape){.docs-ml-promotion-action-row-desktop{margin-left:-8px}}.docs-ml-promotion-action-row-desktop .docs-ml-promotion-action-container{margin:6px 8px;font-family:'Google Sans'}.docs-ml-promotion-action-row-desktop .docs-ml-promotion-action-button-wrapper:focus{outline:none}.docs-ml-promotion-action-button.docs-ml-promotion-yes-button.docs-ml-promotion-app-themed{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff}.docs-ml-promotion-action-button.docs-ml-promotion-yes-button.docs-ml-promotion-app-themed:active{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff}.docs-ml-promotion-action-button.docs-ml-promotion-no-button.docs-ml-promotion-app-themed{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:white;border:1px solid #dadce0!important;color:#188038}.docs-ml-promotion-action-button-wrapper:focus .docs-ml-promotion-action-button.docs-ml-promotion-yes-button.docs-ml-promotion-app-themed{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#4f9e67;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15)}.docs-ml-promotion-action-button-wrapper:focus .docs-ml-promotion-action-button.docs-ml-promotion-no-button.docs-ml-promotion-app-themed{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#e7f5eb;border:1px solid #bbe2c6!important}.docs-ml-promotion{z-index:1002}.docs-ml-header{z-index:1002}.ess-button{cursor:pointer;display:inline-block}.ess-disabled-button{opacity:0.25;filter:alpha(opacity=25);display:inline-block}.ess-button,.ess-disabled-button{margin:6px;vertical-align:middle}.ess-icon{width:32px;height:32px;background-image:url(//ssl.gstatic.com/docs/documents/share/images/ess-icons-4.png);background-repeat:no-repeat}.ess-gplus-icon{background-position:0 0}.ess-gmail-icon{background-position:-34px 0}.ess-facebook-icon{background-position:-68px 0}.ess-twitter-icon{background-position:-102px 0}.scope-icon-default-group{background-repeat:no-repeat;background-position:0 -24px}.scope-icon-default-user{background-repeat:no-repeat;background-position:0 -342px}.scope-icon-default{display:inline-block}.scope-icon-default{width:21px;height:21px;opacity:0.55;filter:alpha(opacity=55);margin-top:4px;margin-left:4px}.scope-icon-holder{display:inline-block}.scope-icon-holder{background-color:#f5f5f5;height:29px;width:29px;vertical-align:middle}.scope-icon-invite-holder{background-color:#fff}.scope-icon-custom{width:29px;height:29px;vertical-align:middle}.scope-icon-disabled{opacity:0.25;filter:alpha(opacity=25)}.scope-icon-unused-invite{background-position:0 -770px}.scope-icon-used-invite{background-position:0 -417px}.scope-icon-unused-invite,.scope-icon-used-invite{width:29px;height:29px;vertical-align:middle;margin-top:0px;margin-left:0px;background-repeat:no-repeat;opacity:1;filter:alpha(opacity=100)}.vo-public-icon,.vo-unlisted-icon,.vo-domain-public-icon,.vo-domain-unlisted-icon,.vo-privately-shared-icon,.vo-private-icon{width:21px;height:21px;background-repeat:no-repeat;margin-right:4px;vertical-align:bottom}.vo-public-icon{background-position:0 -671px}.vo-unlisted-icon{background-position:0 -294px}.vo-domain-public-icon{background-position:0 -850px}.vo-domain-unlisted-icon{background-position:0 -551px}.vo-privately-shared-icon{background-position:0 -72px}.vo-private-icon{background-position:0 -575px}.waffle-filterbox-content{border:none;height:130px;margin:0px 4px;overflow-y:auto}.waffle-filterbox-content>.goog-menuitem-content{font-size:12px}.waffle-filterbox-content>.goog-menuitem{padding:1px 7em 1px 26px}.waffle-filterbox-content>.goog-menuitem-highlight{border:0px;background-color:#d0d0d0}.waffle-filterbox-action-link,.waffle-filterbox-dash{color:#15c;text-decoration:none}.waffle-filterbox-action-link:hover{text-decoration:underline}.waffle-filterbox-input{margin-right:-23px;padding-right:23px;width:221px}.waffle-filterbox-input-icon{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -205px -62px;display:inline-block;margin-top:2px;height:12px;width:12px}.waffle-filterbox-label{padding-left:6px}div.waffle-filterbox-label-icon{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -283px -73px;float:right;height:16px;margin-left:18px;width:16px}.waffle-filterbox-label>div,.waffle-filterbox-label>a{display:inline;font-size:12px;margin-right:3px}.waffle-filterbox-menu-spinner{text-align:center}.waffle-filterbox-menu .goog-menu-filter input{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#fff;border:1px solid #dadce0!important;font-weight:normal}.waffle-filterbox-ok-button .goog-imageless-button-content{font-weight:500;padding:0 15px}.waffle-autofilter-border{border-color:#188038;line-height:0}.filtered-incelldropdown-button{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -791px -13px;cursor:pointer;list-style:none;outline:none}.filtered-incelldropdown-button-disabled{cursor:default;filter:alpha(opacity=30);opacity:0.3}.filtered-incelldropdown-button-hover,.filtered-incelldropdown-button-checked,.filtered-incelldropdown-button-focused{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -137px -46px}.waffle-autovis-lightbox{background-color:rgba(0,0,0,0.7);height:100%;left:0;position:absolute;top:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;width:100%;z-index:1000}.waffle-autovis-lightbox-container{height:100%;width:100%}.waffle-autovis-lightbox-chart{height:100%;width:100%}.waffle-autovis-lightbox-content{bottom:0;left:0;margin:auto;position:absolute;right:0;top:60px}.waffle-autovis-lightbox-content-inner{position:relative;white-space:nowrap}.waffle-autovis-lightbox-previous.jfk-button-disabled,.waffle-autovis-lightbox-next.jfk-button-disabled{color:grey;cursor:default}.waffle-autovis-lightbox-page-count{color:white;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:16px;margin-top:35px;text-align:center;width:100%}.waffle-autovis-lightbox-button{background-color:transparent;background-image:none;border:0;color:white;cursor:pointer;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;margin:0;outline:0;padding:0}.waffle-autovis-lightbox-button:focus{border:none;padding:0}.waffle-autovis-lightbox-previous,.waffle-autovis-lightbox-next{bottom:0;color:white;cursor:pointer;height:50px;line-height:50px;margin:auto;position:absolute;text-align:center;top:0;width:50px}.waffle-autovis-lightbox-previous{margin-right:25px;right:100%}.waffle-autovis-lightbox-next{left:100%;margin-left:25px}.waffle-autovis-lightbox-readonly .waffle-autovis-lightbox-readonly-hidden{display:none}.waffle-autovis-lightbox-header{background-color:rgba(0,0,0,0.7);height:60px;width:100%}.waffle-autovis-lightbox-buttons-wrapper{color:white;font-weight:500;line-height:60px;margin-left:auto;margin-right:auto;text-align:center;width:100%}.waffle-autovis-lightbox-close{cursor:pointer;position:absolute;right:20px;top:19px}.goog-date-picker-wday,.goog-date-picker table tbody td{width:22px!important;height:17px;text-align:center;vertical-align:middle;padding:0}.goog-date-picker-btn{border:0;display:block;float:left;width:12px;cursor:pointer;font:9px Verdana;font-weight:500;text-align:center;margin:0;padding:0}* html .goog-date-picker table{margin-left:-1px}.goog-date-picker-menu{position:absolute;background:threedface;-moz-user-focus:normal;border-style:solid;border-width:1px}.goog-date-picker-menu ul{list-style:none;margin:0;padding:0}.goog-date-picker-menu ul li{float:none;cursor:default}.goog-date-picker,.goog-date-picker-wday{background-color:#d9e6f7}.goog-date-picker-btn{background-color:transparent;color:#069}.goog-date-picker-wkend-start,.goog-date-picker-wkend-end{background-color:#e8eef7}#goog-dp-0,#goog-dp-1,#goog-dp-2,#goog-dp-3,#goog-dp-4,#goog-dp-5,#goog-dp-6{border-top:1px solid #a2bbdd}#goog-dp-0,#goog-dp-7,#goog-dp-14,#goog-dp-21,#goog-dp-28,#goog-dp-35{border-left:1px solid #a2bbdd}#goog-dp-6,#goog-dp-13,#goog-dp-20,#goog-dp-27,#goog-dp-34,#goog-dp-41{border-right:1px solid #fff}.waffle-date-picker,.waffle-date-picker *{box-sizing:border-box;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:400}.waffle-date-picker{position:absolute;width:188px;z-index:1000}.goog-date-picker{-moz-user-focus:normal;-moz-user-select:none;background-color:#fff;border:1px solid #dadce0;border-radius:4px;box-shadow:0 2px 6px 2px rgba(60,64,67,.15);outline:none;padding:0 10px 8px 10px;position:relative;user-select:none;width:188px}.goog-date-picker table{empty-cells:hide;outline:none;width:100%}.goog-date-picker table,.goog-date-picker-head td{background-color:transparent}.goog-date-picker table tbody tr th:first-of-type{display:none}.goog-date-picker table tbody:focus{outline:none;background-color:#e6f4ea}.goog-date-picker-head{color:#80868b;font-size:11px;height:40px}.goog-date-picker-monthyear{letter-spacing:0.2px;padding-left:7px;text-align:left;width:63px}.goog-date-picker-button{border:0;border-radius:50%;cursor:pointer;display:block;font-size:10px;height:20px;left:2px;line-height:20px;margin:0 auto;padding-left:0;position:relative;text-align:center;width:20px;background-color:rgba(0,0,0,0);transition:background-color 100ms linear}.goog-date-picker-button:hover{background-color:#f1f3f4;transition:background-color 100ms linear}.goog-date-picker-button:focus{outline:none}.goog-date-picker-button:active{background-color:#dadce0;transition:background-color 100ms linear}.goog-date-picker-nextMonth,.goog-date-picker-previousMonth{background:url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNiIgaGVpZ2h0PSI4IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogICAgPGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgPHBhdGggZmlsbD0iIzc1NzU3NSIgZD0iTS43MjY2NjY2NyA3LjA2TDMuNzggNCAuNzI2NjY2NjcuOTRsLjk0LS45NEw1LjY2NjY2NjcgNCAxLjY2NjY2NjY3IDh6Ii8+CiAgICAgIDxwYXRoIGQ9Ik0tNS00aDE2djE2SC01eiIvPgogICAgPC9nPgogIDwvc3ZnPg==") center no-repeat}[dir="rtl"] .goog-date-picker-nextMonth{transform:rotate(180deg)}.goog-date-picker-previousMonth{transform:rotate(180deg)}[dir="rtl"] .goog-date-picker-previousMonth{transform:rotate(0deg)}.goog-date-picker-foot{display:none}.goog-date-picker-wday,.goog-date-picker .goog-date-picker-date{font-size:10px;font-weight:400;height:20px;line-height:20px;margin:auto;position:relative;text-align:center;width:24px}.goog-date-picker-wday{background-color:transparent;color:#80868b}.goog-date-picker-date{color:#202124;cursor:pointer;background-color:transparent;z-index:1}.goog-date-picker-date:focus{outline:none}.goog-date-picker-date::before{border-radius:50%;content:"";display:block;height:20px;left:2px;position:absolute;top:0;width:20px;z-index:-1;background-color:rgba(0,0,0,0);transition:background-color 100ms linear}.goog-date-picker-date::after{content:"";display:block;height:20px;left:0;position:absolute;top:0;width:24px;z-index:2}.goog-date-picker-date:hover::before{background-color:#dadce0;transition:background-color 100ms linear}.goog-date-picker-other-month{color:#80868b}.goog-date-picker-other-month:hover::before{background-color:#f1f3f4;transition:background-color 100ms linear}.goog-date-picker-selected{background-color:transparent!important;color:#fff!important;font-weight:400!important}.goog-date-picker-selected,.goog-date-picker-selected:hover{color:#fff}.goog-date-picker-selected::before,.goog-date-picker-selected:hover::before{background-color:#188038;transition:background-color 100ms linear}.docs-ui-toast{bottom:74px}.docs-butterbar-container{z-index:1003}.waffle-ellipses{display:inline-block;height:12px;position:relative;width:25px}.waffle-ellipses-message-container{height:0;overflow:hidden;position:absolute;width:0}.waffle-ellipses-container{height:100%;overflow:hidden;width:100%}.waffle-ellipses-sprite{display:block;position:relative}.waffle-ellipses.waffle-ellipses-active svg.waffle-ellipses-sprite{-webkit-animation:waffle-ellipses-sprite-cycle 1000ms steps(5) infinite reverse;-moz-animation:waffle-ellipses-sprite-cycle 1000ms steps(5) infinite reverse;-o-animation:waffle-ellipses-sprite-cycle 1000ms steps(5) infinite reverse;animation:waffle-ellipses-sprite-cycle 1000ms steps(5) infinite reverse}@keyframes waffle-ellipses-sprite-cycle{from{left:0}to{left:-125px}}.waffle-filter-menu{max-height:400px;overflow:auto}.waffle-filter-bar{display:flex;color:#fff;margin-left:35px;height:30px}.waffle-filter-bar-header{font-weight:500;margin-left:10px}.waffle-filter-bar-name-label,.waffle-filter-bar-range-label{padding:7px 0}.waffle-filter-bar-name-input,.waffle-filter-bar-range-input{background-color:transparent;border:1px solid transparent;box-shadow:none;color:#fff;height:19px;margin-top:2.5px}.waffle-filter-bar-name-input:hover,.waffle-filter-bar-range-input:hover{background-color:#6b6b6b}.waffle-filter-bar-name-input:focus,.waffle-filter-bar-range-input:focus{background:#fff;border:1px solid #4d90fe;color:black}.waffle-filter-bar-range-readonly,.waffle-filter-bar-name-readonly{border:1px dotted transparent;margin:0 3px 0 6px;outline:none;overflow:hidden;padding:6px 4px;text-overflow:ellipsis;white-space:nowrap;vertical-align:bottom}.waffle-filter-bar-range-readonly:focus,.waffle-filter-bar-name-readonly:focus{border-color:#ccc}.waffle-filter-bar-options{margin-top:4px}.waffle-filter-bar-close{margin-top:4px}.waffle-filter-bar .goog-flat-button{background-color:transparent;border:none;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;outline:none}.waffle-filter-bar .goog-flat-button:focus,.waffle-filter-bar .goog-flat-button:hover{background-color:#5f6368}.waffle-filter-bar .goog-flat-button.goog-flat-button-open,.waffle-filter-bar .goog-flat-button:active{background-color:#202124}.waffle-slidingdialog-filterbar{background-color:#3c4043;border-bottom:1px solid black;border-left:none;border-right:none;border-top:1px solid black;padding:4px 12px}.waffle-filter-bar-name-inputbox{display:inline}.waffle-filter-bar-name-inputbox,.waffle-filter-bar-name-readonly{width:175px}.waffle-filter-bar-promo-container{display:inline;margin-left:32px;margin-top:30px;position:absolute}.waffle-filter-bar-align-right{float:right}.waffle-filter-bar-promo{font-size:11px;width:200px}.waffle-filter-bar-range-filter-pills-container{display:flex;-webkit-flex-shrink:1;-ms-flex-negative:1;flex-shrink:1;-moz-flex-wrap:wrap;-ms-flex-wrap:wrap;-webkit-flex-wrap:wrap;flex-wrap:wrap;margin:0 10px;overflow-y:scroll}.waffle-filter-bar-add-range-filter-button{-webkit-border-radius:25px;-moz-border-radius:25px;border-radius:25px;color:white;margin-top:5px;white-space:nowrap}.waffle-filter-bar-rangepill{-webkit-border-radius:25px;-moz-border-radius:25px;border-radius:25px;background-color:white;margin-right:5px;margin-top:2.5px;min-width:100px;height:25px}.waffle-filter-bar-rangepill-range{background-color:transparent;color:black;margin-left:10px;min-width:60px;padding:5px 0}.waffle-filter-bar .waffle-filter-bar-rangepill .waffle-filter-bar-rangepill-close:focus,.waffle-filter-bar .waffle-filter-bar-rangepill .waffle-filter-bar-rangepill-close:hover{background:transparent}.waffle-filter-bar-rangepill-close{margin:0}.waffle-filter-bar-range-pill-input{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;height:25px}.waffle-filter-bar-range-section,.waffle-filter-bar-range-section-container{display:flex;-ms-flex:1;-webkit-flex:1;flex:1;overflow:hidden}.waffle-filter-bar-range-section-space-eater{-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1}.waffle-slidingdialog-formbar{background-color:#424242;border-left:none;border-right:none;padding:4px 16px 4px 55px}.waffle-form-bar{color:#fff;height:30px}.waffle-form-bar-forms-icon{position:relative;top:5px}.waffle-form-bar-forms-text{font-family:Roboto,Arial,sans-serif;font-size:14px;font-weight:500;margin-left:16px;padding:7px 0}.waffle-form-bar-right-all-buttons{float:right}.waffle-form-bar-right-all-buttons button{background-color:transparent;border-radius:2px;border:0;color:white;cursor:pointer;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:500;margin-right:8px;min-width:88px;padding:3px 8px;position:relative;text-transform:uppercase;top:-7px}.waffle-form-bar-right-all-buttons button.goog-button-disabled{color:rgba(255,255,255,0.3);cursor:default}.waffle-form-bar-more-options{margin-left:8px;margin-top:4px}.waffle-form-bar .goog-flat-button{background-color:transparent;border:none;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;outline:none}.waffle-form-bar .goog-flat-button:focus,.waffle-form-bar .goog-flat-button-hover,.waffle-form-bar-right-all-buttons button:focus,.waffle-form-bar-right-all-buttons button:hover{background-color:rgba(204,204,204,0.15);outline-width:0}.waffle-form-bar .goog-flat-button.goog-flat-button-open,.waffle-form-bar .goog-flat-button:active,.waffle-form-bar-right-all-buttons button:active{background-color:rgba(204,204,204,0.25);outline-width:0}.waffle-arguments-help-popup{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background-color:white;border:1px solid rgba(0,0,0,.2);box-shadow:0 1px 3px 1px rgba(60,64,67,.15);color:#222;font-size:11px;line-height:15px;position:absolute;width:calc(340px + 2*10px);word-wrap:break-word;z-index:1000}.waffle-arguments-help-title{-webkit-border-radius:4px 4px 0px 0px;-moz-border-radius:4px 4px 0px 0px;border-radius:4px 4px 0px 0px;display:flex;background-color:#f5f5f5;color:#3c4043;direction:ltr;line-height:16px;padding:8px 12px}.waffle-arguments-help-function-name{text-decoration:inherit}.waffle-arguments-help-body{border-top:1px solid #ebebeb}.waffle-arguments-help-content{padding-bottom:2px}.waffle-arguments-help-section{padding:5px 10px}.waffle-arguments-help-section-title{font-size:11px;color:#666;line-height:18px}.formulas-arguments-help-info-title .waffle-arguments-help-section-title{color:#80868b;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;letter-spacing:.8px;text-transform:uppercase}.formulas-arguments-help-info-title.waffle-arguments-help-section{padding:8px 12px 3px}.waffle-arguments-help-content .formulas-arguments-help-info-title.waffle-arguments-help-section{padding-bottom:12px;padding-top:4px}.waffle-arguments-parameter-help-section{padding:12px 0px}.waffle-arguments-parameter-help-section .waffle-arguments-help-section-title{color:#3c4043;font-family:'Roboto Mono','Consolas',monospace;font-size:13px;line-height:20px;transition:0.218s ease-in}.waffle-arguments-parameter-help-section .waffle-arguments-help-section-active .waffle-arguments-help-section-title{color:#188038;font-weight:bold}.waffle-arguments-parameter-help-section .waffle-arguments-help-section{padding:0 12px 4px}.waffle-arguments-parameter-help-section .waffle-arguments-help-section:last-of-type{padding-bottom:0}.waffle-arguments-help-parameter-content{color:#3c4043;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px}.waffle-arguments-help-section-inactive .waffle-arguments-help-parameter-content,.waffle-arguments-help-section.waffle-arguments-help-section-inactive .waffle-arguments-help-section-title{color:#80868b}.waffle-arguments-help-section-active .waffle-arguments-help-parameter-content,.formulas-arguments-help-info-title .waffle-arguments-help-parameter-content{color:#3c4043}.waffle-arguments-parameter-help-section .waffle-arguments-help-parameter-content{transition:0.218s ease-in}.waffle-arguments-help-formula{-ms-flex:1;-webkit-flex:1;flex:1;direction:ltr;font-family:'Roboto Mono','Consolas',monospace;font-size:13px;overflow:hidden;padding:0}.waffle-arguments-help-formula .waffle-arguments-parameter-holder{overflow-wrap:anywhere}.waffle-arguments-help-example-holder{line-height:13px;text-align:left}.waffle-arguments-help-footer{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;padding:0 12px 12px}.waffle-arguments-help-parameter{border-radius:4px;display:inline-block;padding-left:1px;transition:0.218s ease-in}.waffle-arguments-help-parameter-active{background-color:transparent;color:#188038;font-weight:bold}#waffle-arguments-help-learn-more{color:#15c;text-decoration:none}#waffle-arguments-help-learn-more:hover{text-decoration:underline}.waffle-arguments-help-send-feedback{color:#c53929;float:right;text-decoration:none}.waffle-arguments-help-send-feedback:hover,.waffle-arguments-help-send-feedback:focus{text-decoration:underline}.waffle-arguments-help-code{background-color:transparent;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif}.waffle-arguments-help-button-container{margin-right:0}.waffle-arguments-help-button{display:inline-block;margin:-4px;opacity:1;padding:0}.waffle-arguments-help-button:first-of-type{margin-right:8px}.waffle-arguments-help-button:hover{opacity:1}.waffle-arguments-help-button .docs-icon-img:before{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_grey_medium.svg)}.waffle-arguments-help-button-hover .docs-icon-img:before{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_grey_dark.svg)}.waffle-arguments-help-arg-suggestions-title-container .waffle-arguments-help-button{opacity:1}.waffle-arguments-help-toggle-icon{transition:400ms ease-out;-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.waffle-arguments-help-toggle-icon-flipped{-webkit-transform:rotate(0);-moz-transform:rotate(0);-ms-transform:rotate(0);-o-transform:rotate(0);transform:rotate(0)}.waffle-formula-help-button-hover-container{padding-left:1px;padding-top:1px}.waffle-formula-help-button-hover-container:hover,.waffle-arguments-help-button.waffle-arguments-help-button-focused{background-color:#dadce0;border-radius:50%;outline:none}.waffle-arguments-help-arg-suggestions-section{-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;display:flex;background:#e6f4ea;font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;padding:10px;padding-bottom:14px;padding-right:12px}.waffle-arguments-help-arg-suggestions-v1-ui.waffle-arguments-help-arg-suggestions-section{background:#0f9d58;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif}.waffle-arguments-help-arg-suggestions-title-container{display:flex;color:#188038;font-size:13px}.waffle-arguments-help-arg-suggestions-v1-ui .waffle-arguments-help-arg-suggestions-title-container{color:#fff}.waffle-arguments-help-arg-suggestions-title{-webkit-align-items:center;align-items:center;display:flex;-ms-flex:1;-webkit-flex:1;flex:1}.waffle-arguments-help-arg-suggestions-title-text{font-weight:500;text-transform:capitalize}.waffle-arguments-help-arg-suggestions-v1-ui .waffle-arguments-help-arg-suggestions-title-text{font-weight:700;text-transform:uppercase}.waffle-arguments-help-arg-suggestions-selection-message{font-size:12px;font-weight:400}.waffle-arguments-help-arg-suggestions-chips{margin-top:8px;margin-right:10px}.waffle-arguments-help-arg-suggestions-chips-container{-webkit-align-items:center;align-items:center;display:flex}.waffle-arguments-help-arg-suggestions-chip{box-shadow:0 1px 2px 0 rgba(60,64,67,0.30),0 1px 3px 1px rgba(60,64,67,0.15);background:#fff;border:1px solid transparent;border-radius:8px;color:#5f6368;cursor:pointer;font-size:13px;font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;height:16px;line-height:16px;margin-right:8px;max-width:100px;overflow:hidden;padding:7px;text-overflow:ellipsis;white-space:nowrap}.waffle-arguments-help-arg-suggestions-v1-ui .waffle-arguments-help-arg-suggestions-chip{box-shadow:0px 2px 2px 0px rgba(0,0,0,0.14),0px 3px 1px -2px rgba(0,0,0,0.12),0px 1px 5px 0px rgba(0,0,0,0.2);background:#fff;border-radius:4px;border:1px solid #e0e0e0;color:rgba(0,0,0,0.87);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;min-width:60px;text-align:center}.waffle-arguments-help-arg-suggestions-v2-ui .waffle-arguments-help-arg-suggestions-chip.goog-button-hover,.waffle-arguments-help-arg-suggestions-v2-ui .waffle-arguments-help-arg-suggestions-chip.goog-button-focused{box-shadow:0 1px 1px 0 rgba(52,168,83,0.50),0 1px 3px 1px rgba(52,168,83,0.50);-webkit-transform:scale(1.05);-moz-transform:scale(1.05);-ms-transform:scale(1.05);-o-transform:scale(1.05);transform:scale(1.05);border:1px solid #1e8e3e;outline:none}.waffle-arguments-help-arg-suggestions-v1-ui .waffle-arguments-help-arg-suggestions-chip.goog-button-hover,.waffle-arguments-help-arg-suggestions-v1-ui .waffle-arguments-help-arg-suggestions-chip.goog-button-focused{-webkit-transform:scale(1.05);-moz-transform:scale(1.05);-ms-transform:scale(1.05);-o-transform:scale(1.05);transform:scale(1.05);outline:none}.waffle-arguments-help-arg-suggestions-chip.waffle-suggested-arg-chip-selected{box-shadow:0 1px 1px 0 rgba(52,168,83,0.50),0 1px 3px 1px rgba(52,168,83,0.50);background:rgba(52,168,83,0.04);border:1px solid #1e8e3e;color:#1e8e3e}.waffle-arguments-help-arg-suggestions-v1-ui .waffle-arguments-help-arg-suggestions-chip.waffle-suggested-arg-chip-selected{box-shadow:0px 2px 2px 0px rgba(0,0,0,0.14),0px 3px 1px -2px rgba(0,0,0,0.12),0px 1px 5px 0px rgba(0,0,0,0.2);background:#4285f4;border:1px solid #4285f4;font-weight:700;color:#fff}.waffle-arguments-help-arg-suggestions-chip-icon{display:inline-block;float:left;margin-right:7px;height:16px;width:16px}.waffle-arguments-help-arg-suggestions-v1-ui .waffle-arguments-help-arg-suggestions-chip-icon,.waffle-arguments-help-arg-suggestions-v2-ui-no-chip-icon .waffle-arguments-help-arg-suggestions-chip-icon{display:none}.waffle-arguments-help-arg-suggestions-chip-value{line-height:17px;margin-left:-1px}.waffle-formula-autocomplete-renderer .waffle-ac-active{background:#f5f5f5}.waffle-formula-autocomplete-renderer{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;box-shadow:0 1px 3px 1px rgba(60,64,67,.15);width:calc(340px + 2*10px)}.waffle-function-autocomplete-row{text-overflow:ellipsis;width:340px}.waffle-function-autocomplete-row-name,.waffle-function-autocomplete-row-formula{-ms-flex:1;-webkit-flex:1;flex:1;color:#202124;direction:ltr;font-size:14px;font-family:Inconsolata,monospace,arial,sans,sans-serif;margin:-2px 0}.waffle-function-autocomplete-row-name{overflow:hidden;text-overflow:ellipsis}.waffle-formula-autocomplete-row-primary-content .waffle-function-autocomplete-row-formula{margin:0;overflow:hidden}.waffle-function-autocomplete-row-description{color:#5f6368;display:none;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.waffle-ac-active .waffle-function-autocomplete-row-description{display:block}.waffle-function-autocomplete-row-shortcut,.waffle-function-autocomplete-row-simplified-shortcut{color:#666;direction:ltr}.waffle-actionable-autocomplete-row,.waffle-contextual-formula-autocomplete-row,.waffle-named-range-autocomplete-row{-webkit-align-items:flex-start;align-items:flex-start;display:flex;cursor:pointer;direction:ltr}.waffle-ac-row.waffle-ac-actionable-row{padding:1px 10px}.waffle-ac-row.waffle-ac-named-range-row,.waffle-ac-row.waffle-ac-contextual-row{padding-top:1px}.waffle-ac-active.active.waffle-ac-row:first-of-type{border-top-left-radius:4px;border-top-right-radius:4px}.waffle-ac-active.active.waffle-ac-row:last-of-type{border-bottom-left-radius:4px;border-bottom-right-radius:4px}.waffle-ac-actionable-row{border-bottom:1px solid rgba(0,0,0,0.12);border-top:1px solid rgba(0,0,0,0.12)}.waffle-function-autocomplete-row-icon-container,.waffle-named-range-autocomplete-row-icon-container{display:flex;margin-right:3px;width:25px}.waffle-ac-actionable-row .waffle-function-autocomplete-row-icon-container{opacity:0.4}.waffle-ac-contextual-row .waffle-function-autocomplete-row-icon-container{margin:1px 2px 2px 1px}.waffle-actionable-formula-autocomplete-row-content,.waffle-contextual-formula-autocomplete-row-content,.waffle-named-range-autocomplete-row-content{-ms-flex:1;-webkit-flex:1;flex:1;direction:ltr;padding-top:2px;white-space:normal;width:calc(340px - 25px)}.waffle-actionable-formula-autocomplete-row-content,.waffle-contextual-formula-autocomplete-row-content{word-wrap:break-word}.waffle-named-range-autocomplete-row-content{word-wrap:ellipsis}.waffle-formula-autocomplete-row-primary-content{-webkit-align-items:center;align-items:center;display:flex;direction:ltr}.waffle-contextual-formula-autocomplete-row .waffle-formula-autocomplete-row-primary-content{margin:-2px 0}.waffle-ac-close-autocomplete-row{border:none!important}.waffle-ac-close-autocomplete-row{cursor:default!important;background:rgba(0,0,0,0.15)}.waffle-close-autocomplete-row-content{-webkit-align-items:center;align-items:center;display:flex;-webkit-justify-content:flex-end;justify-content:flex-end;-ms-flex:1;-webkit-flex:1;flex:1}.waffle-close-autocomplete-row-close-button{cursor:pointer;opacity:0.3}.waffle-close-autocomplete-row-close-button:hover,.waffle-close-autocomplete-row-close-button:focus{opacity:0.5}.waffle-close-autocomplete-row-message{-ms-flex:1;-webkit-flex:1;flex:1;color:#000;font-weight:500;overflow:hidden;overflow-wrap:break-word;white-space:normal}.waffle-arguments-help-popup hr{background-color:#dadce0;border:0;height:1px;margin:0 12px}.waffle-sidebar-container.waffle-pivot-sidebar{display:block;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif!important;width:300px}.waffle-sidebar-container.waffle-pivot-sidebar:focus{outline:1px solid #4285f4}#waffle-pivot-aggr{display:inline;font-weight:normal;margin-right:5px}#waffle-pivot-aggr .docs-material-select-outer-box{display:flex;border-bottom:none}#waffle-pivot-aggr-select{font-size:12px}.waffle-pivot-container{border:none;padding:12px 16px 0}.waffle-pivot-label{color:rgba(0,0,0,0.87);font-weight:bold;padding:0 0 14px 2px;position:relative}#waffle-pivot-aggr-label{color:rgba(0,0,0,0.87);font-size:13px;font-weight:500;text-decoration:none}.waffle-pivot-label,#waffle-pivot-aggr-label{color:#202124;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;letter-spacing:0.2px;padding-bottom:18px}.waffle-pivot-add-button{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:white;border:1px solid #dadce0!important;color:#188038;height:24px;padding:3px 12px 5px;border:transparent;color:#188038;cursor:pointer;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;letter-spacing:.25px;margin:0;padding:3px 11px 1px 13px;position:absolute;right:0;text-transform:none;top:-3px}.waffle-pivot-add-button:hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#f8fcf9;border:1px solid #c8e7d1!important;height:24px;padding:3px 12px 5px;padding:3px 11px 1px 13px}.waffle-pivot-add-button:focus{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#e7f5eb;border:1px solid #bbe2c6!important;height:24px;padding:3px 12px 5px;background-color:rgba(66,133,244,.12);border:transparent;padding:3px 11px 1px 13px}.hc-enabled .waffle-pivot-add-button:focus{outline:1px solid}.waffle-pivot-add-button:hover:focus{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#dff2e4;border:1px solid #b5e0c1!important;height:24px;padding:3px 12px 5px;padding:3px 11px 1px 13px}.waffle-pivot-add-button:active{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#dff2e4;border:1px solid transparent!important;box-shadow:0 2px 6px 2px rgba(60,64,67,.15);height:24px;padding:3px 12px 5px;padding:3px 11px 1px 13px}.waffle-pivot-add-button-disabled{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:white;border:1px solid #f1f3f4!important;color:#3c4043;opacity:0.38;height:24px;padding:3px 12px 5px;color:rgba(0,0,0,.12);cursor:default;padding:3px 11px 1px 13px}.waffle-pivot-rangepicker-container{padding:8px 16px 8px}#waffle-pivot-range-selection{padding-bottom:8px}#waffle-pivot-range-selection .waffle-range-selection-button{border-radius:50%;margin:0;padding:4px 2px 4px 0}#waffle-pivot-range-selection .waffle-range-selection-button:focus{background-color:rgba(0,0,0,.12)!important}.waffle-pivot-rangepicker-error-label{color:#db4437;font-size:13px}.waffle-pivot-drop-target{height:auto;margin-bottom:-22px;margin-top:-24px;padding-bottom:24px;padding-top:24px}.waffle-pivot-pill{background-color:#fff;border:none;border-radius:2px;box-shadow:0 1px 3px 1px rgba(60,64,67,.15);cursor:move;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif!important;margin-bottom:16px;transition:max-height 0.25s cubic-bezier(0.4,0.0,0.2,1)}.waffle-pivot-pill:focus{outline-color:#4285f4}.hc-enabled .waffle-pivot-pill:focus{outline:1px solid}.waffle-pivot-pill-disabled{cursor:default}.waffle-pivot-pill-checkbox-label{color:#5f6368;font-size:12px;letter-spacing:.13px;margin-left:10px;vertical-align:middle}.waffle-pivot-pill-align-middle{vertical-align:middle}.waffle-pivot-pill-close{color:#8d8d8d;cursor:pointer;float:right;font-size:14px;transform:translateY(-15%)}.waffle-pivot-pill-close .jfk-button{border:transparent;border-radius:50%;font-size:18px;outline:none;width:20px}.waffle-pivot-pill-close .jfk-button:focus{background-color:rgba(0,0,0,.12)}.waffle-pill-during-dragging{height:33px}.waffle-pill-during-dragging .waffle-pivot-pill-section{display:none}.waffle-pivot-pill-close-disabled{color:rgba(0,0,0,.12)}.waffle-pivot-pill-section{box-sizing:border-box;display:inline-block;margin:8px 0;padding:0 8px;vertical-align:top;width:50%}.hc-enabled .waffle-pivot-pill-section .docs-material-gm-select.waffle-pivot-pill-nodrag:focus{outline:1px solid}#waffle-pivot-filter .waffle-pivot-pill-section,.waffle-pill-section-checkbox,.waffle-pivot-date-grouping-section{width:100%}#waffle-pivot-filter .waffle-pivot-filter-pill-select{padding-bottom:2px;padding-top:2px;width:100%}.hc-enabled .waffle-pivot-pill-section .waffle-pivot-filter-pill-select:focus{outline:1px solid}#waffle-pivot-filter .waffle-pivot-filter-pill-select .goog-flat-menu-button-caption{font-size:12px}.waffle-pivot-date-grouping-section{margin-top:4px}.waffle-pill-section-checkbox{margin-top:0}.waffle-pivot-pill-main-table{background:none;border-bottom:none;min-height:16px;padding:10px 8px 6px 12px}.waffle-pivot-pill-main-table-text{float:left;max-width:185px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.waffle-pivot-pill-title{color:#202124;font-size:14px;font-weight:500;letter-spacing:.25px;overflow:hidden;white-space:nowrap}.waffle-pivot-pill-nodrag{cursor:pointer}.waffle-pivot-pill-type-icon{float:left;margin-right:8px;opacity:1!important;position:relative;top:-1px}.waffle-pivot-pill-type-icon.docs-hc-ie{background-color:white;-ms-high-contrast-adjust:none}.waffle-pivot-pill-type-icon.docs-hc-gecko{filter:invert(1)}.waffle-pivot-pill-limit-combobox.docs-material-gm-select{height:26px}.waffle-pivot-pill-limit-combobox .docs-material-gm-select-input.jfk-textinput{background:transparent}.waffle-pivot-pill-limit-combobox.docs-material-gm-select-open .docs-material-gm-select-input.jfk-textinput{background:white;border:2px solid #1a73e8}.waffle-pivot-pill-limit-combobox .docs-material-gm-select-input.jfk-textinput{border:0;font-size:12px;height:20px;margin:0;max-width:100%;width:83px}.waffle-pivot-multi-select{background:#efefef;background-color:#f1f3f4;border:1px solid #d7d7d7;border-color:transparent;border-radius:4px;display:block;margin:3px 0 0 0;padding:3px;position:relative}.waffle-pivot-multi-select .docs-material-gm-select{margin-bottom:4px}.waffle-pivot-multi-select .docs-material-gm-select:last-child{margin-bottom:0}.waffle-pivot-multi-select .docs-material-gm-select-outer-box{background-color:white}.waffle-pivot-pill-sort-by{vertical-align:top;width:100%}.waffle-pivot-multi-select .waffle-pivot-select-caption{color:#555}.waffle-pivot-select-divider{color:#555;margin:0 3px}.waffle-pivot-checkbox{vertical-align:middle}.waffle-pivot-feedback-section{float:right;margin-right:10px;margin-top:5px;position:relative}#waffle-pivot-feedback{padding-left:10px}.waffle-pivot-add-field-menu{overflow-y:auto}.waffle-pivot-add-field-label{display:inline-block;letter-spacing:0.2px;padding-top:2px}.waffle-pivot-aggr-select-container{display:inline-block;height:20px;margin-top:-5px}#waffle-pivot-aggr-select{border-bottom:2px solid transparent}#waffle-pivot-aggr-select:focus{border-color:#4d90fe}.waffle-pivot-select-label{color:#5f6368;font-size:11px;padding-bottom:3px;padding-left:2px}.waffle-pivot-calculated-input{border:1px solid #dadce0;border-radius:4px;box-sizing:border-box;color:#3c4043;font-size:12px;padding:4px 0px 4px 8px;width:100%}.waffle-pivot-calculated-input:focus{outline-color:#4d90fe}.waffle-pill-section-formula{margin-bottom:0;width:100%}.waffle-pill-section-formula .waffle-pivot-pill-nodrag{padding-top:0}.waffle-pill-section-formula .waffle-pivot-pill-nodrag{padding-top:8px}#waffle-pivot-filter{min-height:20px}.waffle-pivot-recommendation-header{outline:none}.waffle-pivot-recommendation-box .waffle-pivot-container{padding:12px 0 0 16px}.waffle-pivot-curr-drag-item{max-height:30px}.waffle-pivot-recommendation-box.legacy .waffle-pivot-container{border-top:1px solid #efefef;height:auto;padding:8px 8px 0px;padding-bottom:12px}.waffle-pivot-recommendation-box.legacy .waffle-pivot-label{font-size:13px;font-weight:500;margin:0;padding-top:2px;padding-bottom:6px}.waffle-pivot-recommendation-header .waffle-pivot-recommendation-toggle-icon{float:right;transition:200ms ease-out;-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.goog-zippy-expanded .waffle-pivot-recommendation-toggle-icon{-webkit-transform:rotate(0);-moz-transform:rotate(0);-ms-transform:rotate(0);-o-transform:rotate(0);transform:rotate(0);border:1px solid transparent}.waffle-pivot-recommendation-header:focus .waffle-pivot-recommendation-toggle-icon{border:1px solid #5e97f6!important;outline:none}.waffle-pivot-recommendation-toggle-icon-disabled{opacity:0.24}.waffle-pivot-recommendation-error{margin-left:2px}.waffle-pivot-recommendation-error,.waffle-pivot-recommendation-container{opacity:0.7}.waffle-pivot-recommendation-container{-webkit-align-items:flex-start;align-items:flex-start;display:flex;background-color:transparent;color:black;cursor:pointer}.waffle-pivot-recommendation-container:hover,.waffle-pivot-recommendation-container:hover .waffle-pivot-recommendation-icon{opacity:1.0}.waffle-pivot-recommendation-body{display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column}.waffle-pivot-recommendation-content{-webkit-align-items:flex-start;align-items:flex-start;display:flex;-ms-flex:1;-webkit-flex:1;flex:1;background-color:transparent;overflow-wrap:break-word;overflow:hidden;padding:4px 0}.waffle-pivot-recommendation-text{-ms-flex:1;-webkit-flex:1;flex:1;color:rgba(0,0,0,0.87);line-height:21px;padding-left:5px;white-space:normal}.waffle-pivot-recommendation-preview-btn{box-shadow:0px 2px 2px 0px rgba(0,0,0,0.14),0px 3px 1px -2px rgba(0,0,0,0.12),0px 1px 5px 0px rgba(0,0,0,0.2);background-color:white;display:none;opacity:0.7;padding:4px;position:absolute;right:0}.waffle-pivot-recommendation-preview-btn-visible,.waffle-pivot-recommendation-container:hover .waffle-pivot-recommendation-preview-btn{cursor:pointer;display:block;opacity:0.9}.waffle-pivot-recommendation-content:focus,.waffle-pivot-recommendation-content:hover{background-color:#f5f5f5;outline:none}.waffle-recommendation-box-spinner-container{-webkit-align-self:center;align-self:center;height:40px;width:40px}.waffle-recommendation-box-spinner-container .waffle-spinner{height:25px;width:25px}.waffle-pivot-recommendation-error-container{display:flex}.waffle-pivot-recommendation-error-image{opacity:0.5}.waffle-pivot-recommendation-error-content{margin-left:10px}.waffle-pivot-rangepicker-label{color:rgba(0,0,0,0.54)}.waffle-pivot-sidebar .docs-material-gm-select-caption{color:#3c4043;font-size:12px;padding-left:8px}.waffle-pivot-sidebar .docs-material-gm-select-outer-box{padding:0}.waffle-pivot-sidebar .docs-material-gm-checkbox{display:inline-block}.waffle-sidebar-container.waffle-pivot-sidebar-column-names-enabled{width:460px}.waffle-sidebar-container.waffle-pivot-sidebar.waffle-pivot-sidebar-column-names-enabled:focus{outline:none}.waffle-pivot-sidebar-column-names-enabled .waffle-sidebar-content{display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;overflow:hidden}.waffle-pivot-sidebar-column-names-enabled #waffle-pivot-sidebar{border-right:1px solid #dadce0;height:100%;overflow-y:auto;width:300px}.waffle-pivot-sidebar-column-names-enabled #waffle-pivot-sidebar .waffle-pivot-container{box-sizing:border-box;max-width:284px;padding-right:0}.waffle-pivot-sidebar-column-names-enabled .waffle-pivot-recommendation-list{position:relative}.waffle-pivot-sidebar-column-names-enabled .waffle-pivot-column-names-container{display:block;height:100%;overflow-y:auto;width:160px}.waffle-pivot-sidebar-column-names-enabled .waffle-pivot-pill{background:#f1f3f4;border:1px solid #f1f3f4;border-radius:8px;box-shadow:none;margin-left:2px;margin-right:2px}.waffle-pivot-sidebar-column-names-enabled .waffle-pivot-pill:focus{box-shadow:0 1px 3px 1px rgba(60,64,67,.15);outline:none}.waffle-pivot-sidebar-column-names-enabled .waffle-pivot-pill-main-table{padding:6px 8px}.waffle-pivot-pill-type-icon{top:1px}.waffle-pivot-sidebar-column-names-enabled .waffle-pivot-pill-main-table-text,.waffle-pivot-sidebar-column-names-enabled .waffle-pivot-pill-title{line-height:20px}.waffle-pivot-sidebar-column-names-enabled .waffle-pivot-pill-title{color:#3c4043;font-weight:500}.waffle-pivot-sidebar-column-names-enabled .waffle-pivot-pill-close{transform:translateX(4px)}.waffle-pivot-sidebar-column-names-enabled .waffle-pivot-pill-close:focus{background-color:#dadce0}.waffle-pivot-sidebar-column-names-enabled .waffle-pivot-pill-close .jfk-button{color:#5f6368;font-size:14px;height:20px;vertical-align:middle;width:20px}.hc-enabled .waffle-pivot-pill-close .jfk-button-flat:focus{outline:1px solid}.waffle-pivot-sidebar-column-names-enabled.waffle-pill-during-dragging{background:#f8f9fa;border-radius:16px;box-shadow:0 4px 4px 0px rgba(60,64,67,.3),0 8px 12px 6px rgba(60,64,67,.15);opacity:0.9}.waffle-pivot-sidebar-column-names-enabled.waffle-pill-during-dragging .waffle-pivot-pill-close{display:none}.waffle-pivot-sidebar-column-names-enabled .docs-material-gm-select{background:white;border-radius:4px}.waffle-pivot-sidebar-column-names-enabled #waffle-pivot-sidebar .waffle-pivot-pill.waffle-pivot-pill-highlight{background:#ceead6;border-color:#34a853}.waffle-pivot-sidebar-column-names-enabled.waffle-pill-during-dragging.goog-menuitem{box-sizing:border-box;border-radius:16px;cursor:move;margin:0 4px;overflow:hidden;padding-left:8px;padding-right:8px;background:#f8f9fa;box-shadow:0 4px 4px 0px rgba(60,64,67,.3),0 8px 12px 6px rgba(60,64,67,.15);opacity:0.9}.waffle-pivot-sidebar-column-names-enabled.waffle-pill-during-dragging.goog-menuitem .goog-menuitem-content,.waffle-pivot-sidebar-column-names-enabled.waffle-pill-during-dragging.goog-menuitem .goog-menuitem-content span{-ms-flex:1;-webkit-flex:1;flex:1;color:#3c4043;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;line-height:18px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:500}.waffle-pivot-sidebar-column-names-enabled.waffle-pill-during-dragging.goog-menuitem .goog-menuitem-content>div{display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-webkit-justify-content:flex-start;justify-content:flex-start}.waffle-pivot-sidebar-column-names-enabled.waffle-pill-during-dragging.goog-menuitem .goog-menuitem-icon{margin:0 8px 0 0;position:relative;top:0}.waffle-printing-pane{left:0;outline:none;position:absolute;height:100%;top:0;width:100%}.waffle-printing-fullscreen-cover{background:rgba(0,0,0,.54);bottom:0;left:0;position:absolute;right:0;top:0}.waffle-printing-loader-message{color:#fff;font:13px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;line-height:60px;text-align:center;width:100%}.waffle-printing-indeterminate-loader{height:4px;left:0;position:absolute;right:0;top:60px}.waffle-printing-body-wrapper{bottom:0;left:0;position:absolute;right:0;top:60px}.waffle-printing-header-bar{background-color:#424242;height:60px;line-height:60px;width:100%}.waffle-printing-header-bar-left{margin-left:12px}.waffle-printing-header-bar-right{margin-right:12px}.waffle-printing-header-bar-middle{height:100%;line-height:60px;overflow:hidden;text-align:center;width:auto}.waffle-printing-top-level-header-left{float:left;height:60px}.waffle-printing-top-level-header-left>div{vertical-align:middle}.waffle-printing-header-title{color:white;display:inline-block;font:18px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;margin-left:28px;margin-right:16px}.waffle-printing-page-counter{color:white;display:inline-block;font:13px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500}.waffle-printing-header-page-total{font-weight:400}.waffle-printing-cancel-button,.waffle-printing-cancel-button.docs-material-button-focused.docs-material-button-no-focus-border{padding-left:4px}.waffle-printing-cancel-button.docs-material-button-focused{padding-left:3px}.waffle-printing-cancel-button .docs-icon{margin:-4px 8px 0 0}.waffle-printing-header-button-set,.waffle-printing-custom-headers-footers-confirm,.waffle-printing-custom-page-breaks-confirm{float:right}.waffle-printing-header-button-set,.waffle-printing-custom-headers-footers-confirm,.waffle-printing-custom-page-breaks-confirm,.waffle-printing-custom-headers-footers-cancel,.waffle-printing-custom-page-breaks-cancel{margin-top:14px;margin-bottom:14px}.waffle-printing-print-button,.waffle-printing-top-level-cancel-button{float:right}.waffle-printing-float-clear{clear:both}.waffle-printing-preview-pane{background-color:#d1d1d1;height:100%;overflow:hidden;position:relative;width:auto}.waffle-printing-preview-outer{height:100%}.waffle-printing-preview-inner{height:100%;overflow-x:auto;overflow-y:scroll}.waffle-printing-preview-card-wrapper{margin:41px 20px 20px 36px}.waffle-printing-preview-card{background-color:#fff;box-shadow:0 8px 10px 1px rgba(0,0,0,0.14),0 3px 14px 3px rgba(0,0,0,0.12),0 4px 5px 0 rgba(0,0,0,0.20);margin:auto;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;width:100%}.waffle-printing-preview-card>canvas{height:100%;width:100%}.waffle-printing-preview-spinner{position:absolute;left:50%;top:50%;transform:translate(-14px,-14px)}.waffle-printing-preview-page-counter-outer{bottom:22px;margin:0 10%;pointer-events:none;position:absolute;width:80%}.waffle-printing-preview-page-counter-inner{background-color:rgba(0,0,0,0.7);border-radius:12px;color:#fff;display:table;font:16px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;margin:auto;padding:20px 32px;text-align:center}.waffle-printing-preview-page-counter-ellipses{max-height:19px}.waffle-printing-options-pane{background-color:#fff;color:#474747;float:right;height:100%;overflow-y:auto;width:300px}.waffle-printing-options-top-section{padding:8px 16px}.waffle-printing-options-section{border-bottom:1px solid #d2d2d2}.waffle-printing-options-wrapper .docs-charts-editor-collapsible-header{font:16px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500}.waffle-printing-options-wrapper .docs-charts-editor-collapsible-title{width:auto}.waffle-printing-options-wrapper .docs-charts-editor-collapsible-summary{display:none}.waffle-printing-options-wrapper h2{color:rgba(0,0,0,.87);font-size:13px;font-weight:normal;margin:20px 0 0}.waffle-printing-options-wrapper h3,.waffle-printing-options-wrapper .docs-material-labeled-select-label,.waffle-printing-options-wrapper .docs-material-gm-labeled-select-label{color:rgba(0,0,0,.54);font:11px Roboto,RobotoDraft,Helvetica,Arial,sans-serif}.waffle-printing-options-wrapper h3,.waffle-printing-options-wrapper .docs-material-labeled-select,.waffle-printing-options-wrapper .docs-material-gm-labeled-select{margin:20px 0 0}.waffle-printing-options-wrapper .waffle-printing-fine-grained-selection-header{margin-bottom:8px}.waffle-printing-options-wrapper .waffle-material-labeledinput{margin:16px 0 0}.waffle-printing-options-wrapper .waffle-material-labeledinput-underline,.waffle-printing-options-wrapper .waffle-material-labeledinput-accentunderline{bottom:0}.waffle-printing-options-wrapper .waffle-material-labeledinput-input{bottom:3px}.waffle-printing-options-pane .docs-charts-editor-material-menu-button-caption{font-size:16px}.waffle-printing-full-size{display:block;padding:0}.waffle-printing-custom-paper-height-wrapper{float:left;width:120px}.waffle-printing-custom-paper-width-wrapper{float:right;width:120px}.waffle-printing-scale .docs-charts-editor-material-text-input{margin-top:12px}.waffle-printing-custom-scale{float:right;margin-left:20px;width:33%}.waffle-printing-scale-wrapper{overflow:hidden;width:auto}.waffle-printing-page-breaks-edit-button{float:right;margin-right:-8px}.waffle-printing-page-breaks-button-and-toggle{line-height:32px;margin:18px 0}.waffle-printing-page-breaks-toggle-wrapper{color:rgba(0,0,0,0.87);vertical-align:middle;float:left;width:auto}.waffle-printing-page-breaks-toggle{display:inline-block;margin-left:12px;position:relative;top:3px}.waffle-printing-page-breaks-toggle-ie{top:5px}.waffle-printing-page-breaks-toggle-label{display:inline-block}.docs-charts-editor-collapsible-content>div.waffle-printing-formatting-section{padding-bottom:16px}.waffle-printing-horizontal-alignment,.waffle-printing-vertical-alignment{float:left;width:118px}.waffle-printing-horizontal-alignment{margin-right:20px}.waffle-printing-options-section.waffle-printing-repeat-header-cells-section{border-bottom:none}.waffle-printing-options-section.waffle-printing-repeat-header-cells-section h2{margin-bottom:10px}.waffle-printing-options-section.waffle-printing-repeat-header-cells-section h3{margin:0 0 16px}.waffle-printing-rfs-columns,.waffle-printing-rfs-rows,.waffle-printing-rfs-columns .docs-charts-editor-labeledcheckbox,.waffle-printing-rfs-rows .docs-charts-editor-labeledcheckbox{display:inline}.waffle-printing-zoom-wrapper{position:absolute;right:22px;bottom:10px;z-index:1}.waffle-printing-zoom-in-button .jfk-button,.waffle-printing-zoom-out-button .jfk-button{background:#fff;border-radius:20px;box-shadow:0 2px 2px 0 rgba(0,0,0,0.14),0 1px 5px 0 rgba(0,0,0,0.12),0 3px 1px -2px rgba(0,0,0,0.2);height:15px;min-width:0;padding:12.5px;position:relative;margin:0 0 12px 0;right:-80px;transition:.2s right;width:15px}.waffle-printing-zoom-in-button .jfk-button .waffle-printing-zoom-icon-wrapper,.waffle-printing-zoom-out-button .jfk-button .waffle-printing-zoom-icon-wrapper{line-height:0;opacity:.54}.waffle-printing-zoom-out-button .jfk-button{transition-delay:.1s}.waffle-printing-preview-pane:hover .waffle-printing-zoom-in-button .jfk-button{right:0}.waffle-printing-preview-pane:hover .waffle-printing-zoom-out-button .jfk-button,.waffle-printing-zoom-out-button .jfk-button-focused{right:0;transition-delay:.1s}.waffle-printing-zoom-force-visible.jfk-button{right:0;transition:none}.waffle-printing-zoom-in-button .jfk-button.jfk-button-hover,.waffle-printing-zoom-in-button .jfk-button.jfk-button-focused,.waffle-printing-zoom-out-button .jfk-button.jfk-button-hover,.waffle-printing-zoom-out-button .jfk-button.jfk-button-focused{box-shadow:0 4px 5px 0 rgba(0,0,0,0.14),0 1px 10px 0 rgba(0,0,0,0.12),0 2px 4px -1px rgba(0,0,0,0.4)}.waffle-printing-zoom-in-button .jfk-button.jfk-button-hover .waffle-printing-zoom-icon-wrapper,.waffle-printing-zoom-in-button .jfk-button.jfk-button-focused .waffle-printing-zoom-icon-wrapper,.waffle-printing-zoom-out-button .jfk-button.jfk-button-hover .waffle-printing-zoom-icon-wrapper,.waffle-printing-zoom-out-button .jfk-button.jfk-button-focused .waffle-printing-zoom-icon-wrapper{opacity:.87}.waffle-printing-zoom-in-button .jfk-button.jfk-button-active,.waffle-printing-zoom-in-button .jfk-button:active,.waffle-printing-zoom-out-button .jfk-button.jfk-button-active,.waffle-printing-zoom-out-button .jfk-button:active{background:#aaa;border-color:#aaa}.waffle-printing-margins-control{outline:none;position:absolute;top:0;left:0}.waffle-printing-margins-control-top,.waffle-printing-margins-control-bottom{cursor:ns-resize;height:5px;left:0;position:absolute;right:0}.waffle-printing-margins-control-right,.waffle-printing-margins-control-left{bottom:0;cursor:ew-resize;position:absolute;top:0;width:5px}.waffle-printing-margins-control-top{border-bottom:2px dashed #4285f4;margin-top:-7px}.waffle-printing-margins-control-top:hover,.waffle-printing-margins-control-top.waffle-printing-margins-control-active{border-bottom:2px solid #4285f4}.waffle-printing-margins-control-bottom{border-top:2px dashed #4285f4;margin-bottom:-7px}.waffle-printing-margins-control-bottom:hover,.waffle-printing-margins-control-bottom.waffle-printing-margins-control-active{border-top:2px solid #4285f4}.waffle-printing-margins-control-right{border-left:2px dashed #4285f4;margin-right:-7px}.waffle-printing-margins-control-right:hover,.waffle-printing-margins-control-right.waffle-printing-margins-control-active{border-left:2px solid #4285f4}.waffle-printing-margins-control-left{border-right:2px dashed #4285f4;margin-left:-7px}.waffle-printing-margins-control-left:hover,.waffle-printing-margins-control-left.waffle-printing-margins-control-active{border-right:2px solid #4285f4}.waffle-printing-margins-control-top-wrapper,.waffle-printing-margins-control-bottom-wrapper,.waffle-printing-margins-control-right-wrapper,.waffle-printing-margins-control-left-wrapper{background:#fff;border:2px dashed #4285f4;height:34px;padding:16px;width:60px}.waffle-printing-margins-control-top:hover .waffle-printing-margins-control-top-wrapper,.waffle-printing-margins-control-active .waffle-printing-margins-control-top-wrapper,.waffle-printing-margins-control-bottom:hover .waffle-printing-margins-control-bottom-wrapper,.waffle-printing-margins-control-active .waffle-printing-margins-control-bottom-wrapper,.waffle-printing-margins-control-right:hover .waffle-printing-margins-control-right-wrapper,.waffle-printing-margins-control-active .waffle-printing-margins-control-right-wrapper,.waffle-printing-margins-control-left:hover .waffle-printing-margins-control-left-wrapper,.waffle-printing-margins-control-active .waffle-printing-margins-control-left-wrapper{border:2px solid #4285f4}.waffle-printing-margins-control-top-title,.waffle-printing-margins-control-bottom-title,.waffle-printing-margins-control-right-title,.waffle-printing-margins-control-left-title{font:11px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;color:rgba(0,0,0,.54);margin-left:-1px}.waffle-printing-margins-control-top-wrapper,.waffle-printing-margins-control-top:hover .waffle-printing-margins-control-top-wrapper,.waffle-printing-margins-control-active .waffle-printing-margins-control-top-wrapper{border-radius:0 0 2px 2px;border-top:none;box-shadow:0 4px 4px 0 rgba(0,0,0,0.25);left:50%;position:absolute;top:5px;transform:translateX(-50%)}.waffle-printing-margins-control-bottom-wrapper,.waffle-printing-margins-control-bottom:hover .waffle-printing-margins-control-bottom-wrapper,.waffle-printing-margins-control-active .waffle-printing-margins-control-bottom-wrapper{border-bottom:none;border-radius:2px 2px 0 0;box-shadow:0 -4px 4px 0 rgba(0,0,0,0.25);bottom:5px;left:50%;position:absolute;transform:translateX(-50%)}.waffle-printing-margins-control-right-wrapper,.waffle-printing-margins-control-right:hover .waffle-printing-margins-control-right-wrapper,.waffle-printing-margins-control-active .waffle-printing-margins-control-right-wrapper{border-radius:2px 0 0 2px;border-right:none;box-shadow:-4px 0 4px 0 rgba(0,0,0,0.25);position:absolute;right:5px;top:50%;transform:translateY(-50%)}.waffle-printing-margins-control-left-wrapper,.waffle-printing-margins-control-left:hover .waffle-printing-margins-control-left-wrapper,.waffle-printing-margins-control-active .waffle-printing-margins-control-left-wrapper{border-left:none;border-radius:0 2px 2px 0;box-shadow:4px 0 4px 0 rgba(0,0,0,0.25);left:5px;position:absolute;top:50%;transform:translateY(-50%)}.waffle-printing-radio-button-wrapper{float:left;margin-top:6px;width:50%}.waffle-printing-radio-button-wrapper .jfk-radiobutton-label{color:rgba(0,0,0,.87);font:13px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;line-height:18px;margin-left:23px}.waffle-printing-radio-button-wrapper .jfk-radiobutton-label label{margin-left:0}.waffle-printing-radio-button-wrapper .jfk-radiobutton-radio,.waffle-printing-radio-button-wrapper .jfk-radiobutton-hover .jfk-radiobutton-radio{border:2px solid #bebebe;height:16px;left:2px;width:16px}.waffle-printing-radio-button-wrapper .jfk-radiobutton-radio::after{background:#4285f4;border:none;height:8px;left:2px;top:2px;width:8px}.waffle-printing-custom-headers-footers-entry-button,.waffle-printing-page-breaks-entry-button{margin-top:8px;margin-left:-8px}.waffle-printing-custom-headers-footers-cancel,.waffle-printing-custom-page-breaks-cancel{float:left}.waffle-printing-custom-headers-footers-body,.waffle-printing-custom-page-breaks-body{background-color:#d1d1d1;bottom:0;left:0;position:absolute;overflow:hidden;right:0;top:60px}.waffle-printing-custom-headers-footers-overlay{background-color:rgba(255,255,255,0.54);outline:none;position:absolute;top:0;left:0}.waffle-printing-custom-headers-footers-content-area{color:rgba(0,0,0,0.24);font:36px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;text-align:center;overflow:hidden;width:100%}.waffle-printing-custom-headers-footers-overlay-group{border-spacing:12px 0;direction:ltr;position:absolute;table-layout:fixed}.waffle-printing-custom-headers-footers-section-wrapper{width:33.3333%}.waffle-printing-custom-headers-footers-section{background-color:white;height:100%;overflow:hidden;padding:0 8px;transition:border-color 0.2s ease;-webkit-user-select:auto;-moz-user-select:auto;-ms-user-select:auto;white-space:nowrap}.waffle-printing-custom-headers-footers-section-inactive{border:1px dotted #bdbdbd}.waffle-printing-custom-headers-footers-section-inactive:hover{border-color:transparent;border-bottom:1px solid rgba(0,0,0,.87);cursor:pointer}.waffle-printing-custom-headers-footers-section-active{border-bottom:2px solid #4285f4}.waffle-printing-custom-headers-footers-section-content{box-sizing:border-box;color:rgba(0,0,0,.87);height:100%;overflow:hidden}.waffle-printing-custom-headers-footers-section-placeholder{color:rgba(0,0,0,.54)}.waffle-printing-custom-header-footer-section-header-left,.waffle-printing-custom-header-footer-section-footer-left{text-align:left}.waffle-printing-custom-header-footer-section-header-right,.waffle-printing-custom-header-footer-section-footer-right{text-align:right}.waffle-printing-custom-header-footer-section-header-middle,.waffle-printing-custom-header-footer-section-footer-middle{text-align:center}.waffle-printing-custom-headers-footers-section:focus,.waffle-printing-custom-headers-footers-section-content:focus{outline:none}.waffle-printing-custom-headers-footers-pill{-webkit-user-select:all;-moz-user-select:all;-ms-user-select:all}.waffle-printing-custom-headers-footers-pill-select{background-color:#fafafa;border-radius:2px;box-shadow:0 2px 2px 0 rgba(0,0,0,0.14),0 1px 5px 0 rgba(0,0,0,0.12),0 3px 1px -2px rgba(0,0,0,0.2);height:34px;min-width:195px;position:absolute;z-index:1003}.waffle-printing-custom-headers-footers-pill-select:focus{outline:none}.waffle-printing-custom-headers-footers-pill-select .goog-toolbar-separator{height:34px;margin:0}.waffle-printing-custom-page-breaks-header-middle{color:white;font:13px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;margin:14px 0}.waffle-printing-custom-page-breaks-scale{display:inline-block;margin-right:8px;position:relative;top:1px}.waffle-printing-custom-page-breaks-scale .waffle-ellipses{padding-left:4px;top:2px}.waffle-printing-custom-page-breaks-scale-label{font-weight:500}.waffle-printing-custom-page-breaks-reset{margin-left:8px}.waffle-printing-custom-page-breaks-waffle{bottom:0;left:0;position:absolute;right:0;top:0}.waffle-printing-custom-page-breaks-canvas-wrapper{left:0;overflow:hidden;position:absolute;top:0;z-index:1}.waffle-printing-custom-page-breaks-dragger-container{position:absolute}.waffle-printing-custom-page-breaks-overlay{border:2px solid #4285f4;box-shadow:0 8px 10px 1px rgba(0,0,0,0.14),0 3px 14px 3px rgba(0,0,0,0.12),0 4px 5px 0 rgba(0,0,0,0.20);position:absolute}.waffle-printing-snapping-dragger,.waffle-printing-snapping-dragger-handle,.waffle-printing-snapping-dragger-handle-bar{border-width:0;box-sizing:border-box;position:absolute}.waffle-printing-snapping-dragger-handle-horizontal .waffle-printing-page-breaks-rounded-corner{left:-24px;top:-11px;transform:rotate(-90deg)}.waffle-printing-snapping-dragger-rtl .waffle-printing-snapping-dragger-handle-horizontal .waffle-printing-page-breaks-rounded-corner{transform:rotate(90deg)}.waffle-printing-snapping-dragger-rtl .waffle-printing-snapping-dragger-handle-horizontal .waffle-printing-page-breaks-rounded-corner-ie{transform:rotate(-90deg)}.waffle-printing-snapping-dragger-handle-vertical .waffle-printing-page-breaks-rounded-corner{left:-11px;top:-24px}.waffle-printing-snapping-dragger-handle-horizontal,.waffle-printing-snapping-dragger-handle-bar-horizontal{height:5px;transform:translateY(-1px)}.waffle-printing-snapping-dragger-handle-bar-horizontal{border-top:2px dashed #4285f4;cursor:row-resize}.waffle-printing-snapping-dragger-handle-vertical,.waffle-printing-snapping-dragger-handle-bar-vertical{transform:translateX(-1px);width:5px}.waffle-printing-snapping-dragger-handle-bar-vertical{border-left:2px dashed #4285f4;cursor:col-resize}.waffle-printing-snapping-dragger-rtl .waffle-printing-snapping-dragger-handle-vertical,.waffle-printing-snapping-dragger-rtl .waffle-printing-snapping-dragger-handle-bar-vertical{transform:translateX(1px)}.waffle-printing-hard-break .waffle-printing-snapping-dragger-handle-bar{border-style:solid}.waffle-printing-snapping-dragger-active .waffle-printing-snapping-dragger-handle-bar,.waffle-printing-snapping-dragger-highlight .waffle-printing-snapping-dragger-handle-bar{border-color:transparent}.waffle-printing-page-breaks-rounded-corner,.waffle-printing-custom-page-breaks-delete{display:block;position:absolute;z-index:1}.waffle-printing-snapping-dragger-hover-bar{background:#4285f4;border:1px solid white;box-shadow:0 8px 10px 1px rgba(0,0,0,0.14),0 3px 14px 3px rgba(0,0,0,0.12),0 4px 5px 0 rgba(0,0,0,0.20);position:absolute;display:none}.waffle-printing-snapping-dragger-hover .waffle-printing-snapping-dragger-hover-bar,.waffle-printing-snapping-dragger-active .waffle-printing-snapping-dragger-hover-bar{display:block}.waffle-printing-snapping-dragger-hover-bar-horizontal{border-left:none;border-right:none;height:2px;left:0;top:-2px;width:100%}.waffle-printing-snapping-dragger-hover-bar-vertical{border-bottom:none;border-top:none;height:100%;left:-2px;top:0;width:2px}.waffle-printing-custom-page-breaks-delete{background-color:transparent;border:none;box-shadow:none;cursor:pointer;fill:#4285f4;height:24px;margin:0;min-width:0;padding:0;transform:scale(0.4);transition:200ms;width:24px}.waffle-printing-custom-page-breaks-delete-horizontal{left:-16px;top:-13px}.waffle-printing-custom-page-breaks-delete-vertical{left:-12px;top:-17px}.waffle-printing-custom-page-breaks-delete .waffle-printing-custom-page-breaks-delete-background{fill:#4285f4;transition:200ms}.waffle-printing-snapping-dragger-hover .waffle-printing-custom-page-breaks-delete,.waffle-printing-snapping-dragger-active .waffle-printing-custom-page-breaks-delete{fill:#000;transform:scale(1.0)}.waffle-printing-snapping-dragger-hover .waffle-printing-custom-page-breaks-delete-horizontal,.waffle-printing-snapping-dragger-active .waffle-printing-custom-page-breaks-delete-horizontal{left:-24px;top:-12px}.waffle-printing-snapping-dragger-hover .waffle-printing-custom-page-breaks-delete-vertical,.waffle-printing-snapping-dragger-active .waffle-printing-custom-page-breaks-delete-vertical{left:-11px;top:-24px}.waffle-printing-snapping-dragger-hover .waffle-printing-custom-page-breaks-delete-background,.waffle-printing-snapping-dragger-active .waffle-printing-custom-page-breaks-delete-background{opacity:0.0}.waffle-printing-custom-page-breaks-delete-icon{background-color:transparent;opacity:0.54;transition:0s}.waffle-printing-custom-page-breaks-delete.jfk-button-hover .waffle-printing-custom-page-breaks-delete-icon,.waffle-printing-custom-page-breaks-delete.jfk-button-focused .waffle-printing-custom-page-breaks-delete-icon{opacity:0.87}.waffle-printing-custom-page-breaks-delete.jfk-button-active,.waffle-printing-custom-page-breaks-delete:active,.waffle-printing-custom-page-breaks-delete.jfk-button-focused,.waffle-printing-custom-page-breaks-delete:focus{border:none;box-shadow:none;outline:none}.waffle-printing-pane .docs-charts-editor-material-menu-button-caption{color:rgba(0,0,0,.87);font-size:13px}.waffle-printing-pane .docs-charts-editor-collapsible-header{color:rgba(0,0,0,.87);font-size:13px;font-weight:normal}.waffle-printing-pane .waffle-printing-headers-and-footers-section h2{color:rgba(0,0,0,.87);font-size:13px;font-weight:normal;margin-top:16px}.waffle-printing-pane .waffle-printing-headers-and-footers-section h3{font-weight:normal;margin-bottom:11px;margin-top:9px}.waffle-printing-pane-base .docs-material-button-content{display:inline-block;min-width:54px}.apps-promo{z-index:21}.apps-promo-popup{width:300px}.apps-promo-buttons{display:none}#waffle-promo-button .goog-custom-button-inner-box{font-weight:500}.waffle-promo{background:#188038!important;border-radius:8px!important;box-shadow:0px 2px 6px rgba(60,64,67,0.15),0px 1px 2px rgba(0,64,67,0.3)!important;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif!important;width:300px!important}.waffle-promo .docs-promo-container{padding:24px!important}.waffle-promo .docs-promo-text-container{width:252px!important}.waffle-promo .docs-promo-header{color:#fff!important;font-weight:700}.waffle-promo .docs-promo-body{color:#fff!important;padding-top:8px}.waffle-promo .docs-promo-action-row{padding-top:16px;padding-right:0;padding-bottom:0}.waffle-promo .docs-promo-action-container{color:#fff!important;font-weight:500;text-transform:lowercase;display:inline-block}.waffle-promo .docs-promo-action-container::first-letter{text-transform:uppercase}.waffle-promo .jfk-bubble-arrowdown .jfk-bubble-arrowimplbefore,.waffle-promo .jfk-bubble-arrowdown .jfk-bubble-arrowimplafter,.waffle-promo .jfk-bubble-arrowup .jfk-bubble-arrowimplbefore,.waffle-promo .jfk-bubble-arrowup .jfk-bubble-arrowimplafter{border-color:#188038 transparent!important}.waffle-promo .jfk-bubble-arrowleft .jfk-bubble-arrowimplbefore,.waffle-promo .jfk-bubble-arrowleft .jfk-bubble-arrowimplafter,.waffle-promo .jfk-bubble-arrowright .jfk-bubble-arrowimplbefore,.waffle-promo .jfk-bubble-arrowright .jfk-bubble-arrowimplafter{border-color:transparent #188038!important}.waffle-shortcut-override-inside-promo{border:240px solid #0f9d58;border-radius:100%;bottom:-260px;height:95px;position:absolute;right:60px;width:95px;background-color:#fff;z-index:500}.waffle-legacy-shortcut-override-inside-promo{border-radius:100%;bottom:-20px;box-shadow:175px 0 0 190px #0f9d58;height:90px;position:absolute;right:435px;width:80px;z-index:500}[dir="rtl"] .waffle-legacy-shortcut-override-inside-promo{box-shadow:-175px 0 0 190px #0f9d58;left:220px}.waffle-shortcut-override-inside-promo-content,.waffle-legacy-shortcut-override-inside-promo-content{color:white;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;left:-100px;line-height:22px;position:absolute;text-align:left;top:-125px;width:275px}.waffle-legacy-shortcut-override-inside-promo-content{left:100px}.waffle-legacy-shortcut-override-dismiss-button{cursor:pointer;color:white;font:500 15px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;margin:25px 0 0 0;min-width:0;outline:none;padding:0;right:5px;text-transform:uppercase;width:0}.waffle-shortcut-override-inside-promo-header{font:500 21px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;line-height:27px;margin-bottom:16px}.waffle-shortcut-override-inside-promo-description{font-size:15px;opacity:0.87}.apps-ui-material-slide-toggle-container{z-index:1000}.waffle-shortcut-override-outside-promo{background-color:#fafafa;bottom:80px;box-shadow:rgba(255,255,255,.9) 0 1px 0 inset,rgba(0,0,0,.03) 0 -1px 0 inset,rgba(0,0,0,.15) 0 15px 10px,rgba(0,0,0,.3) 0 8px 36px;position:absolute;right:40px;width:380px;z-index:1000}.waffle-shortcut-override-outside-promo-header{font-size:16px;font-weight:500;opacity:0.87;padding:22px 25px 0 25px}.waffle-shortcut-override-outside-promo-description{color:#666;line-height:20px;padding:15px 25px}.waffle-shortcut-override-outside-promo-button-container{padding:0 24px 16px;text-align:right}.waffle-shortcut-override-outside-promo-continue-button,.waffle-shortcut-override-outside-promo-dismiss-button{align-items:center;cursor:pointer;display:inline-flex;font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;justify-content:center;text-transform:uppercase}.waffle-shortcut-override-outside-promo-continue-button{background-color:#4285f4;color:white;padding:6px 15px}.waffle-shortcut-override-outside-promo-dismiss-button{color:#4285f4;margin-right:16px}.waffle-sidebar-container{overflow:hidden;box-shadow:-3px 0px 6px -3px rgba(60,64,67,.15),3px 0px 6px -3px rgba(60,64,67,.15);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;border-left:0;outline:none;position:absolute;right:0;top:0;width:300px}.waffle-sidebar-content{background-color:#fff;font-size:100%;overflow-x:hidden;overflow-y:auto;position:relative}.waffle-sidebar-footer-container{bottom:0;position:absolute;width:100%}.waffle-sidebar-header-container{width:100%}.waffle-sidebar-spinner-container{background-color:#fff;height:100%;position:absolute;width:100%}.waffle-sidebar-spinner-container>.waffle-spinner{left:50%;margin-left:-14px;margin-top:-14px;position:absolute;top:50%}.waffle-sidebar-title{display:flex;align-items:center;color:#202124;background-color:#fff;height:56px;padding:0 16px;border-bottom:1px solid #dadce0;border-top:1px solid #dadce0;font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:16px;z-index:1}.waffle-sidebar-title-text{font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:16px;font-weight:500;line-height:24px;position:relative;left:auto}.waffle-sidebar-title-close.docs-sidebar-close-button{cursor:pointer;position:absolute;right:5px;top:7px}.waffle-sidebar-container .jfk-textinput{border:1px solid #dadce0;border-radius:4px;box-sizing:border-box;color:#3c4043;padding:1px 8px;font-size:14px;height:36px;margin:8px 0}.waffle-sidebar-container .jfk-textinput:focus{border:2px solid #1a73e8;box-shadow:none;padding:0px 7px}.waffle-sidebar-container .jfk-select .goog-flat-menu-button-dropdown{margin-top:0px}.waffle-sidebar-container .goog-flat-menu-button.jfk-select{padding-left:8px!important}.waffle-range-selection-holder .docs-icon-grid,.waffle-range-selection-holder .docs-icon-grid:before,.waffle-sidebar-title .docs-gm-sidebar-icon .docs-icon-sheets-table-24,.waffle-sidebar-title .docs-gm-sidebar-icon .docs-icon-sheets-table-24:before,.waffle-sidebar-title .docs-gm-sidebar-icon .docs-icon-filter-control,.waffle-sidebar-title .docs-gm-sidebar-icon .docs-icon-filter-control:before,.waffle-sidebar-title .docs-gm-sidebar-icon .docs-icon-database,.waffle-sidebar-title .docs-gm-sidebar-icon .docs-icon-database:before{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_green.svg)}.waffle-sidebar-container .goog-flat-menu-button{border:1px solid #dadce0;border-radius:4px;box-sizing:border-box;cursor:pointer;padding:8px 6px 8px 8px;width:100%;align-items:center;background:none;box-sizing:border-box;color:#3c4043;display:inline-flex;justify-content:space-between;outline:none;position:relative;width:auto;width:unset}.waffle-sidebar-container .goog-flat-menu-button-disabled{color:#5f6368;opacity:.38;cursor:default}.waffle-sidebar-container .goog-flat-menu-button:active{background-color:#fff;border:1px solid transparent;box-shadow:0 2px 6px 2px rgba(60,64,67,.15)}.waffle-sidebar-container .goog-flat-menu-button-hover{background-color:rgba(60,64,67,0.04);border:1px solid #dadce0;box-shadow:none}.waffle-sidebar-container .goog-flat-menu-button-focused{background-color:rgba(60,64,67,0.06);border:1px solid #dadce0}.waffle-sidebar-container .goog-flat-menu-button-open{background-color:rgba(60,64,67,0.04);border:1px solid transparent}.waffle-sidebar-container .goog-flat-menu-button-hover.goog-flat-menu-button-open{background-color:rgba(60,64,67,0.06)}.waffle-sidebar-container .goog-flat-menu-button-focused.goog-flat-menu-button-open{background-color:rgba(60,64,67,0.08)}.waffle-sidebar-container .goog-flat-menu-button-disabled{border:1px solid #dadce0;box-shadow:none;cursor:default}.waffle-sidebar-container .goog-flat-menu-button-caption{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;color:#202124;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;height:20px;line-height:20px;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.waffle-sidebar-container .goog-flat-menu-button-dropdown{background:no-repeat url(//ssl.gstatic.com/docs/common/material_common_sprite222_grey_medium.svg) -40px -732px;height:18px;width:18px;border:none;margin-top:0;position:relative;right:0;top:0}.waffle-sidebar-container .goog-flat-menu-button-open .goog-flat-menu-button-dropdown{-moz-transform:rotate(180deg);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.waffle-sidebar-container .docs-flatcolormenubutton .goog-flat-menu-button-caption{height:22px;width:22px;border-radius:50%;border:1px solid #dadce0;margin:0;outline:none}.waffle-sidebar-container .docs-flatcolormenubutton.goog-flat-menu-button{padding:6px 0 6px 6px}.waffle-sidebar-container .jfk-button-action{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff}.waffle-sidebar-container .jfk-button-action.jfk-button-hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#2a8947;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15)}.waffle-sidebar-container .jfk-button-action.jfk-button-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#4f9e67;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15)}.waffle-sidebar-container .jfk-button-action.jfk-button-hover.jfk-button-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#62a877;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15)}.waffle-sidebar-container .jfk-button-action.jfk-button-active,.waffle-sidebar-container .jfk-button-action.jfk-button-focus.jfk-button-active{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#62a877;box-shadow:0 2px 6px 2px rgba(52,168,83,0.15)}.waffle-sidebar-container .jfk-button-action.jfk-button-disabled{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#f1f3f4;color:#3c4043;opacity:0.38}.waffle-sidebar-container .jfk-button-standard{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:white;border:1px solid #dadce0!important;color:#188038}.waffle-sidebar-container .jfk-button-standard.jfk-button-hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#f8fcf9;border:1px solid #c8e7d1!important}.waffle-sidebar-container .jfk-button-standard.jfk-button-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#e7f5eb;border:1px solid #bbe2c6!important}.waffle-sidebar-container .jfk-button-standard.jfk-button-hover.jfk-button-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#dff2e4;border:1px solid #b5e0c1!important}.waffle-sidebar-container .jfk-button-standard.jfk-button-active,.waffle-sidebar-container .jfk-button-standard.jfk-button-focus.jfk-button-active{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#dff2e4;border:1px solid transparent!important;box-shadow:0 2px 6px 2px rgba(60,64,67,.15)}.waffle-sidebar-container .jfk-button-standard.jfk-button-disabled{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:white;border:1px solid #f1f3f4!important;color:#3c4043;opacity:0.38}.waffle-sidebar-container .jfk-button-standard.waffle-range-selection-button,.waffle-sidebar-container .jfk-button-standard.jfk-button-hover.waffle-range-selection-button,.waffle-sidebar-container .jfk-button-standard.jfk-button-focused.waffle-range-selection-button,.waffle-sidebar-container .jfk-button-standard.jfk-button-hover.jfk-button-focused.waffle-range-selection-button{border:none!important;padding:8px 0px 0px!important}.docs-sidebar-toggle-tabs{background-color:white;border-bottom:0;height:40px;margin-top:0;width:100%}.docs-sidebar-toggle-tabs .jfk-button.docs-sidebar-toggle-tab>div{display:inline-block;position:relative}.docs-sidebar-toggle-tabs .jfk-button.docs-sidebar-toggle-tab-active{color:#188038;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;text-transform:none;border-bottom:none;line-height:calc(40px - 8px);height:calc(40px - 8px);margin-top:8px}.docs-sidebar-toggle-tabs .jfk-button.docs-sidebar-toggle-tab-inactive{color:#5f6368;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;text-transform:none;border-bottom:none;line-height:calc(40px - 8px);height:calc(40px - 8px);margin-top:8px}.docs-sidebar-toggle-tabs .jfk-button.docs-sidebar-toggle-tab-inactive:hover{color:#202124;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;text-transform:none;border-bottom:none;line-height:calc(40px - 8px);height:calc(40px - 8px);margin-top:8px}.docs-sidebar-toggle-tabs .jfk-button.docs-sidebar-toggle-tab-active>div:after{border-bottom:3px solid #188038;border-radius:3px 3px 0 0;bottom:0;content:'';display:block;height:0;left:-4px;position:absolute;width:calc(100% + 8px)}.docs-sidebar-toggle-tabs .jfk-button-focused.docs-sidebar-toggle-tab-inactive>div:after{border-bottom:3px dotted #188038;border-radius:3px 3px 0 0;bottom:0;content:'';display:block;height:0;left:-4px;position:absolute;width:calc(100% + 8px)}.docs-sidebar-toggle-tabs .jfk-button-active.jfk-button-focused.docs-sidebar-toggle-tab-inactive>div:after{border-top:none}.waffle-slicer-overlay,.waffle-embedded-object-container,.waffle-slicer-container{border-radius:20px}.waffle-slicer-container{-webkit-align-items:center;align-items:center;display:flex;direction:ltr;height:inherit;min-height:100%;min-width:100%}.waffle-slicer-filter-box-container .goog-menu-filter{display:flex;-webkit-align-items:center;align-items:center;position:relative}.waffle-slicer-filter-box-container .waffle-filterbox-input{-ms-flex:1;-webkit-flex:1;flex:1;margin-right:0!important;width:100%}.waffle-slicer-filter-box-container .waffle-filterbox-input-icon{height:18px;position:absolute;right:8px;top:5px;width:18px}.waffle-slicer-filter-box-container .waffle-filterbox-label-icon-jfk{display:none}.waffle-slicer-filter-box-container .waffle-filterbox-content{height:auto!important;margin:3px 0;max-height:320px}.waffle-slicer-filter-box-container .goog-menuitem .goog-menuitem-content{margin:0 6px}.waffle-slicer-filter-container{box-shadow:0px 1px 1px 0px rgba(0,0,0,0.14),0px 2px 1px -1px rgba(0,0,0,0.12),0px 1px 3px 0px rgba(0,0,0,0.2);background:white;direction:ltr;margin-top:4px;overflow-y:auto;padding-top:8px;position:absolute;right:0;left:0;z-index:1000}.waffle-slicer-filter-container .waffle-filterbox-button-container{display:flex;justify-content:flex-end;min-width:200px}.waffle-slicer-filter-container{border-radius:8px}.waffle-slicer-icon-container{height:24px;padding:5px}.waffle-slicer-icon-filtered{border-radius:50%}.waffle-slicer-row{-webkit-align-items:center;align-items:center;display:flex;-ms-flex:1;-webkit-flex:1;flex:1;margin:0 30px 0 5px;overflow:hidden}.waffle-slicer-row-enabled{cursor:pointer}.waffle-slicer-header{display:flex;-ms-flex:1;-webkit-flex:1;flex:1;max-height:100%;overflow:hidden}.waffle-slicer-title-container{-ms-flex:1;-webkit-flex:1;flex:1;margin:0 10px;overflow:hidden;padding:2px 0;text-overflow:ellipsis;white-space:nowrap}.waffle-slicer-status-container{display:flex;-webkit-flex-shrink:1;-ms-flex-negative:1;flex-shrink:1;border-radius:10%;max-width:100px;overflow:hidden;padding:2px 5px 2px 10px;text-overflow:ellipsis;white-space:nowrap}.waffle-slicer-status-icon-container{-webkit-align-items:center;align-items:center;display:flex;-ms-flex:1;-webkit-flex:1;flex:1}.waffle-slicer-icon-container:hover{border-radius:50%}.waffle-slicer-filter-box-container .waffle-conditionalformat-condition-type-select .goog-flat-menu-button,.waffle-slicer-filter-box-container .waffle-conditionalformat-condition-date-select .goog-flat-menu-button,.waffle-slicer-filter-box-container .waffle-conditionalformat-range-args-holder{width:100%}.waffle-slicer-filter-box-container .waffle-conditionalformat-range-args-holder .waffle-conditionalformat-arg1{margin-right:0;padding:10px;width:100%}.waffle-slicer-filter-box-container .waffle-conditionalformat-arg-separator{margin:0 5px}.waffle-slicer-filter-box-container .waffle-conditionalformat-range-args-holder .waffle-conditionalformat-arg2{padding:10px}.waffle-slicer-help-icon-container{margin:0 3px 0 3px;padding:5px;background-color:transparent}.waffle-spinner{display:inline-block;position:relative;width:28px;height:28px}.waffle-spinner-message-container{position:absolute;width:0;height:0;overflow:hidden}.waffle-spinner-container{width:100%;height:100%}.waffle-spinner.waffle-spinner-active .waffle-spinner-container{-webkit-animation:waffle-spinner-container-rotate 1568ms linear infinite;animation:waffle-spinner-container-rotate 1568ms linear infinite}.waffle-spinner-layer{position:absolute;width:100%;height:100%;opacity:0}.waffle-spinner-color-one{border-color:#4285f4}.waffle-spinner-color-two{border-color:#db4437}.waffle-spinner-color-three{border-color:#f4b400}.waffle-spinner-color-four{border-color:#0f9d58}.waffle-spinner.waffle-spinner-active .waffle-spinner-layer.waffle-spinner-color-one{-webkit-animation:waffle-spinner-fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,waffle-spinner-blue-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both;animation:waffle-spinner-fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,waffle-spinner-blue-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both}.waffle-spinner.waffle-spinner-active .waffle-spinner-layer.waffle-spinner-color-two{-webkit-animation:waffle-spinner-fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,waffle-spinner-red-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both;animation:waffle-spinner-fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,waffle-spinner-red-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both}.waffle-spinner.waffle-spinner-active .waffle-spinner-layer.waffle-spinner-color-three{-webkit-animation:waffle-spinner-fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,waffle-spinner-yellow-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both;animation:waffle-spinner-fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,waffle-spinner-yellow-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both}.waffle-spinner.waffle-spinner-active .waffle-spinner-layer.waffle-spinner-color-four{-webkit-animation:waffle-spinner-fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,waffle-spinner-green-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both;animation:waffle-spinner-fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,waffle-spinner-green-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both}.waffle-spinner-gap-patch{position:absolute;box-sizing:border-box;top:0;left:45%;width:10%;height:100%;overflow:hidden;border-color:inherit}.waffle-spinner-gap-patch .waffle-spinner-circle{width:1000%;left:-450%}.waffle-spinner-circle-clipper{display:inline-block;position:relative;width:50%;height:100%;overflow:hidden;border-color:inherit}.waffle-spinner-circle-clipper .waffle-spinner-circle{width:200%}.waffle-spinner-circle{position:absolute;top:0;right:0;bottom:0;left:0;box-sizing:border-box;height:100%;border-width:3px;border-style:solid;border-color:inherit;border-bottom-color:transparent;border-radius:50%;-webkit-animation:none;animation:none}.waffle-spinner-circle-clipper.waffle-spinner-left .waffle-spinner-circle{border-right-color:transparent;-webkit-transform:rotate(129deg);transform:rotate(129deg)}.waffle-spinner-circle-clipper.waffle-spinner-right .waffle-spinner-circle{left:-100%;border-left-color:transparent;-webkit-transform:rotate(-129deg);transform:rotate(-129deg)}.waffle-spinner.waffle-spinner-active .waffle-spinner-circle-clipper.waffle-spinner-left .waffle-spinner-circle{-webkit-animation:waffle-spinner-left-spin 1333ms cubic-bezier(0.4,0.0,0.2,1) infinite both;animation:waffle-spinner-left-spin 1333ms cubic-bezier(0.4,0.0,0.2,1) infinite both}.waffle-spinner.waffle-spinner-active .waffle-spinner-circle-clipper.waffle-spinner-right .waffle-spinner-circle{-webkit-animation:waffle-spinner-right-spin 1333ms cubic-bezier(0.4,0.0,0.2,1) infinite both;animation:waffle-spinner-right-spin 1333ms cubic-bezier(0.4,0.0,0.2,1) infinite both}.waffle-spinner.waffle-spinner-isWarmdown .waffle-spinner-container{-webkit-animation:waffle-spinner-container-rotate 1568ms linear infinite,waffle-spinner-fade-out 400ms cubic-bezier(0.4,0.0,0.2,1);animation:waffle-spinner-container-rotate 1568ms linear infinite,waffle-spinner-fade-out 400ms cubic-bezier(0.4,0.0,0.2,1)}@keyframes waffle-spinner-container-rotate{to{transform:rotate(360deg)}}@keyframes waffle-spinner-fill-unfill-rotate{12.5%{transform:rotate(135deg)}25%{transform:rotate(270deg)}37.5%{transform:rotate(405deg)}50%{transform:rotate(540deg)}62.5%{transform:rotate(675deg)}75%{transform:rotate(810deg)}87.5%{transform:rotate(945deg)}to{transform:rotate(1080deg)}}@keyframes waffle-spinner-blue-fade-in-out{from{opacity:0.99}25%{opacity:0.99}26%{opacity:0}89%{opacity:0}90%{opacity:0.99}100%{opacity:0.99}}@keyframes waffle-spinner-red-fade-in-out{from{opacity:0}15%{opacity:0}25%{opacity:0.99}50%{opacity:0.99}51%{opacity:0}}@keyframes waffle-spinner-yellow-fade-in-out{from{opacity:0}40%{opacity:0}50%{opacity:0.99}75%{opacity:0.99}76%{opacity:0}}@keyframes waffle-spinner-green-fade-in-out{from{opacity:0}65%{opacity:0}75%{opacity:0.99}90%{opacity:0.99}100%{opacity:0}}@keyframes waffle-spinner-left-spin{from{transform:rotate(130deg)}50%{transform:rotate(-5deg)}to{transform:rotate(130deg)}}@keyframes waffle-spinner-right-spin{from{transform:rotate(-130deg)}50%{transform:rotate(5deg)}to{transform:rotate(-130deg)}}@keyframes waffle-spinner-fade-out{from{opacity:0.99}to{opacity:0}}.row-header-wrapper{overflow:hidden;border-width:0;margin:0;padding:0}.column-headers-background,.row-headers-background{z-index:1}.selected-row-headers-background{position:absolute;background-color:#c8c8c8;width:45px;z-index:2}.selected-column-headers-background{position:absolute;background-color:#c8c8c8;height:23px;z-index:2}.waffle td,.grid-fixed-table td{overflow:hidden;border:1px #e5e5e5 solid;border-color:rgba(0,0,0,0.15);border-width:0 1px 1px 0;vertical-align:bottom;line-height:inherit;background-color:#fff;padding:0 3px}.waffle .softmerge{overflow:visible}.softmerge-inner{white-space:nowrap;overflow:hidden;text-overflow:hidden;position:relative}.waffle-ltr td,.grid-fixed-table-ltr td{border-width:0 1px 1px 0}.waffle-rtl td,.grid-fixed-table-rtl td{border-width:0 0 1px 1px}.waffle th,.grid-fixed-table th{font-weight:normal;background:transparent;text-align:center;vertical-align:middle;font-size:8pt;color:#222;height:23px;border:solid 1px #ccc;border-width:0 1px 1px 0;overflow:hidden;padding:0}.waffle-ltr th,.grid-fixed-table-ltr th{border-width:0 1px 1px 0}.waffle-rtl th,.grid-fixed-table-rtl th{border-width:0 0 1px 1px}.no-grid td{border:solid 1px rgb(255,255,255);border:solid 1px rgba(204,204,204,0);border-width:0 1px 1px 0}td.empty{font-size:0!important}th.row-header{background-color:#eee;width:45px;text-align:center;vertical-align:middle;font-size:8pt;color:#333;line-height:inherit;overflow:hidden}th.tall-row,td.tall-row{vertical-align:top}th.row-header-shim,td.row-header-shim{width:0;margin:0;overflow:hidden}div.column-headers-background{position:absolute;height:23px;background:#eee}th.column-headers-background{background:#eee;position:relative}div.row-headers-background{position:absolute;width:45px;background:#eee}th.row-headers-background{background:#eee;position:relative}tr.column-header-row{height:23px}th.selected,td.selected{background-color:#c8c8c8;border-bottom:1px solid #9fc2fd}td.header-shim,th.header-shim{border-width:0 1px 0 0;height:0;margin:0}td.freezebar-cell,th.freezebar-cell{border-color:#dadfe8!important;background-color:#dadfe8;padding:0;border-width:0}th.freezebar-origin-rtl{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -305px -62px}th.freezebar-origin-ltr{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -205px 0}th.freezebar-origin-ltr,th.freezebar-origin-rtl{background-color:#eee;position:relative}th.frozen-column-cell{width:4px}td.freezebar-hidden,th.freezebar-hidden{height:0px;width:0px;display:none}td.frozen-row-cell,th.frozen-row-cell{height:4px}.grid-fixed-table tr{height:10px}.row-header,.row-header-shim{background:#f8f9fa}div.column-headers-background,th.column-headers-background,div.row-headers-background,th.row-headers-background{background:#f8f9fa;color:#5f6368;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif}.waffle-current-theme{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;line-height:16px;padding-left:15px}.waffle-current-theme-bar{background:#fff;border-bottom:1px solid #dadce0;z-index:1}.waffle-current-theme-bar-shadow{box-shadow:0px 1px 1px 0px rgba(0,0,0,0.14),0px 2px 1px -1px rgba(0,0,0,0.12),0px 1px 3px 0px rgba(0,0,0,0.2)}.waffle-current-theme-common-content{display:flex;-webkit-align-items:center;align-items:center}.waffle-current-theme-preview{padding-bottom:20px}.waffle-current-theme-title-section{-ms-flex:1;-webkit-flex:1;flex:1;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;margin:16px 0;overflow:hidden}.waffle-custom-theme-warning-message{background:#f4f4f4;height:32px;margin:auto;padding:10px}.waffle-theme-thumbnail.waffle-theme-active{box-shadow:0px 2px 2px 0px rgba(0,0,0,0.14),0px 3px 1px -2px rgba(0,0,0,0.12),0px 1px 5px 0px rgba(0,0,0,0.2);border:1px solid #34a853}.waffle-theme-button{outline:none}.waffle-theme-container-element{background:#fff;padding-top:16px;outline:none}.waffle-theme-container-element-focus .waffle-theme-thumbnail{border-color:#1a73e8}.waffle-theme-editor-content{display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;height:100%}.waffle-theme-editor-send-feedback-container{text-align:end;padding:10px}.waffle-theme-editor-themes-container{overflow:auto}.waffle-theme-edit-panel-color{display:flex;margin:5px 0}.waffle-theme-edit-panel-color-text{-ms-flex:1;-webkit-flex:1;flex:1;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;line-height:40px;overflow:hidden;text-overflow:ellipsis}.waffle-theme-edit-panel-font-family{margin-top:5px;margin-bottom:25px}.waffle-theme-editor-edit-panel{font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;overflow:auto;padding:25px}.waffle-theme-edit-panel-color-picker{height:32px;margin:auto}.waffle-theme-edit-panel-title{font-weight:500;overflow:hidden;text-overflow:ellipsis}.waffle-theme-title.waffle-current-theme-title{line-height:20px}.waffle-theme-title{color:#3c4043;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;line-height:32px;overflow:hidden;padding:0px 15px;text-overflow:ellipsis;white-space:nowrap}.waffle-theme-thumbnail{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;cursor:pointer;border:1px solid #dadce0;height:154px;margin:auto;width:250px}.waffle-filterbox-container{padding-top:4px;padding-bottom:0;width:300px}.waffle-filtermenu,.waffle-db-filter-by-value-container{background-color:#fff;padding-left:17px;padding-right:20px;letter-spacing:0.2px}.waffle-filterbox-boolean-condition-picker{background-color:#fff;padding-left:17px;padding-right:20px;letter-spacing:0.2px}.waffle-filterbox-with-condition:focus{outline:none}.waffle-autofilter-sort{padding-left:20px;margin:3px 0px 3px 0px}.waffle-autofilter-sort.waffle-datasourcesheet-sort-selected.hc-enabled-focus{outline:1px solid}.waffle-autofilter-sort.waffle-datasourcesheet-sort-selected{background-color:#e8eaed}.goog-menu.waffle-datasourcesheet-filterbox-container .goog-menuitem{padding-left:17px}.waffle-datasourcesheet-filterbox-container .goog-menuseparator{margin-left:17px;margin-right:20px}.waffle-filterbox-container.waffle-datasourcesheet-filterbox-container .waffle-conditionalformat-condition-type-select .goog-flat-menu-button{width:100%}.waffle-filterbox-content{padding:3px 8px 2px 8px}.waffle-filterbox-content>.goog-menuitem{padding:6px 0px 6px 22px}.waffle-filterbox-label{margin-top:15px;margin-bottom:13px}.waffle-filterbox-with-condition .waffle-filterbox-label{margin-top:0}.waffle-filterbox-label-icon-jfk{background:none;float:right}.waffle-filterbox-button-container{padding:14px 0 14px 20px;text-align:right}.waffle-filterbox-with-condition{overflow-y:auto}.waffle-filterbox-input-icon{background:none}.waffle-action-menu{max-height:400px;overflow:auto}.waffle-recording-toast{background-color:#fff;border-bottom:1px solid rgba(0,0,0,0.14);border-radius:8px;bottom:52px;box-shadow:0 4px 8px 3px rgba(60,64,67,.15);color:#3c4043;font:14px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;outline:none;position:absolute}.waffle-recording-toast-top{height:64px;min-width:454px;overflow:hidden;position:relative}.waffle-recording-toast-bottom{background-color:#fff;border-radius:0 0 8px 8px;border-top:1px solid rgba(0,0,0,0.14);box-sizing:border-box;color:#3c4043;font-size:14px;font-weight:500;width:100%}.waffle-recording-toast-relativity-split .jfk-radiobutton{max-width:232px;padding:12px 12px}.waffle-recording-toast-new-content.waffle-recording-toast-slide-in{-webkit-animation:waffle-recording-toast-new-message 2.1s cubic-bezier(0.4,0,0.2,1) forwards;-moz-animation:waffle-recording-toast-new-message 2.1s cubic-bezier(0.4,0,0.2,1) forwards;-o-animation:waffle-recording-toast-new-message 2.1s cubic-bezier(0.4,0,0.2,1) forwards;animation:waffle-recording-toast-new-message 2.1s cubic-bezier(0.4,0,0.2,1) forwards;opacity:1}.waffle-recording-toast-new-content{overflow:hidden;position:absolute;text-overflow:ellipsis;top:-42px;white-space:nowrap}@keyframes waffle-recording-toast-new-message{0%{top:-42px}14%,86%{top:0}100%{top:42px}}.waffle-recording-toast-content{display:inline-block;height:64px;line-height:64px;margin:0 4px 0 16px}.waffle-recording-toast-content,.waffle-recording-toast-new-content,.waffle-recording-toast-default-content{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:205px}.waffle-recording-toast-default-content{opacity:1;transition:opacity 0.3s cubic-bezier(0.4,0,0.2,1)}.waffle-recording-toast-relativity-split{width:50%;display:inline-block;vertical-align:top}.waffle-recording-toast-label-description{color:#3c4043;font-size:12px;font-weight:normal;margin-top:4px}.waffle-recording-toast-right{float:right}.waffle-recording-toast-expand-section{display:inline-block;border-left:1px solid rgba(0,0,0,0.14);box-sizing:border-box;height:64px;padding:20px 5px;vertical-align:bottom}.waffle-recording-toast-expand{border:none;border-radius:2px;display:inline-block;outline:none;padding:3px}.waffle-recording-toast .goog-flat-button{background-color:transparent;border:none;border-radius:2px;color:#5f6368;display:inline-block;font:14px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;height:16px;margin:14px 0;padding:10px}.waffle-recording-toast-cancel,.waffle-recording-toast-stop{text-transform:none}.waffle-recording-toast .waffle-recording-toast-stop{margin:14px 16px}.waffle-recording-toast-close-button{background-color:transparent;border:none;cursor:pointer;display:inline-block;margin:0;padding:0}.waffle-recording-toast-relativity{display:inline-block;padding-left:12px}.waffle-recording-toast-relativity-label{display:inline-block;padding-left:24px}.waffle-edit-actions-dialog,.waffle-import-custom-function-actions-dialog,.waffle-record-script-dialog{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif}.waffle-record-script-dialog-gm.modal-dialog{width:286px}.waffle-record-script-dialog.modal-dialog{border:none;box-shadow:0 4px 16px 0 rgba(0,0,0,.4);min-height:239px;padding:0;width:334px}.waffle-record-script-dialog .modal-dialog-content{line-height:1em;padding:0 24px}.waffle-record-script-dialog .modal-dialog-title{color:rgba(0,0,0,0.87);font-size:19px;font-weight:500;margin:0;padding:21px 24px 16px 24px}.waffle-record-script-dialog .modal-dialog-buttons{float:right;margin:33px 0 14px 0}.waffle-record-script-dialog-label{color:rgba(0,0,0,0.54);font-size:11px;padding-top:3px}.waffle-record-script-dialog-gm .waffle-record-script-dialog-label{color:#3c4043;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;padding:0 0 4px 0}.waffle-record-script-dialog-name-section{margin-bottom:16px}.waffle-record-script-dialog .docs-charts-editor-material-text-input,.waffle-record-script-dialog .docs-charts-editor-material-text-input input{font-size:13px}.waffle-record-script-dialog-gm .waffle-record-script-name-input{width:100%}.waffle-record-script-shortcut input{margin-left:8px;text-align:center;width:60px}.waffle-record-script-dialog-gm .waffle-record-script-shortcut label{margin-right:8px}.waffle-record-script-dialog-gm .waffle-record-script-shortcut input{width:74px}.waffle-recording-toast .jfk-radiobutton-label{margin-left:28px}.waffle-recording-toast .jfk-radiobutton-radio,.waffle-recording-toast .jfk-radiobutton-hover .jfk-radiobutton-radio{border:2px solid #bebebe;height:16px;left:8px;top:12px;width:16px}.waffle-recording-toast .jfk-radiobutton-radio::after{background:#188038;border:4px solid #188038;box-sizing:border-box;height:8px;left:2px;top:2px;width:8px}.waffle-recording-toast .jfk-radiobutton-checked .jfk-radiobutton-radio{border:2px solid #188038}.waffle-recording-toast-relativity-split .jfk-radiobutton-focused .jfk-radiobutton-radio{border:2px solid #188038}.waffle-recording-toast-relativity-split .jfk-radiobutton-checked.jfk-radiobutton-focused .jfk-radiobutton-radio{border:2px solid #0d652d}.waffle-recording-toast-relativity-split .jfk-radiobutton-checked.jfk-radiobutton-focused .jfk-radiobutton-radio::after{background-color:#0d652d;border:4px solid #0d652d}.waffle-recording-toast-icon{color:#ea4335;display:inline-block;height:16px;margin-bottom:24px;margin-left:16px;margin-top:24px;width:16px}.waffle-recording-toast-outer-circle{border:2px solid #ff5959;border-radius:50%;box-sizing:border-box;height:16px;position:relative;width:16px}.waffle-recording-toast-inner-circle{-webkit-animation:waffle-recording-toast-recording-cycle 1333ms steps(1) infinite;-moz-animation:waffle-recording-toast-recording-cycle 1333ms steps(1) infinite;-o-animation:waffle-recording-toast-recording-cycle 1333ms steps(1) infinite;animation:waffle-recording-toast-recording-cycle 1333ms steps(1) infinite;border:4px solid #ff5959;border-radius:50%;box-sizing:border-box;height:8px;left:2px;position:relative;top:2px;width:8px}@keyframes waffle-recording-toast-recording-cycle{0%{border:4px solid #ff5959}50%{border:0}100%{border:4px solid #ff5959}}.waffle-recording-toast-expand-icon{height:18px;width:18px}.waffle-recording-toast-expand-icon::after{content:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgdmlld0JveD0iMCAwIDE4IDE4Ij48ZyBzdHlsZT0iZmlsbDpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZTpub25lIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSg5IDkpc2NhbGUoMSAtMSl0cmFuc2xhdGUoLTkgLTkpIj48cmVjdCB3aWR0aD0iMTgiIGhlaWdodD0iMTgiLz48cG9seWdvbiBwb2ludHM9IjkgNSAzIDExIDQuNCAxMi40IDkgNy44IDEzLjYgMTIuNCAxNSAxMSIgZmlsbD0iIzVmNjM2OCIvPjwvZz48L2c+PC9zdmc+")}.goog-zippy-collapsed .waffle-recording-toast-expand-icon{transform:rotate(-180deg)}.waffle-recording-toast-relativity-info{color:white;display:inline-block;float:right;font-weight:500;height:20px;text-align:center;width:20px}.waffle-recording-toast-info-circle{border:2px solid white;border-radius:50%;height:16px;left:-2px;position:relative;top:-2px;width:16px}.waffle-edit-actions-dialog.modal-dialog{box-shadow:0 4px 16px 0 rgba(0,0,0,.4);border:none;padding:0px;width:441px}.waffle-edit-actions-dialog .modal-dialog-title{color:rgba(0,0,0,0.87);font-size:18px;font-weight:500;margin-bottom:16px;padding:24px 24px 0 24px}.waffle-import-custom-function-actions-dialog .modal-dialog-title .title-action-number{color:rgba(0,0,0,0.54);font-size:18px;font-weight:400;margin-left:5px}.waffle-edit-actions-dialog .modal-dialog-buttons{float:right;margin-bottom:14px;margin-top:8px}.waffle-edit-actions-dialog .modal-dialog-buttons button,.waffle-record-script-dialog .modal-dialog-buttons button{background-color:white;background-image:none;border:none;border-radius:2px;color:rgba(0,0,0,0.54);font-size:13px;font-weight:500;height:32px;margin-right:8px;min-width:64px;padding-left:8px;padding-right:8px;text-transform:uppercase}.waffle-edit-actions-dialog .modal-dialog-buttons .goog-buttonset-default,.waffle-record-script-dialog .modal-dialog-buttons .goog-buttonset-default,.waffle-recording-toast .waffle-recording-toast-stop{color:#4285f4}.waffle-edit-actions-dialog .modal-dialog-buttons button:hover:enabled,.waffle-record-script-dialog .modal-dialog-buttons button:hover:enabled,.waffle-recording-toast .goog-flat-button-hover,.waffle-recording-toast-expand:hover{background-color:rgba(0,0,0,0.12)}.waffle-edit-actions-dialog .modal-dialog-buttons button:focus,.waffle-record-script-dialog .modal-dialog-buttons button:focus,.waffle-recording-toast .goog-flat-button-focused,.waffle-recording-toast-expand:focus{background-color:#ddd;background-image:none;border:none}.waffle-edit-actions-dialog .modal-dialog-buttons button:active:enabled,.waffle-record-script-dialog .modal-dialog-buttons button:active:enabled,.waffle-recording-toast .goog-flat-button-active,.waffle-recording-toast-expand:active{background-color:rgba(0,0,0,0.12);color:rgba(0,0,0,0.87)}.waffle-edit-actions-dialog .modal-dialog-buttons button.goog-buttonset-default:hover:enabled,.waffle-record-script-dialog .modal-dialog-buttons button.goog-buttonset-default:hover:enabled,.waffle-recording-toast .waffle-recording-toast-stop.goog-flat-button-hover{background-color:rgba(66,133,244,0.12)}.waffle-edit-actions-dialog .modal-dialog-buttons button.goog-buttonset-default:active:enabled,.waffle-record-script-dialog .modal-dialog-buttons button.goog-buttonset-default:active:enabled,.waffle-recording-toast .waffle-recording-toast-stop.goog-flat-button-active,.waffle-recording-toast .waffle-recording-toast-stop.goog-flat-button-enabled{background-color:rgba(66,133,244,0.32);color:#3367d6}.waffle-import-custom-function-add-function .goog-flat-button,.waffle-recording-toast-stop.goog-flat-button{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:white;color:#188038;outline:none;text-transform:none}.waffle-import-custom-function-add-function .goog-flat-button-hover,.waffle-recording-toast-stop.goog-flat-button-hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#f8fcf9;color:#188038}.waffle-import-custom-function-add-function .goog-flat-button-focused,.waffle-recording-toast-stop.goog-flat-button-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#e7f5eb;color:#188038}.waffle-import-custom-function-add-function .goog-flat-button-active,.waffle-recording-toast-stop.goog-flat-button-active{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#dff2e4;color:#188038;box-shadow:0 2px 6px 2px rgba(60,64,67,.15)}.waffle-import-custom-function-view-script .goog-flat-button,.waffle-recording-toast-cancel.goog-flat-button{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:white;color:#5f6368;outline:none;text-transform:none}.waffle-import-custom-function-view-script .goog-flat-button-hover,.waffle-recording-toast-cancel.goog-flat-button-hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#f8fcf9;color:#5f6368}.waffle-import-custom-function-view-script .goog-flat-button-focused,.waffle-recording-toast-cancel.goog-flat-button-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#e7f5eb;color:#5f6368}.waffle-import-custom-function-view-script .goog-flat-button-active,.waffle-recording-toast-cancel.goog-flat-button-active{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#dff2e4;color:#5f6368;box-shadow:0 2px 6px 2px rgba(60,64,67,.15)}.waffle-recording-toast-expand:hover{background-color:#f8fcf9}.waffle-recording-toast-expand:focus{background-color:#e7f5eb}.waffle-recording-toast-expand:focus:hover{background-color:#dff2e4}.waffle-recording-toast-expand:active{background-color:#dff2e4;box-shadow:0 2px 6px 2px rgba(60,64,67,.15)}.waffle-edit-actions-dialog .waffle-edit-actions-row{padding-bottom:10px;padding-top:10px}.waffle-edit-actions-row{color:rgba(0,0,0,0.87);font-size:13px;font-weight:400;height:30px}.waffle-edit-actions-row-name{float:left;margin-right:10px;width:175px}.waffle-edit-actions-row-shortcut-prefix{display:inline-block;margin-right:5px;padding-top:4px}.waffle-edit-actions-row-shortcut{display:inline-block;width:32px}.waffle-edit-actions-row-shortcut-input{max-width:100%;text-align:center}.waffle-edit-actions-row-name input:disabled{color:rgba(0,0,0,0.87);border:none}.waffle-edit-actions-row-name input{max-width:100%}.waffle-edit-actions-dialog .modal-dialog-title-close{margin-right:7px;padding:24px 17px 24px 24px}.waffle-edit-actions-dialog-scroll{max-height:346px;min-height:160px;overflow-y:auto;padding:10px 24px 10px 24px}.waffle-edit-actions-dialog-gm .waffle-edit-actions-dialog-scroll{padding:0 4px}.waffle-edit-actions-options{float:right}.waffle-edit-actions-row-menu{display:inline-block;margin-left:10px}.waffle-edit-actions-options .goog-menuitem{padding-right:30px}.waffle-edit-actions-row .goog-menu{display:inline-block;overflow:hidden}.waffle-edit-actions-shortcut-conflict-message{clear:left;color:#db4437;font-size:11px}.waffle-edit-actions-undo-remove-toast{z-index:1003}.waffle-edit-actions-dialog .modal-dialog-buttons button:disabled{opacity:0.38}.waffle-import-custom-function-title-description{color:rgba(0,0,0,0.54);font-size:11px;font-weight:400}.waffle-import-custom-functions-row-container{padding-top:8px}.waffle-import-custom-function-actions-dialog.modal-dialog{border:none;box-shadow:0 4px 16px 0 rgba(0,0,0,.4);padding:24px 12px;width:451px}.waffle-import-custom-function-actions-dialog .modal-dialog-title{color:rgba(0,0,0,0.87);font-size:18px;font-weight:500;margin-bottom:16px;padding:0 12px}.waffle-import-custom-function-actions-title-separator{border-bottom:1px solid rgba(0,0,0,0.12);margin:0 12px}.waffle-import-custom-function-actions-dialog-scroll{max-height:381px;min-height:185px;overflow-y:scroll;padding:0 1px 10px 2px}.waffle-import-custom-function-row{margin-top:8px;padding-left:10px}.waffle-import-custom-function-add-function{display:inline-block;float:right}.waffle-import-custom-function-add-function button{background-color:white;border:none;border-radius:2px;color:#4285f4;font:500 15px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;height:32px;padding:8px;text-transform:uppercase}.waffle-import-custom-function-add-function button:hover{background-color:rgba(66,133,244,0.12)}.waffle-import-custom-function-add-function button:active{background-color:rgba(66,133,244,0.32);color:#3367d6}.waffle-import-custom-function-name{color:rgba(0,0,0,0.87);font-weight:500;font-size:13px}.waffle-import-custom-function-metadata{color:rgba(0,0,0,0.54);font-size:11px;font-weight:400;margin-top:6px}.waffle-import-custom-function-description-label{font-weight:500}.waffle-import-custom-function-project-name{display:inline-block}.waffle-import-custom-function-file-name{display:inline-block;margin-left:16px}.waffle-import-custom-function-view-script{display:inline-block}.waffle-import-custom-function-view-script button{background-color:white;background-image:none;border:none;border-radius:2px;color:rgba(0,0,0,0.6);font:500 15px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;height:32px;margin-left:-8px;text-transform:uppercase;padding:8px;line-height:1em}.waffle-import-custom-function-view-script button:hover{background-color:rgba(0,0,0,0.12)}.waffle-import-custom-function-view-script button:active{background-color:rgba(0,0,0,0.12);color:rgba(0,0,0,0.87)}.function-description-seperator{padding-left:5px}.waffle-import-custom-function-actions-status-toast{z-index:1003}.waffle-import-custom-function-actions-checkmark{height:24px;width:24px}.waffle-import-custom-function-actions-checkmark::after{content:url("data:image/svg+xml;base64,PHN2ZyB4bWxuczp4bGluaz0naHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluaycgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB2ZXJzaW9uPScxLjEnIHdpZHRoPScyNHB4JyBoZWlnaHQ9JzI0cHgnIHZpZXdCb3g9JzAgMCAxNSAxNSc+PHBhdGggZmlsbD0nZ3JleScgZmlsbC1ydWxlPSdldmVub2RkJyBkPSdNNywxNCBDMTAuODY1OTkzMiwxNCAxNCwxMC44NjU5OTMyIDE0LDcgQzE0LDMuMTM0MDA2NzUgMTAuODY1OTkzMiwwIDcsMCBDMy4xMzQwMDY3NSwwIDAsMy4xMzQwMDY3NSAwLDcgQzAsMTAuODY1OTkzMiAzLjEzNDAwNjc1LDE0IDcsMTQgWiBNMi4yNSw3LjUgTDMuMzA3NSw2LjQ0MjUgTDUuNSw4LjYyNzUgTDEwLjY5MjUsMy40MzUgTDExLjc1LDQuNSBMNS41LDEwLjc1IEwyLjI1LDcuNSBaJz48L3BhdGg+PC9zdmc+")}.waffle-edit-actions-empty{color:rgba(0,0,0,0.54);font-size:15px;font-weight:400;line-height:160px;text-align:center}.docs-ui-toast-content .waffle-ellipses{left:4px;top:3px}.grid-shim-bottom{border-top:1px solid #d9d9d9}.grid-shim-end-ltr{border-left:1px solid #d9d9d9}.grid-shim-end-rtl{border-right:1px solid #d9d9d9}.row-freezebar-extension{background-color:#dadfe8;border-top:1px solid #d9d9d9;border-bottom:1px solid #dbdbdb;position:relative}.grid-bottom-bar{border-top:1px solid #d9d9d9}.grid-bottom-bar{border-top:1px solid #aaa}.column-freezebar-extension{height:100%;background-color:#dadfe8;border-left:1px solid #d9d9d9;border-right:1px solid #dbdbdb;position:relative}.mimic-overlay::-webkit-scrollbar{background-color:rgba(255,255,255,1.0)}.mimic-overlay::-webkit-scrollbar-corner{background-color:rgba(255,255,255,1.0)}.scroll-container::-webkit-scrollbar:vertical{width:12px}.scroll-container::-webkit-scrollbar:horizontal{height:12px}.scroll-container::-webkit-scrollbar-button:start{display:none}.scroll-container::-webkit-scrollbar-button:end{display:block}.scroll-container::-webkit-scrollbar-button{border:1px solid #d9d9d9}.scroll-container::-webkit-scrollbar-button:horizontal{border-width:1px 0 0 0}.scroll-container-ltr::-webkit-scrollbar-button:vertical{border-width:0 0 0 1px}.scroll-container-rtl::-webkit-scrollbar-button:vertical{border-width:0 1px 0 0}.scroll-container::-webkit-scrollbar-button:horizontal:increment{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -663px -13px;width:15px;padding-left:1px;background-clip:border-box;border:1px solid #d9d9d9;border-width:1px 0 0 0;box-shadow:none;background-color:#f8f8f8}.scroll-container::-webkit-scrollbar-button:horizontal:increment:hover{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -395px -62px}.scroll-container::-webkit-scrollbar-button:horizontal:increment:active{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -679px -13px}.scroll-container::-webkit-scrollbar-button:horizontal:decrement{border-left:1px solid #d9d9d9;border-right:1px solid #d9d9d9;background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -283px -62px;width:17px}.scroll-container::-webkit-scrollbar-button:horizontal:hover{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -145px -70px}.scroll-container::-webkit-scrollbar-button:horizontal:active{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -552px 0}.scroll-container::-webkit-scrollbar-button:vertical:increment{padding-top:1px;background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -531px -24px;height:15px}.scroll-container::-webkit-scrollbar-button:vertical:increment:hover{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -570px -42px}.scroll-container::-webkit-scrollbar-button:vertical:increment:active{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -83px -46px}.scroll-container::-webkit-scrollbar-button:vertical:decrement{border-top:1px solid #d9d9d9;border-bottom:1px solid #d9d9d9;background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -631px -27px;height:17px}.scroll-container::-webkit-scrollbar-button:vertical:decrement:hover{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -180px -58px}.scroll-container::-webkit-scrollbar-button:vertical:decrement:active{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -776px -28px}.scroll-container::-webkit-scrollbar-track:vertical{background-clip:border-box;border:1px solid #d9d9d9;box-shadow:none;background-color:#f8f8f8}.scroll-container-ltr::-webkit-scrollbar-track:vertical{border-width:0 0 0 1px}.scroll-container-rtl::-webkit-scrollbar-track:vertical{border-width:0 1px 0 0}.scroll-container::-webkit-scrollbar-track:horizontal{background-clip:border-box;border:1px solid #d9d9d9;border-width:1px 0 0 0;box-shadow:none;background-color:#f8f8f8}.scroll-container::-webkit-scrollbar-track:hover{background:none;box-shadow:none}.native-scrollbar::-webkit-scrollbar-track:hover{border-width:0;background:none;box-shadow:none}.scroll-container::-webkit-scrollbar-track:horizontal:hover,.scroll-container::-webkit-scrollbar-track:vertical:hover{box-shadow:none;background-clip:border-box;border:1px solid #d9d9d9;border-width:1px 0 0 0;box-shadow:none;background-color:#f8f8f8}.scroll-container::-webkit-scrollbar-track:horizontal:hover{border-width:1px 0 0 0}.scroll-container::-webkit-scrollbar-track:vertical:hover{border-width:0 1px 0 1px}.scroll-container::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.2);background-clip:padding-box;border:solid transparent;min-height:28px;padding:none;box-shadow:none;border-width:1px 1px 1px 1px}.scroll-container::-webkit-scrollbar-thumb:horizontal{box-shadow:none;border-width:2px 1px 1px 1px}.scroll-container::-webkit-scrollbar-thumb:vertical{padding:1px 1px 1px 1px;box-shadow:none}.scroll-container-ltr::-webkit-scrollbar-thumb:vertical{border-width:1px 1px 1px 2px}.scroll-container-rtl::-webkit-scrollbar-thumb:vertical{border-width:1px 2px 1px 1px}.scroll-container::-webkit-scrollbar-thumb:hover{box-shadow:none}.native-scrollbar::-webkit-scrollbar-thumb:hover{background:none;background-color:#bdc1c6;box-shadow:none}.native-scrollbar::-webkit-scrollbar-thumb:active{background-color:#80868b}.docs-gm .native-scrollbar::-webkit-scrollbar-track:vertical,.docs-gm .native-scrollbar::-webkit-scrollbar-track:horizontal,.docs-gm .native-scrollbar::-webkit-scrollbar-track:horizontal:hover,.docs-gm .native-scrollbar::-webkit-scrollbar-track:vertical:hover{background-color:#fff}.scroll-container::-webkit-scrollbar-corner{border:1px solid #d9d9d9}.scroll-container-rtl::-webkit-scrollbar-corner{border-width:1px 1px 0 0}.scroll-container-ltr::-webkit-scrollbar-corner{border-width:1px 0 0 1px}.native-scrollbar::-webkit-scrollbar:vertical{width:12px}.native-scrollbar::-webkit-scrollbar:horizontal{height:12px}.native-scrollbar::-webkit-scrollbar-button:start{display:none}.native-scrollbar::-webkit-scrollbar-button:end{display:block}.native-scrollbar::-webkit-scrollbar-button{border:1px solid #d9d9d9}.native-scrollbar::-webkit-scrollbar-button:horizontal{border-width:1px 0 0 0}.native-scrollbar-ltr::-webkit-scrollbar-button:vertical{border-width:0 0 0 1px}.native-scrollbar-rtl::-webkit-scrollbar-button:vertical{border-width:0 1px 0 0}.native-scrollbar::-webkit-scrollbar-button:horizontal:increment{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -663px -13px;width:15px;padding-left:1px;background-clip:border-box;border:1px solid #d9d9d9;border-width:1px 0 0 0;box-shadow:none;background-color:#f8f8f8}.native-scrollbar::-webkit-scrollbar-button:horizontal:increment:hover{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -395px -62px}.native-scrollbar::-webkit-scrollbar-button:horizontal:increment:active{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -679px -13px}.native-scrollbar::-webkit-scrollbar-button:horizontal:decrement{border-left:1px solid #d9d9d9;border-right:1px solid #d9d9d9;background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -283px -62px;width:17px}.native-scrollbar::-webkit-scrollbar-button:horizontal:hover{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -145px -70px}.native-scrollbar::-webkit-scrollbar-button:horizontal:active{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -552px 0}.native-scrollbar::-webkit-scrollbar-button:vertical:increment{padding-top:1px;background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -531px -24px;height:15px}.native-scrollbar::-webkit-scrollbar-button:vertical:increment:hover{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -570px -42px}.native-scrollbar::-webkit-scrollbar-button:vertical:increment:active{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -83px -46px}.native-scrollbar::-webkit-scrollbar-button:vertical:decrement{border-top:1px solid #d9d9d9;border-bottom:1px solid #d9d9d9;background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -631px -27px;height:17px}.native-scrollbar::-webkit-scrollbar-button:vertical:decrement:hover{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -180px -58px}.native-scrollbar::-webkit-scrollbar-button:vertical:decrement:active{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -776px -28px}.native-scrollbar::-webkit-scrollbar-track{margin:0px}.native-scrollbar::-webkit-scrollbar-track:vertical{background-clip:border-box;border:1px solid #d9d9d9;box-shadow:none;background-color:#f8f8f8}.native-scrollbar-ltr::-webkit-scrollbar-track:vertical{border-width:0 0 0 1px}.native-scrollbar-rtl::-webkit-scrollbar-track:vertical{border-width:0 1px 0 0}.native-scrollbar::-webkit-scrollbar-track:horizontal{background-clip:border-box;border:1px solid #d9d9d9;border-width:1px 0 0 0;box-shadow:none;background-color:#f8f8f8}.native-scrollbar::-webkit-scrollbar-track:horizontal:hover,.native-scrollbar::-webkit-scrollbar-track:vertical:hover{box-shadow:none;background-clip:border-box;border:1px solid #d9d9d9;border-width:1px 0 0 0;box-shadow:none;background-color:#f8f8f8}.native-scrollbar::-webkit-scrollbar-track:horizontal:hover{border-width:1px 0 0 0}.native-scrollbar::-webkit-scrollbar-track:vertical:hover{border-width:0 1px 0 1px}.native-scrollbar::-webkit-scrollbar-thumb:horizontal{box-shadow:none;border-width:2px 1px 1px 1px}.native-scrollbar::-webkit-scrollbar-thumb:vertical{padding:1px 1px 1px 1px;box-shadow:none}.native-scrollbar-ltr::-webkit-scrollbar-thumb:vertical{border-width:1px 1px 1px 2px}.native-scrollbar-rtl::-webkit-scrollbar-thumb:vertical{border-width:1px 2px 1px 1px}.native-scrollbar::-webkit-scrollbar-thumb{background-clip:padding-box;background-color:#dadce0;border:solid transparent;border-width:1px 1px 1px 1px;box-shadow:none;min-height:28px;padding:none}.native-scrollbar::-webkit-scrollbar-corner{border:1px solid #d9d9d9}.native-scrollbar-rtl::-webkit-scrollbar-corner{border-width:1px 1px 0 0}.native-scrollbar-ltr::-webkit-scrollbar-corner{border-width:1px 0 0 1px}.native-scrollbar-x{overflow-x:scroll;overflow-y:hidden;border:1px solid #d9d9d9;border-width:0 1px 0 0}.native-scrollbar-y{overflow-x:hidden;overflow-y:scroll;border:1px solid #d9d9d9;border-width:0 0 1px 0}.waffle-verbal-title{text-align:center}.waffle-verbal-wrapper{height:0;overflow:hidden;position:absolute;width:0}.waffle-verbal-highlights-container{background-color:white;border:1px solid #9e9e9e;border-left:4px solid #009e55;font-family:Roboto,Arial,sans-serif;font-size:13px;margin:3px -1px 0 -1px;min-width:400px;padding:20px 20px 15px 20px;white-space:normal}.waffle-verbal-highlights-icon{margin-right:4px}.waffle-verbal-highlights-header{color:#009e55;font-weight:500;margin-bottom:10px}.waffle-verbal-highlights-header-left{float:left}.waffle-verbal-highlights-title-icon{display:inline-block;padding-bottom:2px;padding-right:4px;margin-left:-2px}.waffle-verbal-highlights-title{display:inline-block;vertical-align:bottom}.waffle-verbal-highlights-close{float:right;opacity:0.46}.waffle-verbal-highlights-close.goog-flat-button{position:static;border:none;margin:-4px -4px 0 0;padding:0;background-color:transparent}.waffle-verbal-highlights-bullet{color:#515151;font-family:Roboto,Arial,sans-serif;font-size:13px;margin-top:10px;white-space:pre-wrap}.waffle-verbal-highlights-empty-notice{color:#9e9e9e;margin-bottom:25px;text-align:center}.waffle-verbal-highlights-pager{float:right}.waffle-verbal-highlights-viewall.goog-flat-button{color:#009e55;background-color:transparent;border:none;display:inline-block;float:left;font-family:Roboto,Arial,sans-serif;font-size:13px;padding:0}.waffle-verbal-highlights-previous.goog-flat-button,.waffle-verbal-highlights-next.goog-flat-button{color:#009e55;background-color:transparent;border:none;display:inline-block;font-family:Roboto,Arial,sans-serif;font-size:13px;padding:0}.waffle-verbal-highlights-previous.goog-flat-button-disabled,.waffle-verbal-highlights-next.goog-flat-button-disabled{color:#ccc}.waffle-verbal-highlights-counter{color:#9e9e9e;display:inline-block;font-family:Roboto,Arial,sans-serif;font-size:13px;text-align:center;width:70px}.waffle-verbal-highlights-floatclear{clear:both}.waffle-verbal-highlights-one-option-footer{margin:15px 0}.waffle-verbal-highlights-footer{margin:15px 0 0 0}.waffle-verbal-highlights-viewall-footer.goog-flat-button{background-color:transparent;border:none;margin:15px 0 0 -5px;padding:0}.waffle-verbal-highlights-viewall-back-label{color:#009e55;display:inline-block;font-family:Roboto,Arial,sans-serif;font-size:13px;margin-left:5px;vertical-align:middle}.waffle-overflow-menu-material{transition:opacity 250ms cubic-bezier(0.4,0.0,0.2,1);cursor:pointer;height:18px;opacity:0.54;width:18px}.waffle-overflow-menu-material::after{content:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgdmlld2JveD0iMCAwIDIwIDIwIiBoZWlnaHQ9IjIwIj48cGF0aCBkPSJtMTAgNmMxLjEgMCAyLTAuOSAyLTJzLTAuOS0yLTItMi0yIDAuOS0yIDIgMC45IDIgMiAyem0wIDJjLTEuMSAwLTIgMC45LTIgMnMwLjkgMiAyIDIgMi0wLjkgMi0yLTAuOS0yLTItMnptMCA2Yy0xLjEgMC0yIDAuOS0yIDJzMC45IDIgMiAyIDItMC45IDItMi0wLjktMi0yLTJ6Ii8+PC9zdmc+")}.waffle-overflow-menu-material.waffle-overflow-menu-material-white::after{content:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgdmlld2JveD0iMCAwIDIwIDIwIj48cGF0aCBkPSJNMTAgNmMxLjEgMCAyLTAuOSAyLTJzLTAuOS0yLTItMlM4IDIuOSA4IDQgOC45IDYgMTAgNnpNMTAgOGMtMS4xIDAtMiAwLjktMiAyczAuOSAyIDIgMiAyLTAuOSAyLTJTMTEuMSA4IDEwIDh6TTEwIDE0Yy0xLjEgMC0yIDAuOS0yIDJzMC45IDIgMiAyIDItMC45IDItMlMxMS4xIDE0IDEwIDE0eiIgZmlsbD0iI2ZmZiIvPjwvc3ZnPg==")}.waffle-overflow-menu-material:hover{opacity:0.70}.goog-modalpopup-bg,.modal-dialog-bg{z-index:1002}.goog-modalpopup,.modal-dialog{z-index:1003}.waffle-dialog-header{font-weight:500;font-size:14px;line-height:2.25em}.menuMainLink{border-style:none;border-width:0px;font-size:12px;color:#15c;text-decoration:underline;cursor:pointer;padding:2px 0 0 6px;vertical-align:middle}.dlgImportDisabled{color:#666}div.uploadBox{margin-top:8px}div.dlgImportClear{width:100%;height:1px;clear:both}div.dlgImportButterPane,div.dlgRitzImportButterPane{background-color:#ffd969;padding:8px;margin:8px -8px 0 -8px}span.dlgImportButterPane{padding-left:20px}span.dlgRitzImportButterPane{display:block;padding-top:10px}div.dlgImportHeader{font-weight:500;margin-top:10px}.dlgImportError{font-weight:500;color:red}span.waitSpinner{padding-left:5px}#dlgImportCustomOption{display:inline-block}div.dlgImport{width:730px;font-size:10pt;line-height:130%}div.dlgRitzImport{width:310px;font-size:10pt;line-height:130%}#customDelimiter{width:40px}.dlgImport .jfk-radiobutton,.dlgRitzImport .jfk-radiobutton{display:block}.dlgImportPreview{background-color:#eee;height:300px;width:360px;border:1px solid #ccc;display:table-cell;text-align:center;vertical-align:middle;overflow:scroll}div.dlgImportPreviewMessage{color:gray}table.dlgImport{width:376px;border:0px;padding:0px}.waffle-alert-dialog-inner{width:376px;font-size:10pt}.pub-dialog-wrap{width:500px}.pub-dialog-txt{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;font-weight:500}.pub-dialog-content-div{padding:0px 0px 10px 30px}.pub-dialog-checkbox-label{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px}.pub-dialog-url-box{width:450px;font-family:monospace;padding:5px}.pub-dialog-input{width:220px}.pub-dialog-date-label{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;color:#afafaf;padding:0px 0px 0px 3px}.pub-dialog-input-div{padding:0px 0px 6px 0px}.pub-dialog-helpertext{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;color:#afafaf}.pub-dialog-hr{background-color:#bfbfbf;color:#bfbfbf;height:1px;width:96%}.pub-dialog-hr-div{padding:2px 0 2px 0}.pub-dialog-stjw-infotext-span{font-size:11px;padding-left:5px}.pub-dialog-link-options-document-part-menu-button,.pub-dialog-published-content-menu-button{margin-left:0;max-width:150px}.pub-dialog-link-options-document-part-menu-button-content,.pub-dialog-published-content-menu-button-content{overflow:hidden;text-overflow:ellipsis;width:100%}.pub-dialog-link-options-container,.pub-dialog-published-content-container{margin-top:20px}.pub-dialog-link-options-menu,.pub-dialog-published-content-menu{overflow:auto}.pub-dialog-link-options-chart-menu-item,.pub-dialog-published-content-chart-menu-item{max-width:340px;overflow:hidden;padding-left:15px;text-overflow:ellipsis}.pub-dialog-chart-notice{color:#999;font-size:11px;margin-top:5px}.pub-dialog-chart-notice-emphasis{color:#666;font-weight:500}.dialog-publishobject-div{border:1px solid #ccc;background-color:#efefef;font-family:inherit;font-size:12px;max-height:500px;overflow:auto;padding:15px;width:350px}.dialog-publishobject-msg{font-size:12px}.waffle-selection-dialog-content{margin-right:0;max-height:400px;overflow-x:auto;overflow-y:overlay;width:314px}.waffle-selection-dialog-editbox{margin:5px 0;width:260px}.waffle-selection-dialog-active-editbox,.waffle-flat-multi-range-active-editbox{border:none;box-shadow:none}.waffle-selection-dialog-remove,.waffle-flat-multi-range-remove{color:#999;cursor:pointer;display:inline;margin:0 0 0 8px}.waffle-selection-dialog-remove .docs-icon{width:24px;height:24px;margin:0}.waffle-flat-multi-range-remove-table{display:inline-block}.waffle-selection-dialog-error{color:#212121;font-size:13px}.waffle-dv-trrules .waffle-range-selection-container{width:160px}.waffle-dv-recs-title-bar{font-size:13px;margin:25px 0 9px 3px}.waffle-dv-rec-wrapper{background-color:#eee;margin:0 -42px;min-height:42px;overflow:hidden;padding:5px 38px;position:relative;white-space:nowrap;width:570px}.waffle-dv-rec-description{color:#404040;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.waffle-dv-rec-range{color:#3b80f4;float:right;margin-left:6px}.waffle-dv-rec-chip{background-color:#fff;border:1px solid #e0e0e0;border-radius:8px;float:left;font-size:13px;font-weight:normal;height:auto;line-height:21px;margin:5px;max-width:241px;padding:3px 16px 5px}.waffle-dv-rec-chip.jfk-button-focused{box-shadow:none;border:1px solid rgba(0,0,0,.4)}.waffle-dv-rec-chip.jfk-button-hover{box-shadow:0 1px 2px rgba(0,0,0,.25)}.waffle-dv-rec-chip.waffle-dv-rec-chip-selected{box-shadow:0 2px 2px rgba(0,0,0,.2);border:1px solid #3b80f4}@media screen and (-ms-high-contrast:active){.waffle-dv-rec-chip.waffle-dv-rec-chip-selected{border:2px solid #3b80f4}}.waffle-dv-no-suggestions{color:#757575;font-style:italic;padding-left:10px;position:absolute;top:50%;transform:translateY(-50%)}.waffle-dv-rec-spinner-container{height:100%;text-align:center}.waffle-dv-rec-spinner-container .waffle-spinner{top:7px}.waffle-dv-table-with-suggestions{padding-top:10px}.waffle-dv-feedback-link{float:right;font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;text-decoration:none;text-transform:uppercase}.waffle-range-selection-error{border:1px solid #dd4b39}.input-selection-button-div{margin-top:-1px;margin-left:4px}.waffle-flat-range-select-done{margin-top:3px}.waffle-flat-multi-range-row .waffle-range-selection-holder{width:168px;display:inline-block}.waffle-flat-multi-range-select-done{margin-top:10px}.waffle-flat-range-select-message,.waffle-flat-multi-range-select-message{display:none;margin-top:3px;width:110px}.waffle-flat-range-select-listening .waffle-flat-range-select-message,.waffle-flat-multi-range-select-listening .waffle-flat-multi-range-select-message{display:inline-block}.waffle-flat-range-select-listening,.waffle-flat-multi-range-select-listening{background-color:#fbf2cd;margin:0 -20px 0;padding:10px 20px}.waffle-flat-multi-range-add-another{display:block}.waffle-notification-listrule-container{padding:5px}.waffle-notification-rule-row{display:inline-block;margin-bottom:10px;width:100%}.waffle-notification-rule-text{font-size:10pt}.waffle-notification-rule-description{float:left}.waffle-notification-rulerow-buttons-container{float:right}.waffle-notification-rulerow-edit-container{float:left}.waffle-notification-rulerow-delete-container{float:right}.waffle-notification-rule-disabled{font-size:8pt;color:lightgray!important}.waffle-dialog-notifications-list{width:100%;vertical-align:top}.waffle-dialog-notifications{width:100%;padding:6px 8px 8px 2px;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;vertical-align:top}.waffle-dialog-notifications-gap{padding-left:25px}.waffle-dialog-notifications-input .disabled{color:lightgray!important}.waffle-dialog-notifications-label .disabled{color:lightgray!important}.waffle-dialog-notifications-text{vertical-align:top;padding-left:20px;color:#676767;font-size:8pt;width:150px}.waffle-notifications-add{font-weight:500;display:block}.waffle-notification-rule-area-separator{padding:5px}.waffle-notification-listrule-container{padding:0!important}.waffle-dialog-notifications-bounds{border:1px solid #999;border-color:#dadce0;border-radius:8px;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;height:250px;max-width:672px;min-width:464px;overflow:auto;padding:10px;width:auto;width:unset;vertical-align:top}.waffle-notification-buttons-container{text-align:right}.waffle-notification-addbutton-container{align-self:flex-end;border:none;padding-bottom:6px}.waffle-notifications-dialog .goog-link-button{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:white;color:#188038;height:24px;padding:3px 12px 5px;text-decoration:none}.waffle-dialog-notifications-input{padding-left:0;vertical-align:top}.waffle-notifications-dialog .jfk-radiobutton{left:-7px}.waffle-dialog-notifications-toplabel{font-weight:500;padding-bottom:5px}.waffle-dialog-notifications-label{font-weight:500;padding-bottom:5px}.waffle-notifications-dialog .modal-dialog-buttons{justify-content:space-between}.waffle-notifications-dialog .waffle-notification-addbutton-container .goog-link-button{padding-left:0}.waffle-notification-rule-separator{border-bottom:1px solid #dadce0;clear:both;padding-top:10px}.waffle-notification-helpbutton-container{float:right;margin-right:34px}.waffle-notification-helpbutton-container .goog-link-button{color:#1a73e8}.waffle-notification-bottom-group{padding-bottom:2px}.waffle-notification-end-button{margin-right:0}.sketchy-dialog,.sketchy-dialog-fg{z-index:1003}.waffle-find-replace-dialog-label{padding-right:8px}.waffle-find-replace-dialog-border{border-color:#8cc474;border-style:solid;line-height:0}.waffle-find-replace-dialog-display-message{display:inline-block;line-height:20px;max-width:375px;min-height:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.waffle-findandreplacedialog-checkbox-label{vertical-align:bottom;padding-left:8px}.waffle-find-replace-find-scope-select{margin:8px 8px 8px 0;width:126px}.waffle-find-replace-selection-input{margin-top:8px;vertical-align:top;width:150px}.waffle-find-replace-dialog{min-width:464px}.waffle-find-replace-dialog .modal-dialog-buttons{margin-top:7px}.waffle-find-replace-dialog .find-replace-regex-help{display:inline-block;font:14px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;line-height:16px;margin-left:8px;padding:3px 0;width:auto}.waffle-dv-trrules .waffle-range-selection-container{width:160px}.waffle-dv-table{border-spacing:3px;width:562px}.waffle-dv-table .jfk-checkbox{margin-bottom:1px;margin-left:7px}.waffle-dv-table td{white-space:nowrap}.waffle-dv-helptext{width:310px;margin-left:5px}.waffle-dv-errortext{color:red;font-weight:500}.waffle-dv-smalltext{font-size:10px}.waffle-dv-editbox-number{text-align:right;width:60px}.waffle-dv-editbox-text{width:150px}.waffle-dv-editbox-date{text-align:right;width:100px}.waffle-dv-list-options-textarea{padding-top:5px;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;-webkit-appearance:textfield;width:180px}.waffle-dv-table .jfk-select{float:left;margin-right:10px}.waffle-dv-trrules{height:41px}.waffle-dv-trrules-appearance,.waffle-dv-trrules-showitems{height:26px}.waffle-dv-trrules>td,.waffle-table-dialog-trrules>td{padding-bottom:7px;vertical-align:top}.waffle-dv-trrules>td .input-selection,.waffle-table-dialog-trrules>td .input-selection{margin-left:2px}.waffle-cf-tr-rules .jfk-checkbox{margin-bottom:1px}.waffle-dv-show-dropdown{padding-top:5px;padding-bottom:1px}.waffle-dv-customcheckboxlabel{width:80px;padding-top:11px}.waffle-dv-label{padding-top:5px;padding-left:2px;width:96px;white-space:nowrap}.waffle-dv-label-disabled{color:#d3d3d3}.waffle-dv-separator{margin-left:5px;margin-right:5px}.waffle-dv-highlight-styled-rect{background-color:#0f9d58;opacity:0.06;pointer-events:none}.range-border.waffle-dv-highlight-styled-border{border-color:#0f9d58;border-style:dashed}.waffle-sd-tr-rules{padding-top:7px}.waffle-sd-td-rules{white-space:nowrap;width:50px}.waffle-sd-td-ascending{white-space:nowrap}.waffle-sd-column-selector{width:120px}.waffle-sd-delete{color:#999;cursor:pointer;margin-right:5px;width:10px;text-decoration:none}.waffle-sd-row-separator{border-bottom:1px solid #dadce0;margin-bottom:4px;margin-top:4px}.waffle-sd-add{padding-top:12px;font-weight:500;display:block}.waffle-sd-menu-item{padding-right:30px}.script-gui-dialog-content{padding:0px}.waffle-custom-decimals-error-div{padding-left:.7em;color:#dd4b39}textarea.waffle-input-error:focus,input.waffle-input-error:focus,.waffle-input-error{border:1px solid #dd4b39}.waffle-input-error-butter-container{width:100%;position:absolute;margin-top:-25px;left:0;text-align:center}.waffle-input-error-butter-wrap{display:inline-block;line-height:normal}.dialog-settings-text{max-width:300px;padding-left:25px}.dialog-settings-sep-td{padding:14px 0 9px 0}.dialog-settings-sep{border-top-color:#e8eaed;border-top-style:solid;border-width:1px 0 0 0;color:#bfbfbf;height:0}.jfk-radiobutton-checked .jfk-radiobutton-radio::after{background:#188038;border:4px solid #188038;height:8px;left:0;margin:2px;top:0;width:8px}.jfk-radiobutton-radio{height:16px;width:16px}.jfk-radiobutton-checked.jfk-radiobutton:hover .jfk-radiobutton-radio{border:2px solid #188038}.jfk-radiobutton-checked .jfk-radiobutton-radio{border:2px solid #188038}.jfk-radiobutton:focus .jfk-radiobutton-radio{border:2px solid #188038}.jfk-radiobutton-checked.jfk-radiobutton:focus .jfk-radiobutton-radio{border:2px solid #0d652d}.jfk-radiobutton-checked.jfk-radiobutton:focus .jfk-radiobutton-radio::after{background-color:#0d652d;border:4px solid #0d652d}.dialog-settings-general-settings-div{padding:10px 0 18px 0}.dialog-settings-english-name-div{padding-top:10px}#waffle-settings-dialog-english-name-checkbox-label{padding-left:3px}.waffle-prompt-dialog{width:340px}.waffle-prompt-dialog .modal-dialog-userInput{width:300px;margin:4px}.waffle-spellcheck-cell-display{font-weight:500}.waffle-resize-option{margin:7px}.waffle-resize-inset-input{margin-left:30px}.waffle-resize-row-input-container{margin-left:30px}.waffle-resize-row-input{width:70px}.waffle-resize-row-input-label{margin-left:10px}#waffle-resize-input-error-butter-container{margin-top:-15px}.waffle-confirm-suppress-checkbox{margin-top:8px}.waffle-confirm-learn-more{margin-top:2px}.waffle-slidingdialogbar-wrapper{outline:none;overflow:hidden;width:100%}.waffle-pivot-histogram-errorable-input{display:inline-block;margin:4px;vertical-align:top;width:120px}.waffle-pivot-histogram-dialog-caption{color:rgba(0,0,0,0.54);font-size:11px;padding-top:3px}.waffle-pivot-histogram-dialog-error{color:#db4437;height:15px;margin-top:6px}.waffle-rd-section{padding:8px 0}.waffle-rd-section-title{font-weight:500}.waffle-rd-columns-container{margin-left:-12px;max-height:300px;overflow-x:hidden;overflow-y:auto;padding-top:6px}.waffle-rd-expand-to-range{color:#188038;cursor:pointer;padding-top:2px;text-decoration:underline}.waffle-rd-dialog-gm{min-width:312px}.waffle-rd-ignore-headers{padding-top:6px}.waffle-rd-columns-checkbox{padding-left:12px;position:relative}.waffle-rd-ignore-headers .docs-material-gm-labeled-checkbox,.waffle-rd-columns-checkbox .docs-material-gm-labeled-checkbox{padding:6px 0}.waffle-rd-checkbox-label{display:inline-block;padding-left:5px}.waffle-sort-dialog-gm{min-width:464px}.waffle-sort-dialog-radio-option{display:inline-block;padding-left:8px}.waffle-sd-delete .docs-icon{width:24px;height:24px;margin:0 4px 0 0}.waffle-sd-row-separator{margin-top:16px;margin-bottom:16px}.waffle-sort-dialog-data-header{margin-bottom:25px;overflow:hidden}.waffle-sort-dialog-data-header .docs-material-gm-labeled-checkbox{padding:0}.docs-dialog .modal-dialog-title-close{top:-1px}.modal-dialog.jfk-confirm .modal-dialog-title-close.docs-hc-ie{-ms-high-contrast-adjust:none}.modal-dialog.jfk-confirm .modal-dialog-title-close.docs-hc-gecko:after{background-color:white;filter:invert(1)}.docs-dialog .goog-flat-menu-button{padding-top:7px;padding-bottom:7px}.importThemeLabel{padding:0px 3px}.importThemeOption{padding:5px 7px}.importThemeWarningMessage{color:#9e9e9e;padding:0px 25px}.waffle-dialog-range-suggestion-pill{display:flex;border-radius:20px;cursor:pointer;padding:10px;width:240px}.waffle-dialog-range-suggestion-pill:hover{background:lightgray}.waffle-dialog-range-suggestion-pill-icon{margin-right:9px;min-width:21px}.waffle-dialog-range-suggestion-pill-sheet-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.waffle-dialog-range-suggestion-section{margin-top:24px}.waffle-dialog-range-suggestion-section-header{color:#3c4043;font-family:GoogleSans-Medium,Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;letter-spacing:0.25px;line-height:20px}.goog-palette-cell-selected .goog-palette-colorswatch{background:url("//ssl.gstatic.com/docs/spreadsheets/MainMenuVerSprite007.png") transparent no-repeat;background-position:0px -15px}.goog-palette-cell{border:1px #666 solid}.trix-palette .goog-palette-cell{border:0}.trix-palette .goog-palette-table{border:0;border-spacing:2px;border-collapse:separate;margin:0 4px}.trix-palette .goog-palette-cell-hover{background:#eee}.trix-palette .toolbar-icon,.trix-palette .docs-common-icon{margin:0}.docs-toolbar-menu-button .goog-toolbar-menu-button-caption{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.docs-toolbar-menu-button .goog-toolbar-menu-button-icon{margin-left:3px;margin-right:6px;opacity:1}.docs-toolbar-menu-button .goog-toolbar-menu-button-inner-box{text-align:left}#docs-access-level-indicator.goog-flat-menu-button{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;cursor:pointer;height:24px;line-height:20px;margin:6px 0 6px 8px;padding:0 1px;user-select:none}#docs-access-level-indicator.goog-flat-menu-button-hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#2a8947;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15);cursor:pointer;height:24px;line-height:20px;margin:6px 0 6px 8px;padding:0 1px;user-select:none}#docs-access-level-indicator.goog-flat-menu-button-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#4f9e67;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15);cursor:pointer;height:24px;line-height:20px;margin:6px 0 6px 8px;padding:0 1px;user-select:none}#docs-access-level-indicator.goog-flat-menu-button-hover.goog-flat-menu-button-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#62a877;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15);cursor:pointer;height:24px;line-height:20px;margin:6px 0 6px 8px;padding:0 1px;user-select:none}#docs-access-level-indicator.goog-flat-menu-button-disabled{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;cursor:pointer;height:24px;line-height:20px;margin:6px 0 6px 8px;padding:0 1px;user-select:none;cursor:default;opacity:.38}#docs-access-level-indicator.goog-flat-menu-button-pressed,#docs-access-level-indicator.goog-flat-menu-button:active,#docs-access-level-indicator.goog-flat-menu-button-open,#docs-access-level-indicator.goog-flat-menu-button-hover.goog-flat-menu-button-open,#docs-access-level-indicator.goog-flat-menu-button-focused.goog-flat-menu-button-open{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#62a877;box-shadow:0 2px 6px 2px rgba(52,168,83,0.15);cursor:pointer;height:24px;line-height:20px;margin:6px 0 6px 8px;padding:0 1px;user-select:none}#docs-access-level-indicator .docs-access-level-indicator-icon-container{margin:2px 4px 4px 6px}#docs-access-level-indicator .goog-flat-menu-button-caption{margin-right:20px;font-size:12px;font-weight:500;line-height:21px}#docs-access-level-indicator .goog-flat-menu-button-dropdown{border-bottom-color:#fff;border-top-color:#fff;right:7px;top:10px}.goog-menu.docs-access-level-indicator-menu{border-radius:8px;max-width:272px;padding:22px 24px 24px 24px}.docs-access-level-indicator-menu .docs-access-level-indicator-menu-text{padding:0;font-size:14px;color:#3c4043;line-height:20px;width:196px}.docs-access-level-indicator-menu .docs-access-level-indicator-request-access-button{height:24px;margin:16px 0 0 0;padding:4px 12px;text-transform:none}#docs-approvals-status-indicator-toolbar-separator{margin-right:0px}.docs-gm #docs-primary-toolbars #docs-approvals-locked-menu-button.goog-toolbar-menu-button{cursor:pointer;height:24px;line-height:24px;margin:6px 0 6px 4px;padding:0 4px;user-select:none}#docs-approvals-locked-menu-button .goog-toolbar-menu-button-dropdown{margin-left:2px}.docs-gm #docs-primary-toolbars .docs-approval-status-indicator{cursor:pointer;color:#188038;font-size:14px;font-weight:500;height:26px;letter-spacing:.25px;margin:5px 0px 5px 4px;min-width:unset;padding:0px 12px 0px 9px;user-select:none}.docs-gm #docs-primary-toolbars .docs-approval-status-indicator .docs-icon-img{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_green.svg);cursor:default;margin:-1px 2px 4px 0px}.docs-approval-status-indicator-text{line-height:23px}.docs-icon-inputtools-button-inner{margin:2px 0}.docs-icon-inputtools-menuitem-inner{margin:1px 0;opacity:.70}.docs-icon.docs-icon-inputtools-menuitem-outter,.docs-material .docs-icon.docs-icon-inputtools-menuitem-outter{margin:0 10px 0 12px}.docs-material .docs-icon.docs-icon-inputtools-menuitem-outter,.docs-material #inputToolsToggleButton .docs-icon{width:21px;height:21px}@media print{.docs-ui-unprintable{display:none!important}#docs-editor-container.docs-ui-unprintable{display:none!important}}.docs-fontmenu-icon{left:16px}.docs-fontmenu-text{padding-left:23px}.docs-fontmenu-newlyadded{background-color:#fffecc}.goog-menuitem-highlight.docs-menuitem-add-fonts{border:none;padding-top:6px;padding-bottom:6px}.goog-menuitem-highlight.docs-fontmenu-newlyadded,.goog-menuitem-hover.docs-fontmenu-newlyadded{background-color:#eee}#docs-font-family .goog-toolbar-menu-button-caption{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:70px}.docs-fontmenu .docs-submenuitem{border:none;height:18px;padding:6px 8em 6px 30px}.docs-fontmenu .docs-submenuitem-splitbutton{height:28px;line-height:28px}.docs-fontmenu .docs-submenuitem .goog-menuitem-content{height:17px;line-height:normal}.docs-fontmenu .docs-submenuitem .goog-menuitem-checkbox{height:21px;top:3px}.docs-fontmenu .docs-submenuitem::before{content:'\0025ba';position:absolute;right:0;color:#6e6e6e;width:34px;text-align:center;font-size:70%;line-height:30px;top:0}body[dir="rtl"] .docs-fontmenu .docs-submenuitem::before{content:'\0025c4'}.docs-fontmenu .docs-halfhovermenuitem .goog-submenu-arrow{display:none}#contain-402{bottom:10px;position:fixed;right:50px;z-index:1002}.docs-hats-survey-followup-card{bottom:10px;position:fixed;right:50px;z-index:1002;background-color:#fafafa;border:none;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;box-shadow:rgba(255,255,255,.9) 0 1px 0 inset,rgba(0,0,0,.03) 0 -1px 0 inset,rgba(0,0,0,.15) 0 15px 10px,rgba(0,0,0,.3) 0 8px 36px;padding:20px 26px 10px 16px;width:350px}.docs-hats-survey-followup-card-text{color:#3c4043;font:14px/20px Roboto-Medium,sans-serif;height:46px;padding:12px;width:304px}.docs-hats-survey-followup-card-button-container{text-align:right}.docs-hats-survey-followup-card-button{border-radius:2px;cursor:pointer;display:inline-block;font:14px/20px Roboto-Medium,sans-serif;height:36px;line-height:36px;text-align:center;width:127px}.docs-hats-survey-followup-card-cancel-button{color:#4285f4}.docs-hats-survey-followup-card-survey-button{background-color:#4285f4;color:#fff}.sketchy-dialog.modal-dialog{padding:0}.sketchy-dialog .modal-dialog-title{margin:24px 44px 14px 44px;position:relative}.docs-gm .sketchy-dialog .modal-dialog-title{margin:24px}.sketchy-dialog-title-close{margin-right:0;position:absolute;right:0;top:-8px}.docs-gm .sketchy-dialog-title-close{top:-5px}.sketchy-dialog-title-autosave{color:#999;font-weight:normal;font-size:12px;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;margin-left:24px}.docs-gm .sketchy-dialog-title-autosave{color:#80868b}.waffle-comment-anchor{width:282px}.docos-mole{bottom:28px}.waffle-docos-target-cell-border{border-color:#f4b400}.waffle-docos-target-cell-rect{background-color:#ffe168;opacity:.5;pointer-events:none}.waffle-docos-target-cell-resolved-rect{background-color:#d9d9d9;opacity:.5;pointer-events:none}th.waffle-docos-target-cell-header{background-color:#fcfac6}.waffle-objwrap-gvizchart{background-color:white;height:100%;z-index:18;overflow:hidden}.waffle-embedded-object-overlay{outline:0;position:absolute;z-index:10}.waffle-obj-menu-open{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -763px -13px;border:none;color:#15c;float:right;height:13px;margin:10px;padding:0;text-decoration:none;width:13px}.waffle-obj-menu-open-active,.waffle-obj-menu-open:hover{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -618px -27px}.waffle-obj-message-div{padding:15px 0 15px 15px;font-size:12pt}.waffle-borderless-embedded-object-overlay{border:1px solid #999;margin:0;outline:none;position:absolute;z-index:10;user-select:none;pointer-events:all}.waffle-borderless-embedded-object-container{position:relative}.waffle-borderless-embedded-object-container .waffle-objwrap-gvizchart{background-color:transparent;z-index:15}.waffle-obj-control{position:absolute;z-index:18}.waffle-obj-glasspane-control.waffle-obj-control{z-index:17}.waffle-obj-glasspane-control{left:0;position:absolute;top:0}.waffle-obj-gviz-control{border:1px solid #999;position:absolute;right:-48px;top:-1px}.waffle-obj-drag-component{position:absolute;border:none;background-color:#0096fd}.waffle-selectionbox-background{display:none}.docs-charts-tooltip{z-index:3}.waffle-charts-alert{box-shadow:0px 2px 2px 0px rgba(0,0,0,0.14),0px 3px 1px -2px rgba(0,0,0,0.12),0px 1px 5px 0px rgba(0,0,0,0.2);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;background:rgba(0,0,0,0.87);border-radius:2px;bottom:0;line-height:16px;margin:4px;max-height:93%;max-width:99%;padding:10px 14px;position:absolute;white-space:nowrap;z-index:1000}.waffle-charts-alert-text{color:#fff;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;white-space:normal}.waffle-charts-alert-link-div{float:right;padding-left:35px}a.waffle-charts-alert-link{transition:opacity 250ms cubic-bezier(0.4,0.0,0.2,1);color:#a1c2fa;cursor:pointer;text-decoration:none;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;opacity:0.87;text-transform:uppercase}a.waffle-charts-alert-link:hover{opacity:1}a.waffle-charts-alert-link-close{color:white;margin-left:15px}.waffle-charts-overflow-legend{background-color:#ffffff;border:1px solid #999;position:absolute}.waffle-charts-overflow-legend-scrollbar{position:absolute;top:0;width:10px}.waffle-obj-menu-control{right:5px;top:5px}.waffle-obj-menu-button{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -763px -13px;cursor:pointer;height:13px;width:13px}.waffle-obj-menu-button.waffle-obj-menu-control-active,.waffle-obj-menu-button:hover{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -618px -27px}.waffle-obj-menu-control-material{right:6px;top:6px}.waffle-obj-menu-control-table-chart{right:20px}.waffle-chart-filter-indicator-control{right:6px;top:6px}.waffle-borderless-embedded-object-overlay-focused .waffle-chart-filter-indicator-control{right:24px}.waffle-chart-filter-indicator-control-table-chart{right:20px}.waffle-borderless-embedded-object-overlay-focused .waffle-chart-filter-indicator-control-table-chart{right:38px}.waffle-objwrap-gvizchart div[id^='google-visualization-errors-all-']{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSIjRTBFMEUwIj48cGF0aCBkPSJNOSAxN0g3di03aDJ2N3ptNCAwaC0yVjdoMnYxMHptNCAwaC0ydi00aDJ2NHptMi41IDJoLTE1VjVoMTV2MTR6bTAtMTZoLTE1Yy0xIDAtMiAxLTIgMnYxNGMwIDEgMSAyIDIgMmgxNWMxIDAgMi0xIDItMlY1YzAtMS0xLTItMi0yeiIvPjxwYXRoIGZpbGw9Im5vbmUiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L3N2Zz4="),url("data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgNjAwIDM3MSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMCAxdjFoNjAwVjF6bTAgOTB2MWg2MDB2LTF6bTAgOTF2MWg2MDB2LTF6bTAgOTF2MWg2MDB2LTF6IiBmaWxsPSIjZWVlIi8+PHBhdGggZD0iTTAgMzY2djJoNjAwdi0yeiIgZmlsbD0iI2NmY2ZjZiIvPjwvc3ZnPgo=");background-position:center,0 0;background-repeat:no-repeat,repeat-x;background-size:100px 100px,auto 100%;height:100%;width:100%;white-space:normal}.waffle-objwrap-gvizchart div[id^='google-visualization-errors-all-']>div{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif!important;font-size:14px!important;padding-top:15px;text-align:center}.waffle-objwrap-gvizchart div[id^='google-visualization-errors-all-']>div>span{background-color:transparent!important;color:#db4437!important;display:block}.waffle-objwrap-gvizchart div[id^='google-visualization-errors-all-']>div>span:before{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNiAxNiI+PHBhdGggZmlsbD0iI0RCNDQzNyIgZD0iTTggMEMzLjYgMCAwIDMuNiAwIDhzMy42IDggOCA4IDgtMy42IDgtOC0zLjYtOC04LTh6bS44IDEySDcuMnYtMS42aDEuNlYxMnptMC0zLjJINy4yVjRoMS42djQuOHoiLz48L3N2Zz4K");background-position:0 0;background-repeat:no-repeat;background-size:16px 16px;content:'';display:inline-block;height:16px;margin-right:10px;vertical-align:sub;width:16px}div.ac-datavalidation-renderer{z-index:1001;overflow:auto;box-shadow:1px 2px 5px rgba(0,0,0,0.4)}div.ac-datavalidation-renderer-upside-down{z-index:1001;overflow:auto;box-shadow:1px 0 5px rgba(0,0,0,0.4)}.waffle-ac-renderer{margin:0px 0px;padding:0;z-index:85;overflow:visible;position:absolute;white-space:nowrap;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:normal;line-height:22px;border:1px solid rgba(0,0,0,0.2);background:#fff;box-shadow:0 2px 4px rgba(0,0,0,.2)}.waffle-ac-row{margin:0;cursor:pointer;padding:2px 10px;color:#666666}.waffle-ac-active{background:#f5f5f5;color:#000;border-top:1px solid #ebebeb;border-bottom:1px solid #ebebeb;padding:1px 10px}.waffle-ac-highlighted{font-weight:500}#docs-chrome{zoom:1}.docs-toolbar .goog-menuitem-highlight{background-color:#e0edfe}.ie8 .goog-toolbar-button-disabled .toolbar-icon,.ie8 .goog-toolbar-button-disabled .docs-icon-img,.ie8 .goog-toolbar-button-disabled .goog-toolbar-button-inner-box,.ie8 .goog-toolbar-menu-button-disabled .toolbar-icon,.ie8 .goog-toolbar-menu-button-disabled .docs-icon-img,.ie8 .goog-toolbar-menu-button-disabled .goog-toolbar-menu-button-caption,.ie8 .goog-toolbar-menu-button-disabled .goog-color-menu-button-indicator,.ie8 .goog-toolbar-menu-button-disabled .goog-toolbar-menu-button-dropdown{filter:alpha(opacity=30)}.close-icon-small{width:12px;background-position:-720px 2px}.docs-icon.goog-menuitem-icon{position:absolute}.goog-clipboard{width:16px}#chart-toolbar-container{width:100%}.chart-toolbar-container-with-omnibox{display:inline-block}#chart-toolbar{border:none;padding:0 30px 0 0;position:absolute;right:0;top:0}#datasheet-toolbar{background:none;border-width:0!important;display:inline;min-height:35px;padding:0}.chart-toolbar-with-omnibox#chart-toolbar{right:40px}.docs-material .chart-toolbar-with-omnibox{background:none}#chart-toolbar-title{padding-top:3px}.chart-toolbar-title-with-omnibox{display:inline-block;vertical-align:middle}#chart-toolbar-title.sheet-toolbar-title{line-height:normal}.sheet-toolbar{min-height:22px}.object-toolbar-secondary{margin-right:13px!important}.sheet-toolbar-title{font-weight:500;vertical-align:middle;line-height:20px;padding:0 6px 0 4px}.goog-color-menu-button-indicator{border-bottom:4px solid #f0f0f0}#num-fmt-currency{margin-top:-250px}#num-fmt-date{margin-top:-100px}.num-fmt{clear:both;height:1em;width:180px}.num-fmt b{display:block;font-weight:normal;float:left}.num-fmt span{display:block;float:right;color:#666;font-size:85%}.currency-fmt{width:120px;font-size:92%;height:0.9em}.date-fmt{width:140px;font-size:92%;height:0.9em}.cond-fmt .goog-color-menu-button-indicator{border-bottom-style:double}#formula-bar{padding:4px 0;background:#e5e5e5;margin-right:auto}#formula-bar table{width:100%;border-spacing:0}#t-formula-bar-label{vertical-align:middle;color:#444;padding:0 8px}#t-formula-bar-label.waffle-formulabar-label-disabled{color:#9fa4b3}#t-formula-bar-input-container{width:100%;padding:0}#t-formula-bar-input{resize:none;border:1px #7f9db9 solid;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;background-color:#ffffff}#t-formula-bar-input.waffle-formulabar-input-disabled{background-color:#eee;border-color:#c0c0c0}#t-formula-bar-input .cell-input{word-wrap:break-word;-webkit-nbsp-mode:space;-webkit-line-break:after-white-space}#t-formula-bar-input .waffle-rich-text-link{color:black;text-decoration:none}.ie8 .goog-toolbar-button-disabled .toolbar-icon,.ie8 .goog-toolbar-button-disabled .docs-icon-img,.ie8 .goog-toolbar-button-disabled .goog-toolbar-button-inner-box,.ie8 .goog-toolbar-menu-button-disabled .toolbar-icon,.ie8 .goog-toolbar-menu-button-disabled .docs-icon-img,.ie8 .goog-toolbar-menu-button-disabled .goog-toolbar-menu-button-caption,.ie8 .goog-toolbar-menu-button-disabled .goog-color-menu-button-indicator,.ie8 .goog-toolbar-menu-button-disabled .goog-toolbar-menu-button-dropdown{filter:alpha(opacity=30)}.docs-toolbar-small-separator+div.goog-toolbar-select{margin-left:-4px}#t-text-rotation-palette .goog-palette-table{border-right:1px solid #dadce0}.waffle-text-rotation-combobox{border-color:transparent}.docs-gm .goog-toolbar-combo-button.waffle-text-rotation-combobox{margin:1px}.waffle-text-rotation-combobox.goog-toolbar-combo-button-hover{background:transparent}.docs-material .waffle-text-rotation-combobox.goog-toolbar-combo-button-hover{background:rgba(0,0,0,.06)}.waffle-text-rotation-combobox .goog-toolbar-combo-button-input{height:28px;width:25px}.waffle-revisions-frame{border-style:none}.waffle-revisions-older-text{color:#676767}.waffle-revisions-container{background-color:#fff;z-index:15;overflow:hidden;position:absolute;left:0}#revisions-toolbar{padding:2px 0}#t-revisions-back{margin-left:6px}#t-revisions-revert,#t-revisions-label{margin:0 8px;font-weight:500}#t-revisions-label{line-height:180%}#t-revisions-highlighted-label{position:absolute;right:6px;top:0;line-height:217%}#t-revisions-highlighted{border:2px solid #ffa82d;background-color:#ffd396;padding:2px}#t-revisions-menu{overflow-y:auto;max-height:75%;width:290px}#t-revisions-menu .goog-menuitem{padding:4px 0px;width:268px;clear:both;height:1em}#t-revisions-menu em{display:block;float:left;white-space:nowrap;text-align:right;font-style:normal;width:134px}#t-revisions-menu span{display:block;float:left;white-space:nowrap;color:#666;width:134px}.waffle-spellcheck-target-cell-rect{background-color:#f8b39b;opacity:.5;pointer-events:none}div.sheet-toolbar{width:100%;background-image:none;min-height:35px;border-bottom:1px solid #d9d9d9;padding:0}.docs-material #docs-toolbar-wrapper{padding-left:30px}.docs-material #docs-toolbar-wrapper.docs-hub-appbar{border-bottom:1px solid #d9d9d9;padding-left:21px}.sheet-toolbar-button{margin:3px 2px 0 0}.sheet-toolbar-title{line-height:35px;padding:0 44px 0 44px}.toolbar-decimal-icon{margin-bottom:-7px}.docs-material .docs-icon.toolbar-decimal-icon{margin-bottom:-4px}.docs-material #t-num-fmt-currency,.docs-material #t-num-fmt-percent{font-size:13px}#formula-bar{background:#fff;border-bottom:1px solid #c0c0c0;height:23px;padding:0;position:relative}#t-formula-bar-input{border:none;bottom:4px;left:0;line-height:13px;position:absolute;right:0;top:4px}.name-box-enabled #t-formula-bar-input{height:100%;line-height:23px;top:0}.formula-bar-with-name-box-wrapper{background-color:#eee;display:flex}#t-formula-bar-input.waffle-formulabar-input-disabled{background-color:#fff;border:none}#t-formula-bar-label{align-items:center;display:flex;float:left;justify-content:center;opacity:.55;padding:0;position:relative;text-align:center;width:45px}.docs-icon-insert-formula{margin-top:-1px}.docs-material .docs-icon-insert-formula{margin-top:0;opacity:.70}.formulabar-disabled#formula-bar{background-color:#f8f8f8}.formulabar-disabled #t-formula-bar-label{color:#9fa4b3;opacity:.4}.formulabar-disabled #t-formula-bar-input{background-color:#f8f8f8!important}.formulabar-disabled .default-formula-text-color{color:#777}#t-formula-bar-input-container{height:100%;padding:0 10px;overflow:hidden;width:auto}.name-box-enabled #t-formula-bar-input-container,.name-box-enabled #t-formula-bar-input-container>div{width:100%}#t-formula-bar-input-container>div{height:100%;overflow-x:hidden;overflow-y:auto;position:relative}#t-formula-bar-progress-bar{float:right;margin-top:7px;padding:0;width:161px}#t-formula-bar-progress-bar .progress-bar-horizontal{width:146px;height:5px;border:1px solid #999;padding:1px;background-color:#fff}#t-formula-bar-progress-bar .progress-bar-thumb{background-color:#ccc}.name-box-enabled .formula-bar{display:inline-flex;width:100%}.formula-bar-separator,.name-box-menu-separator{float:left;width:1px;height:100%;position:relative}.name-box-menu-separator-container{background:#f5f5f5;display:none;margin:1px 1px 2px 0}.formula-bar-separator-container,.waffle-name-box-container:hover .name-box-menu-separator-container{display:inline-flex}.formula-bar-separator>div,.name-box-menu-separator>div{background-color:#ccc;bottom:3px;left:0;position:absolute;right:0;top:3px;width:1px}#formula-bar-dragger{border-bottom:1px solid #c0c0c0;height:4px;margin-top:-5px;position:absolute;width:100%}#formula-bar-dragger.formula-bar-hoverable{cursor:ns-resize}#formula-bar-dragger.formula-bar-hoverable:hover{border-bottom:1px solid #a0a0a0}div.formula-bar-disabled{background-color:#ccc}.waffle-formulabar-cellinput-disabled{background-color:#ccc}#t-merge-menu{margin-right:2px}.docs-material #t-merge-menu{margin-right:1px}.goog-toolbar-color-menu-button .goog-toolbar-menu-button-dropdown{margin-top:9px}.goog-menuitem-mnemonic-separator{font-weight:normal}.docos-actionmenu-outer{width:11px;height:11px}.docos-actionmenu-outer>.docos-docomenu-dropdown{width:11px;height:11px;margin:auto;vertical-align:top;cursor:pointer}.docs-gm .docos-actionmenu-outer>.docos-docomenu-dropdown{background-color:transparent}.docos-actionmenu-outer .goog-toolbar-menu-button-dropdown{width:11px;height:11px;margin:0;padding:0}.docos-actionmenu-outer .goog-toolbar-menu-button-inner-box,.docos-actionmenu-outer .goog-toolbar-menu-button-outer-box{width:11px;min-width:11px;height:11px;min-height:11px}.docos-actionmenu>.goog-menuitem{padding-left:10px;padding-right:10px}.docs-gm .docos-actionmenu>.goog-menuitem{padding-left:15px;padding-right:15px}.docos{color:black;font-family:Arial,sans-serif,sans;font-family:var(--docs-material-font-family,Arial,sans-serif,sans);font-size:13px;white-space:normal}.docs-gm .docos{font-size:14px}.docos .jfk-button{font-family:Arial,sans-serif,sans;font-family:var(--docs-material-header-font-family,Arial,sans-serif,sans);font-weight:700;font-weight:var(--docs-material-font-weight-bold,700)}.docs-gm .docos .jfk-button{margin:0 8px 0 0;min-width:24px;vertical-align:middle}.docs-gm .docos .jfk-button-hover{box-shadow:none;background-color:rgba(0,0,0,.06);background-image:none;cursor:pointer;border-color:transparent!important;border-radius:2px;border-width:1px}.docs-gm .docos .jfk-button-active{box-shadow:none;background-color:rgba(0,0,0,0.12);background-image:none;cursor:pointer;border-color:transparent!important;border-radius:2px;border-width:1px}.docos.docs-gm .jfk-button.jfk-button-standard{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:white;border:1px solid #dadce0!important;color:#188038;height:24px;padding:3px 12px 5px}.docos.docs-gm .jfk-button.jfk-button-standard.jfk-button-disabled{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:white;border:1px solid #f1f3f4!important;color:#3c4043;opacity:0.38;height:24px;padding:3px 12px 5px}.docos.docs-gm .jfk-button.jfk-button-standard.jfk-button-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#e7f5eb;border:1px solid #bbe2c6!important;height:24px;padding:3px 12px 5px}.docos.docs-gm .jfk-button.jfk-button-standard.jfk-button-hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#f8fcf9;border:1px solid #c8e7d1!important;height:24px;padding:3px 12px 5px}.docos.docs-gm .jfk-button.jfk-button-standard.jfk-button-focused.jfk-button-hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#dff2e4;border:1px solid #b5e0c1!important;height:24px;padding:3px 12px 5px}.docos.docs-gm .jfk-button.jfk-button-standard.jfk-button-focused.jfk-button-active{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#dff2e4;border:1px solid transparent!important;box-shadow:0 2px 6px 2px rgba(60,64,67,.15);height:24px;padding:3px 12px 5px}.docos.docs-gm .jfk-button.jfk-button-action{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;height:24px;padding:3px 12px 5px}.docos.docs-gm .jfk-button.jfk-button-action.jfk-button-disabled{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#f1f3f4;color:#3c4043;opacity:0.38;height:24px;padding:3px 12px 5px}.docos.docs-gm .jfk-button.jfk-button-action.jfk-button-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#4f9e67;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15);height:24px;padding:3px 12px 5px}.docos.docs-gm .jfk-button.jfk-button-action.jfk-button-hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#2a8947;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15);height:24px;padding:3px 12px 5px}.docos.docs-gm .jfk-button.jfk-button-action.jfk-button-focused.jfk-button-hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#62a877;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15);height:24px;padding:3px 12px 5px}.docos.docs-gm .jfk-button.jfk-button-action.jfk-button-focused.jfk-button-active{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#62a877;box-shadow:0 2px 6px 2px rgba(52,168,83,0.15);height:24px;padding:3px 12px 5px}.docos .modal-dialog-buttons{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-family:var(--docs-material-header-font-family,Roboto,RobotoDraft,Helvetica,Arial,sans-serif)}.docos .modal-dialog-buttons button{font-weight:500}.docos .modal-dialog-title{font-size:16px}.docs-gm .docos .modal-dialog-title{font-size:22px}.docos .modal-dialog-title-text{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-family:var(--docs-material-header-font-family,Roboto,RobotoDraft,Helvetica,Arial,sans-serif);font-weight:normal}.docs-gm .doco-modal.modal-dialog{width:300px}.docs-gm .doco-modal .modal-dialog-title-text{display:block;width:220px;word-wrap:break-word}.docos.docs-gm .jfk-button.jfk-button-standard{color:#188038}.docos.docs-gm .jfk-button.jfk-button-standard.jfk-button-focused{background-color:#e7f5eb;border-color:#bbe2c6!important}.docos.docs-gm .jfk-button.jfk-button-standard.jfk-button-hover{background-color:#f8fcf9;border-color:#c8e7d1!important}.docos.docs-gm .jfk-button.jfk-button-standard.jfk-button-focused.jfk-button-hover{background-color:#dff2e4;border-color:#b5e0c1!important}.docos.docs-gm .jfk-button.jfk-button-standard.jfk-button-active{background-color:#dff2e4;color:#188038}.docos.docs-gm .jfk-button.jfk-button-action{background-color:#188038;color:#fff}.docos.docs-gm .jfk-button.jfk-button-action.jfk-button-focused{background-color:#4f9e67;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15);color:#fff}.docos.docs-gm .jfk-button.jfk-button-action.jfk-button-hover{background-color:#2a8947;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15);color:#fff}.docos.docs-gm .jfk-button.jfk-button-action.jfk-button-focused.jfk-button-hover{background-color:#62a877;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15);color:#fff}.docos.docs-gm .jfk-button.jfk-button-action.jfk-button-active{background-color:#62a877;box-shadow:0 2px 6px 2px rgba(52,168,83,0.15);color:#fff}.docos.docs-gm .docs-material-gm-checkbox.docs-material-gm-checkbox-checked,.docos.docs-gm .docs-material-gm-checkbox.docs-material-gm-checkbox-checked.docs-material-gm-checkbox-focused{background-color:#188038}.docos.docs-gm .docs-material-gm-checkbox.docs-material-gm-checkbox-checked,.docos.docs-gm .docs-material-gm-checkbox.docs-material-gm-checkbox-focused{border-color:#188038}.docos-anchoreddocoview{background-color:#f5f5f5;cursor:pointer;direction:ltr;position:relative;width:240px;border:none;box-shadow:0 1px 3px rgba(0,0,0,0.3);border-radius:2px}.docs-gm .docos-anchoreddocoview{background-color:#fff;border:1px solid rgba(60,64,67,.15);box-shadow:none;width:282px}.docs-gm .docos-anchoreddocoview:hover{border-color:transparent;box-shadow:0 1px 3px 1px rgba(60,64,67,.15)}.docs-gm .docos-anchoreddocoview.docos-docoview-active,.docs-gm .docos-anchoreddocoview.docos-docoview-active:hover{border-color:transparent;box-shadow:0 2px 6px 2px rgba(60,64,67,.15)}.docs-gm .docos-anchoreddocoview-internal,.docs-gm .docos-anchoreddocoview{border-radius:8px}.docos-docoview-active.docos-anchoreddocoview{cursor:default}.docos-presenceindicator{height:12px;font-size:11px;color:#787878;padding-top:8px}.unfocused-presenceindicator{padding-left:8px;padding-bottom:8px;background-color:white}.docos-anchoreddocoview:focus,.docos-anchoreddocoview:active{outline:0}.docos-anchoreddocoview-internal{max-height:inherit;overflow-y:auto;overflow-x:hidden}.docos-anchoreddocoview-content{overflow-y:auto;overflow-x:hidden}.docos-anchoreddocoview .docos-anchoreddocoview-input-pane{border:none;display:none;padding:8px}.docos-anchoreddocoview .docos-anchoreddocoview-input-pane.docos-draftdiscussionview-input-pane{padding-top:0}.docos-anchoreddocoview .docos-draftdiscussionview-input-pane{background:#fff}.docos-docoview-active.docos-anchoreddocoview .docos-anchoreddocoview-input-pane{display:block}.docos-anchoreddocoview-input-pane .docos-input-textarea{display:block;height:26px}.docos-anchoreddocoview-input-pane .docos-input-buttons{text-align:left}.docos-draftdiscussionview-input-pane{border-top:none!important;padding-top:0}.docos-anchoreddocoview .docos-input-at-reply-message,.docos-anchoreddocoview .docos-input-acl-fixer-message,.docos-anchoreddocoview .docos-input-assignment-message,.docos-anchoreddocoview .docos-input-static-message{color:#777;font-size:12px;font-family:Arial,sans-serif,sans;font-family:var(--docs-material-header-font-family,Arial,sans-serif,sans);margin-top:8px}.docs-gm .docos-anchoreddocoview .docos-input-at-reply-message,.docs-gm .docos-anchoreddocoview .docos-input-acl-fixer-message,.docs-gm .docos-anchoreddocoview .docos-input-assignment-message,.docs-gm .docos-anchoreddocoview .docos-input-static-message{color:#3c4043;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;letter-spacing:0.3px;line-height:16px}.docos-layout-anchored .docos-anchoreddocoview{position:absolute;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;z-index:500}.docos-layout-anchored .docos-docomenu-visible.docos-anchoreddocoview{z-index:502}.docos-layout-anchored .docos-docoview-active.docos-anchoreddocoview{z-index:501}.docos-layout-anchored-shadows .docos-anchoreddocoview{box-shadow:0 2px 4px rgba(0,0,0,0.2)}.docos-anchoreddocoview .docos-input-post{margin-right:10px}.docs-gm .docos-layout-vertical .docos-anchoreddocoview .docos-anchoreddocoview-arrow-inner.docos-assignee-you{background-color:#188038}.docos-anchoredreplyview .docos-find-match{background-color:rgba(140,196,116,0.5)}.docos-anchoredreplyview .docos-selected-find-match{background-color:rgba(140,196,116,1)}.docos-anchoredreplyview:focus{outline:none}.docos-anchoredreplyview,.docos-showrepliesbutton{border:none;border-bottom:1px solid #e5e5e5;padding:3px 8px 5px 8px;zoom:1;background:#f5f5f5;position:static}.docos-anchoreddocoview.docos-docoview-active{box-shadow:0px 3px 6px rgba(0,0,0,0.2)}.docs-gm .docos-anchoredreplyview,.docs-gm .docos-showrepliesbutton,.docs-gm .docos-anchoreddocoview-input-pane{background-color:#fff;border-bottom:none;border-top:1px solid #dadce0}.docs-gm .docos-showrepliesbutton{border-top:none;margin:0px 16px 16px 16px;padding-left:0}.docs-gm .docos-anchoreddocoview-show-replies-on-border .docos-showrepliesbutton{color:#1a73e8;letter-spacing:0.2px;margin:0 8px;padding:0;position:relative;text-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-justify-content:center;justify-content:center}.docs-gm .docos-anchoreddocoview-show-replies-on-border .docos-showrepliesbutton:not([style*="display: none"])+.docos-anchoredreplyview:not([style*="display: none"]),.docs-gm .docos-anchoreddocoview-show-replies-on-border .docos-showrepliesbutton:not([style*="display: none"])~.docos-anchoredreplyview[style*="display: none"]+.docos-anchoredreplyview:not([style*="display: none"]){border-top:none}.docs-gm .docos-anchoreddocoview .docos-anchoredreplyview{padding:8px 0;margin:0 12px}.docs-gm .docos-anchoreddocoview .docos-replyview-first.docos-anchoredreplyview{border-bottom:none;padding:12px 12px 8px 12px;margin:0}.docs-gm .docos-anchoreddocoview-input-pane{padding:12px}.docs-gm .docos-input-buttons{padding-top:8px}.docs-gm .docos-anchoreddocoview.docos-docoview-active{border-radius:8px;box-shadow:0 2px 6px 2px rgba(60,64,67,.15)}.docos-anchoreddocoview .docos-anchoreddocoview-content>.docos-anchoredreplyview:last-of-type,.docos-anchoreddocoview .docos-docoview-rootreply:only-child .docos-anchoredreplyview{padding-bottom:12px}.docos-anchoreddocoview .docos-replyview-first.docos-anchoredreplyview{padding:8px;border-bottom:1px solid #ddd;background:#fff;min-height:36px}.docos-docoview-resolved .docos-anchoredreplyview,.docos-docoview-resolved .docos-showrepliesbutton,.docos-anchoreddocoview.docos-docoview-resolved .docos-replyview-first.docos-anchoredreplyview{background:#eee}.docos-anchoreddocoview .docos-anchoreddocoview-draft .docos-replyview-first.docos-anchoredreplyview{border:none}.docos-anchoredreplyview .docos-anchoredreplyview-avatar{left:0!important;display:block}.docos-anchoredreplyview.docos-replyview-first{border-top:none!important}.docos-anchoredreplyview-header .docos-anchoredreplyview-author{margin:0;margin-top:2px;color:#333;font-family:Arial,sans-serif,sans;font-family:var(--docs-material-header-font-family,Arial,sans-serif,sans);font-size:13px;font-weight:normal;font-weight:var(--docs-material-font-weight-bold,normal);height:18px}.docs-gm .docos-anchoredreplyview-header .docos-anchoredreplyview-author{color:#3c4043;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;letter-spacing:0.25px;line-height:20px;margin-top:0}.docos-anchoreddocoview .docos-anchoreddocoview-input-pane .docos-input-textarea,.docos-anchoredreplyview .docos-anchoredreplyview-body .docos-anchoredreplyview-origin{line-height:1.4}.docs-gm .docos-anchoreddocoview .docos-anchoreddocoview-input-pane .docos-input-textarea{line-height:20px}.docos-anchoredreplyview .docos-anchoredreplyview-body{word-wrap:break-word;color:#333;padding:0}.docs-gm .docos-anchoredreplyview .docos-anchoredreplyview-body{color:#3c4043;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;letter-spacing:0.2px;line-height:20px}.docs-gm .docos-anchoredreplyview .docos-anchoredreplyview-body a{color:#1a73e8}.docos-anchoredreplyview-header .docos-anchoredreplyview-timestamp{margin:0;color:#777;font-size:11px}.docs-gm .badging-enabled-doco .docos-anchoredreplyview-header .docos-anchoredreplyview-timestamp{-webkit-align-items:center;align-items:center;display:-webkit-inline-box;display:-moz-inline-box;display:-ms-inline-flexbox;display:-webkit-inline-flex;display:inline-flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row}.docs-gm .docos-anchoredreplyview-header .docos-anchoredreplyview-timestamp{color:#3c4043;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;line-height:16px;letter-spacing:0.3px}.docs-gm .docos-anchoredreplyview .docos-new-tag{-ms-flex:none;-webkit-flex:none;flex:none;align-items:center;background-color:#1a73e8;border-radius:9px;border:1px solid white;color:white;height:16px;justify-content:center;margin:auto 0 auto 0;overflow:hidden;transform-origin:left;transition:transform 0.2s ease-out,color 0.1s ease-in,border-radius 0.2s ease}.docs-gm .docos-anchoredreplyview .docos-new-tag:not(:hover){border-radius:50%;color:transparent;width:6px;transform:scale(0.375)}.docs-gm .docos-anchoredreplyview span+.docos-new-tag{margin-left:4px}.docos-new-tag{font-weight:600;display:inline-block;font-size:0.75rem;font-family:'Roboto',sans-serif;padding:0 5px}.docos-anchoredreplyview .docos-replyview-resolve-button-plus-one,.docos-anchoredreplyview .docos-accept-suggestion,.docos-anchoredreplyview .docos-reject-suggestion{min-width:28px;width:28px;opacity:0.2}.docos-anchoredreplyview .docos-vote-button,.docos-anchoredreplyview .docos-like-button,.docos-anchoredreplyview .docos-replyview-resolve-button-plus-one,.docos-anchoredreplyview .docos-accept-suggestion,.docos-anchoredreplyview .docos-reject-suggestion{height:28px;margin:0;position:relative;top:auto;right:auto;display:inline-block;vertical-align:middle}.docos-anchoredreplyview .docos-vote-button,.docos-anchoredreplyview .docos-replyview-resolve-button-plus-one,.docos-anchoredreplyview .docos-accept-suggestion,.docos-anchoredreplyview .docos-reject-suggestion{padding:0}.docos-anchoredreplyview .docos-accept-suggestion{right:-1px}.docos-anchoredreplyview .docos-accept-suggestion div,.docos-anchoredreplyview .docos-reject-suggestion div{margin:auto;margin-top:1px}.docos-accept-suggestion{border-radius:3px 0 0 3px}.docos-reject-suggestion{border-radius:0 3px 3px 0}.docos.docs-gm .docos-accept-suggestion path,.docos.docs-gm .docos-reject-suggestion path{fill:#188038}.docos.docs-gm .docos-accept-suggestion.jfk-button-disabled path,.docos.docs-gm .docos-reject-suggestion.jfk-button-disabled path{fill:#3c4043}.docos.docs-gm .docos-accept-suggestion.jfk-button-disabled,.docos.docs-gm .docos-reject-suggestion.jfk-button-disabled{background-color:white;opacity:.38}.docos-accept-suggestion.jfk-button-disabled,.docos-reject-suggestion.jfk-button-disabled{background-color:#f9f9f9}.docos-docoview-active.docos-anchoreddocoview .docos-replyview-control,.docos-docoview-active.docos-showrepliesbutton .docos-replyview-control{display:block}.docos-showrepliesbutton-collapsed{word-wrap:break-word;color:#15c}.docos-showrepliesbutton-collapsed:hover,.docos-anchoreddocoview:hover .docos-showrepliesbutton-collapsed{text-decoration:underline}.docos-anchoreddocoview-show-replies-on-border:hover .docos-showrepliesbutton-collapsed-internal,.docos-anchoreddocoview-show-replies-on-border .docos-showrepliesbutton-collapsed:hover .docos-showrepliesbutton-collapsed-internal,.docos-anchoreddocoview-show-replies-on-border .docos-showrepliesbutton-collapsed-internal:hover{text-decoration:underline}.docs-gm .docos-anchoreddocoview-show-replies-on-border .docos-showrepliesbutton-collapsed{position:relative;width:100%}.docos-anchoreddocoview-show-replies-on-border .docos-showrepliesbutton-line{border-top:1px solid #dadce0;height:50%;position:absolute;top:50%;width:100%}.docs-gm .docos-anchoreddocoview-show-replies-on-border .docos-showrepliesbutton-collapsed-internal{background-color:#fff;display:inline-block;margin:0 20px;overflow-wrap:break-word;padding:0 8px;position:relative;word-wrap:break-word;word-break:break-word}.docos-collapsible-replyview{position:relative;margin:6px 0;padding:0}.docs-gm .docos-collapsible-replyview{margin-bottom:0}.docos-collapsible-replyview.docos-collapsible-replyview-empty{margin:0}.docos-anchoredreplyview .docos-collapsed-replyview{height:78px;overflow:hidden}.docos-show-more,.docos-show-less{color:#15c;display:none;opacity:1;width:100%;outline:none}.docos-show-more:focus,.docos-show-less:focus{text-decoration:underline}.docos-show-more{bottom:0;padding-top:16px;position:absolute;right:0}.docos-anchoreddocoview .docos-show-less,.docos-anchoreddocoview .docos-show-more{cursor:pointer;font-size:11px}.docos-anchoreddocoview .docos-show-less{background:#f5f5f5;padding:2px 0}.docos-anchoreddocoview .docos-show-more{padding:7px 0 2px 0}.docos-anchoreddocoview .docos-replyview-first .docos-show-less{background:#fff}.docos-show-more:hover,.docos-show-less:hover{text-decoration:underline}.docos-anchoreddocoview .docos-show-more{background:#f5f5f5;-ms-filter:none;filter:none}.docos-anchoreddocoview .docos-replyview-first .docos-show-more{background:#fff}.docos-anchoreddocoview.docos-docoview-tesla-conflict:hover .docos-show-more{background:#f5f5f5;-ms-filter:none;filter:none}.docos-anchoreddocoview.docos-docoview-tesla-conflict:hover .docos-replyview-first .docos-show-more{background:#fff}.docos-anchoreddocoview.docos-docoview-active .docos-show-more,.docos-anchoreddocoview.docos-docoview-active:hover .docos-show-more{background:#f5f5f5;-ms-filter:none;filter:none}.docs-gm .docos-anchoreddocoview .docos-show-more,.docs-gm .docos-anchoreddocoview .docos-show-less,.docs-gm .docos-anchoreddocoview.docos-docoview-active .docos-show-more,.docs-gm .docos-anchoreddocoview.docos-docoview-active .docos-show-less,.docs-gm .docos-replyview-first .docos-show-more,.docs-gm .docos-anchoreddocoview.docos-docoview-tesla-conflict:hover .docos-show-more{background:#fff}.docos-anchoreddocoview.docos-docoview-active .docos-replyview-first .docos-show-more,.docos-anchoreddocoview.docos-docoview-active:hover .docos-replyview-first .docos-show-more{background:#fff}.docos-collapsed-replyview>.docos-replyview-static>.docos-show-more{display:block}.docos-anchoreddocoview.docos-docoview-active .docos-show-less{background:#f5f5f5}.docos-anchoreddocoview.docos-docoview-active .docos-replyview-first .docos-show-less{background:#fff}.docos-anchoredreplyview-header{margin:6px 0;height:38px;white-space:nowrap;display:flex}.docs-gm .docos-anchoredreplyview-header{margin-top:0}.docos-replyview-first .docos-anchoredreplyview-header{margin:0;margin-bottom:8px}.docos-anchoreddocoview-draft .docos-replyview-first .docos-anchoredreplyview-header{margin:0}.docos-anchoredreplyview-buttonholder{white-space:nowrap}.docos-anchoreddocoview:hover .docos-reject-suggestion,.docos-anchoreddocoview.docos-docoview-active .docos-reject-suggestion,.docos-anchoreddocoview.docos-docomenu-visible .docos-reject-suggestion,.docos-anchoreddocoview:hover .docos-accept-suggestion,.docos-anchoreddocoview.docos-docoview-active .docos-accept-suggestion,.docos-anchoreddocoview.docos-docomenu-visible .docos-accept-suggestion,.docos-anchoreddocoview:hover .docos-mark-done-button-black,.docos-anchoreddocoview.docos-docoview-active .docos-mark-done-button-black,.docos-anchoreddocoview.docos-docomenu-visible .docos-mark-done-button-black,.docos-anchoreddocoview:hover .docos-replyview-resolve-button,.docos-anchoreddocoview.docos-docoview-active .docos-replyview-resolve-button,.docos-anchoreddocoview.docos-docomenu-visible .docos-replyview-resolve-button,.docos-anchoreddocoview:hover .docos-overflowmenu-outer>.docos-docomenu-dropdown,.docos-anchoreddocoview.docos-docoview-active .docos-overflowmenu-outer>.docos-docomenu-dropdown,.docos-anchoreddocoview.docos-docomenu-visible .docos-overflowmenu-outer>.docos-docomenu-dropdown{opacity:0.7}.docos-anchoreddocoview:hover .docos-mark-done-button-white,.docos-anchoreddocoview.docos-docoview-active .docos-mark-done-button-white,.docos-anchoreddocoview.docos-docomenu-visible .docos-mark-done-button-white{border:1px solid rgba(255,255,255,.7)}.docos-overflowmenu-outer .goog-menu{z-index:600}.docos-anchoredreplyview-buttonholder:hover .docos-reject-suggestion,.docos-anchoredreplyview-buttonholder:hover .docos-replyview-resolve-button{border-top-right-radius:0;border-bottom-right-radius:0}.docos-anchoredreplyview-buttonholder>.docos-reject-suggestion:hover,.docos-anchoredreplyview-buttonholder>.docos-replyview-resolve-button:hover{border-top-right-radius:2px;border-bottom-right-radius:2px}.docos-replyview-first .docos-anchoredreplyview-buttonholder{padding:4px 0 4px 4px}.docos-accept-suggestion{margin-right:-1px}.docos-anchoredreplyview-authortimestamp{padding-left:10px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1}.badging-enabled-doco .docos-anchoredreplyview-authortimestamp span{overflow:hidden;text-overflow:ellipsis}.docs-gm .docos-anchoredreplyview-authortimestamp{display:flex;-webkit-align-items:start;align-items:start;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;-webkit-justify-content:center;justify-content:center}.docos-anchoredreplyview-authortimestamp>*{overflow:hidden;text-overflow:ellipsis}.docs-gm .docos-anchoredreplyview-authortimestamp>*{align-self:stretch}.docos-anchoredreplyview-avatar-holder{max-width:32px}.docs-gm .docos-anchoredreplyview-avatar-holder{height:38px;margin-top:2px;max-width:36px;width:36px}.docos-anchoredreplyview-header .docos-avatar{position:relative}.docs-gm .docos-anchoredreplyview-header .docos-avatar{margin-left:2px;margin-top:2px}.docos-user-presence{width:32px;height:6px}.docs-gm .docos-user-presence{width:36px;height:36px;border-radius:50%;margin-top:-34px;margin-left:0}.docos-replyview-resolve-button-original{display:inline-block;margin:0;opacity:0.2;padding-left:2px;position:relative;padding:0 4px 0 4px;min-width:50px;height:28px;vertical-align:top}.docs-gm .docos-replyview-resolve-button-original{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:white;border:1px solid #dadce0!important;color:#188038;height:24px;padding:3px 12px 5px}.docs-gm .docos-replyview-resolve-button-original:hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#f8fcf9;border:1px solid #c8e7d1!important;height:24px;padding:3px 12px 5px}.docs-gm .docos-replyview-resolve-button{border-radius:3px 0 0 3px;display:inline-block;margin:auto;margin-top:1px;padding:0;position:relative;top:auto;right:auto;vertical-align:middle;width:28px;height:28px}.docs-gm .docos-anchoreddocoview:hover .docos-replyview-resolve-button,.docs-gm .docos-anchoreddocoview.docos-docoview-active .docos-replyview-resolve-button{opacity:1}.docos-anchoredreplyview .docos-replyview-edit{margin-left:0}.docos-anchoredreplyview-origin{word-wrap:break-word;color:#777;margin:8px -8px 0 -8px;padding:8px 8px 4px 8px;border-color:#e5e5e5;border-top-style:solid;border-top-width:1px;font-size:11px;font-style:italic}.docs-gm .docos-anchoredreplyview-origin{color:#80868b;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;line-height:16px}.docos-anchoredreplyview .docos-action-text{color:#707070;font-style:italic;word-wrap:break-word;-ms-word-wrap:break-word;overflow-wrap:break-word}.docs-gm .docos-anchoredreplyview .docos-action-text{color:#80868b;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;letter-spacing:0.2px;line-height:20px}.docos-action-text-bottom-wrapper{padding:8px 0 3px 0;position:relative}.docos-anchoreddocoview .docos-anchoredreplyview:last-of-type .docos-action-text-bottom-wrapper{padding:8px 0 0 0}.docos-assigneeview{border-bottom:solid #dddddd 1px;padding:7px 10px 7px 8px}.docs-gm .docos-assigneeview{border-bottom:solid #dadce0 1px;padding:12px}.docos-assigneeview table{border-spacing:0;width:100%}.docos-assigneeview.docos-assignee-other{background-color:#f2f2f2;color:#333333}.docs-gm .docos-assigneeview.docos-assignee-other{background-color:#e6f4ea;color:#3c4043}.docos-assigneeview.docos-assignee-you{background-color:#4285f4;color:white}.docos.docs-gm .docos-assigneeview.docos-assignee-you{background-color:#188038;color:#fff}.docs-gm .docos-assigneeview-avatar-container{padding:2px}.docos-assigneeview-avatar.docos-avatar{position:relative;display:block}.docos-assigneeview-assigneeinfo{padding:0px 0px 0px 10px;width:100%;max-width:135px}.docs-gm .docos-assigneeview-label{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;letter-spacing:0.3px;line-height:16px}.docos-assigneeview-assignee-text{font-weight:700;font-weight:var(--docs-material-font-weight-bold,700);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.docs-gm .docos-assigneeview-assignee-text{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;letter-spacing:0.25px;line-height:20px}.docos-assigneeview .docos-icon-checkmark-black{margin-top:1px}.docos-assigneeview .docos-icon-checkmark-white{margin-top:6px}.docs-gm .docos-assigneeview .docos-icon-checkmark-white{margin-top:1px}.docos-assigneeview .docos-mark-done-button{width:28px;height:28px;min-width:28px;padding:0px;margin:0px;background:none}.docos-assigneeview .docos-mark-done-button-black{opacity:0.2}.docos.docs-gm .docos-assigneeview .docos-mark-done-button-black{opacity:1}.docos-assigneeview .docos-mark-done-button-white{border:1px solid rgba(255,255,255,.38);opacity:0.7}.docos-assigneeview .docos-mark-done-button-white:hover{border:1px solid rgba(255,255,255,1);opacity:1;background:none}.docs-gm .docos-assigneeview .docos-mark-done-button-white{border:none;opacity:1}.CSS_ASSISTED_WRITING_TAB_ICON{align-items:center;background-color:#f9f9f9;border:.0625em solid #bababa;border-radius:.2em;bottom:.1em;box-sizing:border-box;display:inline-flex;height:1.1em;justify-content:center;margin-left:.3em;position:relative;width:1.8em}.CSS_ASSISTED_WRITING_TAB_ICON_TEXT{color:#bababa;font-size:.6em;font-weight:bold}.CSS_ASSISTED_WRITING_TYPEAHEAD_CONTAINER{color:#80868b!important}.docos-ac{background:#fff;border:1px solid #c8c8c8;font-family:Arial,sans-serif,sans;font-family:var(--docs-material-font-family,Arial,sans-serif,sans);margin:0px 0px;padding:4px 0px 4px 0px;position:absolute;z-index:900}.docs-gm .docos-ac{border-color:transparent;border-radius:8px;box-shadow:0 1px 3px 1px rgba(60,64,67,.15);padding:9px 0px 9px 0px}.docos-ac div{cursor:pointer}.docos-ac .ac-row{height:auto;padding:0px}.docos-ac .ac-active{background-color:#eee}.docos-ac div.active{background-color:#eee}.docs-gm .docos-ac .ac-active,.docs-gm .docos-ac div.active{background-color:#f1f3f4}.docos-ac-highlighted{font-weight:bold}.docos-availability-banner{width:268px;background-color:#fef7e0;left:-12px;padding:8px 0 8px 14px;margin:12px 0 8px 0;display:flex;align-items:center}.availability-icon-size{width:18px;height:18px;margin:1px 2px 2px 1px}.docos-availability-banner-text{width:221px;font-size:12px;padding-left:11px}.docos-avatar{left:0;position:absolute;object-fit:cover}.docs-gm .docos-avatar{border-radius:50%}.docos-avatar-unverified{opacity:0.4}.docs-gm .docos-avatar-unverified{background-color:white;opacity:1}.docos-build-info{font-family:Arial,sans-serif,sans;font-family:var(--docs-material-font-family,Arial,sans-serif,sans);font-size:10px/12px;color:#bbb;text-align:right;padding-right:30px}.docos-build-info a{color:#bbb}.docos-calltoactionview{min-height:36px}.docos-calltoactionview-container{background:#f2f2f2;padding:8px}.docs-gm .docos-calltoactionview-container{background:white;padding:16px}.docos-calltoactionview-headertext{color:#3c4043;line-height:20px;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;vertical-align:top;width:100%}.docos-calltoactionview-body{padding:12px 0}.docos-calltoactionview-collapsible{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;overflow:hidden}.docos-calltoactionview-body a{color:#1a73e8}.docos-calltoactionview-checkbox-container{border-bottom:1px solid #dadce0;margin-bottom:16px;padding-bottom:16px;padding-top:4px}.docos-calltoactionview-checkbox-container .docs-material-gm-checkbox{cursor:pointer}.docos-calltoactionview-dont-show-again-checkbox{margin-bottom:10px}.docos-calltoactionview-dont-show-again-label{color:#3c4043;padding-left:10px;position:relative;top:2px}.docos-calltoactionview-show-more,.docos-calltoactionview-show-less{color:#15c;cursor:pointer;font-size:11px;outline:none;padding-top:4px}.docos-calltoactionview-show-more:hover,.docos-calltoactionview-show-less:hover{text-decoration:underline}.docos-contact-row{height:32px;color:rgb(0,0,0);padding:4px 8px;font-family:Arial,sans-serif,sans;font-family:var(--docs-material-font-family,Arial,sans-serif,sans)}.docs-gm .docos-contact-row{height:36px;padding:6px 8px}.docos-contact-row .docos-avatar{float:left;left:initial;position:relative;padding-right:8px}.docs-gm .docos-contact-row .docos-avatar{padding-right:0;margin-right:8px;margin-top:2px}.docos-contact-row-name,.docos-contact-row-email{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.docos-contact-row-email{color:#777;font-size:0.9em}.docs-gm .docos-contact-row-name{color:#3c4043;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;line-height:20px}.docs-gm .docos-ac-highlighted{font-weight:700}.docs-gm .docos-contact-row-email{color:#3c4043;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;line-height:16px}.docos-delete-dialog{font-size:14px;white-space:normal;width:472px}.docos-delete-dialog .docos-delete-dialog-subtitle{width:424px}.docos-delete-dialog span.docs-material-button-content{font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif}.docos-icon{overflow:hidden;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.docos-icon-img:before{content:url(//ssl.gstatic.com/docs/common/d-icons30.png)}.docos-icon-img-hdpi:before{transform:scale(0.5);transform-origin:0 0;display:inline-block;image-rendering:optimizeSpeed;image-rendering:-moz-crisp-edges;image-rendering:-o-crisp-edges;image-rendering:-webkit-optimize-contrast;image-rendering:optimize-contrast;-ms-interpolation-mode:nearest-neighbor}.docos-icon-img{*background:url(//ssl.gstatic.com/docs/common/d-icons30.png)}.docos-icon-img-container{position:absolute}.docos-icon-thumb-black{top:-88px;left:-4px}.docos-icon-thumb-green{top:-106px;left:-4px}.docos-icon-thumb-size{height:18px;width:18px}.docos-icon-bell{top:-25px;left:-25px}.docos-icon-bell-size{height:13px;width:11px}.docos-icon-insert-comment{top:-48px;left:-1px}.docos-icon-accept-checkmark-black{left:0px;top:0px}.docos-icon-accept-checkmark-white{top:-140px;left:-49px}.docos-icon-accept-checkmark-size{height:21px;width:21px}.docs-gm .docos-icon-accept-checkmark-black{left:-42px;top:-24px}.docs-gm .docos-icon-accept-checkmark-white{top:0;left:-42px}.docs-gm .docos-icon-accept-checkmark-size{height:24px;width:24px}.docos-icon-reject-suggestion-cross{top:-45px;left:-21px}.docos-icon-reject-suggestion-cross-size{height:21px;width:21px}.docs-gm .docos-icon-reject-suggestion-cross-size{height:24px;width:24px}.docos-icon-insert-comment-size{height:14px;width:18px}.docos-icon-overflow-three-dots{left:-25px;top:0px}.docos-icon-overflow-three-dots-size{height:21px;width:14px}.docs-gm .docos-icon-overflow-three-dots{left:0;top:-164px}.docs-gm .docos-icon-overflow-three-dots-size{height:24px;width:14px}.docos-icon-explore{top:-64px;left:-2px}.docos-icon-explore-size{height:21px;width:21px}.docos-hc-edge .docos-icon-img,.docos-hc-gecko .docos-icon-img{filter:invert(100%)}.docos-hc-ie .docos-icon-img{-ms-high-contrast-adjust:none;background-color:white}.docos-icon-instant-docos-ltr{top:-48px;left:12px;height:14px;width:18px;position:absolute;clip:rect(48px,20px,72px,0px)}.docos-icon-instant-docos-rtl{top:-48px;left:60px;height:14px;width:18px;position:absolute;clip:rect(48px,-28px,63px,-48px)}.docos-hc-edge .jfk-checkbox-checked .jfk-checkbox-checkmark::before,.docos-hc-gecko .jfk-checkbox-checked .jfk-checkbox-checkmark::before{content:url(//ssl.gstatic.com/docs/common/d-icons30.png);position:absolute;left:-50px;top:-124px;width:15px;height:15px;clip:rect(125px,65px,140px,51px)}.docs-material>.docos-new-comment-icon>.docos-icon-add-comment{top:-125px;left:-4px}.docs-material>.docos-icon-add-comment-size{height:18px;width:18px}.docs-material .docos-icon-instant-docos-ltr{top:-125px;left:11px;height:18px;width:18px;clip:rect(125px,20px,145px,0px)}.docs-material .docos-icon-instant-docos-rtl{top:-125px;left:59px;height:18px;width:18px;clip:rect(125px,-28px,145px,-48px)}.docs-suggestion-button:not(.jfk-button-disabled) .docs-material .docs-icon-img,.docs-suggestion-button:not(.jfk-button-disabled) .docs-material .docs-icon-img::before{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_green.svg)}.docs-suggestion-button.jfk-button-disabled .docs-material .docs-icon-img,.docs-suggestion-button.jfk-button-disabled .docs-material .docs-icon-img::before{opacity:.38}.docos-input{position:relative;outline:none;zoom:1}.docos-input.docos-input-nohide{display:block!important}.docos-input-contenteditable{cursor:text;text-align:start;word-wrap:break-word}.docos-input-contenteditable:empty:before{color:#80868b;content:attr(placeholder);display:block;pointer-events:none}.docos-input-contenteditable p{margin:0}.docos-input-textarea{box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;-webkit-box-sizing:border-box;color:#999;font-family:Arial,sans-serif,sans;font-family:var(--docs-material-font-family,Arial,sans-serif,sans);font-size:13px;margin:0;overflow-x:hidden;overflow-y:hidden;outline-width:0!important;padding:4px;resize:none;width:100%;border:1px solid #c8c8c8}.docs-gm .docos-input-textarea{border:1px solid #dadce0;border-radius:4px;box-sizing:border-box;color:#3c4043;font-size:14px;line-height:20px;min-height:36px;padding:8px}.docs-gm .docos-input-textarea:focus{border:2px solid #1a73e8;box-shadow:none;padding:7px}.docos-input-textarea:disabled{background-color:#eee!important}*:first-child+html .docos-input-textarea{width:95%}.docos-input-buttons{display:none;zoom:1}.docos-input-buttons-post{font-weight:700;font-weight:var(--docs-material-font-weight-bold,700)}.docos-input-typing>.docos-input-textarea{color:#000}.docs-gm .docos-input-typing>.docos-input-textarea{color:#3c4043}.docos-input-typing>.docos-input-buttons{display:block}.docos-input-assign-to-text{color:#616161;font-style:italic;padding:5px 0 3px 0;word-wrap:break-word}.docos-input-assignment-panel{padding:6px 8px 4px 8px;background-color:#f5f5f5;border-style:solid;border-width:0 1px 1px 1px;border-color:#c8c8c8;margin-bottom:8px;cursor:pointer}.docs-gm .docos-input-assignment-panel{padding:6px 8px 11px 0;background-color:#fff;border:1px solid transparent;border-bottom:1px solid #dadce0;margin-bottom:18px;cursor:pointer}.docos-input-assignment-box{margin:2px 10px 0 0;float:left;width:11px}.docos-anchoreddocoview .docos-input-assignee-text{margin-top:1px}.docos-input-assignee-text{text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:13px;font-family:Arial,sans-serif,sans;font-family:var(--docs-material-font-family,Arial,sans-serif,sans);color:#707070;font-weight:normal;display:inline-block;width:calc(100% - 51px)}.docos-input-assignee-text.docos-input-assignee-text-no-chevron{width:calc(100% - 23px)}.docs-gm .docos-input-assignee-text{margin-top:6px;margin-left:8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:14px;font-family:Arial,sans-serif,sans;font-family:var(--docs-material-font-family,Arial,sans-serif,sans);color:#3c4043;font-weight:normal;display:inline-block;width:calc(100% - 57px)}.docs-gm .docos-input-assignee-text.docos-input-assignee-text-no-chevron{width:calc(100% - 29px)}.docos-streamdocoview .docos-input-assignee-select{margin-top:0px}.docos-assignee-select-focus{border:1px solid #4d90fe!important;border-radius:2px}.docos-input-assignee-select{border:none;-moz-box-shadow:none;-webkit-box-shadow:none;background:none;box-shadow:none;cursor:pointer;float:right;width:24px;height:15px;margin:2px}.docs-gm .docos-anchoreddocoview .docos-input-assignee-select{margin-top:6px}.docos-input-assignee-select .goog-menu-button-caption{padding:0px}.docos-input-assignee-select .goog-menu-button-inner-box{margin:0px}.docos-assignee-select-item{padding:0px;border-width:0px}.docos-assignee-select-item.goog-menuitem-highlight{background-color:#f2f2f2}.goog-menu.goog-menu-vertical.docos-assignee-select-menu{padding:4px 0 4px 0;max-height:222px;overflow-y:auto;box-sizing:border-box}.goog-menu.goog-menu-vertical.docs-gm.docos-assignee-select-menu{padding:8px 0 8px 0}.goog-menu.goog-menu-vertical.docs-gm.docos-assignee-select-menu .docos-assignee-select-item,.goog-menu.goog-menu-vertical.docs-gm.docos-assignee-select-menu .docos-assignee-select-item.goog-menu-item-highlight{border:none;padding:0}.docos-input-assignment-panel .goog-menu-button-dropdown{width:24px;background:url(//ssl.gstatic.com/images/icons/material/system/2x/arrow_drop_down_black_24dp.png) center no-repeat;background-size:24px;opacity:0.54;box-sizing:border-box}.docos-input-assignment-panel .goog-menu-button-dropdown:hover{opacity:0.87}.docos-input-assignment-panel .goog-menu-button-outer-box,.docos-input-assignment-panel .goog-menu-button-inner-box{border-style:none;padding:0}.docos-instant-button-bubble-icon{margin-left:-3px;margin-top:13px}.docs-material .docos-instant-button-bubble-icon{margin-top:11px}.docos-vote-button{font-size:14px;min-width:38px;background-color:rgba(245,245,245,0.2);border-color:rgba(0,0,0,0.01880392);background-image:-moz-linear-gradient(top,rgba(245,245,245,0.2),rgba(241,241,241,0.2));background-image:-ms-linear-gradient(top,rgba(245,245,245,0.2),rgba(241,241,241,0.2));background-image:-o-linear-gradient(top,rgba(245,245,245,0.2),rgba(241,241,241,0.2));background-image:linear-gradient(top,rgba(245,245,245,0.2),rgba(241,241,241,0.2));background-image:-webkit-linear-gradient(top,rgba(245,245,245,0.2),rgba(241,241,241,0.2))}.docos-anchoreddocoview:hover .docos-vote-button,.docos-anchoreddocoview.docos-docoview-active .docos-vote-button,.docos-anchoreddocoview.docos-docomenu-visible .docos-vote-button{background-color:rgba(245,245,245,0.7);border-color:rgba(0,0,0,0.0686274);background-image:-webkit-linear-gradient(top,rgba(245,245,245,0.7),rgba(241,241,241,0.7));background-image:-moz-linear-gradient(top,rgba(245,245,245,0.7),rgba(241,241,241,0.7));background-image:-ms-linear-gradient(top,rgba(245,245,245,0.7),rgba(241,241,241,0.7));background-image:-o-linear-gradient(top,rgba(245,245,245,0.7),rgba(241,241,241,0.7));background-image:linear-gradient(top,rgba(245,245,245,0.7),rgba(241,241,241,0.7))}.docos-vote-button.jfk-button-hover{border:1px solid rgba(198,198,198,0.7)!important}.vote-button-text{color:rgb(51,51,51);opacity:0.2}.docos-anchoreddocoview:hover .vote-button-text,.docos-anchoreddocoview.docos-docoview-active .vote-button-text,.docos-anchoreddocoview.docos-docomenu-visible .vote-button-text{opacity:0.6}.post-has-votes-no-current-user-vote,.jfk-button-hover .vote-button-text,.current-user-has-up-vote{opacity:1!important}.vote-button-text.current-user-has-up-vote{color:#0f9d58}.docos-like-button{padding:0px 4px 0px 4px;min-width:20px;background-color:rgba(245,245,245,0.2);border-color:rgba(0,0,0,0.01880392);background-image:-moz-linear-gradient(top,rgba(245,245,245,0.2),rgba(241,241,241,0.2));background-image:-ms-linear-gradient(top,rgba(245,245,245,0.2),rgba(241,241,241,0.2));background-image:-o-linear-gradient(top,rgba(245,245,245,0.2),rgba(241,241,241,0.2));background-image:linear-gradient(top,rgba(245,245,245,0.2),rgba(241,241,241,0.2));background-image:-webkit-linear-gradient(top,rgba(245,245,245,0.2),rgba(241,241,241,0.2))}.docos-anchoreddocoview:hover .docos-like-button,.docos-anchoreddocoview.docos-docoview-active .docos-like-button,.docos-anchoreddocoview.docos-docomenu-visible .docos-like-button{background-color:rgba(245,245,245,0.7);border-color:rgba(0,0,0,0.0686274);background-image:-webkit-linear-gradient(top,rgba(245,245,245,0.7),rgba(241,241,241,0.7));background-image:-moz-linear-gradient(top,rgba(245,245,245,0.7),rgba(241,241,241,0.7));background-image:-ms-linear-gradient(top,rgba(245,245,245,0.7),rgba(241,241,241,0.7));background-image:-o-linear-gradient(top,rgba(245,245,245,0.7),rgba(241,241,241,0.7));background-image:linear-gradient(top,rgba(245,245,245,0.7),rgba(241,241,241,0.7))}.docos-like-button.jfk-button-hover{border:1px solid rgba(198,198,198,0.7)!important}.docos-like-button .jfk-button-img{margin-top:0px}.docos-like-button .docos-icon{opacity:0.2}.docos-anchoreddocoview:hover .docos-icon,.docos-anchoreddocoview.docos-docoview-active .docos-icon,.docos-anchoreddocoview.docos-docomenu-visible .docos-icon{opacity:0.6}.post-has-votes-no-current-user-vote,.jfk-button-hover .docos-icon,.current-user-has-up-vote{opacity:1!important}.like-button-text{font-size:12px;display:inline-block;vertical-align:middle;color:rgb(51,51,51);opacity:1;margin-left:2px;font-weight:normal}.like-button-text.no-votes{display:none}.docos-spinner{height:100px;overflow:hidden;position:relative}.docos-quantum-spinner{height:28px;left:50%;margin-left:-14px;position:absolute;top:36px;width:28px}.docos-notificationdialog-content{width:500px}.docos-notificationdialog-label{padding:0 3px 0 8px}.docos-notificationdialog-control{padding-left:3px;margin-bottom:12px}.docos-notificationdialog-header{font-weight:700;font-weight:var(--docs-material-font-weight-bold,700);margin-bottom:12px}.docos-notificationdialog-help{position:absolute;right:20px}.docos-overflowmenu-outer{display:inline-block}.docos-overflowmenu-outer>.docos-docomenu-dropdown{border:1px solid transparent;width:14px;height:28px;margin:auto;position:relative;left:-1px;opacity:0.2}.docs-gm .docos-overflowmenu-outer>.docos-docomenu-dropdown{transition:opacity 250ms cubic-bezier(0.4,0.0,0.2,1);border:none;cursor:pointer}.docos-overflowmenu-outer>.docos-docomenu-dropdown:hover,.docos-overflowmenu-outer>.docos-docomenu-dropdown:focus{border:1px solid #4d90fe;border-top-left-radius:0;border-bottom-left-radius:0}.docs-gm .docos-overflowmenu-outer>.docos-docomenu-dropdown:hover,.docs-gm .docos-overflowmenu-outer>.docos-docomenu-dropdown:focus{border:none;background:none;box-shadow:none;opacity:1.0}.docos-overflowmenu-outer .goog-toolbar-menu-button-inner-box,.docos-overflowmenu-outer .goog-toolbar-menu-button-outer-box{min-width:14px;margin:0;padding:0}.docos-overflowmenu-outer .docos-icon{vertical-align:middle;opacity:0.7}.docos-overflowmenu-outer .goog-toolbar-menu-button-dropdown{display:none}.docos-overflowmenu .goog-menuitem,.docs-gm .docos-overflowmenu.goog-menu .goog-menuitem{padding-right:15px;padding-left:15px}.drive-quantum-spinner.active{-webkit-animation:container-rotate 1568ms linear infinite;animation:container-rotate 1568ms linear infinite}@-webkit-keyframes container-rotate{to{-webkit-transform:rotate(360deg)}}@keyframes container-rotate{to{transform:rotate(360deg)}}.spinner-layer{position:absolute;width:100%;height:100%;opacity:0}.spinner-blue{border-color:#4285f4}.spinner-red{border-color:#db4437}.spinner-yellow{border-color:#f4b400}.spinner-green{border-color:#0f9d58}.drive-quantum-spinner.active .spinner-layer.spinner-blue{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,blue-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,blue-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both}.drive-quantum-spinner.active .spinner-layer.spinner-red{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,red-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,red-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both}.drive-quantum-spinner.active .spinner-layer.spinner-yellow{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,yellow-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,yellow-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both}.drive-quantum-spinner.active .spinner-layer.spinner-green{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,green-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,green-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both}@-webkit-keyframes fill-unfill-rotate{12.5%{-webkit-transform:rotate(135deg)}25%{-webkit-transform:rotate(270deg)}37.5%{-webkit-transform:rotate(405deg)}50%{-webkit-transform:rotate(540deg)}62.5%{-webkit-transform:rotate(675deg)}75%{-webkit-transform:rotate(810deg)}87.5%{-webkit-transform:rotate(945deg)}to{-webkit-transform:rotate(1080deg)}}@keyframes fill-unfill-rotate{12.5%{transform:rotate(135deg)}25%{transform:rotate(270deg)}37.5%{transform:rotate(405deg)}50%{transform:rotate(540deg)}62.5%{transform:rotate(675deg)}75%{transform:rotate(810deg)}87.5%{transform:rotate(945deg)}to{transform:rotate(1080deg)}}@-webkit-keyframes blue-fade-in-out{from{opacity:1}25%{opacity:1}26%{opacity:0}89%{opacity:0}90%{opacity:1}100%{opacity:1}}@keyframes blue-fade-in-out{from{opacity:1}25%{opacity:1}26%{opacity:0}89%{opacity:0}90%{opacity:1}100%{opacity:1}}@-webkit-keyframes red-fade-in-out{from{opacity:0}15%{opacity:0}25%{opacity:1}50%{opacity:1}51%{opacity:0}}@keyframes red-fade-in-out{from{opacity:0}15%{opacity:0}25%{opacity:1}50%{opacity:1}51%{opacity:0}}@-webkit-keyframes yellow-fade-in-out{from{opacity:0}40%{opacity:0}50%{opacity:1}75%{opacity:1}76%{opacity:0}}@keyframes yellow-fade-in-out{from{opacity:0}40%{opacity:0}50%{opacity:1}75%{opacity:1}76%{opacity:0}}@-webkit-keyframes green-fade-in-out{from{opacity:0}65%{opacity:0}75%{opacity:1}90%{opacity:1}100%{opacity:0}}@keyframes green-fade-in-out{from{opacity:0}65%{opacity:0}75%{opacity:1}90%{opacity:1}100%{opacity:0}}.spinner-gap-patch{position:absolute;box-sizing:border-box;top:0;left:45%;width:10%;height:100%;overflow:hidden;border-color:inherit}.spinner-gap-patch .spinner-circle{width:1000%;left:-450%}.spinner-circle-clipper{display:inline-block;position:relative;width:50%;height:100%;overflow:hidden;border-color:inherit}.spinner-circle-clipper .spinner-circle{width:200%}.spinner-circle{box-sizing:border-box;height:100%;border-width:3px;border-style:solid;border-color:inherit;border-bottom-color:transparent!important;border-radius:50%;-webkit-animation:none;animation:none}.spinner-circle-clipper.spinner-left .spinner-circle{border-right-color:transparent!important;-webkit-transform:rotate(129deg);transform:rotate(129deg)}.spinner-circle-clipper.spinner-right .spinner-circle{left:-100%;border-left-color:transparent!important;-webkit-transform:rotate(-129deg);transform:rotate(-129deg)}.drive-quantum-spinner.active .spinner-circle-clipper.spinner-left .spinner-circle{-webkit-animation:left-spin 1333ms cubic-bezier(0.4,0.0,0.2,1) infinite both;animation:left-spin 1333ms cubic-bezier(0.4,0.0,0.2,1) infinite both}.drive-quantum-spinner.active .spinner-circle-clipper.spinner-right .spinner-circle{-webkit-animation:right-spin 1333ms cubic-bezier(0.4,0.0,0.2,1) infinite both;animation:right-spin 1333ms cubic-bezier(0.4,0.0,0.2,1) infinite both}@-webkit-keyframes left-spin{from{-webkit-transform:rotate(130deg)}50%{-webkit-transform:rotate(-5deg)}to{-webkit-transform:rotate(130deg)}}@keyframes left-spin{from{transform:rotate(130deg)}50%{transform:rotate(-5deg)}to{transform:rotate(130deg)}}@-webkit-keyframes right-spin{from{-webkit-transform:rotate(-130deg)}50%{-webkit-transform:rotate(5deg)}to{-webkit-transform:rotate(-130deg)}}@keyframes right-spin{from{transform:rotate(-130deg)}50%{transform:rotate(5deg)}to{transform:rotate(-130deg)}}.spinner-fit{position:absolute;top:0;bottom:0;right:0;left:0}.docos-quantum-spinner.active{-webkit-animation:container-rotate 1568ms linear infinite;animation:container-rotate 1568ms linear infinite}.active .spinner-layer.spinner-blue{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,blue-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,blue-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both}.active .spinner-layer.spinner-red{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,red-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,red-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both}.active .spinner-layer.spinner-yellow{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,yellow-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,yellow-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both}.active .spinner-layer.spinner-green{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,green-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,green-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both}.active .spinner-circle-clipper.spinner-left .spinner-circle{-webkit-animation:left-spin 1333ms cubic-bezier(0.4,0.0,0.2,1) infinite both;animation:left-spin 1333ms cubic-bezier(0.4,0.0,0.2,1) infinite both}.active .spinner-circle-clipper.spinner-right .spinner-circle{-webkit-animation:right-spin 1333ms cubic-bezier(0.4,0.0,0.2,1) infinite both;animation:right-spin 1333ms cubic-bezier(0.4,0.0,0.2,1) infinite both}.docos-readonly .hide-on-readonly{display:none!important}.show-on-readonly{display:none}.docos-readonly .show-on-readonly{display:inline-block!important}.docos-resolve-highlight{border:1px solid rgba(0,0,0,0.2)}.docos-resolve-animation{-webkit-transition:all 270ms ease-out;-moz-transition:all 270ms ease-out;-o-transition:all 270ms ease-out;transition:all 270ms ease-out;-webkit-transform:scale(0.3);-moz-transform:scale(0.3);-o-transform:scale(0.3);transform:scale(0.3);-webkit-transform-origin:center top;-moz-transform-origin:center top;-o-transform-origin:center top;transform-origin:center top;opacity:0.3}#docos-shadow-wrapper{position:relative}#docos-shadow{background:#000;background:rgba(0,0,0,0.7);color:#fff;position:absolute;z-index:700;left:0;top:0}#docos-shadow,.docos-shadow-table{height:100%;width:100%}#docos-shadow-description{font-weight:700;font-weight:var(--docs-material-font-weight-bold,700)}#docos-shadow-confirm,#docos-shadow-delete{margin:2px 7px}.docos-smarttodoview{min-height:36px}.docos-smarttodoview-container{padding:8px;background:#f2f2f2}.docs-gm .docos-smarttodoview-container{background:white;padding:16px}.docos-smarttodoview .docos-icon-explore-container{display:inline-block;padding:3px 2px 0px 2px;width:20px;height:20px;opacity:.54}.docos-gm-sidebars .docos-smarttodoview .docos-icon-explore-container{padding-top:5px}.docos-smarttodoview-header{height:38px}.docos-smarttodoview-header table{border-spacing:0}.docos-smarttodoview-headertext{padding-left:8px;width:100%;vertical-align:top}.docos-smarttodoview-headertext-outer{position:relative}.docos-smarttodoview-headertext-inner{position:absolute;padding-top:4px;width:100%;color:#616161;font-weight:700;font-weight:var(--docs-material-font-weight-bold,700);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.docs-gm .docos-smarttodoview-headertext-inner{color:#3c4043;line-height:20px;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:700}.docos-smarttodoview-body{color:#333;padding-bottom:4px;word-wrap:break-word}.docs-gm .docos-smarttodoview-body{border-bottom:1px solid #dadce0;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;margin-bottom:10px;padding-bottom:16px}.docos-gm-sidebars .docos-smarttodoview .docos-input-assign-to-text{color:#3c4043;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:500;line-height:20px}.docos-smarttodoview-showfeedbackdialog-container{display:inline-block;margin-top:8px}.docos-smarttodoview-showfeedbackdialog-button{color:#616161;font-size:12px}.docos-smarttodoview-showfeedbackdialog-button:hover,.docos-smarttodoview-showfeedbackdialog-button:focus{text-decoration:underline;cursor:pointer;outline:none}.docos-smarttodoview-feedback{padding:13px 8px 10px 8px;border-top:1px solid #ddd;background-color:#fff}.docos-smarttodoview-feedback-headertext{color:#333;font-weight:700;font-weight:var(--docs-material-font-weight-bold,700)}.docos-smarttodoview-feedback-checkboxlist{margin:7px 0 7px 0}.docos-smarttodoview-feedback-checkbox-container{margin:4px 0 3px 0}.docos-smarttodoview-feedback-checkbox-container label{cursor:pointer}.docos-smarttodoview-feedback-checkbox-container .jfk-checkbox{border:1px solid rgba(0,0,0,.54);cursor:pointer}.docos-smarttodoview-feedback-checkbox-container .jfk-checkbox-focused{border:1px solid #4d90fe}.docos-smarttodoview-feedback-checkbox-container .jfk-checkbox-hover{border:1px solid #333}.docos-smarttodoview-feedback-checkbox-container .jfk-checkbox-clearOutline{border:1px solid rgba(0,0,0,.54)}.docos-smarttodoview-feedback-checkbox{margin:0 8px 0 4px}.docos-smarttodoview-feedback-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#333;display:inline-block;vertical-align:middle}.docos-smarttodoview-writefeedback-link{margin:2px 0 5px 0;color:#4285f4;cursor:pointer}.docos-streamdocoview{border-top:1px solid #e8e8e8;font-family:Arial,sans-serif,sans;font-family:var(--docs-material-font-family,Arial,sans-serif,sans);font-size:12px;font-size:var(--docs-material-font-size-normal,12px);padding:18px 0 7px 0;position:relative;outline:none;zoom:1}.docs-gm .docos-streamdocoview{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;padding:16px}.docs-gm .docos-streampanemargin-legacy{border:1px solid #dadce0;border-radius:4px;margin:16px 0}.docs-gm .docos-streamdocoview-avatar{left:16px}.docos:not(.docs-gm) .docos-streamdocoview:last-child{padding-bottom:0}.docos:not(.docs-gm) .docos-streamdocoview:last-child .docos-streamdocoview-controls{padding-bottom:0}.docos-streamdocoview .docos-docoview-rootreply{min-height:48px}.docos-streamrootreplyview{margin-right:12px;min-height:51px;padding:0 6px;position:relative;top:-3px}.docs-gm .docos-streamrootreplyview{margin-bottom:8px;padding:0;top:0}.docos:not(.docs-gm) .docos-docoview-resolved .docos-streamrootreplyview{background-color:#f6f6f6}.docos:not(.docs-gm) .docos-docoview-active .docos-streamrootreplyview{background-color:#fffbe1}.docs-gm .docos-streamdocoview.docos-docoview-resolved{background-color:#f1f3f4}.docos.docs-gm .docos-streamdocoview.docos-docoview-active{background-color:#fffbe1}.docos.docs-gm .docos-streamdocoview.docos-docoview-active-experiment{background-color:#e6f4ea}.docos-streamdocoview-content{margin-left:60px;position:relative}.docs-gm .docos-streamdocoview-content{margin-left:40px}.docos-streamdocoview-authorname{font-weight:700;font-weight:var(--docs-material-font-weight-bold,700);font-family:Arial,sans-serif,sans;font-family:var(--docs-material-header-font-family,Arial,sans-serif,sans)}.docs-gm .badging-enabled-doco .docos-streamdocoview-authorname{-webkit-align-items:center;align-items:center;display:-webkit-inline-box;display:-moz-inline-box;display:-ms-inline-flexbox;display:-webkit-inline-flex;display:inline-flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row}.docs-gm .docos-streamdocoview-authorname .docos-new-tag{-ms-flex:none;-webkit-flex:none;flex:none;align-items:center;background-color:#1a73e8;border-radius:9px;border:1px solid white;color:white;height:16px;justify-content:center;margin:auto 0 auto 0;overflow:hidden;transform-origin:left;transition:transform 0.2s ease-out,color 0.1s ease-in,border-radius 0.2s ease;line-height:16px}.docs-gm .docos-streamdocoview-authorname .docos-new-tag:not(:hover){border-radius:50%;color:transparent;transform:scale(0.375);width:6px}.docs-gm .docos-streamdocoview-authorname span+.docos-new-tag{margin-left:4px}.docos-streamdocoview-body{color:#333;word-wrap:break-word;top:-7px;zoom:1}.docos-streamdocoview-timestamp,.docos-streamdocoview-comments-off{color:#5f6368;font-size:11px;font-size:var(--docs-material-font-size-12,11px);padding:0}.docos-streamdocoview-timestamp,.docos-streamdocoview-reopen-control{right:2px}.docos-streamdocoview-bullet{color:#ccc;font-size:12px;line-height:100%;padding:0 2px}.docos-streamdocoview-controls{font-family:Arial,sans-serif,sans;font-family:var(--docs-material-header-font-family,Arial,sans-serif,sans);font-weight:normal;font-weight:var(--docs-material-font-weight-bold,normal);padding:4px 0}.docos-streamdocoview-timestamp:hover{text-decoration:underline;cursor:pointer}.docos-streamdocoview-input-pane{padding-right:6px;margin-left:30px}.docs-gm .docos-streamdocoview-input-pane{margin-left:40px;padding-right:0}.docos-streamdocoview-input-pane .docos-input-textarea{background-color:#fff;border:1px solid #c9d4ec;height:23px;font-size:12px}.docs-gm .docos-streamdocoview-input-pane .docos-input-textarea{border:1px solid #dadce0;border-radius:4px;box-sizing:border-box;color:#3c4043;font-size:14px;line-height:20px;min-height:36px;padding:8px;height:unset}.docs-gm .docos-streamdocoview-input-pane .docos-input-textarea:focus{border:2px solid #1a73e8;box-shadow:none;padding:7px}.docos-streamdocoview-input-pane.docos-input-typing .docos-input-textarea{background-color:#fff}.docos-streamdocoview-edit-pane .docos-input-textarea{height:36px}.docos-streamdocoview-inputcontainer,.docos-streamdocoview-replycontainer{margin:4px 12px 3px 0}.docs-gm .docos-streamdocoview-inputcontainer,.docs-gm .docos-streamdocoview-replycontainer{margin:0}.docos-streamdocoview-inputcontainer{background-color:#eff2f9;-moz-border-radius:0 0 6px 6px;-webkit-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;padding:6px 0 2px 6px;position:relative;zoom:1}.docs-gm .docos-streamdocoview-inputcontainer{background-color:white;border:1px solid #dadce0;-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;padding:16px}.docos-docoview-resolved .docos-streamdocoview-inputcontainer{background-color:#f6f6f6}.docs-gm .docos-docoview-resolved .docos-streamdocoview-inputcontainer{background-color:white}.docos-streamdocoview-details{position:absolute;right:0;top:0}.docos-streamdocoview.docos-docoview-resolved .docos-streamdocoview-details{right:4px}.docos-streamdocoview .docos-actionmenu-outer{position:absolute;right:-12px;top:3px}.docos-streamdocoview-reopen-control{display:inline}.docos-streamdocoview-reopen-control>.docos-docoview-reopen{font-family:Arial,sans-serif,sans;font-family:var(--docs-material-header-font-family,Arial,sans-serif,sans);font-size:11px;font-size:var(--docs-material-font-size-12,11px);font-weight:normal;font-weight:var(--docs-material-font-weight-bold,normal);color:#15c}.docos-streamdocoview-comment-control>.docos-docoview-comment,.docos-streamdocoview-resolve-control>.docos-docoview-resolve{color:#999;line-height:100%}.docos-streamdocoview-comment-control>.docos-docoview-comment:hover,.docos-streamdocoview-reopen-control>.docos-docoview-reopen:hover,.docos-streamdocoview-resolve-control>.docos-docoview-resolve:hover{text-decoration:underline;cursor:pointer}.docos-streamrootreplyview:hover .docos-docoview-comment,.docos-streamrootreplyview:hover .docos-docoview-resolve,.docos-docoview-active .docos-docoview-comment,.docos-docoview-active .docos-docoview-resolve{color:#15c}.docos-streampane .docos-input-buttons{padding-bottom:6px}.docos-streampane .docos-input-post{margin:0 4px 0 0}.docos-streampane .docos-input-cancel{background:none}.docos-streampane-container{line-height:140%;outline:none}.docos-streampane-content{position:relative}.docos-streampane-notificationslink{color:#15c;cursor:pointer;font-size:12px;position:absolute;right:0;top:-3px}.docos-streampane-notificationslink:hover{text-decoration:underline}.docos-offline .docos-streampane-notificationslink{color:#999;cursor:default}.docos-offline .docos-streampane-notificationslink:hover{text-decoration:none}.docos-streampane-feedbacklink{bottom:-10px;color:#15c;cursor:pointer;font-size:12px;padding-right:5px;padding-top:5px;position:absolute;right:5px;text-decoration:none}.docos-offline .docos-streampane-feedbacklink{display:none}.docos-streampane-readonlytext{color:#333;padding:12px 0 12px 20px}.docos-streampane-bannertext{background-color:#fef7e0;border-top:1px solid #dadce0;border-bottom:1px solid #dadce0;color:#5f6368;font-weight:500;padding:12px 20px 12px 20px;position:relative}.docos-streampane-bannerlink,.docos-streampane-bannerlink:visited{color:#1a73e8;font-weight:400;margin-left:8px}.docs-gm .docos-streampane-bannertext{border-top:0px}.docos-streampane-entryarea{margin:6px 29px 10px 20px;position:relative;zoom:1}.docos-streampane-entryarea-content{margin-left:61px;position:relative;zoom:1}.docos-streampane-username{font-size:12px;font-weight:700;font-weight:var(--docs-material-font-weight-bold,700);margin-bottom:3px;top:-3px}.docos-streampane-title{font-size:1.2em;margin:20px 5px 2px}.docos-streampane-input-pane{top:-4px}.docos-streampane-input-pane .docos-input-post{font-weight:700;font-weight:var(--docs-material-font-weight-bold,700)}.docos-streampane-input-pane .docos-input-textarea{font-size:12px;height:30px}.docos-streamdocoview-inputcontainer .docos-input-at-reply-message,.docos-streamdocoview-inputcontainer .docos-input-acl-fixer-message,.docos-streamdocoview-inputcontainer .docos-input-assignment-message,.docos-streamdocoview-inputcontainer .docos-input-static-message{color:#777;line-height:normal;margin-top:8px}.docos-streampane-error{background-color:#dd4b39;border:1px solid #602019;border-radius:4px;color:#fff;margin:6px;padding:6px;text-align:center}.docos-streampane-header{overflow:hidden;padding:10px 29px 10px 20px;background-color:#f5f5f5}.docs-gm .docos-streampane-header{background-color:white;border-bottom:1px solid #dadce0}.docos-streampane-header .docos-notification-settings,.docos-streampane-header .docos-new-comment-button,.docos-streampane-header .docos-feedback-button,.docos-streampane-header .docos-priority-checkbox{display:inline-block;float:right}.docos-streampane-header .goog-flat-menu-button,.docos-streampane-header .jfk-button{border-color:transparent;background-color:transparent;background-image:none}.docos-streampane-header .goog-flat-menu-button-hover,.docos-streampane-header .goog-flat-menu-button-active,.docos-streampane-header .goog-flat-menu-button-open,.docos-streampane-header .goog-flat-menu-button-focused,.docos-streampane-header .jfk-button-hover,.docos-streampane-header .jfk-button-active,.docos-streampane-header .jfk-button-focused{border-color:#c6c6c6;background-color:#f8f8f8;background-image:-webkit-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-moz-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-ms-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-o-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:linear-gradient(top,#f8f8f8,#f1f1f1)}.docos-streampane-header .goog-flat-menu-button-dropdown{visibility:hidden}.docos-streampane-header .goog-flat-menu-button-hover .goog-flat-menu-button-dropdown,.docos-streampane-header .goog-flat-menu-button-active .goog-flat-menu-button-dropdown,.docos-streampane-header .goog-flat-menu-button-open .goog-flat-menu-button-dropdown,.docos-streampane-header .goog-flat-menu-button-focused .goog-flat-menu-button-dropdown{visibility:visible}.docos-streampane-header .goog-flat-menu-button-disabled .docos-ns-caption-icon{opacity:0.3}.docos-streampane-header .jfk-button-disabled .docos-new-comment-icon{opacity:0.15}.docos-streampane-header .docos-new-comment-button,.docos-streampane-header .docos-feedback-button{margin-left:12px;margin-right:0}.docos-enable-docs-header .docos-stream-view-legacy{padding:0 29px 0 20px}.docos-enable-docs-header .docos-stream-view{position:relative;overflow:auto}.docos-enable-docs-header .docos-stream-view-height{max-height:369px}.docos-enable-docs-header .docos-stream-view-height-legacy{max-height:450px}.docos-enable-docs-header:not(.docs-gm) .docos-stream-view>.docos-streamdocoview:first-child{border-top-color:transparent}.docos-new-comment-icon{display:inline-block;vertical-align:middle;margin:4px 5px 5px 2px;opacity:0.65}.docs-gm .docos-new-comment-icon{opacity:1}.docs-gm .docos-new-comment-button,.docs-gm .docos-notification-settings .goog-flat-menu-button,.docs-gm .docos-priority-checkbox .docs-material-gm-labeled-checkbox .docs-material-gm-labeled-checkbox-label{box-shadow:none;background-color:white;background-image:none;cursor:pointer;border-color:transparent!important;border-radius:2px;border-width:1px;border:none;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;line-height:16px;padding-bottom:1px;padding-left:6px;padding-right:6px;padding-top:2px}.docs-gm .docos-notification-settings .goog-flat-menu-button{margin-right:8px}.docs-gm .docos-notification-settings .goog-flat-menu-button-caption{font-weight:500;vertical-align:middle}.docs-gm .docos-notification-settings .goog-flat-menu-button-dropdown{display:none}.docs-gm .docos-new-comment-button,.docs-gm .docos-notification-settings .goog-flat-menu-button,.docs-gm .docos-priority-checkbox .docs-material-gm-labeled-checkbox-label{background-color:white;color:#188038}.docs-gm .docos-priority-checkbox .docs-material-gm-labeled-checkbox{padding:5px 0}.docs-gm .docos-priority-checkbox .docs-material-gm-labeled-checkbox .docs-material-gm-labeled-checkbox-checkbox{border-color:#188038}.docs-gm .docos-priority-checkbox .docs-material-gm-labeled-checkbox-circle{display:none}.docs-gm .docos-priority-checkbox .docs-material-gm-labeled-checkbox-content{margin-left:0}.docs-gm .docos-new-comment-button.jfk-button-hover,.docs-gm .docos-new-comment-button.jfk-button-focused,.docs-gm .docos-notification-settings .goog-flat-menu-button.goog-flat-menu-button-hover,.docs-gm .docos-notification-settings .goog-flat-menu-button.goog-flat-menu-button-focused,.docs-gm .docos-priority-checkbox .docs-material-gm-labeled-checkbox-hover,.docs-gm .docos-priority-checkbox .docs-material-gm-labeled-checkbox-focused,.docs-gm .docos-priority-checkbox .docs-material-gm-labeled-checkbox-hover .docs-material-gm-labeled-checkbox-label,.docs-gm .docos-priority-checkbox .docs-material-gm-labeled-checkbox-focused .docs-material-gm-labeled-checkbox-label{box-shadow:none;background-color:#e6f4ea;background-image:none;cursor:pointer;border-color:transparent!important;border-radius:2px;border-width:1px}.docs-gm .docos-new-comment-button.jfk-button-active,.docs-gm .docos-notification-settings .goog-flat-menu-button.goog-flat-menu-button-open{box-shadow:none;background-color:#ceead6;background-image:none;cursor:pointer;border-color:transparent!important;border-radius:2px;border-width:1px}.docos-notification-settings .goog-option-selected{background-image:none}.docos-notification-settings .goog-option-selected .goog-menuitem-checkbox{content:url(//ssl.gstatic.com/ui/v1/menu/checkmark.png);margin-left:-3px;margin-top:3px}.docos-notification-settings .goog-menuitem-highlight.goog-option-selected .goog-menuitem-checkbox{margin-top:2px}.docs-gm .docos-new-comment-button.jfk-button-disabled{background-color:white;color:#f1f3f4;cursor:default}.docs-gm .docos-streampane-content .docos-streampane-submit-feedback-container{max-height:369px;overflow:auto}.docs-gm .docos-streampane-content .docos-streampane-submit-feedback-container .docos-stream-view-height{max-height:none;overflow:visible}.docs-gm .docos-streampane-content .docos-streampane-submit-feedback{box-shadow:none;background-color:#f1f3f4;background-image:none;cursor:pointer;border-color:transparent!important;border-radius:2px;border-width:1px;border-radius:1000px;color:#3c4043;font-weight:500;margin:16px;padding:5px 15px}.docs-gm .docos-streampane-content .docos-stream-view-legacy .docos-streampane-submit-feedback{margin-bottom:0;margin-left:0;margin-right:0}.docs-gm .docos-streampane-content .docos-streampane-submit-feedback.jfk-button-hover,.docs-gm .docos-streampane-content .docos-streampane-submit-feedback.jfk-button-focused{box-shadow:none;background-color:#e8eaed;background-image:none;cursor:pointer;border-color:transparent!important;border-radius:2px;border-width:1px;border-radius:1000px}.docos-ns-caption-icon{display:inline-block;vertical-align:middle;margin:4px 5px 5px 2px}.docs-gm .docos-ns-caption-icon{margin-left:0}.docos-gm-notification-icon-path,.docos-new-comment-icon-path{fill:#188038}.jfk-button-disabled .docos-new-comment-icon-path{fill:#f1f3f4}.docos-ns-caption{text-align:left}.docs-gm .docos-ns-caption{height:27px}.docos-ns-caption-text{display:inline-block;height:17px}.docs-gm .docos-ns-caption-text{line-height:16px;height:16px}.docos-ns-caption-placeholder{visibility:hidden}.docos-streamreplyview{background-color:#eff2f9;color:#666;font-size:12px;padding:6px 6px 0 6px;position:relative;margin-bottom:3px;min-height:24px}.docos-streamreplyview,.docos-streamrootreplyview{outline:none}.docs-gm .docos-streamreplyview{background-color:white;border:1px solid #dadce0;border-radius:4px;font-size:14px;margin-bottom:8px;padding:16px}.docos-docoview-resolved .docos-streamreplyview{background-color:#f6f6f6}.docs-gm .docos-docoview-resolved .docos-streamreplyview{background-color:white}.docos-streamreplyview-avatar{left:6px}.docs-gm .docos-streamreplyview-avatar{left:16px}.docos-streamreplyview-content{padding-left:30px}.docs-gm .docos-streamreplyview-content{padding-left:40px}.docos-streamreplyview-author{color:black;font-weight:700;font-weight:var(--docs-material-font-weight-bold,700)}.docos:not(.docs-gm) .docos-streamreplyview-author{left:-2px;margin:0 4px;right:-2px}.docs-gm .badging-enabled-doco .docos-streamreplyview-author{-webkit-align-items:center;align-items:center;display:-webkit-inline-box;display:-moz-inline-box;display:-ms-inline-flexbox;display:-webkit-inline-flex;display:inline-flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row}.docs-gm .docos-streamreplyview-author{color:#3c4043;letter-spacing:0.25px;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;line-height:20px;padding-right:8px}.docs-gm .docos-streamreplyview .docos-new-tag{-ms-flex:none;-webkit-flex:none;flex:none;align-items:center;background-color:#1a73e8;border-radius:9px;border:1px solid white;color:white;height:16px;justify-content:center;margin:auto 0 auto 0;overflow:hidden;transform-origin:left;transition:transform 0.2s ease-out,color 0.1s ease-in,border-radius 0.2s ease;line-height:16px}.docs-gm .docos-streamreplyview .docos-new-tag:not(:hover){border-radius:50%;color:transparent;transform:scale(0.375);width:6px}.docs-gm .docos-streamreplyview span+.docos-new-tag{margin-left:4px}.docos-streamreplyview-body{color:#333;margin:0;top:-4px;width:100%;word-wrap:break-word}.docos-streamreplyview-text,.docos-streamreplyview-timestamp{position:relative;top:-3px}.docos-streamreplyview-text{width:100%}.docos-streamreplyview-origin{padding-bottom:4px;font-style:italic}.docos-streamreplyview-origin,.docos-streamreplyview-timestamp{color:#999;font-size:11px;white-space:pre}.docos-streamdocoview .docos-streamreplyview .docos-replyview-control{display:inline;top:-3px}.docos-streamreplyview-edit-pane .docos-input-textarea{height:23px}.docos-streamdocoview .docos-replyview-quote{border-left:1px solid #ccc;font-style:italic;font-size:12px;padding:3px 10px 3px 10px;position:relative;zoom:1;word-wrap:break-word}.docs-gm .docos-streamdocoview .docos-replyview-quote{margin:8px 0;padding:0 8px 0 16px;border-left-width:3px}.docs-gm .docos-streamdocoview .docos-replyview-quote{border-left-color:#188038}.docos-replyview-quote-caption{font-size:11px;font-weight:normal;font-weight:var(--docs-material-font-weight-bold,normal);color:#999;margin-right:2px;padding:0}.docs-gm .docos-replyview-quote-caption{color:#3c4043;letter-spacing:0.8px;line-height:21px;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;text-transform:uppercase}.docos-replyview-quote-collapsed{overflow:hidden;height:18px;padding-left:3px}.docs-gm .docos-replyview-quote-collapse{height:21px;padding-left:0}.docos-replyview-quote-expand{background:#fff;padding:3px 5px 0 5px;position:absolute;right:0;top:0}.docs-gm .docos-replyview-quote-expand{padding:0 5px 0 8px}.docos-replyview-quote-collapse,.docos-replyview-quote-expand{color:#15c;visibility:hidden}.docs-gm .docos-replyview-quote-collapse,.docs-gm .docos-replyview-quote-expand{color:#1a73e8}.docos-docoview-active .docos-replyview-quote-collapse,.docos-docoview-active .docos-replyview-quote-expand{visibility:visible}.docos-docoview-active .docos-replyview-quote-expand{background:#fffbe1}.docos-replyview-quote-collapse:hover,.docos-replyview-quote-expand:hover{cursor:pointer;text-decoration:underline}.docos-streamrootreplyview .docos-action-text,.docos-streamreplyview .docos-action-text{color:#777;font-style:italic;word-wrap:break-word;-ms-word-wrap:break-word;overflow-wrap:break-word}.docs-gm .docos-streamrootreplyview .docos-action-text,.docs-gm .docos-streamreplyview .docos-action-text{color:#3c4043;opacity:0.7}.docos-streamrootreplyview .docos-action-text{display:inline-block}.docos-streamdocoview-content .docos-input-assignment-panel{margin-top:-5px}.docos-textarea{margin:0;padding:2px;font-family:Arial,sans-serif,sans;font-family:var(--docs-material-font-family,Arial,sans-serif,sans);outline-width:0!important;resize:none}.docos-replyview-delete,.docos-replyview-edit{color:#15c;font-size:11px;margin:0 2px}.docos-replyview-delete:hover,.docos-replyview-edit:hover{text-decoration:underline;cursor:pointer}.docos-input-cancel{margin:0 0}.docos-input-post{margin:8px 7px 0 0}.docos-root-reply-action-text-wrapper{padding:8px 0 0 0;position:relative}.docos-hc-ie .jfk-checkbox{-ms-high-contrast-adjust:none!important;background-color:white!important}.peoplekitComponentsListImplList{list-style:none;margin:0;padding:0}.peoplekitComponentsListImplList:focus{outline:none}.peoplekitComponentsAvatarImplAvatar{-webkit-border-radius:50%;border-radius:50%;overflow:hidden}.peoplekitComponentsAvatarImplContainer{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-direction:row;flex-direction:row;height:inherit;width:inherit}.peoplekitComponentsAvatarImplColumn{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-direction:column;flex-direction:column;-webkit-box-flex:1;-webkit-flex:1;flex:1;overflow:hidden;height:inherit;-webkit-align-items:stretch;align-items:stretch}.peoplekitComponentsAvatarImplRow{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-flex:1;-webkit-flex:1;flex:1;overflow:hidden}.peoplekitComponentsAvatarImplDivider{margin:1px}.peoplekitComponentsAvatarImplImageRoot{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-direction:column;flex-direction:column;-webkit-box-flex:auto;-webkit-flex:auto;flex:auto;-webkit-align-items:center;align-items:center;justify-items:center;-webkit-transition:background 50ms ease-in-out;transition:background 50ms ease-in-out}.isLoading.peoplekitComponentsAvatarImplImageRoot{background-clip:padding-box;background-color:#5f6368}.peoplekitComponentsAvatarImplImage{opacity:1;display:block;-webkit-transition:opacity 50ms ease-in-out;transition:opacity 50ms ease-in-out}.isLoading .peoplekitComponentsAvatarImplImage{opacity:0}.peoplekitComponentsResultlistitemResultListItem{background-color:#fff;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-direction:column;flex-direction:column;height:64px;-webkit-justify-content:center;justify-content:center}.peoplekitComponentsResultlistitemResultListItem.comfortableDensity{height:52px}.peoplekitComponentsResultlistitemResultListItem.compactDensity{height:44px}.peoplekitComponentsResultlistitemResultListItem.isActive{background-color:#e8eaed}.peoplekitComponentsResultlistitemResultListItem.isOutOfOffice{background-color:papayawhip}.peoplekitComponentsResultlistitemResultListItemRow{-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;padding-left:12px;padding-right:12px}.peoplekitComponentsResultlistitemLeft{-webkit-box-flex:initial;-webkit-flex:initial;flex:initial}.peoplekitComponentsResultlistitemCenter{-webkit-box-flex:auto;-webkit-flex:auto;flex:auto;overflow:hidden}.peoplekitComponentsResultlistitemRight{-webkit-box-flex:initial;-webkit-flex:initial;flex:initial}.peoplekitComponentsResultlistitemLabelContainer{-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:flex-start;align-items:flex-start;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;margin-left:12px;margin-right:0}.peoplekitComponentsResultlistitemLabelRow{-webkit-box-flex:initial;-webkit-flex:initial;flex:initial;width:100%}.peoplekitComponentsResultlistitemLabel{letter-spacing:.00625em;font-family:Roboto,Arial,sans-serif;font-size:1rem;font-weight:400;line-height:1.5rem;color:#3c4043;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.peoplekitComponentsResultlistitemResultListItem.comfortableDensity .peoplekitComponentsResultlistitemLabel{line-height:1.375rem}.peoplekitComponentsResultlistitemResultListItem.compactDensity .peoplekitComponentsResultlistitemLabel{letter-spacing:.01428571em;font-family:Roboto,Arial,sans-serif;font-size:.875rem;font-weight:400;line-height:1.125}.peoplekitComponentsResultlistitemSublabel{letter-spacing:.01428571em;font-family:Roboto,Arial,sans-serif;font-size:.875rem;font-weight:400;line-height:1.25rem;color:#5f6368;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.peoplekitComponentsResultlistitemResultListItem.comfortableDensity .peoplekitComponentsResultlistitemSublabel{line-height:1.125rem}.peoplekitComponentsResultlistitemResultListItem.compactDensity .peoplekitComponentsResultlistitemSublabel{letter-spacing:.025em;font-family:Roboto,Arial,sans-serif;font-size:.75rem;font-weight:400;line-height:.875rem}.peoplekitComponentsResultlistitemResultListItem.isDisabled .peoplekitComponentsResultlistitemLabel,.peoplekitComponentsResultlistitemResultListItem.isDisabled .peoplekitComponentsResultlistitemSublabel{color:#3c4043;opacity:.38}.peoplekitComponentsResultlistitemAvatar{position:relative}.peoplekitComponentsResultlistitemResultListItem.isDisabled .peoplekitComponentsResultlistitemAvatar{opacity:.5}.peoplekitComponentsResultlistitemAvatarContainer{height:inherit;width:inherit;position:relative}.peoplekitComponentsResultlistitemAvatarSelectionOverlay{background-color:#1a73e8;-webkit-border-radius:50%;border-radius:50%;height:100%;left:0;opacity:0;position:absolute;top:0;-webkit-transform:scale(0);transform:scale(0);-webkit-transition:transform .15s ease-out;transition:transform .15s ease-out;width:100%}.peoplekitComponentsResultlistitemResultListItem.isSelected .peoplekitComponentsResultlistitemAvatarSelectionOverlay{opacity:1;-webkit-transform:scale(1);transform:scale(1)}.peoplekitComponentsResultlistitemWhiteCheck{fill:#fff;margin:8px}.peoplekitComponentsResultlistitemOutOfOffice{letter-spacing:.01428571em;font-family:Roboto,Arial,sans-serif;font-size:.875rem;font-weight:400;line-height:1.25rem;color:#5f6368;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:none}.peoplekitComponentsResultlistitemDisabledDisableReasonContainer{-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:flex}.peoplekitComponentsResultlistitemDisabledTextIndicator{letter-spacing:.00625em;font-family:Roboto,Arial,sans-serif;font-size:1rem;font-weight:400;line-height:1.5rem;color:#5f6368}.peoplekitComponentsResultlistitemDisabledIconIndicator{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;background-color:#f1f3f4;-webkit-border-radius:50px;border-radius:50px;width:32px;height:32px;margin-left:16px;margin-right:calc(16px - 12px)}.peoplekitComponentsResultlistitemDisabledSelectedIcon{fill:#5f6368}.peolekitUiResultlistHeader{letter-spacing:.07272727em;font-family:Roboto,Arial,sans-serif;font-size:.6875rem;font-weight:500;line-height:1rem;text-transform:uppercase;color:#3c4043;padding-bottom:4px;padding-left:24px;padding-right:0;padding-top:16px}.peolekitUiResultlistGroup{letter-spacing:.01785714em;font-family:Roboto,Arial,sans-serif;font-size:.875rem;font-weight:500;line-height:1.25rem;padding-bottom:4px;padding-top:8px;padding-left:24px;padding-right:0}.peoplekitComponentsAutocompleteInlineContainer,.peoplekitComponentsAutocompleteInlineListContainer{height:100%;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-direction:column;flex-direction:column;overflow:hidden}.isLoading .peoplekitComponentsAutocompleteInlineListContainer,.peoplekitComponentsAutocompleteInlineCircularProgress{display:none}.isLoading .peoplekitComponentsAutocompleteInlineCircularProgress{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-justify-content:center;justify-content:center;-webkit-align-items:center;align-items:center;height:100%}.isLoading .peoplekitComponentsAutocompleteInlineCircularProgress:before,.isLoading .peoplekitComponentsAutocompleteInlineCircularProgress:after{-webkit-box-flex:auto;-webkit-flex:auto;flex:auto}.peoplekitComponentsCircularprogressCircularProgress{display:inline-block;height:40px;position:relative;width:40px}.peoplekitComponentsCircularprogressMessageContainer{height:0;overflow:hidden;position:absolute;width:0}.peoplekitComponentsCircularprogressCircularProgressContainer{width:100%;height:100%}.peoplekitComponentsCircularprogressCircularProgress.isActive .peoplekitComponentsCircularprogressCircularProgressContainer{-webkit-animation:circular-progress-container-rotate 1568ms linear infinite;-webkit-animation:circular-progress-container-rotate 1568ms linear infinite;animation:circular-progress-container-rotate 1568ms linear infinite}.peoplekitComponentsCircularprogressCircularProgressLayer{height:100%;opacity:0;position:absolute;width:100%}.peoplekitComponentsCircularprogressColorOne{border-color:#4285f4}.peoplekitComponentsCircularprogressColorTwo{border-color:#ea4335}.peoplekitComponentsCircularprogressColorThree{border-color:#fbbc04}.peoplekitComponentsCircularprogressColorFour{border-color:#34a853}.peoplekitComponentsCircularprogressCircularProgress.isActive .peoplekitComponentsCircularprogressCircularProgressLayer.peoplekitComponentsCircularprogressColorOne{-webkit-animation:circular-progress-fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,circular-progress-blue-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both;-webkit-animation:circular-progress-fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,circular-progress-blue-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both;animation:circular-progress-fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,circular-progress-blue-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both}.peoplekitComponentsCircularprogressCircularProgress.isActive .peoplekitComponentsCircularprogressCircularProgressLayer.peoplekitComponentsCircularprogressColorTwo{-webkit-animation:circular-progress-fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,circular-progress-red-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both;-webkit-animation:circular-progress-fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,circular-progress-red-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both;animation:circular-progress-fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,circular-progress-red-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both}.peoplekitComponentsCircularprogressCircularProgress.isActive .peoplekitComponentsCircularprogressCircularProgressLayer.peoplekitComponentsCircularprogressColorThree{-webkit-animation:circular-progress-fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,circular-progress-yellow-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both;-webkit-animation:circular-progress-fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,circular-progress-yellow-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both;animation:circular-progress-fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,circular-progress-yellow-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both}.peoplekitComponentsCircularprogressCircularProgress.isActive .peoplekitComponentsCircularprogressCircularProgressLayer.peoplekitComponentsCircularprogressColorFour{-webkit-animation:circular-progress-fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,circular-progress-green-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both;-webkit-animation:circular-progress-fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,circular-progress-green-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both;animation:circular-progress-fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,circular-progress-green-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both}.peoplekitComponentsCircularprogressGapPatch{position:absolute;-webkit-box-sizing:border-box;box-sizing:border-box;top:0;left:45%;width:10%;height:100%;overflow:hidden;border-color:inherit}.peoplekitComponentsCircularprogressGapPatch .peoplekitComponentsCircularprogressCircle{width:1000%;left:-450%}.peoplekitComponentsCircularprogressCircleClipper{display:inline-block;position:relative;width:50%;height:100%;overflow:hidden;border-color:inherit}.peoplekitComponentsCircularprogressCircleClipper .peoplekitComponentsCircularprogressCircle{width:200%}.peoplekitComponentsCircularprogressCircle{position:absolute;top:0;right:0;bottom:0;left:0;-webkit-box-sizing:border-box;box-sizing:border-box;height:100%;border-width:3px;border-style:solid;border-color:inherit;border-bottom-color:transparent;-webkit-border-radius:50%;border-radius:50%;-webkit-animation:none;-webkit-animation:none;animation:none}.peoplekitComponentsCircularprogressCircleClipper.peoplekitComponentsCircularprogressLeft .peoplekitComponentsCircularprogressCircle{border-right-color:transparent;-webkit-transform:rotate(129deg);-webkit-transform:rotate(129deg);transform:rotate(129deg)}.peoplekitComponentsCircularprogressCircleClipper.peoplekitComponentsCircularprogressRight .peoplekitComponentsCircularprogressCircle{left:-100%;border-left-color:transparent;-webkit-transform:rotate(-129deg);-webkit-transform:rotate(-129deg);transform:rotate(-129deg)}.peoplekitComponentsCircularprogressCircularProgress.isActive .peoplekitComponentsCircularprogressCircleClipper.peoplekitComponentsCircularprogressLeft .peoplekitComponentsCircularprogressCircle{-webkit-animation:circular-progress-left-spin 1333ms cubic-bezier(0.4,0.0,0.2,1) infinite both;-webkit-animation:circular-progress-left-spin 1333ms cubic-bezier(0.4,0.0,0.2,1) infinite both;animation:circular-progress-left-spin 1333ms cubic-bezier(0.4,0.0,0.2,1) infinite both}.peoplekitComponentsCircularprogressCircularProgress.isActive .peoplekitComponentsCircularprogressCircleClipper.peoplekitComponentsCircularprogressRight .peoplekitComponentsCircularprogressCircle{-webkit-animation:circular-progress-right-spin 1333ms cubic-bezier(0.4,0.0,0.2,1) infinite both;-webkit-animation:circular-progress-right-spin 1333ms cubic-bezier(0.4,0.0,0.2,1) infinite both;animation:circular-progress-right-spin 1333ms cubic-bezier(0.4,0.0,0.2,1) infinite both}.peoplekitComponentsCircularprogressCircularProgress.isWarmdown .peoplekitComponentsCircularprogressCircularProgressContainer{-webkit-animation:circular-progress-container-rotate 1568ms linear infinite,circular-progress-fade-out 400ms cubic-bezier(0.4,0.0,0.2,1);-webkit-animation:circular-progress-container-rotate 1568ms linear infinite,circular-progress-fade-out 400ms cubic-bezier(0.4,0.0,0.2,1);animation:circular-progress-container-rotate 1568ms linear infinite,circular-progress-fade-out 400ms cubic-bezier(0.4,0.0,0.2,1)}@keyframes circular-progress-container-rotate{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes circular-progress-container-rotate{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes circular-progress-fill-unfill-rotate{12.5%{-webkit-transform:rotate(135deg);transform:rotate(135deg)}25%{-webkit-transform:rotate(270deg);transform:rotate(270deg)}37.5%{-webkit-transform:rotate(405deg);transform:rotate(405deg)}50%{-webkit-transform:rotate(540deg);transform:rotate(540deg)}62.5%{-webkit-transform:rotate(675deg);transform:rotate(675deg)}75%{-webkit-transform:rotate(810deg);transform:rotate(810deg)}87.5%{-webkit-transform:rotate(945deg);transform:rotate(945deg)}to{-webkit-transform:rotate(1080deg);transform:rotate(1080deg)}}@-webkit-keyframes circular-progress-fill-unfill-rotate{12.5%{-webkit-transform:rotate(135deg);transform:rotate(135deg)}25%{-webkit-transform:rotate(270deg);transform:rotate(270deg)}37.5%{-webkit-transform:rotate(405deg);transform:rotate(405deg)}50%{-webkit-transform:rotate(540deg);transform:rotate(540deg)}62.5%{-webkit-transform:rotate(675deg);transform:rotate(675deg)}75%{-webkit-transform:rotate(810deg);transform:rotate(810deg)}87.5%{-webkit-transform:rotate(945deg);transform:rotate(945deg)}to{-webkit-transform:rotate(1080deg);transform:rotate(1080deg)}}@keyframes circular-progress-blue-fade-in-out{0%{opacity:.99}25%{opacity:.99}26%{opacity:0}89%{opacity:0}90%{opacity:.99}to{opacity:.99}}@-webkit-keyframes circular-progress-blue-fade-in-out{0%{opacity:.99}25%{opacity:.99}26%{opacity:0}89%{opacity:0}90%{opacity:.99}to{opacity:.99}}@keyframes circular-progress-red-fade-in-out{0%{opacity:0}15%{opacity:0}25%{opacity:.99}50%{opacity:.99}51%{opacity:0}}@-webkit-keyframes circular-progress-red-fade-in-out{0%{opacity:0}15%{opacity:0}25%{opacity:.99}50%{opacity:.99}51%{opacity:0}}@keyframes circular-progress-yellow-fade-in-out{0%{opacity:0}40%{opacity:0}50%{opacity:.99}75%{opacity:.99}76%{opacity:0}}@-webkit-keyframes circular-progress-yellow-fade-in-out{0%{opacity:0}40%{opacity:0}50%{opacity:.99}75%{opacity:.99}76%{opacity:0}}@keyframes circular-progress-green-fade-in-out{0%{opacity:0}65%{opacity:0}75%{opacity:.99}90%{opacity:.99}to{opacity:0}}@-webkit-keyframes circular-progress-green-fade-in-out{0%{opacity:0}65%{opacity:0}75%{opacity:.99}90%{opacity:.99}to{opacity:0}}@keyframes circular-progress-left-spin{0%{-webkit-transform:rotate(130deg);transform:rotate(130deg)}50%{-webkit-transform:rotate(-5deg);transform:rotate(-5deg)}to{-webkit-transform:rotate(130deg);transform:rotate(130deg)}}@-webkit-keyframes circular-progress-left-spin{0%{-webkit-transform:rotate(130deg);transform:rotate(130deg)}50%{-webkit-transform:rotate(-5deg);transform:rotate(-5deg)}to{-webkit-transform:rotate(130deg);transform:rotate(130deg)}}@keyframes circular-progress-right-spin{0%{-webkit-transform:rotate(-130deg);transform:rotate(-130deg)}50%{-webkit-transform:rotate(5deg);transform:rotate(5deg)}to{-webkit-transform:rotate(-130deg);transform:rotate(-130deg)}}@-webkit-keyframes circular-progress-right-spin{0%{-webkit-transform:rotate(-130deg);transform:rotate(-130deg)}50%{-webkit-transform:rotate(5deg);transform:rotate(5deg)}to{-webkit-transform:rotate(-130deg);transform:rotate(-130deg)}}@keyframes circular-progress-fade-out{0%{opacity:.99}to{opacity:0}}@-webkit-keyframes circular-progress-fade-out{0%{opacity:.99}to{opacity:0}}.peoplekitComponentsScrollboxScrollbar::-webkit-scrollbar-thumb{background:#ddd;border-bottom:1px solid white;border-left:4px solid white;-webkit-border-radius:8px;border-radius:8px;border-right:4px solid white;border-top:1px solid white;-webkit-box-shadow:none;box-shadow:none;min-height:40px}.peoplekitComponentsScrollboxScrollbar::hover::-webkit-scrollbar-thumb{background:#80868b}.peoplekitComponentsScrollboxScrollbar::-webkit-scrollbar-thumb:hover{background:#80868b}.peoplekitComponentsScrollboxScrollbar::-webkit-scrollbar-thumb:active{background:#5f6368}.peoplekitComponentsScrollboxScrollbar{border:none;outline:none;overflow:auto}.peoplekitComponentsAutocompletePopupContainer{border:0;box-shadow:0 1px 3px 0 rgba(60,64,67,.30),0 4px 8px 3px rgba(60,64,67,.15);background-color:#fff;-webkit-border-radius:4px;border-radius:4px;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-direction:column;flex-direction:column;overflow:hidden;padding-bottom:8px;padding-top:8px;position:absolute;-webkit-user-select:none;z-index:999999}sentinel{}.waffle-banding-sidebar-content{overflow-y:hidden}.waffle-banding-sidebar{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;height:calc(100% - 36px);overflow-y:auto}.waffle-banding-range-picker{border-bottom:1px solid lightgrey;padding:15px 10px}.waffle-banding-range-label{color:#3c4043;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;line-height:20px;padding-bottom:10px}.waffle-banding-header-footer-checkbox-wrapper{border-bottom:1px solid lightgrey;padding:10px 10px 0}.waffle-banding-range-picker,.waffle-banding-header-footer-checkbox-wrapper{border-bottom:0}.waffle-banding-checkbox-wrapper{align-items:flex-start;display:flex;flex-wrap:wrap}.waffle-banding-checkbox-wrapper .docs-material-gm-labeled-checkbox{max-width:none;padding:1px 20px 0 0;width:auto}.waffle-banding-checkbox-wrapper .docs-material-gm-labeled-checkbox:last-child{padding-right:0}.waffle-banding-sidebar-color-picker{padding:15px 10px}.waffle-banding-sidebar-color-picker-label{color:#3c4043;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:500;line-height:12px;padding:5px 0}.waffle-banding-color-picker-table,.waffle-banding-color-picker-focused,.waffle-banding-color-picker-hover{border:0;margin:0;outline:none;padding:0;width:0}.waffle-banding-color-picker-table{border-collapse:separate;border-spacing:4px}.waffle-banding-color-picker-cell{border-width:0}.waffle-banding-color-picker-cell:focus{outline:1px solid #5e97f6}.waffle-banding-sidebar-color-tile-wrapper{border:1px solid transparent}.waffle-banding-color-picker-cell-selected .waffle-banding-sidebar-color-tile-wrapper{border:1px solid #4d90fe}.waffle-banding-color-picker-cell-hover .waffle-banding-sidebar-color-tile{border-color:darkgrey}.waffle-banding-sidebar-color-tile{border:1px solid lightgrey;cursor:pointer;height:35px;line-height:35px;margin:1px;vertical-align:middle;width:33px}.waffle-assistant-banding-recommendation .waffle-banding-sidebar-color-tile{width:26px}.waffle-banding-sidebar-color-tile-wrapper .docs-sheet-add .docs-icon{margin-left:7px}.docs-sheet-add .docs-icon-img{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_green.svg)}.waffle-banding-sidebar-color-tile-band{border-bottom:1px solid lightgrey;height:8px;width:100%}.waffle-banding-sidebar-color-tile-band:last-child{border-bottom-width:0}.waffle-banding-sidebar-color-picker-preview{padding:5px}.waffle-banding-sidebar-color-preview{display:flex;padding:5px 0}.waffle-banding-sidebar-color-preview .goog-toolbar-menu-button{margin:0}.waffle-banding-sidebar-color-preview-label{border:1px solid lightgrey;border-radius:4px;box-sizing:border-box;display:inline-block;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;height:36px;letter-spacing:0.25px;line-height:16px;margin-right:5px;padding:9px 24px 11px 24px;text-align:center;vertical-align:middle;width:170px}.waffle-banding-sidebar-color-picker-container{border:1px solid #dadce0;border-radius:4px;margin-top:5px}.waffle-banding-sidebar-custom-color-wrapper{border-bottom:1px solid #dadce0}.waffle-banding-sidebar-color-preview-picker{background-color:#f8f8f8;border-color:#c6c6c6;display:inline-block;margin:0}.waffle-banding-sidebar-color-preview-picker.goog-flat-menu-button-active{background-color:#fff!important}.waffle-banding-sidebar-buttons{margin-bottom:0;padding:0 10px 10px 10px;text-align:right}.waffle-banding-sidebar-buttons .jfk-button{margin-left:16px;margin-right:0}.waffle-named-ranges-edit-buttons{text-align:right}.waffle-banding-sidebar-clear-container{border-top:1px solid lightgrey;bottom:0;left:0;position:absolute;text-align:center;vertical-align:bottom;width:100%}.waffle-banding-sidebar-clear .docs-icon{opacity:1;opacity:unset}.waffle-banding-sidebar-clear .docs-icon-img{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_green.svg)}.waffle-banding-sidebar-clear:hover{background-color:#eee;border-color:darkgrey;color:#424242}.waffle-banding-sidebar-clear-label{padding-left:3px}.waffle-banding-sidebar-color-wrapper{margin-bottom:3px;margin-left:1px}.waffle-banding-sidebar-clear{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:white;color:#188038;border-radius:0!important;cursor:pointer;outline:none}.waffle-banding-sidebar-clear.goog-button-hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#f8fcf9;color:#188038}.waffle-banding-sidebar-clear.goog-button-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#e7f5eb;color:#188038}.waffle-banding-sidebar-clear.goog-button-hover.goog-button-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#dff2e4;color:#188038}.waffle-banding-sidebar-clear.goog-button-active{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#dff2e4;color:#188038;box-shadow:0 2px 6px 2px rgba(60,64,67,.15)}.waffle-conditionalformat-warning{background:#fff;border-bottom:1px solid #bdbdbd;border-left:8px solid #f4b400;box-sizing:border-box;box-shadow:0 1px 4px 0 rgba(0,0,0,0.22);color:#424242;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;line-height:16px;padding:14px 14px 14px 16px;z-index:2}.waffle-conditionalformat-dismiss-warning-button-holder{height:14px;margin-top:6px;width:212px}.waffle-conditionalformat-dismiss-warning-button{color:#3367d6;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;height:14px;line-height:14px;position:absolute;right:14px}.waffle-conditionalformat-scroll-pane{overflow-x:hidden;overflow-y:auto}.jfk-button-clear-outline.waffle-conditionalformat-add-rule-button{border:1px solid #bdbdbd}.waffle-conditionalformat-add-rule-button:focus,.waffle-conditionalformat-add-rule-button:hover{cursor:pointer}.jfk-button-clear-outline.waffle-conditionalformat-add-another-rule-button{border:1px solid #eee}.waffle-conditionalformat-add-another-rule-button:focus,.waffle-conditionalformat-add-another-rule-button:hover{cursor:pointer}.waffle-filterbox-container .waffle-conditionalformat-condition-type-select .goog-flat-menu-button,.waffle-filterbox-container .waffle-conditionalformat-condition-date-select .goog-flat-menu-button,.waffle-filterbox-container .waffle-conditionalformat-arg1,.waffle-filterbox-container .waffle-conditionalformat-arg2,.waffle-filterbox-container .waffle-filterbox-input{width:252px}.waffle-conditionalformat-condition-type-select .goog-flat-menu-button,.waffle-conditionalformat-condition-date-select .goog-flat-menu-button{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#fff;border:1px solid #dadce0!important;font-weight:normal;text-align:left}.waffle-filterbox-boolean-condition-picker-body input{border:1px solid #dadce0;border-radius:4px;box-sizing:border-box;color:#3c4043;padding:1px 8px;font-size:14px;height:36px;margin:8px 0}.waffle-filterbox-boolean-condition-picker-body input:focus{border:2px solid #1a73e8;box-shadow:none;padding:0px 7px}.waffle-conditionalformat-condition-type-select .goog-flat-menu-button,.waffle-conditionalformat-condition-date-select .goog-flat-menu-button{padding-right:8px}.waffle-filterbox-boolean-condition-picker-body{margin:6px 0 8px 0}.waffle-conditionalformat-add-rule-icon{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -83px -24px;height:10px;position:absolute;right:15px;top:18px;width:10px}.waffle-conditionalformat-add-another-rule-icon{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -552px -42px;height:18px;position:absolute;right:18px;top:13px;width:18px}.waffle-conditionalformat-view-pill.waffle-conditionalformat-filter-border{border-left:4px solid #f4b400;padding-left:6px}.waffle-conditionalformat-view-pill:focus,.waffle-conditionalformat-view-pill:hover{background-color:#f3f3f3;outline:none}.waffle-conditionalformat-drag-handle{cursor:move;height:76px;line-height:76px;left:0;position:absolute;top:0;visibility:hidden;width:10px}.waffle-conditionalformat-view-pill:hover .waffle-conditionalformat-drag-handle{visibility:visible}.waffle-conditionalformat-view-pill.waffle-conditionalformat-filter-border .waffle-conditionalformat-drag-handle{left:-4px}.waffle-conditionalformat-drag-handle-icon{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -716px -17px;height:18px;left:4px;position:absolute;top:29px;width:3px}.waffle-conditionalformat-format-preview{height:54px;line-height:54px;margin-right:10px;position:absolute;text-align:center;width:44px}.waffle-conditionalformat-condition{color:#333;font-size:13px;font-weight:500;line-height:15px;max-height:30px;margin-bottom:4px;overflow:hidden;text-overflow:ellipsis;width:142px}.waffle-conditionalformat-range{color:#555;height:14px;font-size:12px;line-height:14px;overflow:hidden;text-overflow:ellipsis;width:142px}.waffle-conditionalformat-view-pill.waffle-conditionalformat-filter-border .waffle-conditionalformat-delete-button-holder{left:212px}.waffle-conditionalformat-delete-button-holder .waffle-conditionalformat-delete-rule{opacity:0.5}.waffle-conditionalformat-delete-button-holder .waffle-conditionalformat-delete-rule:hover{opacity:1}.waffle-conditionalformat-range-border{border-color:#8cc474;border-style:solid;line-height:0}.waffle-conditionalformat-range-wrapper{color:#444;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px}.waffle-conditionalformat-boolean-format-picker{padding:0 18px}.waffle-conditionalformat-edit-pill-section-label{color:#646464;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;line-height:14px;margin-bottom:6px;margin-top:18px}.waffle-conditionalformat-cancel-button,.waffle-conditionalformat-done-button{cursor:pointer}.waffle-sidebar-content .waffle-conditionalformat-format-button-inner{font-size:13px;font-weight:normal;height:30px;line-height:30px;padding-left:6px;text-align:left}.waffle-conditionalformat-default-style-button,.waffle-conditionalformat-custom-style-button{background:#fff;background-clip:padding-box;cursor:pointer;height:26px;line-height:26px;margin:3px}.waffle-conditionalformat-active-style-check{color:#000;font-weight:500}.waffle-conditionalformat-condition-date-select .jfk-select{margin-top:6px}.waffle-conditionalformat-arg1{margin:6px 6px 0 0;width:196px}.waffle-conditionalformat-arg1-short{width:162px}.waffle-conditionalformat-arg2{margin:6px 6px 0 0;width:162px}.waffle-conditionalformat-multi-arg-content{max-height:135px;overflow:auto}.waffle-filterbox-container .waffle-conditionalformat-multi-arg-content .waffle-conditionalformat-editbox{width:208px}.waffle-conditionalformat-remove{color:#999;cursor:pointer;display:inline;margin:0 0 0 8px}.waffle-conditionalformat-remove .docs-icon{height:24px;margin:0;width:24px}.waffle-filterbox-container .waffle-conditionalformat-editbox{margin:5px 0;width:225px}.waffle-conditionalformat-custom-toolbar{background-color:#fff;border:1px solid #d8d8d8;border-radius:0 0 4px 4px!important;border-top:none;box-sizing:border-box;margin:6px 0;margin-left:-1px;margin-top:0;padding:0 2px;width:100%}.waffle-conditionalformat-gradient-point-holder{margin-bottom:18px}.waffle-conditionalformat-gradient-point-holder-last{margin-bottom:0}.waffle-conditionalformat-gradient-input-holder{margin-right:6px;top:1px;width:90px}.waffle-conditionalformat-gradient-min-input,.waffle-conditionalformat-gradient-mid-input,.waffle-conditionalformat-gradient-max-input{width:66px}.waffle-conditionalformat-gradient-min-input.label-input-label-disabled,.waffle-conditionalformat-gradient-mid-input.label-input-label-disabled,.waffle-conditionalformat-gradient-max-input.label-input-label-disabled{background-color:#ebebe4}.waffle-conditionalformat-gradient-min-color:focus,.waffle-conditionalformat-gradient-mid-color:focus,.waffle-conditionalformat-gradient-max-color:focus{border-color:#4d90fe}.waffle-conditionalformat-gradient-min-color.goog-toolbar-menu-button,.waffle-conditionalformat-gradient-mid-color.goog-toolbar-menu-button,.waffle-conditionalformat-gradient-max-color.goog-toolbar-menu-button{height:27px;margin:0}.jfk-bubble.waffle-error-bubble.waffle-conditionalformat-error-bubble{z-index:1!important}.waffle-conditionalformat-no-suggestions{color:#757575;font-size:12px;font-style:italic;padding-top:12px}.waffle-conditionalformat-suggestion{-ms-flex:1;-webkit-flex:1;flex:1;background-clip:content-box;height:24px;line-height:24px;padding:1px;text-align:center}.waffle-conditionalformat-suggestion-chip{padding-top:14px}.waffle-conditionalformat-suggestion-group{display:flex;-moz-flex-wrap:wrap;-ms-flex-wrap:wrap;-webkit-flex-wrap:wrap;flex-wrap:wrap;border:1px solid #d0d0d0;padding:1px}.waffle-conditionalformat-suggestion-range{font-weight:500}.waffle-conditionalformat-collapsible-suggestions{border-bottom:1px solid #d6d6d6}.waffle-conditionalformat-suggestions-section{padding:18px}.waffle-conditionalformat-suggestion-text{color:#646464;font-size:12px;padding-top:6px}.waffle-conditionalformat-suggestions-title{color:#646464;font-weight:500}.waffle-conditionalformat-suggestions-spinner-container{padding-top:14px;text-align:center}.waffle-conditionalformat-edit-pill-section-header{color:#3c4043;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;margin-bottom:18px;margin-top:25px}.waffle-conditionalformat-range-picker{border-bottom:none;padding:0 18px 18px 18px}.waffle-conditionalformat-boolean-condition-picker,.waffle-conditionalformat-gradient-format-picker{border-top:none;padding:0 18px}.waffle-conditionalformat-slide-pane .waffle-conditionalformat-edit-pill-section-header{margin-top:10px;padding:0 18px}.waffle-conditionalformat-slide-pane .waffle-conditionalformat-edit-pill-button-bar{padding:12px 18px 18px 24px}.waffle-conditionalformat-slide-frame,.waffle-conditionalformat-slide-pane{position:absolute;width:100%}.waffle-conditionalformat-condition-type-select .jfk-select,.waffle-conditionalformat-condition-date-select .jfk-select{margin:0;width:100%}.waffle-conditionalformat-default-boolean-picker{width:100%}.waffle-conditionalformat-arg1-holder,.waffle-conditionalformat-arg2,.waffle-conditionalformat-arg1{width:100%}.waffle-conditionalformat-arg2,.waffle-conditionalformat-arg1{padding-left:8px;padding-right:8px}.waffle-conditionalformat-arg-separator{color:#424242;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;margin:0 7px}.waffle-conditionalformat-twoArgs-holder{align-items:center;display:flex;justify-content:space-evenly}.waffle-sidebar-content .waffle-conditionalformat-format-button{border-radius:4px 4px 0 0!important;font-size:14px;height:36px;left:-1px;margin:0}.waffle-conditionalformat-format-button.goog-flat-menu-button,.waffle-conditionalformat-format-button .goog-flat-menu-button-caption,.waffle-conditionalformat-format-button-inner{width:100%}.waffle-conditionalformat-default-menu .goog-palette-table{width:100%}.waffle-conditionalformat-default-menu{border-radius:4px;width:262px}.waffle-conditionalformat-custom-style-button{padding:0 6px;text-align:left;width:auto}.waffle-conditionalformat-default-style-button{height:31px;line-height:30px;margin-left:1px;margin-right:0;width:69px}.waffle-conditionalformat-default-menu .trix-palette .goog-palette-table{margin:0px}.waffle-conditionalformat-default-menu .goog-palette.trix-palette{padding:5px}.waffle-conditionalformat-default-menu .trix-palette .goog-palette-cell{padding:5px}.waffle-conditionalformat-edit-pill-button-bar{position:relative;text-align:right;padding:0 18px 24px 18px;border-bottom:1px solid #dadce0}.waffle-conditionalformat-done-button{margin-right:0px}.waffle-conditionalformat-add-another-rule-button{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:white;color:#188038;background-color:#fff;padding:16px 24px;text-align:left;width:100%}.waffle-conditionalformat-add-another-rule-plus,.waffle-conditionalformat-add-rule-plus{font-size:24px;font-weight:100;line-height:21px;margin-right:8px;vertical-align:text-bottom}.waffle-conditionalformat-default-gradient-picker{width:100%}.waffle-conditionalformat-gradient-min-color .goog-toolbar-menu-button-inner-box,.waffle-conditionalformat-gradient-mid-color .goog-toolbar-menu-button-inner-box,.waffle-conditionalformat-gradient-max-color .goog-toolbar-menu-button-inner-box{min-width:30px}.waffle-conditionalformat-gradient-min-select .jfk-select,.waffle-conditionalformat-gradient-mid-select .jfk-select,.waffle-conditionalformat-gradient-max-select .jfk-select{margin:0 6px 0 0;text-align:left;width:123px}.waffle-conditionalformat-gradient-input-holder input{width:100%}.waffle-conditionalformat-gradient-point{align-items:center;display:flex;justify-content:flex-start}.waffle-conditionalformat-gradient-point .jfk-select{height:36px;margin-top:1px;width:123px}.waffle-conditionalformat-delete-button-holder{height:56px;left:250px!important;line-height:56px;position:absolute}.waffle-conditionalformat-delete-button-holder .docs-icon{width:21px;height:21px}.waffle-conditionalformat-view-pill{background-color:#fff;border-bottom:1px solid #ccc;cursor:pointer;display:flex;height:56px;padding:10px;position:relative}.waffle-conditionalformat-view-pill-summary{left:56px;margin-bottom:auto;margin-right:8px;margin-top:auto;position:relative;width:142px}.waffle-conditionalformat-add-rule-button{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:white;color:#188038;height:44px;padding-top:17px;text-align:left;width:100%}.waffle-conditionalformat-drag-item{border:1px solid #ccc;width:280px}.waffle-conditionalformat-range-args-holder .waffle-conditionalformat-arg1-holder,.waffle-conditionalformat-range-args-holder .waffle-conditionalformat-arg2-holder,.waffle-conditionalformat-range-args-holder .waffle-conditionalformat-arg1{display:flex;-ms-flex:1;-webkit-flex:1;flex:1;overflow:hidden}.waffle-conditionalformat-range-args-holder .waffle-conditionalformat-arg2{-ms-flex:1;-webkit-flex:1;flex:1;margin-right:0;overflow:hidden}.waffle-conditionalformat-range-slider{margin-top:10px}.waffle-find-replace-active-cell-rect{-webkit-animation-name:waffle-find-replace-pulse;-moz-animation-name:waffle-find-replace-pulse;-o-animation-name:waffle-find-replace-pulse;animation-name:waffle-find-replace-pulse;-webkit-animation-duration:200ms;-moz-animation-duration:200ms;-o-animation-duration:200ms;animation-duration:200ms;-webkit-animation-timing-function:ease-in-out;-moz-animation-timing-function:ease-in-out;-o-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;background-color:rgba(140,196,116,0.5);border:1px solid white;border-radius:1px;box-shadow:0px 0px 0px 2px black,0 2px 3px 0 rgba(60,64,67,0.30),0 6px 10px 4px rgba(60,64,67,0.15);margin:-1px 0 0 -1px;pointer-events:none;position:absolute}.waffle-find-replace-not-active-cell-rect{background-color:rgba(140,196,116,0.25);pointer-events:none;position:absolute}@keyframes waffle-find-replace-pulse{from{-webkit-transform:scale(1.1,1.3);-moz-transform:scale(1.1,1.3);-ms-transform:scale(1.1,1.3);-o-transform:scale(1.1,1.3);transform:scale(1.1,1.3);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}}#waffle-gotobar-button-go{margin-right:8px}.docs-slidingdialog .docs-icon-next{filter:alpha(opacity=40);opacity:.40;-moz-opacity:.40}#waffle-gotobar-input{width:200px}.waffle-gotobar-rangematcher-row-icon{width:20px}.waffle-gotobar-rangematcher-row-suggestion{padding:5px}.waffle-gotobar-rangematcher-row-message{color:#aaa;padding:5px}#waffle-gotobar-error{color:#dd4b39;cursor:default;padding:0 7px 0 0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}#waffle-gotobar-error-icon{background:#dd4b39;-webkit-border-radius:10px;-moz-border-radius:10px;border-radius:10px;color:white;display:inline-block;font-weight:500;padding:0 5px;position:relative;text-decoration:none;top:-1px}#waffle-named-ranges-container{border:none;height:auto;overflow-y:auto}#waffle-named-ranges-add-range{background:white;border-bottom:1px solid #ddd;color:#188038;cursor:pointer;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;line-height:16px;height:auto;padding:13px 10px 13px 10px}.waffle-named-ranges-add-range-active{color:#dd4b39}.waffle-named-ranges-add-range-inactive{color:#15c}.waffle-named-ranges-add-range-icon{margin-top:-1px}.waffle-named-ranges-add-range-icon .docs-icon-img{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_green.svg)}.waffle-named-ranges-pill{border-bottom:1px solid #ddd;cursor:default;padding:10px 20px 10px 20px;position:relative}.waffle-named-ranges-pill:focus,.waffle-named-ranges-pill:hover{background-color:white;outline:none}#waffle-named-ranges-add-range,#waffle-named-ranges-add-range:focus{outline:none}#waffle-named-ranges-add-range:hover{background-color:#f8fcf9}#waffle-named-ranges-add-range:focus,.waffle-named-ranges-pill:not(.waffle-named-ranges-edit-pill):focus{background-color:#e7f5eb}#waffle-named-ranges-add-range:active{background-color:#dff2e4}.waffle-named-ranges-range-name,.waffle-named-ranges-range-rect,.waffle-named-ranges-edit-range-name{overflow:hidden;text-overflow:ellipsis}.waffle-named-ranges-pill:focus .waffle-named-ranges-edit-range-button,.waffle-named-ranges-pill:hover .waffle-named-ranges-edit-range-button{display:inline-block}.waffle-named-ranges-edit-range-button{box-shadow:none;background-color:transparent;background-image:none;cursor:pointer;border-color:transparent!important;border-radius:2px;border-width:1px;color:#15c;cursor:pointer;display:none;position:absolute;right:24px;top:13px}#waffle-named-ranges-edit-delete{box-shadow:none;background-color:white;background-image:none;cursor:pointer;border-color:transparent!important;border-radius:2px;border-width:1px;float:none;margin-left:4px;margin-right:0;top:0}#waffle-named-ranges-edit-delete .docs-icon{height:24px;margin:0;width:24px}.waffle-named-ranges-edit-range-button.jfk-button-hover,#waffle-named-ranges-edit-delete.jfk-button-hover,#waffle-named-ranges-edit-delete.jfk-button-focus{box-shadow:none;background-color:rgba(0,0,0,.06);background-image:none;cursor:pointer;border-color:transparent!important;border-radius:2px;border-width:1px}.waffle-named-ranges-edit-range-button.jfk-button-active,#waffle-named-ranges-edit-delete.jfk-button-active{box-shadow:none;background-color:rgba(0,0,0,0.12);background-image:none;cursor:pointer;border-color:transparent!important;border-radius:2px;border-width:1px}.waffle-named-ranges-range-name{font-size:14px;font-weight:500}.waffle-named-ranges-edit-pill{background-color:#fff;cursor:default}.waffle-named-ranges-edit-title-bar{padding:12px 0}.waffle-named-ranges-edit-range-name{font-size:15px;font-weight:500;margin:0;max-width:190px}.waffle-named-ranges-add-range-name-input{margin:5px 0 10px;position:relative;top:2px;width:calc(100%)}.waffle-named-ranges-add-range-name-input.waffle-named-ranges-add-range-name-input-with-delete{width:calc(100% - 32px)}.waffle-named-ranges-select-error{border-color:#dd4b39}.waffle-named-ranges-range-select-listening{background-color:transparent;background-color:unset;margin:0 -20px 0;padding:10px 20px;padding-top:0}.waffle-named-ranges-edit-range-select-done{margin-top:16px}.waffle-named-ranges-edit-range-select-message{color:#3c4043;display:none;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;font-weight:400;margin-top:3px;width:110px}.waffle-named-ranges-range-select-listening .waffle-named-ranges-edit-range-select-message{display:inline-block}.waffle-named-ranges-edit-done,.waffle-named-ranges-edit-cancel{margin-top:10px}.waffle-named-ranges-edit-buttons{text-align:right}.waffle-named-ranges-edit-buttons .jfk-button{margin-left:16px;margin-right:0}#waffle-named-ranges-edit-validation-error{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:400;margin-top:10px}#waffle-named-ranges-edit-validation-error-text{color:#dd4b39;padding:0 7px 0 0}#waffle-named-ranges-edit-validation-error-icon{background:#dd4b39;-webkit-border-radius:10px;-moz-border-radius:10px;border-radius:10px;color:white;display:inline-block;font-weight:500;padding:0 5px;position:relative;text-decoration:none;top:-1px}#waffle-named-ranges-promo{border-radius:8px;background-color:#e6f4ea;cursor:default;margin:16px;padding:16px}.waffle-named-ranges-promo-title{align-items:center;color:#188038;display:flex;font-size:14px;font-weight:500;margin-bottom:10px}.waffle-named-ranges-promo-title .docs-icon{margin:0 8px 0 0}.waffle-named-ranges-promo-title-text{font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500}.waffle-named-ranges-promo-content{color:#188038;font-size:12px;letter-spacing:.3px;margin:24px 0}.waffle-named-ranges-promo-example{align-items:center;background-color:#fff;border-radius:4px;color:#202124;display:flex;margin-top:8px;padding:8px}.waffle-named-ranges-promo-example .docs-icon{margin:0 4px 0 0}.waffle-named-ranges-promo-example .docs-icon-img:before{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_grey_dark.svg)}.waffle-named-ranges-promo-example .docs-icon-img{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_grey_dark.svg)}.waffle-named-ranges-promo-separator{background-color:#ddd;border:none;color:#ddd;height:1px;margin:20px 0 20px;width:95%}.waffle-named-ranges-promo-formulabar{border:solid #f3f3f3;border-width:10px 0 10px 0;margin:15px 0 20px}.waffle-named-ranges-promo-footer{display:flex;justify-content:flex-end}.waffle-named-ranges-promo-footer a{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#e6f4ea;color:#188038;display:inline-block}.waffle-named-ranges-promo-footer a:hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#e6f4ea;color:#188038;text-decoration:none}.waffle-named-ranges-promo-footer a:focus,.waffle-named-ranges-promo-footer a:hover:focus{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#ceead6;color:#188038}.waffle-named-ranges-promo-footer a:active,.waffle-named-ranges-promo-footer a:hover:active{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#ceead6;color:#188038;box-shadow:0 1px 3px 1px rgba(60,64,67,.15)}.waffle-named-ranges-promo-lock-container{height:27px;margin-right:12px;overflow:hidden;vertical-align:middle;width:23px}.waffle-named-ranges-promo-lock:before{content:url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png")}.waffle-named-ranges-promo-lock{background:url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png");left:-618px;opacity:.60;position:relative;top:0}.docs-icon.waffle-named-ranges-locked{height:21px;margin-bottom:3px;width:21px}.docs-icon.waffle-named-ranges-unlocked{height:21px;width:21px}#waffle-named-ranges-edit-manage-named-ranges{color:#15c;cursor:pointer;margin-top:5px;padding-bottom:5px}.waffle-named-ranges-border{border-color:#8cc474;border-style:solid;line-height:0}#waffle-ritz-protection-container{border:none;height:auto;overflow-y:auto;width:300px}.waffle-ritz-protection-link-button{background:white;color:#188038;cursor:pointer;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;line-height:16px;height:16px;padding:16px}.docs-icon.waffle-ritz-protection-add-range-icon{margin-top:-1px}.docs-icon.waffle-ritz-protection-add-range-icon .docs-icon-img{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_green.svg)}#waffle-ritz-protection-add-range{border-bottom:1px solid #ddd}.waffle-ritz-protection-link-button,.waffle-ritz-protection-link-button:focus{outline:none}.waffle-ritz-protection-link-button:hover{background-color:#f8fcf9}.waffle-ritz-protection-link-button:focus{background-color:#e7f5eb}.waffle-ritz-protection-link-button:active{background-color:#dff2e4}.waffle-ritz-protection-pill{border-bottom:1px solid #ddd;cursor:default;padding-bottom:10px;padding-top:10px;position:relative}.waffle-ritz-protection-pill-contents{color:#5f6368;font-size:14px;padding-left:16px;padding-right:16px}.waffle-ritz-protection-edit-permissions{border-top:1px solid #ddd;border-bottom:1px solid #ddd;padding-bottom:15px;padding-top:15px;margin-top:15px}.waffle-ritz-protection-edit-permissions-lock{left:-5px;width:15px}.waffle-ritz-protection-edit-buttons{display:flex;justify-content:flex-end;padding-top:8px}.waffle-ritz-protection-edit-permissions-title{font-size:14px;font-weight:500;word-wrap:break-word}.waffle-ritz-protection-edit-permissions-description{color:gray}.waffle-ritz-protection-range-rect,.waffle-ritz-protection-edit-range-name{overflow:hidden;text-overflow:ellipsis}.waffle-ritz-protection-range-rect-holder{color:#202124;font-weight:500}.waffle-ritz-protection-view-pill{cursor:pointer}.waffle-ritz-protection-view-pill:focus,.waffle-ritz-protection-view-pill:hover{background-color:#f3f3f3}.waffle-ritz-protection-range-name{font-size:14px;font-weight:500;word-wrap:break-word}.waffle-ritz-protection-edit-pill{background-color:#fff;cursor:default}.waffle-ritz-protection-edit-title-bar{padding:12px 0}.waffle-ritz-protection-edit-range-name{font-size:15px;font-weight:500;margin:0;max-width:190px}#waffle-ritz-protection-edit-delete{cursor:pointer;float:right;top:16px}#waffle-ritz-protection-edit-delete .docs-icon{height:24px;margin:0;width:24px}.waffle-ritz-protection-add-description-input{margin:5px 0 10px;position:relative;top:2px;width:100%}.waffle-ritz-protection-edit-description-input{width:236px}.waffle-ritz-protection-select-error{border-color:#dd4b39}#waffle-ritz-protection-edit-sheet-select{margin:0px;text-align:left;width:100%}#waffle-ritz-protection-edit-sheet-select .goog-flat-menu-button-caption{text-overflow:ellipsis;overflow:hidden;width:inherit}#waffle-ritz-protection-edit-sheet-label{font-weight:500;margin:0px 5px;overflow:hidden;text-overflow:ellipsis}.waffle-ritz-protection-holes-checkbox-container{margin-bottom:5px;margin-top:10px}#waffle-ritz-protection-holes-checkbox-label{color:#3c4043;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;line-height:24px;padding-left:8px;vertical-align:middle}.waffle-ritz-protection-edit-done,.waffle-ritz-protection-edit-cancel{margin-top:10px}.waffle-ritz-protection-edit-cancel{margin-right:8px}.waffle-ritz-protection-edit-done{margin-right:0}.waffle-ritz-protection-edit-toggle-range,.waffle-ritz-protection-edit-toggle-sheet{margin:10px 0px;width:85px}.waffle-ritz-protection-tab-separator{border-top:1px solid #dadce0;margin-left:-16px;padding-top:16px;width:300px}#waffle-ritz-protection-edit-validation-error{margin-top:5px}#waffle-ritz-protection-edit-validation-error-text{color:#dd4b39;padding:0 7px 0 0}#waffle-ritz-protection-edit-validation-error-icon{background:#dd4b39;-webkit-border-radius:10px;-moz-border-radius:10px;border-radius:10px;color:white;display:inline-block;font-weight:500;padding:0 5px;position:relative;text-decoration:none;top:-1px}.waffle-ritz-protection-edit-permissions-button{margin-top:10px;padding-right:15px}#waffle-ritz-protection-promo{cursor:default;padding:0 15px 0 15px}.waffle-ritz-protection-promo-content{color:#636363;margin:20px 0 20px}.waffle-ritz-protection-promo-separator{background-color:#ddd;border:none;color:#ddd;height:1px;margin:20px 0 20px;width:95%}.waffle-ritz-protection-promo-lock-container{height:27px;margin-right:12px;overflow:hidden;vertical-align:middle;width:23px}.waffle-ritz-protection-promo-lock:before{content:url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png")}.waffle-ritz-protection-promo-lock{background:url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png");left:-618px;opacity:.60;position:relative;top:0}#waffle-ritz-protection-edit-manage-ritz-protection{color:#15c;cursor:pointer;margin-top:5px;padding-bottom:5px}.waffle-ritz-protection-border{border-color:#8cc474;border-style:solid;line-height:0}.waffle-ritz-protection-acl-loading{width:400px}.waffle-ritz-protection-acl-loading-spinner,.waffle-ritz-protection-acl-loading-text{display:inline-block;position:relative;transition:left 300ms ease-out;transition:width 300ms ease-out;vertical-align:middle}.waffle-ritz-protection-type-buttons .jfk-radiobutton{display:block;margin-bottom:4px}.waffle-ritz-protection-dropdown{margin:4px 0 24px 27px}.waffle-ritz-protection-dropdown .goog-flat-menu-button-caption{font-size:12px;text-align:left;width:345px}.waffle-ritz-protection-custom-container{margin-left:27px}.waffle-ritz-protection-acl-table-container{border-collapse:collapse;border-top:1px solid #d6d6d6;font-family:arial,sans-serif;font-size:13px;margin-bottom:10px;max-height:230px;overflow:auto;width:373px}.waffle-ritz-protection-acl-header-name,.waffle-ritz-protection-acl-header-edit{color:#616161;display:inline-block;font-family:arial,sans-serif;font-size:11px;font-weight:500}.waffle-ritz-protection-acl-header{margin-bottom:10px}.waffle-ritz-protection-acl-header-edit{text-align:right}.waffle-ritz-protection-acl-scope-col,.waffle-ritz-protection-acl-header-name{width:85%}.waffle-ritz-protection-acl-edit-col,.waffle-ritz-protection-acl-header-edit{width:15%}.waffle-ritz-protection-acl-header-edit-checkbox{margin-right:10px}.waffle-ritz-protection-acl-table{empty-cells:show;width:100%}.waffle-ritz-protection-acl-table td{border-bottom:1px solid #ebebeb;font-size:13px;padding:8px 0px}.waffle-ritz-protection-acl-missing{opacity:0.5}.waffle-ritz-protection-acl-row td{text-overflow:ellipsis}.waffle-ritz-protection-acl-scope{width:313px}.waffle-ritz-protection-acl-text{display:inline-block;margin-left:15px;overflow:hidden;text-overflow:ellipsis;vertical-align:middle;width:239px;white-space:nowrap}.waffle-ritz-protection-acl-email{color:#777;margin-left:5px}.waffle-ritz-protection-acl-checkbox{display:block;margin-left:auto;margin-right:10px}.waffle-ritz-protection-acl-default-icon{display:inline-block;filter:alpha(opacity=55);height:21px;opacity:0.55;margin-left:4px;margin-top:4px;width:21px}.waffle-ritz-protection-acl-icon-container{background-color:#f5f5f5;display:inline-block;height:29px;vertical-align:middle;width:29px}.waffle-ritz-protection-acl-custom-icon{height:29px;vertical-align:middle;width:29px}.waffle-ritz-protection-acl-icon-disabled{filter:alpha(opacity=25);opacity:0.25}.waffle-ritz-protection-add-editors-container{background-color:#f5f5f5;margin-bottom:24px;padding:16px}.waffle-ritz-protection-add-editors-label{font-size:11px;font-weight:500;padding-right:15px}.waffle-ritz-protection-add-editors-input{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding-left:8px;padding-right:8px;transition:height 200ms ease-out;width:100%}.waffle-ritz-protection-ac-renderer{background:#fff;border:1px solid #666;box-shadow:2px 2px 2px rgba(102,102,102,.4);color:#333;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;max-height:120px;overflow:hidden;position:absolute;width:369px;white-space:nowrap;z-index:1010}.waffle-ritz-protection-ac-renderer .goog-contacts-ui-autocomplete-new-section{border-top:1px solid #666;padding-top:2px}.waffle-ritz-protection-ac-renderer .ac-row{cursor:pointer;padding:4px 10px 4px 4px}.waffle-ritz-protection-ac-renderer .ac-highlighted{color:#222}.waffle-ritz-protection-ac-renderer .ac-active{background:#eee}.waffle-ritz-protection-list{border-collapse:collapse;border-top:1px solid #ebebeb;font-family:arial,sans-serif;font-size:13px;margin-bottom:24px;margin-left:27px;max-height:200px;outline:transparent;overflow:auto}.waffle-ritz-protection-item{border-bottom:1px solid #ebebeb;padding:5px 0}.waffle-ritz-protection-item-hover{background:#eee}.waffle-ritz-protection-item-name{font-size:13px;font-weight:500;word-wrap:break-word}.waffle-ritz-protection-item-range{color:gray;font-size:12px;word-wrap:break-word}.waffle-ritz-protection-acl-butter{background:#f9edbe;border:1px solid #f0c36d;color:#222;font-family:arial,sans-serif;font-size:13px;margin-bottom:10px;margin-top:10px;max-width:358px;padding:5px;text-align:center;width:100%}.waffle-ritz-protection-acl-butter-text{display:inline-block}.waffle-ritz-protection-acl-butter-href{text-decoration:underline}.waffle-ritz-protection-acl-butter-action{cursor:pointer;color:#15c;display:inline-block}.waffle-flat-multi-range-select-done{margin-top:8px}.waffle-flat-range-select-listening,.waffle-flat-multi-range-select-listening{background-color:transparent;background-color:unset}.waffle-ritz-protection-pill-contents .waffle-flat-multi-range-row{margin-bottom:8px}.waffle-ritz-protection-pill-contents .waffle-flat-multi-range-add-another{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:white;border:1px solid #dadce0!important;color:#188038;height:24px;padding:3px 12px 5px;display:inline-block;margin:0}.waffle-ritz-protection-pill-contents .waffle-flat-multi-range-add-another:focus{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#e7f5eb;border:1px solid #bbe2c6!important;height:24px;padding:3px 12px 5px}.waffle-ritz-protection-pill-contents .waffle-flat-multi-range-add-another:hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#f8fcf9;border:1px solid #c8e7d1!important;height:24px;padding:3px 12px 5px}.waffle-ritz-protection-pill-contents .waffle-flat-multi-range-add-another:hover:focus{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#dff2e4;border:1px solid #b5e0c1!important;height:24px;padding:3px 12px 5px}.waffle-ritz-protection-pill-contents .waffle-flat-multi-range-add-another:active,.waffle-ritz-protection-pill-contents .waffle-flat-multi-range-add-another:hover:active{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#dff2e4;border:1px solid transparent!important;box-shadow:0 2px 6px 2px rgba(60,64,67,.15);height:24px;padding:3px 12px 5px}.goog-tab-bar.spreadsheet-settings-dialog-tab-bar .goog-tab.spreadsheet-settings-tab{color:#5f6368;cursor:pointer;font-weight:500;margin:1px 15px 0 0;padding:4px 8px;text-align:center;text-decoration:none;top:1px;width:120px}.goog-tab-bar.spreadsheet-settings-dialog-tab-bar{background:none;border-bottom-color:#e8eaed!important;margin-bottom:20px;padding-left:0!important}.goog-tab-bar.spreadsheet-settings-dialog-tab-bar .goog-tab.spreadsheet-settings-tab.goog-tab-selected,.goog-tab-bar.spreadsheet-settings-dialog-tab-bar .goog-tab.spreadsheet-settings-tab.goog-tab-hover{background:none;border-bottom:2px solid #188038;border-left:none;border-right:none;border-top:none;color:#202124}.dialog-settings .dialog-settings-input{width:210px}.dialog-settings .jfk-select{box-sizing:border-box;max-width:210px}.dialog-settings{width:670px}.dialog-settings-label{padding-bottom:4px;padding-top:4px}.dialog-settings-display-language{padding-top:4px}.dialog-settings .goog-flat-menu-button-caption{text-align:left;text-overflow:ellipsis}.modal-dialog.dialog-settings .jfk-select.goog-flat-menu-button{padding-left:14px}.grid-container {height:100%;width:100%;overflow:auto} \ No newline at end of file diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/compare/tests/compare.rs b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/compare/tests/compare.rs new file mode 100644 index 0000000..294a8d4 --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/compare/tests/compare.rs @@ -0,0 +1,136 @@ +use ahash::RandomState; +use criterion::*; +use farmhash::FarmHasher; +use fnv::FnvBuildHasher; +use fxhash::FxBuildHasher; +use std::hash::{BuildHasher, BuildHasherDefault, Hash, Hasher}; +use xxhash_rust::xxh3::Xxh3Builder; + +fn ahash(k: &K, builder: &RandomState) -> u64 { + let mut hasher = builder.build_hasher(); + k.hash(&mut hasher); + hasher.finish() +} + +fn generic_hash(key: &K, builder: &B) -> u64 { + let mut hasher = builder.build_hasher(); + key.hash(&mut hasher); + hasher.finish() +} + +fn create_string(len: usize) -> String { + let mut string = String::default(); + for pos in 1..=len { + let c = (48 + (pos % 10) as u8) as char; + string.push(c); + } + string +} + +fn compare_ahash(c: &mut Criterion) { + let builder = RandomState::new(); + let test = "compare_ahash"; + for num in &[1, 3, 7, 15, 31, 63, 127, 255, 511, 1023] { + let name = "string".to_owned() + &num.to_string(); + let string = create_string(*num); + c.bench_with_input(BenchmarkId::new(test, &name), &string, |bencher, s| { + bencher.iter(|| black_box(ahash(s, &builder))); + }); + } +} + +fn compare_other(c: &mut Criterion, test: &str, builder: B) { + for num in &[1, 3, 7, 15, 31, 63, 127, 255, 511, 1023] { + let name = "string".to_owned() + &num.to_string(); + let string = create_string(*num); + c.bench_with_input(BenchmarkId::new(test, &name), &string, |bencher, s| { + bencher.iter(|| black_box(generic_hash(&s, &builder))); + }); + } +} + +fn compare_farmhash(c: &mut Criterion) { + let int: u64 = 1234; + let string = create_string(1024); + let builder = BuildHasherDefault::::default(); + compare_other(c, "compare_farmhash", builder) +} + +fn compare_fnvhash(c: &mut Criterion) { + let int: u64 = 1234; + let string = create_string(1024); + let builder = FnvBuildHasher::default(); + compare_other(c, "compare_fnvhash", builder) +} + +fn compare_fxhash(c: &mut Criterion) { + let int: u64 = 1234; + let string = create_string(1024); + let builder = FxBuildHasher::default(); + compare_other(c, "compare_fxhash", builder) +} + +fn compare_highway(c: &mut Criterion) { + let int: u64 = 1234; + let string = create_string(1024); + let builder = highway::HighwayBuildHasher::default(); + compare_other(c, "compare_highway", builder) +} + +fn compare_metro(c: &mut Criterion) { + let int: u64 = 1234; + let string = create_string(1024); + let builder = metrohash::MetroBuildHasher::default(); + compare_other(c, "compare_metro", builder) +} + +fn compare_t1ha(c: &mut Criterion) { + let int: u64 = 1234; + let string = create_string(1024); + let builder = t1ha::T1haBuildHasher::default(); + compare_other(c, "compare_t1ha", builder) +} + +fn compare_sip13(c: &mut Criterion) { + let int: u64 = 1234; + let string = create_string(1024); + let builder = BuildHasherDefault::::default(); + compare_other(c, "compare_sip13", builder) +} + +fn compare_sip24(c: &mut Criterion) { + let int: u64 = 1234; + let string = create_string(1024); + let builder = BuildHasherDefault::::default(); + compare_other(c, "compare_sip24", builder) +} + +fn compare_wyhash(c: &mut Criterion) { + let int: u64 = 1234; + let string = create_string(1024); + let builder = BuildHasherDefault::::default(); + compare_other(c, "compare_wyhash", builder) +} + +fn compare_xxhash(c: &mut Criterion) { + let int: u64 = 1234; + let string = create_string(1024); + let builder = Xxh3Builder::default(); + compare_other(c, "compare_xxhash", builder) +} + +criterion_main!(compare); +criterion_group!( + compare, + compare_ahash, + compare_farmhash, + compare_fnvhash, + compare_fxhash, + compare_highway, + compare_metro, + compare_t1ha, + compare_sip13, + compare_sip24, + compare_wyhash, + compare_xxhash, +); diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/rustfmt.toml b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/rustfmt.toml new file mode 100644 index 0000000..7530651 --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/rustfmt.toml @@ -0,0 +1 @@ +max_width = 120 diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/smhasher/ahash-cbindings/Cargo.toml b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/smhasher/ahash-cbindings/Cargo.toml new file mode 100644 index 0000000..49513b3 --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/smhasher/ahash-cbindings/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "ahash-cbindings" +version = "0.1.2" +authors = ["Tom Kaitchuck "] +edition = "2018" +description = "C bindings for aHash so that it can be invoked by SMHasher to verify quality." + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +[lib] +name = "ahash_c" +crate-type = ["staticlib"] # Creates static lib + +[profile.release] +opt-level = 3 +debug = false +lto = 'fat' +debug-assertions = false + +[dependencies] +ahash = { path = "../../", default-features = false } \ No newline at end of file diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/smhasher/ahash-cbindings/install.sh b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/smhasher/ahash-cbindings/install.sh new file mode 100755 index 0000000..2effe93 --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/smhasher/ahash-cbindings/install.sh @@ -0,0 +1 @@ +RUSTFLAGS="-C opt-level=3 -C target-cpu=native -C codegen-units=1" cargo build --release && sudo cp target/release/libahash_c.a /usr/local/lib/ diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/smhasher/ahash-cbindings/src/lib.rs b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/smhasher/ahash-cbindings/src/lib.rs new file mode 100644 index 0000000..e2e5bdb --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/smhasher/ahash-cbindings/src/lib.rs @@ -0,0 +1,12 @@ +#![feature(build_hasher_simple_hash_one)] + +use ahash::*; +use core::slice; +use std::hash::{BuildHasher}; + +#[no_mangle] +pub extern "C" fn ahash64(buf: *const (), len: usize, seed: u64) -> u64 { + let buf: &[u8] = unsafe { slice::from_raw_parts(buf as *const u8, len) }; + let build_hasher = RandomState::with_seeds(seed, seed, seed, seed); + build_hasher.hash_one(&buf) +} diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/smhasher/ahashOutput.txt b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/smhasher/ahashOutput.txt new file mode 100644 index 0000000..5191a86 --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/smhasher/ahashOutput.txt @@ -0,0 +1,1137 @@ +------------------------------------------------------------------------------- +--- Testing ahash64 "ahash 64bit" GOOD + +[[[ Sanity Tests ]]] + +Verification value 0x74CCCAD5 ....... SKIP (self- or unseeded) +Running sanity check 1 .......... PASS +Running AppendedZeroesTest .......... PASS + +[[[ Speed Tests ]]] + +Bulk speed test - 262144-byte keys +Alignment 7 - 21.075 bytes/cycle - 60295.19 MiB/sec @ 3 ghz +Alignment 6 - 20.741 bytes/cycle - 59341.51 MiB/sec @ 3 ghz +Alignment 5 - 20.881 bytes/cycle - 59741.43 MiB/sec @ 3 ghz +Alignment 4 - 21.013 bytes/cycle - 60117.99 MiB/sec @ 3 ghz +Alignment 3 - 20.976 bytes/cycle - 60012.54 MiB/sec @ 3 ghz +Alignment 2 - 20.998 bytes/cycle - 60074.72 MiB/sec @ 3 ghz +Alignment 1 - 21.026 bytes/cycle - 60154.64 MiB/sec @ 3 ghz +Alignment 0 - 22.039 bytes/cycle - 63054.96 MiB/sec @ 3 ghz +Average - 21.094 bytes/cycle - 60349.12 MiB/sec @ 3 ghz + +Small key speed test - 1-byte keys - 18.00 cycles/hash +Small key speed test - 2-byte keys - 18.00 cycles/hash +Small key speed test - 3-byte keys - 18.00 cycles/hash +Small key speed test - 4-byte keys - 18.00 cycles/hash +Small key speed test - 5-byte keys - 18.00 cycles/hash +Small key speed test - 6-byte keys - 18.00 cycles/hash +Small key speed test - 7-byte keys - 18.00 cycles/hash +Small key speed test - 8-byte keys - 18.00 cycles/hash +Small key speed test - 9-byte keys - 18.00 cycles/hash +Small key speed test - 10-byte keys - 18.19 cycles/hash +Small key speed test - 11-byte keys - 18.00 cycles/hash +Small key speed test - 12-byte keys - 18.00 cycles/hash +Small key speed test - 13-byte keys - 19.00 cycles/hash +Small key speed test - 14-byte keys - 18.97 cycles/hash +Small key speed test - 15-byte keys - 18.73 cycles/hash +Small key speed test - 16-byte keys - 19.41 cycles/hash +Small key speed test - 17-byte keys - 20.00 cycles/hash +Small key speed test - 18-byte keys - 20.00 cycles/hash +Small key speed test - 19-byte keys - 20.00 cycles/hash +Small key speed test - 20-byte keys - 20.41 cycles/hash +Small key speed test - 21-byte keys - 20.00 cycles/hash +Small key speed test - 22-byte keys - 20.00 cycles/hash +Small key speed test - 23-byte keys - 20.00 cycles/hash +Small key speed test - 24-byte keys - 20.59 cycles/hash +Small key speed test - 25-byte keys - 20.12 cycles/hash +Small key speed test - 26-byte keys - 20.16 cycles/hash +Small key speed test - 27-byte keys - 20.00 cycles/hash +Small key speed test - 28-byte keys - 20.00 cycles/hash +Small key speed test - 29-byte keys - 20.31 cycles/hash +Small key speed test - 30-byte keys - 20.33 cycles/hash +Small key speed test - 31-byte keys - 20.15 cycles/hash +Average 19.173 cycles/hash + +[[[ 'Hashmap' Speed Tests ]]] + +std::unordered_map +Init std HashMapTest: 186.422 cycles/op (104334 inserts, 1% deletions) +Running std HashMapTest: 120.371 cycles/op (5.2 stdv) + +greg7mdp/parallel-hashmap +Init fast HashMapTest: 110.249 cycles/op (104334 inserts, 1% deletions) +Running fast HashMapTest: 86.785 cycles/op (3.2 stdv) ....... PASS + +[[[ Avalanche Tests ]]] + +Testing 24-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.634667% +Testing 32-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.600667% +Testing 40-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.627333% +Testing 48-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.656667% +Testing 56-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.599333% +Testing 64-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.690667% +Testing 72-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.812667% +Testing 80-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.678000% +Testing 96-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.670000% +Testing 112-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.728667% +Testing 128-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.717333% +Testing 160-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.681333% +Testing 512-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.922000% +Testing 1024-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.740000% + +[[[ Keyset 'Sparse' Tests ]]] + +Keyset 'Sparse' - 16-bit keys with up to 9 bits set - 50643 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 0.3, actual 0 (0.00x) +Testing collisions (high 19-25 bits) - Worst is 19 bits: 2369/2368 (1.00x) +Testing collisions (low 32-bit) - Expected 0.3, actual 1 (3.35x) (1) ! +Testing collisions (low 19-25 bits) - Worst is 25 bits: 46/38 (1.20x) +Testing distribution - Worst bias is the 13-bit window at bit 24 - 0.505% + +Keyset 'Sparse' - 24-bit keys with up to 8 bits set - 1271626 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 188.2, actual 171 (0.91x) +Testing collisions (high 24-35 bits) - Worst is 28 bits: 3050/3007 (1.01x) +Testing collisions (low 32-bit) - Expected 188.2, actual 193 (1.03x) (5) +Testing collisions (low 24-35 bits) - Worst is 30 bits: 774/752 (1.03x) +Testing distribution - Worst bias is the 17-bit window at bit 51 - 0.087% + +Keyset 'Sparse' - 32-bit keys with up to 7 bits set - 4514873 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 2372.2, actual 2423 (1.02x) (51) +Testing collisions (high 25-38 bits) - Worst is 36 bits: 162/148 (1.09x) +Testing collisions (low 32-bit) - Expected 2372.2, actual 2312 (0.97x) +Testing collisions (low 25-38 bits) - Worst is 38 bits: 42/37 (1.13x) +Testing distribution - Worst bias is the 19-bit window at bit 19 - 0.040% + +Keyset 'Sparse' - 40-bit keys with up to 6 bits set - 4598479 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 2460.8, actual 2483 (1.01x) (23) +Testing collisions (high 25-38 bits) - Worst is 38 bits: 54/38 (1.40x) +Testing collisions (low 32-bit) - Expected 2460.8, actual 2444 (0.99x) (-16) +Testing collisions (low 25-38 bits) - Worst is 38 bits: 43/38 (1.12x) +Testing distribution - Worst bias is the 19-bit window at bit 56 - 0.074% + +Keyset 'Sparse' - 48-bit keys with up to 6 bits set - 14196869 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 23437.8, actual 23188 (0.99x) (-249) +Testing collisions (high 27-42 bits) - Worst is 30 bits: 93748/93442 (1.00x) +Testing collisions (low 32-bit) - Expected 23437.8, actual 23337 (1.00x) (-100) +Testing collisions (low 27-42 bits) - Worst is 39 bits: 187/183 (1.02x) +Testing distribution - Worst bias is the 20-bit window at bit 30 - 0.021% + +Keyset 'Sparse' - 56-bit keys with up to 5 bits set - 4216423 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 2069.0, actual 2107 (1.02x) (39) +Testing collisions (high 25-38 bits) - Worst is 36 bits: 147/129 (1.14x) +Testing collisions (low 32-bit) - Expected 2069.0, actual 2111 (1.02x) (43) +Testing collisions (low 25-38 bits) - Worst is 32 bits: 2111/2068 (1.02x) +Testing distribution - Worst bias is the 18-bit window at bit 57 - 0.046% + +Keyset 'Sparse' - 64-bit keys with up to 5 bits set - 8303633 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8021.7, actual 7994 (1.00x) (-27) +Testing collisions (high 26-40 bits) - Worst is 39 bits: 70/62 (1.12x) +Testing collisions (low 32-bit) - Expected 8021.7, actual 8171 (1.02x) (150) +Testing collisions (low 26-40 bits) - Worst is 39 bits: 66/62 (1.05x) +Testing distribution - Worst bias is the 20-bit window at bit 32 - 0.044% + +Keyset 'Sparse' - 72-bit keys with up to 5 bits set - 15082603 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 26451.8, actual 26737 (1.01x) (286) +Testing collisions (high 27-42 bits) - Worst is 37 bits: 854/827 (1.03x) +Testing collisions (low 32-bit) - Expected 26451.8, actual 26464 (1.00x) (13) +Testing collisions (low 27-42 bits) - Worst is 40 bits: 123/103 (1.19x) +Testing distribution - Worst bias is the 20-bit window at bit 26 - 0.018% + +Keyset 'Sparse' - 96-bit keys with up to 4 bits set - 3469497 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 1401.0, actual 1387 (0.99x) (-13) +Testing collisions (high 25-38 bits) - Worst is 35 bits: 190/175 (1.08x) +Testing collisions (low 32-bit) - Expected 1401.0, actual 1415 (1.01x) (15) +Testing collisions (low 25-38 bits) - Worst is 38 bits: 33/21 (1.51x) +Testing distribution - Worst bias is the 19-bit window at bit 22 - 0.072% + +Keyset 'Sparse' - 160-bit keys with up to 4 bits set - 26977161 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 84546.1, actual 84950 (1.00x) (404) +Testing collisions (high 28-44 bits) - Worst is 44 bits: 28/20 (1.35x) +Testing collisions (low 32-bit) - Expected 84546.1, actual 84446 (1.00x) (-100) +Testing collisions (low 28-44 bits) - Worst is 41 bits: 174/165 (1.05x) +Testing distribution - Worst bias is the 20-bit window at bit 40 - 0.011% + +Keyset 'Sparse' - 256-bit keys with up to 3 bits set - 2796417 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 910.2, actual 973 (1.07x) (63) +Testing collisions (high 25-37 bits) - Worst is 35 bits: 130/113 (1.14x) +Testing collisions (low 32-bit) - Expected 910.2, actual 962 (1.06x) (52) +Testing collisions (low 25-37 bits) - Worst is 36 bits: 68/56 (1.20x) +Testing distribution - Worst bias is the 19-bit window at bit 27 - 0.108% + +Keyset 'Sparse' - 512-bit keys with up to 3 bits set - 22370049 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 58155.4, actual 58209 (1.00x) (54) +Testing collisions (high 28-43 bits) - Worst is 33 bits: 29243/29102 (1.00x) +Testing collisions (low 32-bit) - Expected 58155.4, actual 58026 (1.00x) (-129) +Testing collisions (low 28-43 bits) - Worst is 43 bits: 33/28 (1.16x) +Testing distribution - Worst bias is the 20-bit window at bit 54 - 0.011% + +Keyset 'Sparse' - 1024-bit keys with up to 2 bits set - 524801 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 32.1, actual 31 (0.97x) +Testing collisions (high 22-32 bits) - Worst is 28 bits: 569/512 (1.11x) +Testing collisions (low 32-bit) - Expected 32.1, actual 24 (0.75x) +Testing collisions (low 22-32 bits) - Worst is 29 bits: 285/256 (1.11x) +Testing distribution - Worst bias is the 16-bit window at bit 32 - 0.224% + +Keyset 'Sparse' - 2048-bit keys with up to 2 bits set - 2098177 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.4, actual 506 (0.99x) (-6) +Testing collisions (high 24-36 bits) - Worst is 34 bits: 144/128 (1.12x) +Testing collisions (low 32-bit) - Expected 512.4, actual 510 (1.00x) (-2) +Testing collisions (low 24-36 bits) - Worst is 28 bits: 8200/8178 (1.00x) +Testing distribution - Worst bias is the 18-bit window at bit 49 - 0.101% + + +[[[ Keyset 'Permutation' Tests ]]] + +Combination Lowbits Tests: +Keyset 'Combination' - up to 7 blocks from a set of 8 - 2396744 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 668.6, actual 661 (0.99x) (-7) +Testing collisions (high 24-37 bits) - Worst is 28 bits: 10767/10667 (1.01x) +Testing collisions (low 32-bit) - Expected 668.6, actual 756 (1.13x) (88) +Testing collisions (low 24-37 bits) - Worst is 35 bits: 99/83 (1.18x) +Testing distribution - Worst bias is the 18-bit window at bit 41 - 0.081% + + +Combination Highbits Tests +Keyset 'Combination' - up to 7 blocks from a set of 8 - 2396744 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 668.6, actual 672 (1.01x) (4) +Testing collisions (high 24-37 bits) - Worst is 31 bits: 1379/1336 (1.03x) +Testing collisions (low 32-bit) - Expected 668.6, actual 680 (1.02x) (12) +Testing collisions (low 24-37 bits) - Worst is 31 bits: 1387/1336 (1.04x) +Testing distribution - Worst bias is the 18-bit window at bit 26 - 0.054% + + +Combination Hi-Lo Tests: +Keyset 'Combination' - up to 6 blocks from a set of 15 - 12204240 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 17322.9, actual 17435 (1.01x) (113) +Testing collisions (high 27-41 bits) - Worst is 41 bits: 39/33 (1.15x) +Testing collisions (low 32-bit) - Expected 17322.9, actual 17089 (0.99x) (-233) +Testing collisions (low 27-41 bits) - Worst is 40 bits: 79/67 (1.17x) +Testing distribution - Worst bias is the 20-bit window at bit 15 - 0.026% + + +Combination 0x8000000 Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8186.7, actual 8218 (1.00x) (32) +Testing collisions (high 26-40 bits) - Worst is 40 bits: 40/31 (1.25x) +Testing collisions (low 32-bit) - Expected 8186.7, actual 8210 (1.00x) (24) +Testing collisions (low 26-40 bits) - Worst is 32 bits: 8210/8186 (1.00x) +Testing distribution - Worst bias is the 20-bit window at bit 16 - 0.047% + + +Combination 0x0000001 Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8186.7, actual 8118 (0.99x) (-68) +Testing collisions (high 26-40 bits) - Worst is 26 bits: 503735/503108 (1.00x) +Testing collisions (low 32-bit) - Expected 8186.7, actual 8308 (1.01x) (122) +Testing collisions (low 26-40 bits) - Worst is 37 bits: 272/255 (1.06x) +Testing distribution - Worst bias is the 20-bit window at bit 59 - 0.056% + + +Combination 0x800000000000000 Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8186.7, actual 8204 (1.00x) (18) +Testing collisions (high 26-40 bits) - Worst is 39 bits: 70/63 (1.09x) +Testing collisions (low 32-bit) - Expected 8186.7, actual 8149 (1.00x) (-37) +Testing collisions (low 26-40 bits) - Worst is 30 bits: 32824/32682 (1.00x) +Testing distribution - Worst bias is the 20-bit window at bit 61 - 0.039% + + +Combination 0x000000000000001 Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8186.7, actual 8288 (1.01x) (102) +Testing collisions (high 26-40 bits) - Worst is 31 bits: 16594/16362 (1.01x) +Testing collisions (low 32-bit) - Expected 8186.7, actual 8159 (1.00x) (-27) +Testing collisions (low 26-40 bits) - Worst is 34 bits: 2078/2047 (1.01x) +Testing distribution - Worst bias is the 20-bit window at bit 33 - 0.030% + + +Combination 16-bytes [0-1] Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8186.7, actual 8107 (0.99x) (-79) +Testing collisions (high 26-40 bits) - Worst is 38 bits: 134/127 (1.05x) +Testing collisions (low 32-bit) - Expected 8186.7, actual 8153 (1.00x) (-33) +Testing collisions (low 26-40 bits) - Worst is 39 bits: 70/63 (1.09x) +Testing distribution - Worst bias is the 20-bit window at bit 10 - 0.046% + + +Combination 16-bytes [0-last] Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8186.7, actual 8163 (1.00x) (-23) +Testing collisions (high 26-40 bits) - Worst is 38 bits: 144/127 (1.13x) +Testing collisions (low 32-bit) - Expected 8186.7, actual 8116 (0.99x) (-70) +Testing collisions (low 26-40 bits) - Worst is 26 bits: 504097/503108 (1.00x) +Testing distribution - Worst bias is the 20-bit window at bit 16 - 0.042% + + +Combination 32-bytes [0-1] Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8186.7, actual 8390 (1.02x) (204) +Testing collisions (high 26-40 bits) - Worst is 40 bits: 34/31 (1.06x) +Testing collisions (low 32-bit) - Expected 8186.7, actual 8106 (0.99x) (-80) +Testing collisions (low 26-40 bits) - Worst is 26 bits: 502218/503108 (1.00x) +Testing distribution - Worst bias is the 20-bit window at bit 6 - 0.037% + + +Combination 32-bytes [0-last] Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8186.7, actual 8387 (1.02x) (201) +Testing collisions (high 26-40 bits) - Worst is 38 bits: 144/127 (1.13x) +Testing collisions (low 32-bit) - Expected 8186.7, actual 7860 (0.96x) +Testing collisions (low 26-40 bits) - Worst is 26 bits: 503416/503108 (1.00x) +Testing distribution - Worst bias is the 20-bit window at bit 22 - 0.030% + + +Combination 64-bytes [0-1] Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8186.7, actual 8126 (0.99x) (-60) +Testing collisions (high 26-40 bits) - Worst is 38 bits: 148/127 (1.16x) +Testing collisions (low 32-bit) - Expected 8186.7, actual 8171 (1.00x) (-15) +Testing collisions (low 26-40 bits) - Worst is 36 bits: 523/511 (1.02x) +Testing distribution - Worst bias is the 20-bit window at bit 40 - 0.042% + + +Combination 64-bytes [0-last] Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8186.7, actual 8289 (1.01x) (103) +Testing collisions (high 26-40 bits) - Worst is 36 bits: 546/511 (1.07x) +Testing collisions (low 32-bit) - Expected 8186.7, actual 8002 (0.98x) +Testing collisions (low 26-40 bits) - Worst is 39 bits: 66/63 (1.03x) +Testing distribution - Worst bias is the 20-bit window at bit 7 - 0.039% + + +Combination 128-bytes [0-1] Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8186.7, actual 8099 (0.99x) (-87) +Testing collisions (high 26-40 bits) - Worst is 40 bits: 38/31 (1.19x) +Testing collisions (low 32-bit) - Expected 8186.7, actual 8269 (1.01x) (83) +Testing collisions (low 26-40 bits) - Worst is 40 bits: 40/31 (1.25x) +Testing distribution - Worst bias is the 20-bit window at bit 10 - 0.029% + + +Combination 128-bytes [0-last] Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8186.7, actual 8279 (1.01x) (93) +Testing collisions (high 26-40 bits) - Worst is 40 bits: 39/31 (1.22x) +Testing collisions (low 32-bit) - Expected 8186.7, actual 8252 (1.01x) (66) +Testing collisions (low 26-40 bits) - Worst is 39 bits: 75/63 (1.17x) +Testing distribution - Worst bias is the 20-bit window at bit 9 - 0.029% + + +[[[ Keyset 'Window' Tests ]]] + +Keyset 'Window' - 32-bit key, 25-bit window - 32 tests, 33554432 keys per test +Window at 0 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 1 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 2 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 3 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 4 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 5 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 6 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 7 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 8 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 9 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 10 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 11 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 12 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 13 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 14 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 15 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 16 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 17 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 18 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 19 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 20 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 21 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 22 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 23 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 24 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 25 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 26 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 27 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 28 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 29 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 30 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 31 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 32 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) + +[[[ Keyset 'Cyclic' Tests ]]] + +Keyset 'Cyclic' - 8 cycles of 8 bytes - 1000000 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 116.4, actual 103 (0.88x) +Testing collisions (high 23-34 bits) - Worst is 30 bits: 495/465 (1.06x) +Testing collisions (low 32-bit) - Expected 116.4, actual 109 (0.94x) +Testing collisions (low 23-34 bits) - Worst is 30 bits: 468/465 (1.01x) +Testing distribution - Worst bias is the 17-bit window at bit 37 - 0.111% + +Keyset 'Cyclic' - 8 cycles of 9 bytes - 1000000 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 116.4, actual 106 (0.91x) +Testing collisions (high 23-34 bits) - Worst is 33 bits: 62/58 (1.07x) +Testing collisions (low 32-bit) - Expected 116.4, actual 120 (1.03x) (4) +Testing collisions (low 23-34 bits) - Worst is 34 bits: 46/29 (1.58x) +Testing distribution - Worst bias is the 17-bit window at bit 48 - 0.132% + +Keyset 'Cyclic' - 8 cycles of 10 bytes - 1000000 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 116.4, actual 116 (1.00x) +Testing collisions (high 23-34 bits) - Worst is 33 bits: 63/58 (1.08x) +Testing collisions (low 32-bit) - Expected 116.4, actual 116 (1.00x) +Testing collisions (low 23-34 bits) - Worst is 33 bits: 68/58 (1.17x) +Testing distribution - Worst bias is the 17-bit window at bit 60 - 0.103% + +Keyset 'Cyclic' - 8 cycles of 11 bytes - 1000000 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 116.4, actual 129 (1.11x) (13) +Testing collisions (high 23-34 bits) - Worst is 33 bits: 69/58 (1.19x) +Testing collisions (low 32-bit) - Expected 116.4, actual 120 (1.03x) (4) +Testing collisions (low 23-34 bits) - Worst is 32 bits: 120/116 (1.03x) +Testing distribution - Worst bias is the 17-bit window at bit 27 - 0.109% + +Keyset 'Cyclic' - 8 cycles of 12 bytes - 1000000 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 116.4, actual 95 (0.82x) +Testing collisions (high 23-34 bits) - Worst is 23 bits: 56886/57305 (0.99x) +Testing collisions (low 32-bit) - Expected 116.4, actual 120 (1.03x) (4) +Testing collisions (low 23-34 bits) - Worst is 34 bits: 34/29 (1.17x) +Testing distribution - Worst bias is the 17-bit window at bit 46 - 0.134% + +Keyset 'Cyclic' - 8 cycles of 16 bytes - 1000000 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 116.4, actual 126 (1.08x) (10) +Testing collisions (high 23-34 bits) - Worst is 33 bits: 79/58 (1.36x) +Testing collisions (low 32-bit) - Expected 116.4, actual 98 (0.84x) +Testing collisions (low 23-34 bits) - Worst is 23 bits: 57131/57305 (1.00x) +Testing distribution - Worst bias is the 17-bit window at bit 31 - 0.147% + + +[[[ Keyset 'TwoBytes' Tests ]]] + +Keyset 'TwoBytes' - up-to-4-byte keys, 652545 total keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 49.6, actual 42 (0.85x) +Testing collisions (high 23-33 bits) - Worst is 24 bits: 12603/12527 (1.01x) +Testing collisions (low 32-bit) - Expected 49.6, actual 44 (0.89x) +Testing collisions (low 23-33 bits) - Worst is 27 bits: 1606/1583 (1.01x) +Testing distribution - Worst bias is the 16-bit window at bit 36 - 0.093% + +Keyset 'TwoBytes' - up-to-8-byte keys, 5471025 total keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 3483.1, actual 3401 (0.98x) +Testing collisions (high 26-39 bits) - Worst is 37 bits: 111/108 (1.02x) +Testing collisions (low 32-bit) - Expected 3483.1, actual 3448 (0.99x) (-35) +Testing collisions (low 26-39 bits) - Worst is 37 bits: 121/108 (1.11x) +Testing distribution - Worst bias is the 20-bit window at bit 57 - 0.040% + +Keyset 'TwoBytes' - up-to-12-byte keys, 18616785 total keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 40289.5, actual 39941 (0.99x) (-348) +Testing collisions (high 27-42 bits) - Worst is 27 bits: 1233062/1233446 (1.00x) +Testing collisions (low 32-bit) - Expected 40289.5, actual 40360 (1.00x) (71) +Testing collisions (low 27-42 bits) - Worst is 37 bits: 1310/1260 (1.04x) +Testing distribution - Worst bias is the 20-bit window at bit 62 - 0.019% + +Keyset 'TwoBytes' - up-to-16-byte keys, 44251425 total keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 227182.3, actual 227244 (1.00x) (62) +Testing collisions (high 29-45 bits) - Worst is 44 bits: 60/55 (1.08x) +Testing collisions (low 32-bit) - Expected 227182.3, actual 227447 (1.00x) (265) +Testing collisions (low 29-45 bits) - Worst is 37 bits: 7356/7123 (1.03x) +Testing distribution - Worst bias is the 19-bit window at bit 1 - 0.004% + +Keyset 'TwoBytes' - up-to-20-byte keys, 86536545 total keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 865959.1, actual 866640 (1.00x) (681) +Testing collisions (high 30-47 bits) - Worst is 44 bits: 230/212 (1.08x) +Testing collisions (low 32-bit) - Expected 865959.1, actual 866255 (1.00x) (296) +Testing collisions (low 30-47 bits) - Worst is 38 bits: 13774/13620 (1.01x) +Testing distribution - Worst bias is the 20-bit window at bit 50 - 0.005% + + +[[[ Keyset 'Text' Tests ]]] + +Keyset 'Text' - keys of form "FooXXXXBar" - 14776336 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 25389.0, actual 25650 (1.01x) (261) +Testing collisions (high 27-42 bits) - Worst is 39 bits: 208/198 (1.05x) +Testing collisions (low 32-bit) - Expected 25389.0, actual 25416 (1.00x) (27) +Testing collisions (low 27-42 bits) - Worst is 36 bits: 1653/1588 (1.04x) +Testing distribution - Worst bias is the 20-bit window at bit 7 - 0.019% + +Keyset 'Text' - keys of form "FooBarXXXX" - 14776336 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 25389.0, actual 25488 (1.00x) (99) +Testing collisions (high 27-42 bits) - Worst is 40 bits: 106/99 (1.07x) +Testing collisions (low 32-bit) - Expected 25389.0, actual 25444 (1.00x) (55) +Testing collisions (low 27-42 bits) - Worst is 42 bits: 27/24 (1.09x) +Testing distribution - Worst bias is the 19-bit window at bit 58 - 0.011% + +Keyset 'Text' - keys of form "XXXXFooBar" - 14776336 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 25389.0, actual 25061 (0.99x) (-328) +Testing collisions (high 27-42 bits) - Worst is 41 bits: 58/49 (1.17x) +Testing collisions (low 32-bit) - Expected 25389.0, actual 25212 (0.99x) (-177) +Testing collisions (low 27-42 bits) - Worst is 37 bits: 799/794 (1.01x) +Testing distribution - Worst bias is the 20-bit window at bit 6 - 0.024% + +Keyset 'Words' - 4000000 random keys of len 6-16 from alnum charset +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 1862.1, actual 1864 (1.00x) (2) +Testing collisions (high 25-38 bits) - Worst is 38 bits: 41/29 (1.41x) +Testing collisions (low 32-bit) - Expected 1862.1, actual 1930 (1.04x) (68) +Testing collisions (low 25-38 bits) - Worst is 35 bits: 251/232 (1.08x) +Testing distribution - Worst bias is the 19-bit window at bit 51 - 0.057% + +Keyset 'Words' - 4000000 random keys of len 6-16 from password charset +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 1862.1, actual 1875 (1.01x) (13) +Testing collisions (high 25-38 bits) - Worst is 33 bits: 954/931 (1.02x) +Testing collisions (low 32-bit) - Expected 1862.1, actual 1891 (1.02x) (29) +Testing collisions (low 25-38 bits) - Worst is 38 bits: 31/29 (1.07x) +Testing distribution - Worst bias is the 19-bit window at bit 36 - 0.055% + +Keyset 'Words' - 104334 dict words +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 1.3, actual 0 (0.00x) +Testing collisions (high 20-28 bits) - Worst is 21 bits: 2566/2552 (1.01x) +Testing collisions (low 32-bit) - Expected 1.3, actual 1 (0.79x) +Testing collisions (low 20-28 bits) - Worst is 22 bits: 1301/1286 (1.01x) +Testing distribution - Worst bias is the 14-bit window at bit 35 - 0.260% + + +[[[ Keyset 'Zeroes' Tests ]]] + +Keyset 'Zeroes' - 204800 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 4.9, actual 8 (1.64x) (4) +Testing collisions (high 21-29 bits) - Worst is 27 bits: 161/156 (1.03x) +Testing collisions (low 32-bit) - Expected 4.9, actual 4 (0.82x) +Testing collisions (low 21-29 bits) - Worst is 26 bits: 317/312 (1.02x) +Testing distribution - Worst bias is the 15-bit window at bit 51 - 0.517% + + +[[[ Keyset 'Seed' Tests ]]] + +Keyset 'Seed' - 5000000 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 2909.3, actual 2977 (1.02x) (68) +Testing collisions (high 26-39 bits) - Worst is 38 bits: 52/45 (1.14x) +Testing collisions (low 32-bit) - Expected 2909.3, actual 2918 (1.00x) (9) +Testing collisions (low 26-39 bits) - Worst is 37 bits: 100/90 (1.10x) +Testing distribution - Worst bias is the 19-bit window at bit 54 - 0.037% + + +[[[ Keyset 'PerlinNoise' Tests ]]] + +Testing 16777216 coordinates (L2) : +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 32725.4, actual 32878 (1.00x) (153) +Testing collisions (high 27-42 bits) - Worst is 34 bits: 8352/8189 (1.02x) +Testing collisions (low 32-bit) - Expected 32725.4, actual 32870 (1.00x) (145) +Testing collisions (low 27-42 bits) - Worst is 34 bits: 8327/8189 (1.02x) + +Testing AV variant, 128 count with 4 spacing, 4-12: +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 1116.2, actual 1100 (0.99x) (-16) +Testing collisions (high 25-37 bits) - Worst is 37 bits: 36/34 (1.03x) +Testing collisions (low 32-bit) - Expected 1116.2, actual 1150 (1.03x) (34) +Testing collisions (low 25-37 bits) - Worst is 33 bits: 584/558 (1.05x) + + +[[[ Diff 'Differential' Tests ]]] + +Testing 8303632 up-to-5-bit differentials in 64-bit keys -> 64 bit hashes. +1000 reps, 8303632000 total tests, expecting 0.00 random collisions.......... +0 total collisions, of which 0 single collisions were ignored + +Testing 11017632 up-to-4-bit differentials in 128-bit keys -> 64 bit hashes. +1000 reps, 11017632000 total tests, expecting 0.00 random collisions.......... +0 total collisions, of which 0 single collisions were ignored + +Testing 2796416 up-to-3-bit differentials in 256-bit keys -> 64 bit hashes. +1000 reps, 2796416000 total tests, expecting 0.00 random collisions.......... +0 total collisions, of which 0 single collisions were ignored + + +[[[ DiffDist 'Differential Distribution' Tests ]]] + +Testing bit 0 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 525 (1.03x) (14) +Testing collisions (high 24-36 bits) - Worst is 33 bits: 289/255 (1.13x) +Testing collisions (low 32-bit) - Expected 511.9, actual 555 (1.08x) (44) +Testing collisions (low 24-36 bits) - Worst is 34 bits: 141/127 (1.10x) +Testing distribution - Worst bias is the 18-bit window at bit 45 - 0.075% + +Testing bit 1 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 514 (1.00x) (3) +Testing collisions (high 24-36 bits) - Worst is 31 bits: 1045/1023 (1.02x) +Testing collisions (low 32-bit) - Expected 511.9, actual 543 (1.06x) (32) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 41/31 (1.28x) +Testing distribution - Worst bias is the 18-bit window at bit 33 - 0.083% + +Testing bit 2 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 493 (0.96x) +Testing collisions (high 24-36 bits) - Worst is 26 bits: 32575/32429 (1.00x) +Testing collisions (low 32-bit) - Expected 511.9, actual 519 (1.01x) (8) +Testing collisions (low 24-36 bits) - Worst is 34 bits: 134/127 (1.05x) +Testing distribution - Worst bias is the 18-bit window at bit 43 - 0.101% + +Testing bit 3 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 511 (1.00x) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 78/63 (1.22x) +Testing collisions (low 32-bit) - Expected 511.9, actual 521 (1.02x) (10) +Testing collisions (low 24-36 bits) - Worst is 35 bits: 77/63 (1.20x) +Testing distribution - Worst bias is the 18-bit window at bit 31 - 0.067% + +Testing bit 4 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 483 (0.94x) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 36/31 (1.13x) +Testing collisions (low 32-bit) - Expected 511.9, actual 492 (0.96x) +Testing collisions (low 24-36 bits) - Worst is 25 bits: 64466/64191 (1.00x) +Testing distribution - Worst bias is the 17-bit window at bit 36 - 0.052% + +Testing bit 5 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 519 (1.01x) (8) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 39/31 (1.22x) +Testing collisions (low 32-bit) - Expected 511.9, actual 542 (1.06x) (31) +Testing collisions (low 24-36 bits) - Worst is 35 bits: 77/63 (1.20x) +Testing distribution - Worst bias is the 18-bit window at bit 38 - 0.055% + +Testing bit 6 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 549 (1.07x) (38) +Testing collisions (high 24-36 bits) - Worst is 31 bits: 1115/1023 (1.09x) +Testing collisions (low 32-bit) - Expected 511.9, actual 547 (1.07x) (36) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 40/31 (1.25x) +Testing distribution - Worst bias is the 18-bit window at bit 4 - 0.116% + +Testing bit 7 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 515 (1.01x) (4) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 33/31 (1.03x) +Testing collisions (low 32-bit) - Expected 511.9, actual 483 (0.94x) +Testing collisions (low 24-36 bits) - Worst is 24 bits: 125823/125777 (1.00x) +Testing distribution - Worst bias is the 18-bit window at bit 62 - 0.067% + +Testing bit 8 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 514 (1.00x) (3) +Testing collisions (high 24-36 bits) - Worst is 31 bits: 1051/1023 (1.03x) +Testing collisions (low 32-bit) - Expected 511.9, actual 511 (1.00x) +Testing collisions (low 24-36 bits) - Worst is 35 bits: 67/63 (1.05x) +Testing distribution - Worst bias is the 18-bit window at bit 36 - 0.091% + +Testing bit 9 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 524 (1.02x) (13) +Testing collisions (high 24-36 bits) - Worst is 33 bits: 264/255 (1.03x) +Testing collisions (low 32-bit) - Expected 511.9, actual 514 (1.00x) (3) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 45/31 (1.41x) +Testing distribution - Worst bias is the 18-bit window at bit 42 - 0.069% + +Testing bit 10 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 502 (0.98x) (-9) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 75/63 (1.17x) +Testing collisions (low 32-bit) - Expected 511.9, actual 503 (0.98x) (-8) +Testing collisions (low 24-36 bits) - Worst is 30 bits: 2102/2046 (1.03x) +Testing distribution - Worst bias is the 17-bit window at bit 43 - 0.085% + +Testing bit 11 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 480 (0.94x) +Testing collisions (high 24-36 bits) - Worst is 30 bits: 2073/2046 (1.01x) +Testing collisions (low 32-bit) - Expected 511.9, actual 527 (1.03x) (16) +Testing collisions (low 24-36 bits) - Worst is 32 bits: 527/511 (1.03x) +Testing distribution - Worst bias is the 18-bit window at bit 60 - 0.112% + +Testing bit 12 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 513 (1.00x) (2) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 71/63 (1.11x) +Testing collisions (low 32-bit) - Expected 511.9, actual 524 (1.02x) (13) +Testing collisions (low 24-36 bits) - Worst is 33 bits: 265/255 (1.04x) +Testing distribution - Worst bias is the 18-bit window at bit 35 - 0.068% + +Testing bit 13 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 559 (1.09x) (48) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 73/63 (1.14x) +Testing collisions (low 32-bit) - Expected 511.9, actual 555 (1.08x) (44) +Testing collisions (low 24-36 bits) - Worst is 34 bits: 150/127 (1.17x) +Testing distribution - Worst bias is the 18-bit window at bit 26 - 0.103% + +Testing bit 14 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 512 (1.00x) (1) +Testing collisions (high 24-36 bits) - Worst is 34 bits: 134/127 (1.05x) +Testing collisions (low 32-bit) - Expected 511.9, actual 506 (0.99x) (-5) +Testing collisions (low 24-36 bits) - Worst is 35 bits: 69/63 (1.08x) +Testing distribution - Worst bias is the 18-bit window at bit 28 - 0.064% + +Testing bit 15 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 526 (1.03x) (15) +Testing collisions (high 24-36 bits) - Worst is 32 bits: 526/511 (1.03x) +Testing collisions (low 32-bit) - Expected 511.9, actual 532 (1.04x) (21) +Testing collisions (low 24-36 bits) - Worst is 31 bits: 1067/1023 (1.04x) +Testing distribution - Worst bias is the 18-bit window at bit 18 - 0.076% + +Testing bit 16 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 542 (1.06x) (31) +Testing collisions (high 24-36 bits) - Worst is 33 bits: 291/255 (1.14x) +Testing collisions (low 32-bit) - Expected 511.9, actual 481 (0.94x) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 36/31 (1.13x) +Testing distribution - Worst bias is the 18-bit window at bit 49 - 0.077% + +Testing bit 17 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 527 (1.03x) (16) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 37/31 (1.16x) +Testing collisions (low 32-bit) - Expected 511.9, actual 546 (1.07x) (35) +Testing collisions (low 24-36 bits) - Worst is 35 bits: 75/63 (1.17x) +Testing distribution - Worst bias is the 18-bit window at bit 56 - 0.079% + +Testing bit 18 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 502 (0.98x) (-9) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 35/31 (1.09x) +Testing collisions (low 32-bit) - Expected 511.9, actual 498 (0.97x) +Testing collisions (low 24-36 bits) - Worst is 34 bits: 130/127 (1.02x) +Testing distribution - Worst bias is the 18-bit window at bit 16 - 0.066% + +Testing bit 19 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 522 (1.02x) (11) +Testing collisions (high 24-36 bits) - Worst is 33 bits: 264/255 (1.03x) +Testing collisions (low 32-bit) - Expected 511.9, actual 559 (1.09x) (48) +Testing collisions (low 24-36 bits) - Worst is 33 bits: 281/255 (1.10x) +Testing distribution - Worst bias is the 18-bit window at bit 20 - 0.089% + +Testing bit 20 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 547 (1.07x) (36) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 71/63 (1.11x) +Testing collisions (low 32-bit) - Expected 511.9, actual 524 (1.02x) (13) +Testing collisions (low 24-36 bits) - Worst is 34 bits: 139/127 (1.09x) +Testing distribution - Worst bias is the 18-bit window at bit 27 - 0.064% + +Testing bit 21 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 487 (0.95x) +Testing collisions (high 24-36 bits) - Worst is 34 bits: 135/127 (1.05x) +Testing collisions (low 32-bit) - Expected 511.9, actual 510 (1.00x) (-1) +Testing collisions (low 24-36 bits) - Worst is 35 bits: 69/63 (1.08x) +Testing distribution - Worst bias is the 18-bit window at bit 34 - 0.091% + +Testing bit 22 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 517 (1.01x) (6) +Testing collisions (high 24-36 bits) - Worst is 33 bits: 269/255 (1.05x) +Testing collisions (low 32-bit) - Expected 511.9, actual 490 (0.96x) +Testing collisions (low 24-36 bits) - Worst is 29 bits: 4116/4090 (1.01x) +Testing distribution - Worst bias is the 18-bit window at bit 55 - 0.120% + +Testing bit 23 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 480 (0.94x) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 33/31 (1.03x) +Testing collisions (low 32-bit) - Expected 511.9, actual 508 (0.99x) (-3) +Testing collisions (low 24-36 bits) - Worst is 30 bits: 2076/2046 (1.01x) +Testing distribution - Worst bias is the 18-bit window at bit 5 - 0.060% + +Testing bit 24 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 493 (0.96x) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 39/31 (1.22x) +Testing collisions (low 32-bit) - Expected 511.9, actual 492 (0.96x) +Testing collisions (low 24-36 bits) - Worst is 30 bits: 2079/2046 (1.02x) +Testing distribution - Worst bias is the 18-bit window at bit 54 - 0.078% + +Testing bit 25 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 511 (1.00x) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 65/63 (1.02x) +Testing collisions (low 32-bit) - Expected 511.9, actual 493 (0.96x) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 33/31 (1.03x) +Testing distribution - Worst bias is the 18-bit window at bit 7 - 0.093% + +Testing bit 26 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 533 (1.04x) (22) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 71/63 (1.11x) +Testing collisions (low 32-bit) - Expected 511.9, actual 514 (1.00x) (3) +Testing collisions (low 24-36 bits) - Worst is 30 bits: 2088/2046 (1.02x) +Testing distribution - Worst bias is the 18-bit window at bit 33 - 0.084% + +Testing bit 27 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 456 (0.89x) +Testing collisions (high 24-36 bits) - Worst is 29 bits: 4111/4090 (1.00x) +Testing collisions (low 32-bit) - Expected 511.9, actual 519 (1.01x) (8) +Testing collisions (low 24-36 bits) - Worst is 31 bits: 1054/1023 (1.03x) +Testing distribution - Worst bias is the 18-bit window at bit 24 - 0.074% + +Testing bit 28 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 528 (1.03x) (17) +Testing collisions (high 24-36 bits) - Worst is 33 bits: 274/255 (1.07x) +Testing collisions (low 32-bit) - Expected 511.9, actual 490 (0.96x) +Testing collisions (low 24-36 bits) - Worst is 35 bits: 80/63 (1.25x) +Testing distribution - Worst bias is the 18-bit window at bit 40 - 0.097% + +Testing bit 29 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 491 (0.96x) +Testing collisions (high 24-36 bits) - Worst is 27 bits: 16375/16298 (1.00x) +Testing collisions (low 32-bit) - Expected 511.9, actual 505 (0.99x) (-6) +Testing collisions (low 24-36 bits) - Worst is 24 bits: 125841/125777 (1.00x) +Testing distribution - Worst bias is the 18-bit window at bit 3 - 0.067% + +Testing bit 30 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 512 (1.00x) (1) +Testing collisions (high 24-36 bits) - Worst is 34 bits: 142/127 (1.11x) +Testing collisions (low 32-bit) - Expected 511.9, actual 497 (0.97x) +Testing collisions (low 24-36 bits) - Worst is 34 bits: 134/127 (1.05x) +Testing distribution - Worst bias is the 18-bit window at bit 9 - 0.062% + +Testing bit 31 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 475 (0.93x) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 38/31 (1.19x) +Testing collisions (low 32-bit) - Expected 511.9, actual 523 (1.02x) (12) +Testing collisions (low 24-36 bits) - Worst is 34 bits: 146/127 (1.14x) +Testing distribution - Worst bias is the 18-bit window at bit 48 - 0.071% + +Testing bit 32 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 485 (0.95x) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 35/31 (1.09x) +Testing collisions (low 32-bit) - Expected 511.9, actual 568 (1.11x) (57) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 39/31 (1.22x) +Testing distribution - Worst bias is the 18-bit window at bit 8 - 0.068% + +Testing bit 33 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 537 (1.05x) (26) +Testing collisions (high 24-36 bits) - Worst is 32 bits: 537/511 (1.05x) +Testing collisions (low 32-bit) - Expected 511.9, actual 556 (1.09x) (45) +Testing collisions (low 24-36 bits) - Worst is 34 bits: 145/127 (1.13x) +Testing distribution - Worst bias is the 18-bit window at bit 55 - 0.080% + +Testing bit 34 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 498 (0.97x) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 38/31 (1.19x) +Testing collisions (low 32-bit) - Expected 511.9, actual 514 (1.00x) (3) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 45/31 (1.41x) +Testing distribution - Worst bias is the 18-bit window at bit 22 - 0.065% + +Testing bit 35 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 514 (1.00x) (3) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 34/31 (1.06x) +Testing collisions (low 32-bit) - Expected 511.9, actual 521 (1.02x) (10) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 44/31 (1.38x) +Testing distribution - Worst bias is the 18-bit window at bit 28 - 0.081% + +Testing bit 36 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 575 (1.12x) (64) +Testing collisions (high 24-36 bits) - Worst is 32 bits: 575/511 (1.12x) +Testing collisions (low 32-bit) - Expected 511.9, actual 548 (1.07x) (37) +Testing collisions (low 24-36 bits) - Worst is 32 bits: 548/511 (1.07x) +Testing distribution - Worst bias is the 18-bit window at bit 28 - 0.080% + +Testing bit 37 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 553 (1.08x) (42) +Testing collisions (high 24-36 bits) - Worst is 33 bits: 303/255 (1.18x) +Testing collisions (low 32-bit) - Expected 511.9, actual 469 (0.92x) +Testing collisions (low 24-36 bits) - Worst is 29 bits: 4183/4090 (1.02x) +Testing distribution - Worst bias is the 18-bit window at bit 44 - 0.076% + +Testing bit 38 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 495 (0.97x) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 66/63 (1.03x) +Testing collisions (low 32-bit) - Expected 511.9, actual 524 (1.02x) (13) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 35/31 (1.09x) +Testing distribution - Worst bias is the 18-bit window at bit 7 - 0.067% + +Testing bit 39 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 480 (0.94x) +Testing collisions (high 24-36 bits) - Worst is 24 bits: 125741/125777 (1.00x) +Testing collisions (low 32-bit) - Expected 511.9, actual 542 (1.06x) (31) +Testing collisions (low 24-36 bits) - Worst is 35 bits: 73/63 (1.14x) +Testing distribution - Worst bias is the 17-bit window at bit 0 - 0.053% + +Testing bit 40 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 523 (1.02x) (12) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 67/63 (1.05x) +Testing collisions (low 32-bit) - Expected 511.9, actual 523 (1.02x) (12) +Testing collisions (low 24-36 bits) - Worst is 35 bits: 71/63 (1.11x) +Testing distribution - Worst bias is the 18-bit window at bit 18 - 0.098% + +Testing bit 41 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 520 (1.02x) (9) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 34/31 (1.06x) +Testing collisions (low 32-bit) - Expected 511.9, actual 519 (1.01x) (8) +Testing collisions (low 24-36 bits) - Worst is 35 bits: 71/63 (1.11x) +Testing distribution - Worst bias is the 18-bit window at bit 44 - 0.072% + +Testing bit 42 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 503 (0.98x) (-8) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 40/31 (1.25x) +Testing collisions (low 32-bit) - Expected 511.9, actual 531 (1.04x) (20) +Testing collisions (low 24-36 bits) - Worst is 33 bits: 273/255 (1.07x) +Testing distribution - Worst bias is the 18-bit window at bit 4 - 0.072% + +Testing bit 43 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 546 (1.07x) (35) +Testing collisions (high 24-36 bits) - Worst is 33 bits: 287/255 (1.12x) +Testing collisions (low 32-bit) - Expected 511.9, actual 480 (0.94x) +Testing collisions (low 24-36 bits) - Worst is 34 bits: 133/127 (1.04x) +Testing distribution - Worst bias is the 18-bit window at bit 43 - 0.073% + +Testing bit 44 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 530 (1.04x) (19) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 40/31 (1.25x) +Testing collisions (low 32-bit) - Expected 511.9, actual 510 (1.00x) (-1) +Testing collisions (low 24-36 bits) - Worst is 27 bits: 16377/16298 (1.00x) +Testing distribution - Worst bias is the 18-bit window at bit 27 - 0.057% + +Testing bit 45 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 510 (1.00x) (-1) +Testing collisions (high 24-36 bits) - Worst is 26 bits: 32880/32429 (1.01x) +Testing collisions (low 32-bit) - Expected 511.9, actual 525 (1.03x) (14) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 39/31 (1.22x) +Testing distribution - Worst bias is the 18-bit window at bit 35 - 0.076% + +Testing bit 46 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 513 (1.00x) (2) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 34/31 (1.06x) +Testing collisions (low 32-bit) - Expected 511.9, actual 573 (1.12x) (62) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 40/31 (1.25x) +Testing distribution - Worst bias is the 17-bit window at bit 53 - 0.061% + +Testing bit 47 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 503 (0.98x) (-8) +Testing collisions (high 24-36 bits) - Worst is 30 bits: 2078/2046 (1.02x) +Testing collisions (low 32-bit) - Expected 511.9, actual 475 (0.93x) +Testing collisions (low 24-36 bits) - Worst is 24 bits: 125854/125777 (1.00x) +Testing distribution - Worst bias is the 18-bit window at bit 7 - 0.077% + +Testing bit 48 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 511 (1.00x) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 67/63 (1.05x) +Testing collisions (low 32-bit) - Expected 511.9, actual 487 (0.95x) +Testing collisions (low 24-36 bits) - Worst is 35 bits: 65/63 (1.02x) +Testing distribution - Worst bias is the 18-bit window at bit 57 - 0.075% + +Testing bit 49 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 530 (1.04x) (19) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 34/31 (1.06x) +Testing collisions (low 32-bit) - Expected 511.9, actual 530 (1.04x) (19) +Testing collisions (low 24-36 bits) - Worst is 30 bits: 2125/2046 (1.04x) +Testing distribution - Worst bias is the 18-bit window at bit 55 - 0.071% + +Testing bit 50 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 548 (1.07x) (37) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 37/31 (1.16x) +Testing collisions (low 32-bit) - Expected 511.9, actual 560 (1.09x) (49) +Testing collisions (low 24-36 bits) - Worst is 34 bits: 144/127 (1.13x) +Testing distribution - Worst bias is the 18-bit window at bit 7 - 0.123% + +Testing bit 51 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 533 (1.04x) (22) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 74/63 (1.16x) +Testing collisions (low 32-bit) - Expected 511.9, actual 520 (1.02x) (9) +Testing collisions (low 24-36 bits) - Worst is 29 bits: 4156/4090 (1.02x) +Testing distribution - Worst bias is the 18-bit window at bit 59 - 0.070% + +Testing bit 52 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 489 (0.96x) +Testing collisions (high 24-36 bits) - Worst is 30 bits: 2066/2046 (1.01x) +Testing collisions (low 32-bit) - Expected 511.9, actual 503 (0.98x) (-8) +Testing collisions (low 24-36 bits) - Worst is 26 bits: 32529/32429 (1.00x) +Testing distribution - Worst bias is the 18-bit window at bit 42 - 0.084% + +Testing bit 53 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 527 (1.03x) (16) +Testing collisions (high 24-36 bits) - Worst is 30 bits: 2145/2046 (1.05x) +Testing collisions (low 32-bit) - Expected 511.9, actual 504 (0.98x) (-7) +Testing collisions (low 24-36 bits) - Worst is 26 bits: 32595/32429 (1.01x) +Testing distribution - Worst bias is the 18-bit window at bit 46 - 0.084% + +Testing bit 54 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 515 (1.01x) (4) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 71/63 (1.11x) +Testing collisions (low 32-bit) - Expected 511.9, actual 540 (1.05x) (29) +Testing collisions (low 24-36 bits) - Worst is 34 bits: 153/127 (1.20x) +Testing distribution - Worst bias is the 18-bit window at bit 18 - 0.089% + +Testing bit 55 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 551 (1.08x) (40) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 77/63 (1.20x) +Testing collisions (low 32-bit) - Expected 511.9, actual 529 (1.03x) (18) +Testing collisions (low 24-36 bits) - Worst is 32 bits: 529/511 (1.03x) +Testing distribution - Worst bias is the 18-bit window at bit 24 - 0.118% + +Testing bit 56 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 513 (1.00x) (2) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 42/31 (1.31x) +Testing collisions (low 32-bit) - Expected 511.9, actual 489 (0.96x) +Testing collisions (low 24-36 bits) - Worst is 30 bits: 2079/2046 (1.02x) +Testing distribution - Worst bias is the 18-bit window at bit 58 - 0.104% + +Testing bit 57 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 516 (1.01x) (5) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 44/31 (1.38x) +Testing collisions (low 32-bit) - Expected 511.9, actual 526 (1.03x) (15) +Testing collisions (low 24-36 bits) - Worst is 34 bits: 146/127 (1.14x) +Testing distribution - Worst bias is the 18-bit window at bit 24 - 0.101% + +Testing bit 58 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 562 (1.10x) (51) +Testing collisions (high 24-36 bits) - Worst is 33 bits: 290/255 (1.13x) +Testing collisions (low 32-bit) - Expected 511.9, actual 549 (1.07x) (38) +Testing collisions (low 24-36 bits) - Worst is 32 bits: 549/511 (1.07x) +Testing distribution - Worst bias is the 18-bit window at bit 3 - 0.080% + +Testing bit 59 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 501 (0.98x) +Testing collisions (high 24-36 bits) - Worst is 34 bits: 133/127 (1.04x) +Testing collisions (low 32-bit) - Expected 511.9, actual 516 (1.01x) (5) +Testing collisions (low 24-36 bits) - Worst is 34 bits: 143/127 (1.12x) +Testing distribution - Worst bias is the 18-bit window at bit 30 - 0.076% + +Testing bit 60 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 509 (0.99x) (-2) +Testing collisions (high 24-36 bits) - Worst is 34 bits: 129/127 (1.01x) +Testing collisions (low 32-bit) - Expected 511.9, actual 537 (1.05x) (26) +Testing collisions (low 24-36 bits) - Worst is 34 bits: 142/127 (1.11x) +Testing distribution - Worst bias is the 18-bit window at bit 41 - 0.104% + +Testing bit 61 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 502 (0.98x) (-9) +Testing collisions (high 24-36 bits) - Worst is 33 bits: 263/255 (1.03x) +Testing collisions (low 32-bit) - Expected 511.9, actual 525 (1.03x) (14) +Testing collisions (low 24-36 bits) - Worst is 35 bits: 66/63 (1.03x) +Testing distribution - Worst bias is the 18-bit window at bit 60 - 0.089% + +Testing bit 62 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 541 (1.06x) (30) +Testing collisions (high 24-36 bits) - Worst is 32 bits: 541/511 (1.06x) +Testing collisions (low 32-bit) - Expected 511.9, actual 502 (0.98x) (-9) +Testing collisions (low 24-36 bits) - Worst is 35 bits: 73/63 (1.14x) +Testing distribution - Worst bias is the 18-bit window at bit 4 - 0.057% + +Testing bit 63 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 479 (0.94x) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 37/31 (1.16x) +Testing collisions (low 32-bit) - Expected 511.9, actual 562 (1.10x) (51) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 37/31 (1.16x) +Testing distribution - Worst bias is the 18-bit window at bit 50 - 0.061% + + +[[[ MomentChi2 Tests ]]] + +Analyze hashes produced from a serie of linearly increasing numbers of 32-bit, using a step of 2 ... +Target values to approximate : 38918200.000000 - 273633.333333 +4 threads starting... done +Popcount 1 stats : 38919070.880649 - 273658.516930 +Popcount 0 stats : 38919194.839021 - 273657.339256 +MomentChi2 for bits 1 : 1.38579 +MomentChi2 for bits 0 : 1.80837 + +Derivative stats (transition from 2 consecutive values) : +Popcount 1 stats : 38918610.739435 - 273628.413070 +Popcount 0 stats : 38919023.148389 - 273649.013652 +MomentChi2 for deriv b1 : 0.308275 +MomentChi2 for deriv b0 : 1.23807 + + Great + + +[[[ Prng Tests ]]] + +Generating 33554432 random numbers : +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 130731.3, actual 130656 (1.00x) (-75) +Testing collisions (high 28-44 bits) - Worst is 43 bits: 66/63 (1.03x) +Testing collisions (low 32-bit) - Expected 130731.3, actual 130961 (1.00x) (230) +Testing collisions (low 28-44 bits) - Worst is 37 bits: 4145/4095 (1.01x) + +[[[ BadSeeds Tests ]]] + +Testing 0 internal secrets: +0x0 PASS + + +Input vcode 0x00000001, Output vcode 0x00000001, Result vcode 0x00000001 +Verification value is 0x00000001 - Testing took 594.176606 seconds +------------------------------------------------------------------------------- diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/smhasher/clone_smhasher.sh b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/smhasher/clone_smhasher.sh new file mode 100755 index 0000000..f98379e --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/smhasher/clone_smhasher.sh @@ -0,0 +1 @@ +git clone https://github.com/rurban/smhasher.git diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/smhasher/fallbackNoFoldedOutput.txt b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/smhasher/fallbackNoFoldedOutput.txt new file mode 100644 index 0000000..8b6040b --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/smhasher/fallbackNoFoldedOutput.txt @@ -0,0 +1,1137 @@ +------------------------------------------------------------------------------- +--- Testing ahash64 "ahash 64bit" GOOD + +[[[ Sanity Tests ]]] + +Verification value 0x4F80BA96 ....... SKIP (self- or unseeded) +Running sanity check 1 .......... PASS +Running AppendedZeroesTest .......... PASS + +[[[ Speed Tests ]]] + +Bulk speed test - 262144-byte keys +Alignment 7 - 18.833 bytes/cycle - 53881.77 MiB/sec @ 3 ghz +Alignment 6 - 18.835 bytes/cycle - 53887.84 MiB/sec @ 3 ghz +Alignment 5 - 18.835 bytes/cycle - 53888.73 MiB/sec @ 3 ghz +Alignment 4 - 19.338 bytes/cycle - 55327.26 MiB/sec @ 3 ghz +Alignment 3 - 19.422 bytes/cycle - 55566.47 MiB/sec @ 3 ghz +Alignment 2 - 19.475 bytes/cycle - 55717.32 MiB/sec @ 3 ghz +Alignment 1 - 19.266 bytes/cycle - 55120.73 MiB/sec @ 3 ghz +Alignment 0 - 19.932 bytes/cycle - 57026.80 MiB/sec @ 3 ghz +Average - 19.242 bytes/cycle - 55052.12 MiB/sec @ 3 ghz + +Small key speed test - 1-byte keys - 33.00 cycles/hash +Small key speed test - 2-byte keys - 33.00 cycles/hash +Small key speed test - 3-byte keys - 32.02 cycles/hash +Small key speed test - 4-byte keys - 30.73 cycles/hash +Small key speed test - 5-byte keys - 30.81 cycles/hash +Small key speed test - 6-byte keys - 31.95 cycles/hash +Small key speed test - 7-byte keys - 33.00 cycles/hash +Small key speed test - 8-byte keys - 33.00 cycles/hash +Small key speed test - 9-byte keys - 30.83 cycles/hash +Small key speed test - 10-byte keys - 30.79 cycles/hash +Small key speed test - 11-byte keys - 30.86 cycles/hash +Small key speed test - 12-byte keys - 31.79 cycles/hash +Small key speed test - 13-byte keys - 32.00 cycles/hash +Small key speed test - 14-byte keys - 32.31 cycles/hash +Small key speed test - 15-byte keys - 30.51 cycles/hash +Small key speed test - 16-byte keys - 30.93 cycles/hash +Small key speed test - 17-byte keys - 33.07 cycles/hash +Small key speed test - 18-byte keys - 35.00 cycles/hash +Small key speed test - 19-byte keys - 35.00 cycles/hash +Small key speed test - 20-byte keys - 33.93 cycles/hash +Small key speed test - 21-byte keys - 32.86 cycles/hash +Small key speed test - 22-byte keys - 32.96 cycles/hash +Small key speed test - 23-byte keys - 34.30 cycles/hash +Small key speed test - 24-byte keys - 35.00 cycles/hash +Small key speed test - 25-byte keys - 35.00 cycles/hash +Small key speed test - 26-byte keys - 32.65 cycles/hash +Small key speed test - 27-byte keys - 33.00 cycles/hash +Small key speed test - 28-byte keys - 33.44 cycles/hash +Small key speed test - 29-byte keys - 35.00 cycles/hash +Small key speed test - 30-byte keys - 35.00 cycles/hash +Small key speed test - 31-byte keys - 34.00 cycles/hash +Average 32.830 cycles/hash + +[[[ 'Hashmap' Speed Tests ]]] + +std::unordered_map +Init std HashMapTest: 199.037 cycles/op (102774 inserts, 1% deletions) +Running std HashMapTest: 125.873 cycles/op (2.4 stdv) + +greg7mdp/parallel-hashmap +Init fast HashMapTest: 113.297 cycles/op (102774 inserts, 1% deletions) +Running fast HashMapTest: 85.337 cycles/op (2.7 stdv) ....... PASS + +[[[ Avalanche Tests ]]] + +Testing 24-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.653333% +Testing 32-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.654667% +Testing 40-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.725333% +Testing 48-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.680667% +Testing 56-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.686000% +Testing 64-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.676000% +Testing 72-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.676000% +Testing 80-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.620667% +Testing 96-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.699333% +Testing 112-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.684667% +Testing 128-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.734000% +Testing 160-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.673333% +Testing 512-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.748000% +Testing 1024-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.780000% + +[[[ Keyset 'Sparse' Tests ]]] + +Keyset 'Sparse' - 16-bit keys with up to 9 bits set - 50643 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 0.3, actual 0 (0.00x) +Testing collisions (high 19-25 bits) - Worst is 22 bits: 313/304 (1.03x) +Testing collisions (low 32-bit) - Expected 0.3, actual 0 (0.00x) +Testing collisions (low 19-25 bits) - Worst is 25 bits: 43/38 (1.13x) +Testing distribution - Worst bias is the 13-bit window at bit 9 - 0.766% + +Keyset 'Sparse' - 24-bit keys with up to 8 bits set - 1271626 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 188.2, actual 179 (0.95x) +Testing collisions (high 24-35 bits) - Worst is 30 bits: 772/752 (1.03x) +Testing collisions (low 32-bit) - Expected 188.2, actual 180 (0.96x) +Testing collisions (low 24-35 bits) - Worst is 24 bits: 46572/46996 (0.99x) +Testing distribution - Worst bias is the 17-bit window at bit 52 - 0.099% + +Keyset 'Sparse' - 32-bit keys with up to 7 bits set - 4514873 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 2372.2, actual 2386 (1.01x) (14) +Testing collisions (high 25-38 bits) - Worst is 33 bits: 1206/1186 (1.02x) +Testing collisions (low 32-bit) - Expected 2372.2, actual 2291 (0.97x) +Testing collisions (low 25-38 bits) - Worst is 35 bits: 299/296 (1.01x) +Testing distribution - Worst bias is the 19-bit window at bit 7 - 0.048% + +Keyset 'Sparse' - 40-bit keys with up to 6 bits set - 4598479 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 2460.8, actual 2467 (1.00x) (7) +Testing collisions (high 25-38 bits) - Worst is 38 bits: 42/38 (1.09x) +Testing collisions (low 32-bit) - Expected 2460.8, actual 2431 (0.99x) (-29) +Testing collisions (low 25-38 bits) - Worst is 37 bits: 80/76 (1.04x) +Testing distribution - Worst bias is the 18-bit window at bit 32 - 0.044% + +Keyset 'Sparse' - 48-bit keys with up to 6 bits set - 14196869 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 23437.8, actual 23394 (1.00x) (-43) +Testing collisions (high 27-42 bits) - Worst is 41 bits: 58/45 (1.27x) +Testing collisions (low 32-bit) - Expected 23437.8, actual 23042 (0.98x) (-395) +Testing collisions (low 27-42 bits) - Worst is 40 bits: 97/91 (1.06x) +Testing distribution - Worst bias is the 20-bit window at bit 27 - 0.026% + +Keyset 'Sparse' - 56-bit keys with up to 5 bits set - 4216423 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 2069.0, actual 2131 (1.03x) (63) +Testing collisions (high 25-38 bits) - Worst is 38 bits: 44/32 (1.36x) +Testing collisions (low 32-bit) - Expected 2069.0, actual 2134 (1.03x) (66) +Testing collisions (low 25-38 bits) - Worst is 38 bits: 40/32 (1.24x) +Testing distribution - Worst bias is the 19-bit window at bit 28 - 0.078% + +Keyset 'Sparse' - 64-bit keys with up to 5 bits set - 8303633 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8021.7, actual 8004 (1.00x) (-17) +Testing collisions (high 26-40 bits) - Worst is 35 bits: 1003/1003 (1.00x) +Testing collisions (low 32-bit) - Expected 8021.7, actual 8045 (1.00x) (24) +Testing collisions (low 26-40 bits) - Worst is 40 bits: 39/31 (1.24x) +Testing distribution - Worst bias is the 20-bit window at bit 25 - 0.045% + +Keyset 'Sparse' - 72-bit keys with up to 5 bits set - 15082603 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 26451.8, actual 26592 (1.01x) (141) +Testing collisions (high 27-42 bits) - Worst is 33 bits: 13368/13233 (1.01x) +Testing collisions (low 32-bit) - Expected 26451.8, actual 26315 (0.99x) (-136) +Testing collisions (low 27-42 bits) - Worst is 40 bits: 113/103 (1.09x) +Testing distribution - Worst bias is the 20-bit window at bit 59 - 0.018% + +Keyset 'Sparse' - 96-bit keys with up to 4 bits set - 3469497 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 1401.0, actual 1354 (0.97x) +Testing collisions (high 25-38 bits) - Worst is 36 bits: 88/87 (1.00x) +Testing collisions (low 32-bit) - Expected 1401.0, actual 1422 (1.02x) (22) +Testing collisions (low 25-38 bits) - Worst is 36 bits: 96/87 (1.10x) +Testing distribution - Worst bias is the 18-bit window at bit 43 - 0.055% + +Keyset 'Sparse' - 160-bit keys with up to 4 bits set - 26977161 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 84546.1, actual 84656 (1.00x) (110) +Testing collisions (high 28-44 bits) - Worst is 42 bits: 84/82 (1.02x) +Testing collisions (low 32-bit) - Expected 84546.1, actual 84598 (1.00x) (52) +Testing collisions (low 28-44 bits) - Worst is 41 bits: 199/165 (1.20x) +Testing distribution - Worst bias is the 20-bit window at bit 3 - 0.014% + +Keyset 'Sparse' - 256-bit keys with up to 3 bits set - 2796417 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 910.2, actual 914 (1.00x) (4) +Testing collisions (high 25-37 bits) - Worst is 36 bits: 62/56 (1.09x) +Testing collisions (low 32-bit) - Expected 910.2, actual 887 (0.97x) +Testing collisions (low 25-37 bits) - Worst is 35 bits: 130/113 (1.14x) +Testing distribution - Worst bias is the 19-bit window at bit 47 - 0.068% + +Keyset 'Sparse' - 512-bit keys with up to 3 bits set - 22370049 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 58155.4, actual 58437 (1.00x) (282) +Testing collisions (high 28-43 bits) - Worst is 33 bits: 29437/29102 (1.01x) +Testing collisions (low 32-bit) - Expected 58155.4, actual 58276 (1.00x) (121) +Testing collisions (low 28-43 bits) - Worst is 35 bits: 7362/7280 (1.01x) +Testing distribution - Worst bias is the 19-bit window at bit 11 - 0.011% + +Keyset 'Sparse' - 1024-bit keys with up to 2 bits set - 524801 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 32.1, actual 39 (1.22x) (7) +Testing collisions (high 22-32 bits) - Worst is 32 bits: 39/32 (1.22x) +Testing collisions (low 32-bit) - Expected 32.1, actual 29 (0.90x) +Testing collisions (low 22-32 bits) - Worst is 30 bits: 136/128 (1.06x) +Testing distribution - Worst bias is the 16-bit window at bit 59 - 0.126% + +Keyset 'Sparse' - 2048-bit keys with up to 2 bits set - 2098177 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.4, actual 513 (1.00x) (1) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 38/32 (1.19x) +Testing collisions (low 32-bit) - Expected 512.4, actual 491 (0.96x) +Testing collisions (low 24-36 bits) - Worst is 34 bits: 134/128 (1.05x) +Testing distribution - Worst bias is the 18-bit window at bit 17 - 0.134% + + +[[[ Keyset 'Permutation' Tests ]]] + +Combination Lowbits Tests: +Keyset 'Combination' - up to 7 blocks from a set of 8 - 2396744 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 668.6, actual 705 (1.05x) (37) +Testing collisions (high 24-37 bits) - Worst is 32 bits: 705/668 (1.05x) +Testing collisions (low 32-bit) - Expected 668.6, actual 619 (0.93x) +Testing collisions (low 24-37 bits) - Worst is 24 bits: 163754/163326 (1.00x) +Testing distribution - Worst bias is the 18-bit window at bit 19 - 0.061% + + +Combination Highbits Tests +Keyset 'Combination' - up to 7 blocks from a set of 8 - 2396744 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 668.6, actual 662 (0.99x) (-6) +Testing collisions (high 24-37 bits) - Worst is 30 bits: 2701/2672 (1.01x) +Testing collisions (low 32-bit) - Expected 668.6, actual 689 (1.03x) (21) +Testing collisions (low 24-37 bits) - Worst is 36 bits: 48/41 (1.15x) +Testing distribution - Worst bias is the 18-bit window at bit 47 - 0.053% + + +Combination Hi-Lo Tests: +Keyset 'Combination' - up to 6 blocks from a set of 15 - 12204240 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 17322.9, actual 17227 (0.99x) (-95) +Testing collisions (high 27-41 bits) - Worst is 27 bits: 538234/538415 (1.00x) +Testing collisions (low 32-bit) - Expected 17322.9, actual 17271 (1.00x) (-51) +Testing collisions (low 27-41 bits) - Worst is 41 bits: 43/33 (1.27x) +Testing distribution - Worst bias is the 20-bit window at bit 5 - 0.027% + + +Combination 0x8000000 Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8186.7, actual 8305 (1.01x) (119) +Testing collisions (high 26-40 bits) - Worst is 32 bits: 8305/8186 (1.01x) +Testing collisions (low 32-bit) - Expected 8186.7, actual 8198 (1.00x) (12) +Testing collisions (low 26-40 bits) - Worst is 34 bits: 2097/2047 (1.02x) +Testing distribution - Worst bias is the 20-bit window at bit 57 - 0.044% + + +Combination 0x0000001 Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8186.7, actual 8255 (1.01x) (69) +Testing collisions (high 26-40 bits) - Worst is 38 bits: 142/127 (1.11x) +Testing collisions (low 32-bit) - Expected 8186.7, actual 8105 (0.99x) (-81) +Testing collisions (low 26-40 bits) - Worst is 40 bits: 34/31 (1.06x) +Testing distribution - Worst bias is the 20-bit window at bit 48 - 0.036% + + +Combination 0x800000000000000 Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8186.7, actual 8071 (0.99x) (-115) +Testing collisions (high 26-40 bits) - Worst is 27 bits: 256884/256766 (1.00x) +Testing collisions (low 32-bit) - Expected 8186.7, actual 8209 (1.00x) (23) +Testing collisions (low 26-40 bits) - Worst is 40 bits: 38/31 (1.19x) +Testing distribution - Worst bias is the 20-bit window at bit 25 - 0.032% + + +Combination 0x000000000000001 Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8186.7, actual 8052 (0.98x) (-134) +Testing collisions (high 26-40 bits) - Worst is 35 bits: 1029/1023 (1.00x) +Testing collisions (low 32-bit) - Expected 8186.7, actual 8128 (0.99x) (-58) +Testing collisions (low 26-40 bits) - Worst is 40 bits: 40/31 (1.25x) +Testing distribution - Worst bias is the 20-bit window at bit 21 - 0.070% + + +Combination 16-bytes [0-1] Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8186.7, actual 8235 (1.01x) (49) +Testing collisions (high 26-40 bits) - Worst is 38 bits: 134/127 (1.05x) +Testing collisions (low 32-bit) - Expected 8186.7, actual 8072 (0.99x) (-114) +Testing collisions (low 26-40 bits) - Worst is 26 bits: 503674/503108 (1.00x) +Testing distribution - Worst bias is the 20-bit window at bit 54 - 0.046% + + +Combination 16-bytes [0-last] Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8186.7, actual 8207 (1.00x) (21) +Testing collisions (high 26-40 bits) - Worst is 34 bits: 2088/2047 (1.02x) +Testing collisions (low 32-bit) - Expected 8186.7, actual 8017 (0.98x) +Testing collisions (low 26-40 bits) - Worst is 40 bits: 37/31 (1.16x) +Testing distribution - Worst bias is the 20-bit window at bit 10 - 0.037% + + +Combination 32-bytes [0-1] Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8186.7, actual 8218 (1.00x) (32) +Testing collisions (high 26-40 bits) - Worst is 32 bits: 8218/8186 (1.00x) +Testing collisions (low 32-bit) - Expected 8186.7, actual 8233 (1.01x) (47) +Testing collisions (low 26-40 bits) - Worst is 38 bits: 152/127 (1.19x) +Testing distribution - Worst bias is the 20-bit window at bit 2 - 0.029% + + +Combination 32-bytes [0-last] Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8186.7, actual 8324 (1.02x) (138) +Testing collisions (high 26-40 bits) - Worst is 37 bits: 268/255 (1.05x) +Testing collisions (low 32-bit) - Expected 8186.7, actual 8099 (0.99x) (-87) +Testing collisions (low 26-40 bits) - Worst is 36 bits: 525/511 (1.03x) +Testing distribution - Worst bias is the 20-bit window at bit 13 - 0.044% + + +Combination 64-bytes [0-1] Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8186.7, actual 8033 (0.98x) (-153) +Testing collisions (high 26-40 bits) - Worst is 39 bits: 67/63 (1.05x) +Testing collisions (low 32-bit) - Expected 8186.7, actual 8293 (1.01x) (107) +Testing collisions (low 26-40 bits) - Worst is 37 bits: 274/255 (1.07x) +Testing distribution - Worst bias is the 20-bit window at bit 29 - 0.037% + + +Combination 64-bytes [0-last] Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8186.7, actual 8335 (1.02x) (149) +Testing collisions (high 26-40 bits) - Worst is 32 bits: 8335/8186 (1.02x) +Testing collisions (low 32-bit) - Expected 8186.7, actual 8163 (1.00x) (-23) +Testing collisions (low 26-40 bits) - Worst is 40 bits: 35/31 (1.09x) +Testing distribution - Worst bias is the 20-bit window at bit 20 - 0.033% + + +Combination 128-bytes [0-1] Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8186.7, actual 8238 (1.01x) (52) +Testing collisions (high 26-40 bits) - Worst is 31 bits: 16565/16362 (1.01x) +Testing collisions (low 32-bit) - Expected 8186.7, actual 8062 (0.98x) (-124) +Testing collisions (low 26-40 bits) - Worst is 37 bits: 262/255 (1.02x) +Testing distribution - Worst bias is the 20-bit window at bit 16 - 0.042% + + +Combination 128-bytes [0-last] Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8186.7, actual 8270 (1.01x) (84) +Testing collisions (high 26-40 bits) - Worst is 39 bits: 70/63 (1.09x) +Testing collisions (low 32-bit) - Expected 8186.7, actual 8144 (0.99x) (-42) +Testing collisions (low 26-40 bits) - Worst is 40 bits: 41/31 (1.28x) +Testing distribution - Worst bias is the 20-bit window at bit 29 - 0.042% + + +[[[ Keyset 'Window' Tests ]]] + +Keyset 'Window' - 32-bit key, 25-bit window - 32 tests, 33554432 keys per test +Window at 0 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 1 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 2 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 3 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 4 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 5 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 6 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 7 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 8 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 9 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 10 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 11 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 12 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 13 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 14 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 15 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 16 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 17 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 18 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 19 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 20 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 21 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 22 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 23 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 24 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 25 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 26 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 27 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 28 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 29 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 30 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 31 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 32 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) + +[[[ Keyset 'Cyclic' Tests ]]] + +Keyset 'Cyclic' - 8 cycles of 8 bytes - 1000000 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 116.4, actual 129 (1.11x) (13) +Testing collisions (high 23-34 bits) - Worst is 34 bits: 35/29 (1.20x) +Testing collisions (low 32-bit) - Expected 116.4, actual 105 (0.90x) +Testing collisions (low 23-34 bits) - Worst is 26 bits: 7507/7413 (1.01x) +Testing distribution - Worst bias is the 17-bit window at bit 40 - 0.089% + +Keyset 'Cyclic' - 8 cycles of 9 bytes - 1000000 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 116.4, actual 112 (0.96x) +Testing collisions (high 23-34 bits) - Worst is 28 bits: 1915/1860 (1.03x) +Testing collisions (low 32-bit) - Expected 116.4, actual 109 (0.94x) +Testing collisions (low 23-34 bits) - Worst is 30 bits: 472/465 (1.01x) +Testing distribution - Worst bias is the 17-bit window at bit 28 - 0.111% + +Keyset 'Cyclic' - 8 cycles of 10 bytes - 1000000 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 116.4, actual 106 (0.91x) +Testing collisions (high 23-34 bits) - Worst is 25 bits: 14825/14754 (1.00x) +Testing collisions (low 32-bit) - Expected 116.4, actual 130 (1.12x) (14) +Testing collisions (low 23-34 bits) - Worst is 34 bits: 39/29 (1.34x) +Testing distribution - Worst bias is the 17-bit window at bit 51 - 0.114% + +Keyset 'Cyclic' - 8 cycles of 11 bytes - 1000000 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 116.4, actual 110 (0.94x) +Testing collisions (high 23-34 bits) - Worst is 27 bits: 3703/3716 (1.00x) +Testing collisions (low 32-bit) - Expected 116.4, actual 105 (0.90x) +Testing collisions (low 23-34 bits) - Worst is 29 bits: 977/930 (1.05x) +Testing distribution - Worst bias is the 17-bit window at bit 32 - 0.120% + +Keyset 'Cyclic' - 8 cycles of 12 bytes - 1000000 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 116.4, actual 107 (0.92x) +Testing collisions (high 23-34 bits) - Worst is 23 bits: 57386/57305 (1.00x) +Testing collisions (low 32-bit) - Expected 116.4, actual 132 (1.13x) (16) +Testing collisions (low 23-34 bits) - Worst is 34 bits: 40/29 (1.37x) +Testing distribution - Worst bias is the 17-bit window at bit 57 - 0.073% + +Keyset 'Cyclic' - 8 cycles of 16 bytes - 1000000 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 116.4, actual 132 (1.13x) (16) +Testing collisions (high 23-34 bits) - Worst is 32 bits: 132/116 (1.13x) +Testing collisions (low 32-bit) - Expected 116.4, actual 118 (1.01x) (2) +Testing collisions (low 23-34 bits) - Worst is 32 bits: 118/116 (1.01x) +Testing distribution - Worst bias is the 17-bit window at bit 46 - 0.095% + + +[[[ Keyset 'TwoBytes' Tests ]]] + +Keyset 'TwoBytes' - up-to-4-byte keys, 652545 total keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 49.6, actual 53 (1.07x) (4) +Testing collisions (high 23-33 bits) - Worst is 32 bits: 53/49 (1.07x) +Testing collisions (low 32-bit) - Expected 49.6, actual 60 (1.21x) (11) +Testing collisions (low 23-33 bits) - Worst is 33 bits: 35/24 (1.41x) +Testing distribution - Worst bias is the 16-bit window at bit 21 - 0.145% + +Keyset 'TwoBytes' - up-to-8-byte keys, 5471025 total keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 3483.1, actual 3402 (0.98x) +Testing collisions (high 26-39 bits) - Worst is 29 bits: 27946/27781 (1.01x) +Testing collisions (low 32-bit) - Expected 3483.1, actual 3541 (1.02x) (58) +Testing collisions (low 26-39 bits) - Worst is 38 bits: 56/54 (1.03x) +Testing distribution - Worst bias is the 19-bit window at bit 30 - 0.034% + +Keyset 'TwoBytes' - up-to-12-byte keys, 18616785 total keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 40289.5, actual 39891 (0.99x) (-398) +Testing collisions (high 27-42 bits) - Worst is 27 bits: 1232174/1233446 (1.00x) +Testing collisions (low 32-bit) - Expected 40289.5, actual 40423 (1.00x) (134) +Testing collisions (low 27-42 bits) - Worst is 42 bits: 42/39 (1.07x) +Testing distribution - Worst bias is the 20-bit window at bit 6 - 0.016% + +Keyset 'TwoBytes' - up-to-16-byte keys, 44251425 total keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 227182.3, actual 227113 (1.00x) (-69) +Testing collisions (high 29-45 bits) - Worst is 45 bits: 32/27 (1.15x) +Testing collisions (low 32-bit) - Expected 227182.3, actual 227820 (1.00x) (638) +Testing collisions (low 29-45 bits) - Worst is 45 bits: 30/27 (1.08x) +Testing distribution - Worst bias is the 20-bit window at bit 11 - 0.006% + +Keyset 'TwoBytes' - up-to-20-byte keys, 86536545 total keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 865959.1, actual 866474 (1.00x) (515) +Testing collisions (high 30-47 bits) - Worst is 45 bits: 108/106 (1.01x) +Testing collisions (low 32-bit) - Expected 865959.1, actual 865864 (1.00x) (-95) +Testing collisions (low 30-47 bits) - Worst is 37 bits: 27468/27237 (1.01x) +Testing distribution - Worst bias is the 20-bit window at bit 18 - 0.005% + + +[[[ Keyset 'Text' Tests ]]] + +Keyset 'Text' - keys of form "FooXXXXBar" - 14776336 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 25389.0, actual 25545 (1.01x) (156) +Testing collisions (high 27-42 bits) - Worst is 40 bits: 106/99 (1.07x) +Testing collisions (low 32-bit) - Expected 25389.0, actual 25253 (0.99x) (-136) +Testing collisions (low 27-42 bits) - Worst is 42 bits: 25/24 (1.01x) +Testing distribution - Worst bias is the 20-bit window at bit 51 - 0.027% + +Keyset 'Text' - keys of form "FooBarXXXX" - 14776336 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 25389.0, actual 25219 (0.99x) (-170) +Testing collisions (high 27-42 bits) - Worst is 31 bits: 50616/50719 (1.00x) +Testing collisions (low 32-bit) - Expected 25389.0, actual 25549 (1.01x) (160) +Testing collisions (low 27-42 bits) - Worst is 40 bits: 106/99 (1.07x) +Testing distribution - Worst bias is the 20-bit window at bit 60 - 0.022% + +Keyset 'Text' - keys of form "XXXXFooBar" - 14776336 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 25389.0, actual 25373 (1.00x) (-16) +Testing collisions (high 27-42 bits) - Worst is 42 bits: 29/24 (1.17x) +Testing collisions (low 32-bit) - Expected 25389.0, actual 25204 (0.99x) (-185) +Testing collisions (low 27-42 bits) - Worst is 39 bits: 221/198 (1.11x) +Testing distribution - Worst bias is the 20-bit window at bit 28 - 0.020% + +Keyset 'Words' - 4000000 random keys of len 6-16 from alnum charset +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 1862.1, actual 1800 (0.97x) +Testing collisions (high 25-38 bits) - Worst is 37 bits: 65/58 (1.12x) +Testing collisions (low 32-bit) - Expected 1862.1, actual 1819 (0.98x) +Testing collisions (low 25-38 bits) - Worst is 34 bits: 484/465 (1.04x) +Testing distribution - Worst bias is the 19-bit window at bit 63 - 0.041% + +Keyset 'Words' - 4000000 random keys of len 6-16 from password charset +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 1862.1, actual 1827 (0.98x) (-35) +Testing collisions (high 25-38 bits) - Worst is 35 bits: 237/232 (1.02x) +Testing collisions (low 32-bit) - Expected 1862.1, actual 1885 (1.01x) (23) +Testing collisions (low 25-38 bits) - Worst is 35 bits: 237/232 (1.02x) +Testing distribution - Worst bias is the 19-bit window at bit 60 - 0.059% + +Keyset 'Words' - 102774 dict words +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 1.2, actual 0 (0.00x) +Testing collisions (high 20-27 bits) - Worst is 27 bits: 46/39 (1.17x) +Testing collisions (low 32-bit) - Expected 1.2, actual 1 (0.81x) +Testing collisions (low 20-27 bits) - Worst is 25 bits: 173/157 (1.10x) +Testing distribution - Worst bias is the 14-bit window at bit 35 - 0.340% + + +[[[ Keyset 'Zeroes' Tests ]]] + +Keyset 'Zeroes' - 204800 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 4.9, actual 6 (1.23x) (2) +Testing collisions (high 21-29 bits) - Worst is 25 bits: 651/623 (1.04x) +Testing collisions (low 32-bit) - Expected 4.9, actual 5 (1.02x) (1) +Testing collisions (low 21-29 bits) - Worst is 27 bits: 166/156 (1.06x) +Testing distribution - Worst bias is the 15-bit window at bit 55 - 0.298% + + +[[[ Keyset 'Seed' Tests ]]] + +Keyset 'Seed' - 5000000 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 2909.3, actual 2790 (0.96x) +Testing collisions (high 26-39 bits) - Worst is 26 bits: 181311/181723 (1.00x) +Testing collisions (low 32-bit) - Expected 2909.3, actual 2885 (0.99x) (-24) +Testing collisions (low 26-39 bits) - Worst is 39 bits: 33/22 (1.45x) +Testing distribution - Worst bias is the 19-bit window at bit 55 - 0.051% + + +[[[ Keyset 'PerlinNoise' Tests ]]] + +Testing 16777216 coordinates (L2) : +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 32725.4, actual 32807 (1.00x) (82) +Testing collisions (high 27-42 bits) - Worst is 39 bits: 266/255 (1.04x) +Testing collisions (low 32-bit) - Expected 32725.4, actual 33071 (1.01x) (346) +Testing collisions (low 27-42 bits) - Worst is 42 bits: 44/31 (1.38x) + +Testing AV variant, 128 count with 4 spacing, 4-12: +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 1116.2, actual 1124 (1.01x) (8) +Testing collisions (high 25-37 bits) - Worst is 36 bits: 83/69 (1.19x) +Testing collisions (low 32-bit) - Expected 1116.2, actual 1026 (0.92x) +Testing collisions (low 25-37 bits) - Worst is 27 bits: 35507/35452 (1.00x) + + +[[[ Diff 'Differential' Tests ]]] + +Testing 8303632 up-to-5-bit differentials in 64-bit keys -> 64 bit hashes. +1000 reps, 8303632000 total tests, expecting 0.00 random collisions.......... +0 total collisions, of which 0 single collisions were ignored + +Testing 11017632 up-to-4-bit differentials in 128-bit keys -> 64 bit hashes. +1000 reps, 11017632000 total tests, expecting 0.00 random collisions.......... +0 total collisions, of which 0 single collisions were ignored + +Testing 2796416 up-to-3-bit differentials in 256-bit keys -> 64 bit hashes. +1000 reps, 2796416000 total tests, expecting 0.00 random collisions.......... +0 total collisions, of which 0 single collisions were ignored + + +[[[ DiffDist 'Differential Distribution' Tests ]]] + +Testing bit 0 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 530 (1.04x) (19) +Testing collisions (high 24-36 bits) - Worst is 33 bits: 273/255 (1.07x) +Testing collisions (low 32-bit) - Expected 511.9, actual 537 (1.05x) (26) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 42/31 (1.31x) +Testing distribution - Worst bias is the 18-bit window at bit 10 - 0.083% + +Testing bit 1 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 518 (1.01x) (7) +Testing collisions (high 24-36 bits) - Worst is 32 bits: 518/511 (1.01x) +Testing collisions (low 32-bit) - Expected 511.9, actual 526 (1.03x) (15) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 36/31 (1.13x) +Testing distribution - Worst bias is the 18-bit window at bit 63 - 0.070% + +Testing bit 2 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 524 (1.02x) (13) +Testing collisions (high 24-36 bits) - Worst is 31 bits: 1063/1023 (1.04x) +Testing collisions (low 32-bit) - Expected 511.9, actual 528 (1.03x) (17) +Testing collisions (low 24-36 bits) - Worst is 31 bits: 1062/1023 (1.04x) +Testing distribution - Worst bias is the 18-bit window at bit 10 - 0.078% + +Testing bit 3 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 531 (1.04x) (20) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 68/63 (1.06x) +Testing collisions (low 32-bit) - Expected 511.9, actual 494 (0.97x) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 38/31 (1.19x) +Testing distribution - Worst bias is the 18-bit window at bit 14 - 0.059% + +Testing bit 4 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 519 (1.01x) (8) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 72/63 (1.13x) +Testing collisions (low 32-bit) - Expected 511.9, actual 492 (0.96x) +Testing collisions (low 24-36 bits) - Worst is 24 bits: 125969/125777 (1.00x) +Testing distribution - Worst bias is the 18-bit window at bit 6 - 0.068% + +Testing bit 5 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 498 (0.97x) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 35/31 (1.09x) +Testing collisions (low 32-bit) - Expected 511.9, actual 504 (0.98x) (-7) +Testing collisions (low 24-36 bits) - Worst is 35 bits: 75/63 (1.17x) +Testing distribution - Worst bias is the 18-bit window at bit 39 - 0.077% + +Testing bit 6 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 477 (0.93x) +Testing collisions (high 24-36 bits) - Worst is 34 bits: 134/127 (1.05x) +Testing collisions (low 32-bit) - Expected 511.9, actual 465 (0.91x) +Testing collisions (low 24-36 bits) - Worst is 26 bits: 32805/32429 (1.01x) +Testing distribution - Worst bias is the 18-bit window at bit 34 - 0.086% + +Testing bit 7 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 514 (1.00x) (3) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 34/31 (1.06x) +Testing collisions (low 32-bit) - Expected 511.9, actual 498 (0.97x) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 48/31 (1.50x) +Testing distribution - Worst bias is the 18-bit window at bit 33 - 0.090% + +Testing bit 8 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 474 (0.93x) +Testing collisions (high 24-36 bits) - Worst is 29 bits: 4132/4090 (1.01x) +Testing collisions (low 32-bit) - Expected 511.9, actual 483 (0.94x) +Testing collisions (low 24-36 bits) - Worst is 28 bits: 8305/8170 (1.02x) +Testing distribution - Worst bias is the 16-bit window at bit 37 - 0.063% + +Testing bit 9 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 481 (0.94x) +Testing collisions (high 24-36 bits) - Worst is 31 bits: 1048/1023 (1.02x) +Testing collisions (low 32-bit) - Expected 511.9, actual 501 (0.98x) +Testing collisions (low 24-36 bits) - Worst is 35 bits: 68/63 (1.06x) +Testing distribution - Worst bias is the 18-bit window at bit 24 - 0.065% + +Testing bit 10 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 504 (0.98x) (-7) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 37/31 (1.16x) +Testing collisions (low 32-bit) - Expected 511.9, actual 494 (0.97x) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 36/31 (1.13x) +Testing distribution - Worst bias is the 18-bit window at bit 43 - 0.068% + +Testing bit 11 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 509 (0.99x) (-2) +Testing collisions (high 24-36 bits) - Worst is 34 bits: 140/127 (1.09x) +Testing collisions (low 32-bit) - Expected 511.9, actual 572 (1.12x) (61) +Testing collisions (low 24-36 bits) - Worst is 32 bits: 572/511 (1.12x) +Testing distribution - Worst bias is the 18-bit window at bit 51 - 0.091% + +Testing bit 12 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 486 (0.95x) +Testing collisions (high 24-36 bits) - Worst is 24 bits: 125213/125777 (1.00x) +Testing collisions (low 32-bit) - Expected 511.9, actual 520 (1.02x) (9) +Testing collisions (low 24-36 bits) - Worst is 31 bits: 1043/1023 (1.02x) +Testing distribution - Worst bias is the 18-bit window at bit 6 - 0.083% + +Testing bit 13 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 547 (1.07x) (36) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 78/63 (1.22x) +Testing collisions (low 32-bit) - Expected 511.9, actual 515 (1.01x) (4) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 35/31 (1.09x) +Testing distribution - Worst bias is the 18-bit window at bit 32 - 0.074% + +Testing bit 14 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 457 (0.89x) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 72/63 (1.13x) +Testing collisions (low 32-bit) - Expected 511.9, actual 509 (0.99x) (-2) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 35/31 (1.09x) +Testing distribution - Worst bias is the 18-bit window at bit 24 - 0.084% + +Testing bit 15 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 510 (1.00x) (-1) +Testing collisions (high 24-36 bits) - Worst is 30 bits: 2133/2046 (1.04x) +Testing collisions (low 32-bit) - Expected 511.9, actual 476 (0.93x) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 37/31 (1.16x) +Testing distribution - Worst bias is the 18-bit window at bit 52 - 0.071% + +Testing bit 16 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 503 (0.98x) (-8) +Testing collisions (high 24-36 bits) - Worst is 28 bits: 8161/8170 (1.00x) +Testing collisions (low 32-bit) - Expected 511.9, actual 508 (0.99x) (-3) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 38/31 (1.19x) +Testing distribution - Worst bias is the 18-bit window at bit 49 - 0.062% + +Testing bit 17 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 513 (1.00x) (2) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 41/31 (1.28x) +Testing collisions (low 32-bit) - Expected 511.9, actual 520 (1.02x) (9) +Testing collisions (low 24-36 bits) - Worst is 33 bits: 279/255 (1.09x) +Testing distribution - Worst bias is the 18-bit window at bit 50 - 0.070% + +Testing bit 18 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 546 (1.07x) (35) +Testing collisions (high 24-36 bits) - Worst is 33 bits: 283/255 (1.11x) +Testing collisions (low 32-bit) - Expected 511.9, actual 487 (0.95x) +Testing collisions (low 24-36 bits) - Worst is 28 bits: 8185/8170 (1.00x) +Testing distribution - Worst bias is the 18-bit window at bit 22 - 0.058% + +Testing bit 19 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 514 (1.00x) (3) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 37/31 (1.16x) +Testing collisions (low 32-bit) - Expected 511.9, actual 498 (0.97x) +Testing collisions (low 24-36 bits) - Worst is 24 bits: 125639/125777 (1.00x) +Testing distribution - Worst bias is the 18-bit window at bit 54 - 0.082% + +Testing bit 20 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 525 (1.03x) (14) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 74/63 (1.16x) +Testing collisions (low 32-bit) - Expected 511.9, actual 541 (1.06x) (30) +Testing collisions (low 24-36 bits) - Worst is 30 bits: 2173/2046 (1.06x) +Testing distribution - Worst bias is the 18-bit window at bit 10 - 0.062% + +Testing bit 21 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 510 (1.00x) (-1) +Testing collisions (high 24-36 bits) - Worst is 33 bits: 275/255 (1.07x) +Testing collisions (low 32-bit) - Expected 511.9, actual 517 (1.01x) (6) +Testing collisions (low 24-36 bits) - Worst is 34 bits: 135/127 (1.05x) +Testing distribution - Worst bias is the 17-bit window at bit 29 - 0.059% + +Testing bit 22 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 505 (0.99x) (-6) +Testing collisions (high 24-36 bits) - Worst is 27 bits: 16472/16298 (1.01x) +Testing collisions (low 32-bit) - Expected 511.9, actual 529 (1.03x) (18) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 39/31 (1.22x) +Testing distribution - Worst bias is the 18-bit window at bit 45 - 0.071% + +Testing bit 23 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 526 (1.03x) (15) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 38/31 (1.19x) +Testing collisions (low 32-bit) - Expected 511.9, actual 542 (1.06x) (31) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 43/31 (1.34x) +Testing distribution - Worst bias is the 18-bit window at bit 57 - 0.070% + +Testing bit 24 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 515 (1.01x) (4) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 38/31 (1.19x) +Testing collisions (low 32-bit) - Expected 511.9, actual 532 (1.04x) (21) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 38/31 (1.19x) +Testing distribution - Worst bias is the 18-bit window at bit 50 - 0.060% + +Testing bit 25 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 511 (1.00x) +Testing collisions (high 24-36 bits) - Worst is 28 bits: 8353/8170 (1.02x) +Testing collisions (low 32-bit) - Expected 511.9, actual 497 (0.97x) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 42/31 (1.31x) +Testing distribution - Worst bias is the 18-bit window at bit 4 - 0.067% + +Testing bit 26 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 499 (0.97x) +Testing collisions (high 24-36 bits) - Worst is 34 bits: 132/127 (1.03x) +Testing collisions (low 32-bit) - Expected 511.9, actual 538 (1.05x) (27) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 40/31 (1.25x) +Testing distribution - Worst bias is the 18-bit window at bit 24 - 0.073% + +Testing bit 27 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 533 (1.04x) (22) +Testing collisions (high 24-36 bits) - Worst is 32 bits: 533/511 (1.04x) +Testing collisions (low 32-bit) - Expected 511.9, actual 485 (0.95x) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 36/31 (1.13x) +Testing distribution - Worst bias is the 18-bit window at bit 10 - 0.105% + +Testing bit 28 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 532 (1.04x) (21) +Testing collisions (high 24-36 bits) - Worst is 34 bits: 136/127 (1.06x) +Testing collisions (low 32-bit) - Expected 511.9, actual 506 (0.99x) (-5) +Testing collisions (low 24-36 bits) - Worst is 33 bits: 265/255 (1.04x) +Testing distribution - Worst bias is the 18-bit window at bit 63 - 0.073% + +Testing bit 29 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 494 (0.97x) +Testing collisions (high 24-36 bits) - Worst is 29 bits: 4145/4090 (1.01x) +Testing collisions (low 32-bit) - Expected 511.9, actual 492 (0.96x) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 35/31 (1.09x) +Testing distribution - Worst bias is the 18-bit window at bit 51 - 0.081% + +Testing bit 30 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 505 (0.99x) (-6) +Testing collisions (high 24-36 bits) - Worst is 26 bits: 32853/32429 (1.01x) +Testing collisions (low 32-bit) - Expected 511.9, actual 500 (0.98x) +Testing collisions (low 24-36 bits) - Worst is 30 bits: 2081/2046 (1.02x) +Testing distribution - Worst bias is the 18-bit window at bit 4 - 0.073% + +Testing bit 31 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 503 (0.98x) (-8) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 37/31 (1.16x) +Testing collisions (low 32-bit) - Expected 511.9, actual 503 (0.98x) (-8) +Testing collisions (low 24-36 bits) - Worst is 26 bits: 32504/32429 (1.00x) +Testing distribution - Worst bias is the 18-bit window at bit 48 - 0.068% + +Testing bit 32 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 536 (1.05x) (25) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 69/63 (1.08x) +Testing collisions (low 32-bit) - Expected 511.9, actual 526 (1.03x) (15) +Testing collisions (low 24-36 bits) - Worst is 33 bits: 274/255 (1.07x) +Testing distribution - Worst bias is the 18-bit window at bit 29 - 0.072% + +Testing bit 33 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 500 (0.98x) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 39/31 (1.22x) +Testing collisions (low 32-bit) - Expected 511.9, actual 562 (1.10x) (51) +Testing collisions (low 24-36 bits) - Worst is 33 bits: 292/255 (1.14x) +Testing distribution - Worst bias is the 18-bit window at bit 19 - 0.116% + +Testing bit 34 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 569 (1.11x) (58) +Testing collisions (high 24-36 bits) - Worst is 34 bits: 151/127 (1.18x) +Testing collisions (low 32-bit) - Expected 511.9, actual 529 (1.03x) (18) +Testing collisions (low 24-36 bits) - Worst is 31 bits: 1087/1023 (1.06x) +Testing distribution - Worst bias is the 18-bit window at bit 42 - 0.070% + +Testing bit 35 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 518 (1.01x) (7) +Testing collisions (high 24-36 bits) - Worst is 29 bits: 4155/4090 (1.02x) +Testing collisions (low 32-bit) - Expected 511.9, actual 546 (1.07x) (35) +Testing collisions (low 24-36 bits) - Worst is 34 bits: 149/127 (1.16x) +Testing distribution - Worst bias is the 18-bit window at bit 9 - 0.097% + +Testing bit 36 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 519 (1.01x) (8) +Testing collisions (high 24-36 bits) - Worst is 31 bits: 1084/1023 (1.06x) +Testing collisions (low 32-bit) - Expected 511.9, actual 502 (0.98x) (-9) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 35/31 (1.09x) +Testing distribution - Worst bias is the 18-bit window at bit 59 - 0.069% + +Testing bit 37 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 542 (1.06x) (31) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 81/63 (1.27x) +Testing collisions (low 32-bit) - Expected 511.9, actual 544 (1.06x) (33) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 37/31 (1.16x) +Testing distribution - Worst bias is the 17-bit window at bit 36 - 0.069% + +Testing bit 38 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 516 (1.01x) (5) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 67/63 (1.05x) +Testing collisions (low 32-bit) - Expected 511.9, actual 486 (0.95x) +Testing collisions (low 24-36 bits) - Worst is 27 bits: 16424/16298 (1.01x) +Testing distribution - Worst bias is the 18-bit window at bit 16 - 0.116% + +Testing bit 39 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 516 (1.01x) (5) +Testing collisions (high 24-36 bits) - Worst is 34 bits: 139/127 (1.09x) +Testing collisions (low 32-bit) - Expected 511.9, actual 536 (1.05x) (25) +Testing collisions (low 24-36 bits) - Worst is 35 bits: 70/63 (1.09x) +Testing distribution - Worst bias is the 18-bit window at bit 43 - 0.066% + +Testing bit 40 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 533 (1.04x) (22) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 35/31 (1.09x) +Testing collisions (low 32-bit) - Expected 511.9, actual 540 (1.05x) (29) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 40/31 (1.25x) +Testing distribution - Worst bias is the 18-bit window at bit 25 - 0.065% + +Testing bit 41 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 501 (0.98x) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 33/31 (1.03x) +Testing collisions (low 32-bit) - Expected 511.9, actual 548 (1.07x) (37) +Testing collisions (low 24-36 bits) - Worst is 33 bits: 277/255 (1.08x) +Testing distribution - Worst bias is the 18-bit window at bit 60 - 0.091% + +Testing bit 42 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 516 (1.01x) (5) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 39/31 (1.22x) +Testing collisions (low 32-bit) - Expected 511.9, actual 553 (1.08x) (42) +Testing collisions (low 24-36 bits) - Worst is 32 bits: 553/511 (1.08x) +Testing distribution - Worst bias is the 18-bit window at bit 23 - 0.057% + +Testing bit 43 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 545 (1.06x) (34) +Testing collisions (high 24-36 bits) - Worst is 32 bits: 545/511 (1.06x) +Testing collisions (low 32-bit) - Expected 511.9, actual 497 (0.97x) +Testing collisions (low 24-36 bits) - Worst is 28 bits: 8234/8170 (1.01x) +Testing distribution - Worst bias is the 18-bit window at bit 61 - 0.090% + +Testing bit 44 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 461 (0.90x) +Testing collisions (high 24-36 bits) - Worst is 24 bits: 125866/125777 (1.00x) +Testing collisions (low 32-bit) - Expected 511.9, actual 526 (1.03x) (15) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 38/31 (1.19x) +Testing distribution - Worst bias is the 18-bit window at bit 10 - 0.043% + +Testing bit 45 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 551 (1.08x) (40) +Testing collisions (high 24-36 bits) - Worst is 32 bits: 551/511 (1.08x) +Testing collisions (low 32-bit) - Expected 511.9, actual 512 (1.00x) (1) +Testing collisions (low 24-36 bits) - Worst is 35 bits: 65/63 (1.02x) +Testing distribution - Worst bias is the 17-bit window at bit 52 - 0.060% + +Testing bit 46 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 506 (0.99x) (-5) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 67/63 (1.05x) +Testing collisions (low 32-bit) - Expected 511.9, actual 490 (0.96x) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 36/31 (1.13x) +Testing distribution - Worst bias is the 18-bit window at bit 21 - 0.079% + +Testing bit 47 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 536 (1.05x) (25) +Testing collisions (high 24-36 bits) - Worst is 33 bits: 282/255 (1.10x) +Testing collisions (low 32-bit) - Expected 511.9, actual 483 (0.94x) +Testing collisions (low 24-36 bits) - Worst is 35 bits: 70/63 (1.09x) +Testing distribution - Worst bias is the 18-bit window at bit 9 - 0.079% + +Testing bit 48 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 527 (1.03x) (16) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 72/63 (1.13x) +Testing collisions (low 32-bit) - Expected 511.9, actual 503 (0.98x) (-8) +Testing collisions (low 24-36 bits) - Worst is 35 bits: 70/63 (1.09x) +Testing distribution - Worst bias is the 18-bit window at bit 56 - 0.081% + +Testing bit 49 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 560 (1.09x) (49) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 74/63 (1.16x) +Testing collisions (low 32-bit) - Expected 511.9, actual 523 (1.02x) (12) +Testing collisions (low 24-36 bits) - Worst is 33 bits: 263/255 (1.03x) +Testing distribution - Worst bias is the 17-bit window at bit 41 - 0.058% + +Testing bit 50 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 522 (1.02x) (11) +Testing collisions (high 24-36 bits) - Worst is 33 bits: 271/255 (1.06x) +Testing collisions (low 32-bit) - Expected 511.9, actual 519 (1.01x) (8) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 40/31 (1.25x) +Testing distribution - Worst bias is the 18-bit window at bit 39 - 0.079% + +Testing bit 51 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 531 (1.04x) (20) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 76/63 (1.19x) +Testing collisions (low 32-bit) - Expected 511.9, actual 489 (0.96x) +Testing collisions (low 24-36 bits) - Worst is 29 bits: 4122/4090 (1.01x) +Testing distribution - Worst bias is the 18-bit window at bit 6 - 0.071% + +Testing bit 52 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 512 (1.00x) (1) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 67/63 (1.05x) +Testing collisions (low 32-bit) - Expected 511.9, actual 562 (1.10x) (51) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 46/31 (1.44x) +Testing distribution - Worst bias is the 18-bit window at bit 15 - 0.055% + +Testing bit 53 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 501 (0.98x) +Testing collisions (high 24-36 bits) - Worst is 29 bits: 4137/4090 (1.01x) +Testing collisions (low 32-bit) - Expected 511.9, actual 535 (1.05x) (24) +Testing collisions (low 24-36 bits) - Worst is 32 bits: 535/511 (1.05x) +Testing distribution - Worst bias is the 18-bit window at bit 62 - 0.093% + +Testing bit 54 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 465 (0.91x) +Testing collisions (high 24-36 bits) - Worst is 27 bits: 16437/16298 (1.01x) +Testing collisions (low 32-bit) - Expected 511.9, actual 515 (1.01x) (4) +Testing collisions (low 24-36 bits) - Worst is 34 bits: 139/127 (1.09x) +Testing distribution - Worst bias is the 18-bit window at bit 46 - 0.076% + +Testing bit 55 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 555 (1.08x) (44) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 39/31 (1.22x) +Testing collisions (low 32-bit) - Expected 511.9, actual 491 (0.96x) +Testing collisions (low 24-36 bits) - Worst is 34 bits: 138/127 (1.08x) +Testing distribution - Worst bias is the 18-bit window at bit 52 - 0.074% + +Testing bit 56 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 539 (1.05x) (28) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 36/31 (1.13x) +Testing collisions (low 32-bit) - Expected 511.9, actual 533 (1.04x) (22) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 39/31 (1.22x) +Testing distribution - Worst bias is the 18-bit window at bit 31 - 0.108% + +Testing bit 57 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 513 (1.00x) (2) +Testing collisions (high 24-36 bits) - Worst is 33 bits: 272/255 (1.06x) +Testing collisions (low 32-bit) - Expected 511.9, actual 522 (1.02x) (11) +Testing collisions (low 24-36 bits) - Worst is 35 bits: 68/63 (1.06x) +Testing distribution - Worst bias is the 18-bit window at bit 8 - 0.114% + +Testing bit 58 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 514 (1.00x) (3) +Testing collisions (high 24-36 bits) - Worst is 28 bits: 8230/8170 (1.01x) +Testing collisions (low 32-bit) - Expected 511.9, actual 545 (1.06x) (34) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 43/31 (1.34x) +Testing distribution - Worst bias is the 18-bit window at bit 7 - 0.092% + +Testing bit 59 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 500 (0.98x) +Testing collisions (high 24-36 bits) - Worst is 30 bits: 2120/2046 (1.04x) +Testing collisions (low 32-bit) - Expected 511.9, actual 503 (0.98x) (-8) +Testing collisions (low 24-36 bits) - Worst is 35 bits: 69/63 (1.08x) +Testing distribution - Worst bias is the 18-bit window at bit 31 - 0.065% + +Testing bit 60 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 496 (0.97x) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 65/63 (1.02x) +Testing collisions (low 32-bit) - Expected 511.9, actual 486 (0.95x) +Testing collisions (low 24-36 bits) - Worst is 29 bits: 4218/4090 (1.03x) +Testing distribution - Worst bias is the 18-bit window at bit 22 - 0.081% + +Testing bit 61 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 520 (1.02x) (9) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 67/63 (1.05x) +Testing collisions (low 32-bit) - Expected 511.9, actual 486 (0.95x) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 39/31 (1.22x) +Testing distribution - Worst bias is the 18-bit window at bit 6 - 0.064% + +Testing bit 62 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 522 (1.02x) (11) +Testing collisions (high 24-36 bits) - Worst is 32 bits: 522/511 (1.02x) +Testing collisions (low 32-bit) - Expected 511.9, actual 533 (1.04x) (22) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 35/31 (1.09x) +Testing distribution - Worst bias is the 18-bit window at bit 52 - 0.084% + +Testing bit 63 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 498 (0.97x) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 34/31 (1.06x) +Testing collisions (low 32-bit) - Expected 511.9, actual 496 (0.97x) +Testing collisions (low 24-36 bits) - Worst is 30 bits: 2053/2046 (1.00x) +Testing distribution - Worst bias is the 18-bit window at bit 53 - 0.104% + + +[[[ MomentChi2 Tests ]]] + +Analyze hashes produced from a serie of linearly increasing numbers of 32-bit, using a step of 2 ... +Target values to approximate : 38918200.000000 - 273633.333333 +4 threads starting... done +Popcount 1 stats : 38918835.315783 - 273623.606930 +Popcount 0 stats : 38918226.200577 - 273605.413971 +MomentChi2 for bits 1 : 0.737544 +MomentChi2 for bits 0 : 0.00125443 + +Derivative stats (transition from 2 consecutive values) : +Popcount 1 stats : 38919083.803108 - 273655.817065 +Popcount 0 stats : 38919331.387736 - 273661.792772 +MomentChi2 for deriv b1 : 1.42723 +MomentChi2 for deriv b0 : 2.33884 + + Great + + +[[[ Prng Tests ]]] + +Generating 33554432 random numbers : +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 130731.3, actual 131908 (1.01x) (1177) +Testing collisions (high 28-44 bits) - Worst is 37 bits: 4198/4095 (1.02x) +Testing collisions (low 32-bit) - Expected 130731.3, actual 131430 (1.01x) (699) +Testing collisions (low 28-44 bits) - Worst is 42 bits: 144/127 (1.13x) + +[[[ BadSeeds Tests ]]] + +Testing 0 internal secrets: +0x0 PASS + + +Input vcode 0x00000001, Output vcode 0x00000001, Result vcode 0x00000001 +Verification value is 0x00000001 - Testing took 631.594488 seconds +------------------------------------------------------------------------------- diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/smhasher/fallbackOutput.txt b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/smhasher/fallbackOutput.txt new file mode 100644 index 0000000..28f4930 --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/smhasher/fallbackOutput.txt @@ -0,0 +1,1516 @@ +------------------------------------------------------------------------------- +--- Testing ahash64 "ahash 64bit" GOOD + +[[[ Sanity Tests ]]] + +Verification value 0xE15404B7 ....... SKIP (self- or unseeded) +Running sanity check 1 .......... PASS +Running AppendedZeroesTest .......... PASS + +[[[ Speed Tests ]]] + +Bulk speed test - 262144-byte keys +Alignment 7 - 7.097 bytes/cycle - 20304.54 MiB/sec @ 3 ghz +Alignment 6 - 7.075 bytes/cycle - 20242.50 MiB/sec @ 3 ghz +Alignment 5 - 7.070 bytes/cycle - 20228.27 MiB/sec @ 3 ghz +Alignment 4 - 7.079 bytes/cycle - 20253.31 MiB/sec @ 3 ghz +Alignment 3 - 7.053 bytes/cycle - 20178.99 MiB/sec @ 3 ghz +Alignment 2 - 7.059 bytes/cycle - 20194.86 MiB/sec @ 3 ghz +Alignment 1 - 7.066 bytes/cycle - 20215.71 MiB/sec @ 3 ghz +Alignment 0 - 7.166 bytes/cycle - 20501.12 MiB/sec @ 3 ghz +Average - 7.083 bytes/cycle - 20264.91 MiB/sec @ 3 ghz + +Small key speed test - 1-byte keys - 13.92 cycles/hash +Small key speed test - 2-byte keys - 13.98 cycles/hash +Small key speed test - 3-byte keys - 13.98 cycles/hash +Small key speed test - 4-byte keys - 13.99 cycles/hash +Small key speed test - 5-byte keys - 13.98 cycles/hash +Small key speed test - 6-byte keys - 13.98 cycles/hash +Small key speed test - 7-byte keys - 13.99 cycles/hash +Small key speed test - 8-byte keys - 13.98 cycles/hash +Small key speed test - 9-byte keys - 13.25 cycles/hash +Small key speed test - 10-byte keys - 13.25 cycles/hash +Small key speed test - 11-byte keys - 13.26 cycles/hash +Small key speed test - 12-byte keys - 13.26 cycles/hash +Small key speed test - 13-byte keys - 13.30 cycles/hash +Small key speed test - 14-byte keys - 13.26 cycles/hash +Small key speed test - 15-byte keys - 13.63 cycles/hash +Small key speed test - 16-byte keys - 13.70 cycles/hash +Small key speed test - 17-byte keys - 21.55 cycles/hash +Small key speed test - 18-byte keys - 27.87 cycles/hash +Small key speed test - 19-byte keys - 27.96 cycles/hash +Small key speed test - 20-byte keys - 14.57 cycles/hash +Small key speed test - 21-byte keys - 15.23 cycles/hash +Small key speed test - 22-byte keys - 15.56 cycles/hash +Small key speed test - 23-byte keys - 15.67 cycles/hash +Small key speed test - 24-byte keys - 15.60 cycles/hash +Small key speed test - 25-byte keys - 15.67 cycles/hash +Small key speed test - 26-byte keys - 15.69 cycles/hash +Small key speed test - 27-byte keys - 15.68 cycles/hash +Small key speed test - 28-byte keys - 15.69 cycles/hash +Small key speed test - 29-byte keys - 16.94 cycles/hash +Small key speed test - 30-byte keys - 16.95 cycles/hash +Small key speed test - 31-byte keys - 16.95 cycles/hash +Average 15.688 cycles/hash + +[[[ 'Hashmap' Speed Tests ]]] + +std::unordered_map +Init std HashMapTest: 343.665 cycles/op (102401 inserts, 1% deletions) +Running std HashMapTest: 122.429 cycles/op (1.9 stdv) + +greg7mdp/parallel-hashmap +Init fast HashMapTest: 119.334 cycles/op (102401 inserts, 1% deletions) +Running fast HashMapTest: 84.563 cycles/op (1.5 stdv) ....... PASS + +[[[ Avalanche Tests ]]] + +Testing 24-bit keys -> 64-bit hashes, 300000 reps worst bias is 0.784000% +Testing 32-bit keys -> 64-bit hashes, 300000 reps worst bias is 0.640667% +Testing 40-bit keys -> 64-bit hashes, 300000 reps worst bias is 0.592000% +Testing 48-bit keys -> 64-bit hashes, 300000 reps worst bias is 0.704667% +Testing 56-bit keys -> 64-bit hashes, 300000 reps worst bias is 0.772667% +Testing 64-bit keys -> 64-bit hashes, 300000 reps worst bias is 0.766000% +Testing 72-bit keys -> 64-bit hashes, 300000 reps worst bias is 0.738667% +Testing 80-bit keys -> 64-bit hashes, 300000 reps worst bias is 0.665333% +Testing 96-bit keys -> 64-bit hashes, 300000 reps worst bias is 0.744000% +Testing 112-bit keys -> 64-bit hashes, 300000 reps worst bias is 0.706000% +Testing 128-bit keys -> 64-bit hashes, 300000 reps worst bias is 0.731333% +Testing 160-bit keys -> 64-bit hashes, 300000 reps worst bias is 0.685333% +Testing 512-bit keys -> 64-bit hashes, 300000 reps worst bias is 0.830667% +Testing 1024-bit keys -> 64-bit hashes, 300000 reps worst bias is 0.796000% + +[[[ Keyset 'Sparse' Tests ]]] + +Keyset 'Sparse' - 16-bit keys with up to 9 bits set - 50643 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 0.3, actual 0 (0.00x) +Testing collisions (high 19-25 bits) - Worst is 25 bits: 48/38 (1.26x) +Testing collisions (high 12-bit) - Expected 46547.0, actual 46547 (1.00x) +Testing collisions (high 8-bit) - Expected 50387.0, actual 50387 (1.00x) +Testing collisions (low 32-bit) - Expected 0.3, actual 0 (0.00x) +Testing collisions (low 19-25 bits) - Worst is 23 bits: 170/152 (1.11x) +Testing collisions (low 12-bit) - Expected 46547.0, actual 46547 (1.00x) +Testing collisions (low 8-bit) - Expected 50387.0, actual 50387 (1.00x) +Testing distribution - Worst bias is the 13-bit window at bit 26 - 0.598% + +Keyset 'Sparse' - 24-bit keys with up to 8 bits set - 1271626 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 188.2, actual 193 (1.03x) (5) +Testing collisions (high 24-35 bits) - Worst is 32 bits: 193/188 (1.03x) +Testing collisions (high 12-bit) - Expected 1267530.0, actual 1267530 (1.00x) +Testing collisions (high 8-bit) - Expected 1271370.0, actual 1271370 (1.00x) +Testing collisions (low 32-bit) - Expected 188.2, actual 154 (0.82x) +Testing collisions (low 24-35 bits) - Worst is 26 bits: 11981/12047 (0.99x) +Testing collisions (low 12-bit) - Expected 1267530.0, actual 1267530 (1.00x) +Testing collisions (low 8-bit) - Expected 1271370.0, actual 1271370 (1.00x) +Testing distribution - Worst bias is the 17-bit window at bit 26 - 0.074% + +Keyset 'Sparse' - 32-bit keys with up to 7 bits set - 4514873 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 2373.0, actual 2361 (0.99x) (-12) +Testing collisions (high 25-38 bits) - Worst is 37 bits: 84/74 (1.13x) +Testing collisions (high 12-bit) - Expected 4510777.0, actual 4510777 (1.00x) +Testing collisions (high 8-bit) - Expected 4514617.0, actual 4514617 (1.00x) +Testing collisions (low 32-bit) - Expected 2373.0, actual 2372 (1.00x) (-1) +Testing collisions (low 25-38 bits) - Worst is 33 bits: 1215/1186 (1.02x) +Testing collisions (low 12-bit) - Expected 4510777.0, actual 4510777 (1.00x) +Testing collisions (low 8-bit) - Expected 4514617.0, actual 4514617 (1.00x) +Testing distribution - Worst bias is the 19-bit window at bit 62 - 0.060% + +Keyset 'Sparse' - 40-bit keys with up to 6 bits set - 4598479 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 2461.7, actual 2479 (1.01x) (18) +Testing collisions (high 25-38 bits) - Worst is 36 bits: 160/153 (1.04x) +Testing collisions (high 12-bit) - Expected 4594383.0, actual 4594383 (1.00x) +Testing collisions (high 8-bit) - Expected 4598223.0, actual 4598223 (1.00x) +Testing collisions (low 32-bit) - Expected 2461.7, actual 2461 (1.00x) +Testing collisions (low 25-38 bits) - Worst is 30 bits: 9912/9846 (1.01x) +Testing collisions (low 12-bit) - Expected 4594383.0, actual 4594383 (1.00x) +Testing collisions (low 8-bit) - Expected 4598223.0, actual 4598223 (1.00x) +Testing distribution - Worst bias is the 19-bit window at bit 37 - 0.049% + +Keyset 'Sparse' - 48-bit keys with up to 6 bits set - 14196869 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 23463.6, actual 23570 (1.00x) (107) +Testing collisions (high 27-42 bits) - Worst is 41 bits: 60/45 (1.31x) +Testing collisions (high 12-bit) - Expected 14192773.0, actual 14192773 (1.00x) +Testing collisions (high 8-bit) - Expected 14196613.0, actual 14196613 (1.00x) +Testing collisions (low 32-bit) - Expected 23463.6, actual 23383 (1.00x) (-80) +Testing collisions (low 27-42 bits) - Worst is 42 bits: 27/22 (1.18x) +Testing collisions (low 12-bit) - Expected 14192773.0, actual 14192773 (1.00x) +Testing collisions (low 8-bit) - Expected 14196613.0, actual 14196613 (1.00x) +Testing distribution - Worst bias is the 20-bit window at bit 27 - 0.021% + +Keyset 'Sparse' - 56-bit keys with up to 5 bits set - 4216423 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 2069.7, actual 2105 (1.02x) (36) +Testing collisions (high 25-38 bits) - Worst is 33 bits: 1070/1034 (1.03x) +Testing collisions (high 12-bit) - Expected 4212327.0, actual 4212327 (1.00x) +Testing collisions (high 8-bit) - Expected 4216167.0, actual 4216167 (1.00x) +Testing collisions (low 32-bit) - Expected 2069.7, actual 2124 (1.03x) (55) +Testing collisions (low 25-38 bits) - Worst is 34 bits: 557/517 (1.08x) +Testing collisions (low 12-bit) - Expected 4212327.0, actual 4212327 (1.00x) +Testing collisions (low 8-bit) - Expected 4216167.0, actual 4216167 (1.00x) +Testing distribution - Worst bias is the 19-bit window at bit 31 - 0.057% + +Keyset 'Sparse' - 64-bit keys with up to 5 bits set - 8303633 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8026.9, actual 7860 (0.98x) +Testing collisions (high 26-40 bits) - Worst is 30 bits: 31911/32107 (0.99x) +Testing collisions (high 12-bit) - Expected 8299537.0, actual 8299537 (1.00x) +Testing collisions (high 8-bit) - Expected 8303377.0, actual 8303377 (1.00x) +Testing collisions (low 32-bit) - Expected 8026.9, actual 7934 (0.99x) (-92) +Testing collisions (low 26-40 bits) - Worst is 39 bits: 78/62 (1.24x) +Testing collisions (low 12-bit) - Expected 8299537.0, actual 8299537 (1.00x) +Testing collisions (low 8-bit) - Expected 8303377.0, actual 8303377 (1.00x) +Testing distribution - Worst bias is the 20-bit window at bit 38 - 0.047% + +Keyset 'Sparse' - 72-bit keys with up to 5 bits set - 15082603 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 26482.7, actual 26535 (1.00x) (53) +Testing collisions (high 27-42 bits) - Worst is 42 bits: 30/25 (1.16x) +Testing collisions (high 12-bit) - Expected 15078507.0, actual 15078507 (1.00x) +Testing collisions (high 8-bit) - Expected 15082347.0, actual 15082347 (1.00x) +Testing collisions (low 32-bit) - Expected 26482.7, actual 26509 (1.00x) (27) +Testing collisions (low 27-42 bits) - Worst is 39 bits: 218/206 (1.05x) +Testing collisions (low 12-bit) - Expected 15078507.0, actual 15078507 (1.00x) +Testing collisions (low 8-bit) - Expected 15082347.0, actual 15082347 (1.00x) +Testing distribution - Worst bias is the 20-bit window at bit 34 - 0.022% + +Keyset 'Sparse' - 96-bit keys with up to 4 bits set - 3469497 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 1401.3, actual 1459 (1.04x) (58) +Testing collisions (high 25-38 bits) - Worst is 38 bits: 29/21 (1.32x) +Testing collisions (high 12-bit) - Expected 3465401.0, actual 3465401 (1.00x) +Testing collisions (high 8-bit) - Expected 3469241.0, actual 3469241 (1.00x) +Testing collisions (low 32-bit) - Expected 1401.3, actual 1445 (1.03x) (44) +Testing collisions (low 25-38 bits) - Worst is 38 bits: 27/21 (1.23x) +Testing collisions (low 12-bit) - Expected 3465401.0, actual 3465401 (1.00x) +Testing collisions (low 8-bit) - Expected 3469241.0, actual 3469241 (1.00x) +Testing distribution - Worst bias is the 19-bit window at bit 54 - 0.068% + +Keyset 'Sparse' - 160-bit keys with up to 4 bits set - 26977161 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 84723.3, actual 85179 (1.01x) (456) +Testing collisions (high 28-44 bits) - Worst is 38 bits: 1340/1323 (1.01x) +Testing collisions (high 12-bit) - Expected 26973065.0, actual 26973065 (1.00x) +Testing collisions (high 8-bit) - Expected 26976905.0, actual 26976905 (1.00x) +Testing collisions (low 32-bit) - Expected 84723.3, actual 84918 (1.00x) (195) +Testing collisions (low 28-44 bits) - Worst is 44 bits: 28/20 (1.35x) +Testing collisions (low 12-bit) - Expected 26973065.0, actual 26973065 (1.00x) +Testing collisions (low 8-bit) - Expected 26976905.0, actual 26976905 (1.00x) +Testing distribution - Worst bias is the 20-bit window at bit 47 - 0.014% + +Keyset 'Sparse' - 256-bit keys with up to 3 bits set - 2796417 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 910.4, actual 867 (0.95x) +Testing collisions (high 25-37 bits) - Worst is 37 bits: 31/28 (1.09x) +Testing collisions (high 12-bit) - Expected 2792321.0, actual 2792321 (1.00x) +Testing collisions (high 8-bit) - Expected 2796161.0, actual 2796161 (1.00x) +Testing collisions (low 32-bit) - Expected 910.4, actual 947 (1.04x) (37) +Testing collisions (low 25-37 bits) - Worst is 34 bits: 238/227 (1.05x) +Testing collisions (low 12-bit) - Expected 2792321.0, actual 2792321 (1.00x) +Testing collisions (low 8-bit) - Expected 2796161.0, actual 2796161 (1.00x) +Testing distribution - Worst bias is the 19-bit window at bit 41 - 0.082% + +Keyset 'Sparse' - 512-bit keys with up to 3 bits set - 22370049 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 58256.4, actual 58441 (1.00x) (185) +Testing collisions (high 28-43 bits) - Worst is 43 bits: 43/28 (1.51x) +Testing collisions (high 12-bit) - Expected 22365953.0, actual 22365953 (1.00x) +Testing collisions (high 8-bit) - Expected 22369793.0, actual 22369793 (1.00x) +Testing collisions (low 32-bit) - Expected 58256.4, actual 58230 (1.00x) (-26) +Testing collisions (low 28-43 bits) - Worst is 40 bits: 241/227 (1.06x) +Testing collisions (low 12-bit) - Expected 22365953.0, actual 22365953 (1.00x) +Testing collisions (low 8-bit) - Expected 22369793.0, actual 22369793 (1.00x) +Testing distribution - Worst bias is the 20-bit window at bit 43 - 0.013% + +Keyset 'Sparse' - 1024-bit keys with up to 2 bits set - 524801 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 32.1, actual 38 (1.19x) (6) +Testing collisions (high 22-32 bits) - Worst is 32 bits: 38/32 (1.19x) +Testing collisions (high 12-bit) - Expected 520705.0, actual 520705 (1.00x) +Testing collisions (high 8-bit) - Expected 524545.0, actual 524545 (1.00x) +Testing collisions (low 32-bit) - Expected 32.1, actual 33 (1.03x) (1) +Testing collisions (low 22-32 bits) - Worst is 31 bits: 72/64 (1.12x) +Testing collisions (low 12-bit) - Expected 520705.0, actual 520705 (1.00x) +Testing collisions (low 8-bit) - Expected 524545.0, actual 524545 (1.00x) +Testing distribution - Worst bias is the 16-bit window at bit 38 - 0.117% + +Keyset 'Sparse' - 2048-bit keys with up to 2 bits set - 2098177 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.5, actual 536 (1.05x) (24) +Testing collisions (high 24-36 bits) - Worst is 32 bits: 536/512 (1.05x) +Testing collisions (high 12-bit) - Expected 2094081.0, actual 2094081 (1.00x) +Testing collisions (high 8-bit) - Expected 2097921.0, actual 2097921 (1.00x) +Testing collisions (low 32-bit) - Expected 512.5, actual 492 (0.96x) +Testing collisions (low 24-36 bits) - Worst is 27 bits: 16444/16400 (1.00x) +Testing collisions (low 12-bit) - Expected 2094081.0, actual 2094081 (1.00x) +Testing collisions (low 8-bit) - Expected 2097921.0, actual 2097921 (1.00x) +Testing distribution - Worst bias is the 18-bit window at bit 44 - 0.056% + + +[[[ Keyset 'Permutation' Tests ]]] + +Combination Lowbits Tests: +Keyset 'Combination' - up to 7 blocks from a set of 8 - 2396744 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 668.7, actual 701 (1.05x) (33) +Testing collisions (high 25-37 bits) - Worst is 36 bits: 48/41 (1.15x) +Testing collisions (high 12-bit) - Expected 2392648.0, actual 2392648 (1.00x) +Testing collisions (high 8-bit) - Expected 2396488.0, actual 2396488 (1.00x) +Testing collisions (low 32-bit) - Expected 668.7, actual 671 (1.00x) (3) +Testing collisions (low 25-37 bits) - Worst is 36 bits: 57/41 (1.36x) +Testing collisions (low 12-bit) - Expected 2392648.0, actual 2392648 (1.00x) +Testing collisions (low 8-bit) - Expected 2396488.0, actual 2396488 (1.00x) +Testing distribution - Worst bias is the 18-bit window at bit 61 - 0.065% + + +Combination Highbits Tests +Keyset 'Combination' - up to 7 blocks from a set of 8 - 2396744 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 668.7, actual 652 (0.97x) +Testing collisions (high 25-37 bits) - Worst is 34 bits: 182/167 (1.09x) +Testing collisions (high 12-bit) - Expected 2392648.0, actual 2392648 (1.00x) +Testing collisions (high 8-bit) - Expected 2396488.0, actual 2396488 (1.00x) +Testing collisions (low 32-bit) - Expected 668.7, actual 660 (0.99x) (-8) +Testing collisions (low 25-37 bits) - Worst is 37 bits: 25/20 (1.20x) +Testing collisions (low 12-bit) - Expected 2392648.0, actual 2392648 (1.00x) +Testing collisions (low 8-bit) - Expected 2396488.0, actual 2396488 (1.00x) +Testing distribution - Worst bias is the 18-bit window at bit 0 - 0.052% + + +Combination Hi-Lo Tests: +Keyset 'Combination' - up to 6 blocks from a set of 15 - 12204240 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 17339.3, actual 17349 (1.00x) (10) +Testing collisions (high 27-41 bits) - Worst is 41 bits: 37/33 (1.09x) +Testing collisions (high 12-bit) - Expected 12200144.0, actual 12200144 (1.00x) +Testing collisions (high 8-bit) - Expected 12203984.0, actual 12203984 (1.00x) +Testing collisions (low 32-bit) - Expected 17339.3, actual 17458 (1.01x) (119) +Testing collisions (low 27-41 bits) - Worst is 40 bits: 74/67 (1.09x) +Testing collisions (low 12-bit) - Expected 12200144.0, actual 12200144 (1.00x) +Testing collisions (low 8-bit) - Expected 12203984.0, actual 12203984 (1.00x) +Testing distribution - Worst bias is the 20-bit window at bit 15 - 0.032% + + +Combination 0x8000000 Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8192.0, actual 8225 (1.00x) (34) +Testing collisions (high 26-40 bits) - Worst is 40 bits: 35/31 (1.09x) +Testing collisions (high 12-bit) - Expected 8384510.0, actual 8384510 (1.00x) +Testing collisions (high 8-bit) - Expected 8388350.0, actual 8388350 (1.00x) +Testing collisions (low 32-bit) - Expected 8192.0, actual 8174 (1.00x) (-17) +Testing collisions (low 26-40 bits) - Worst is 40 bits: 35/31 (1.09x) +Testing collisions (low 12-bit) - Expected 8384510.0, actual 8384510 (1.00x) +Testing collisions (low 8-bit) - Expected 8388350.0, actual 8388350 (1.00x) +Testing distribution - Worst bias is the 20-bit window at bit 44 - 0.040% + + +Combination 0x0000001 Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8192.0, actual 8146 (0.99x) (-45) +Testing collisions (high 26-40 bits) - Worst is 39 bits: 73/63 (1.14x) +Testing collisions (high 12-bit) - Expected 8384510.0, actual 8384510 (1.00x) +Testing collisions (high 8-bit) - Expected 8388350.0, actual 8388350 (1.00x) +Testing collisions (low 32-bit) - Expected 8192.0, actual 8268 (1.01x) (77) +Testing collisions (low 26-40 bits) - Worst is 40 bits: 37/31 (1.16x) +Testing collisions (low 12-bit) - Expected 8384510.0, actual 8384510 (1.00x) +Testing collisions (low 8-bit) - Expected 8388350.0, actual 8388350 (1.00x) +Testing distribution - Worst bias is the 20-bit window at bit 30 - 0.031% + + +Combination 0x800000000000000 Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8192.0, actual 8259 (1.01x) (68) +Testing collisions (high 26-40 bits) - Worst is 32 bits: 8259/8191 (1.01x) +Testing collisions (high 12-bit) - Expected 8384510.0, actual 8384510 (1.00x) +Testing collisions (high 8-bit) - Expected 8388350.0, actual 8388350 (1.00x) +Testing collisions (low 32-bit) - Expected 8192.0, actual 8238 (1.01x) (47) +Testing collisions (low 26-40 bits) - Worst is 40 bits: 38/31 (1.19x) +Testing collisions (low 12-bit) - Expected 8384510.0, actual 8384510 (1.00x) +Testing collisions (low 8-bit) - Expected 8388350.0, actual 8388350 (1.00x) +Testing distribution - Worst bias is the 20-bit window at bit 3 - 0.036% + + +Combination 0x000000000000001 Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8192.0, actual 8145 (0.99x) (-46) +Testing collisions (high 26-40 bits) - Worst is 40 bits: 35/31 (1.09x) +Testing collisions (high 12-bit) - Expected 8384510.0, actual 8384510 (1.00x) +Testing collisions (high 8-bit) - Expected 8388350.0, actual 8388350 (1.00x) +Testing collisions (low 32-bit) - Expected 8192.0, actual 7977 (0.97x) +Testing collisions (low 26-40 bits) - Worst is 40 bits: 35/31 (1.09x) +Testing collisions (low 12-bit) - Expected 8384510.0, actual 8384510 (1.00x) +Testing collisions (low 8-bit) - Expected 8388350.0, actual 8388350 (1.00x) +Testing distribution - Worst bias is the 20-bit window at bit 12 - 0.042% + + +Combination 16-bytes [0-1] Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8192.0, actual 8278 (1.01x) (87) +Testing collisions (high 26-40 bits) - Worst is 40 bits: 39/31 (1.22x) +Testing collisions (high 12-bit) - Expected 8384510.0, actual 8384510 (1.00x) +Testing collisions (high 8-bit) - Expected 8388350.0, actual 8388350 (1.00x) +Testing collisions (low 32-bit) - Expected 8192.0, actual 8070 (0.99x) (-121) +Testing collisions (low 26-40 bits) - Worst is 37 bits: 267/255 (1.04x) +Testing collisions (low 12-bit) - Expected 8384510.0, actual 8384510 (1.00x) +Testing collisions (low 8-bit) - Expected 8388350.0, actual 8388350 (1.00x) +Testing distribution - Worst bias is the 20-bit window at bit 23 - 0.033% + + +Combination 16-bytes [0-last] Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8192.0, actual 8038 (0.98x) (-153) +Testing collisions (high 26-40 bits) - Worst is 38 bits: 131/127 (1.02x) +Testing collisions (high 12-bit) - Expected 8384510.0, actual 8384510 (1.00x) +Testing collisions (high 8-bit) - Expected 8388350.0, actual 8388350 (1.00x) +Testing collisions (low 32-bit) - Expected 8192.0, actual 8156 (1.00x) (-35) +Testing collisions (low 26-40 bits) - Worst is 40 bits: 38/31 (1.19x) +Testing collisions (low 12-bit) - Expected 8384510.0, actual 8384510 (1.00x) +Testing collisions (low 8-bit) - Expected 8388350.0, actual 8388350 (1.00x) +Testing distribution - Worst bias is the 20-bit window at bit 22 - 0.035% + + +Combination 32-bytes [0-1] Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8192.0, actual 8268 (1.01x) (77) +Testing collisions (high 26-40 bits) - Worst is 38 bits: 130/127 (1.02x) +Testing collisions (high 12-bit) - Expected 8384510.0, actual 8384510 (1.00x) +Testing collisions (high 8-bit) - Expected 8388350.0, actual 8388350 (1.00x) +Testing collisions (low 32-bit) - Expected 8192.0, actual 8158 (1.00x) (-33) +Testing collisions (low 26-40 bits) - Worst is 30 bits: 32831/32767 (1.00x) +Testing collisions (low 12-bit) - Expected 8384510.0, actual 8384510 (1.00x) +Testing collisions (low 8-bit) - Expected 8388350.0, actual 8388350 (1.00x) +Testing distribution - Worst bias is the 20-bit window at bit 26 - 0.038% + + +Combination 32-bytes [0-last] Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8192.0, actual 8197 (1.00x) (6) +Testing collisions (high 26-40 bits) - Worst is 35 bits: 1055/1023 (1.03x) +Testing collisions (high 12-bit) - Expected 8384510.0, actual 8384510 (1.00x) +Testing collisions (high 8-bit) - Expected 8388350.0, actual 8388350 (1.00x) +Testing collisions (low 32-bit) - Expected 8192.0, actual 8202 (1.00x) (11) +Testing collisions (low 26-40 bits) - Worst is 36 bits: 529/511 (1.03x) +Testing collisions (low 12-bit) - Expected 8384510.0, actual 8384510 (1.00x) +Testing collisions (low 8-bit) - Expected 8388350.0, actual 8388350 (1.00x) +Testing distribution - Worst bias is the 20-bit window at bit 58 - 0.031% + + +Combination 64-bytes [0-1] Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8192.0, actual 8127 (0.99x) (-64) +Testing collisions (high 26-40 bits) - Worst is 39 bits: 69/63 (1.08x) +Testing collisions (high 12-bit) - Expected 8384510.0, actual 8384510 (1.00x) +Testing collisions (high 8-bit) - Expected 8388350.0, actual 8388350 (1.00x) +Testing collisions (low 32-bit) - Expected 8192.0, actual 8076 (0.99x) (-115) +Testing collisions (low 26-40 bits) - Worst is 37 bits: 261/255 (1.02x) +Testing collisions (low 12-bit) - Expected 8384510.0, actual 8384510 (1.00x) +Testing collisions (low 8-bit) - Expected 8388350.0, actual 8388350 (1.00x) +Testing distribution - Worst bias is the 20-bit window at bit 63 - 0.028% + + +Combination 64-bytes [0-last] Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8192.0, actual 8181 (1.00x) (-10) +Testing collisions (high 26-40 bits) - Worst is 40 bits: 35/31 (1.09x) +Testing collisions (high 12-bit) - Expected 8384510.0, actual 8384510 (1.00x) +Testing collisions (high 8-bit) - Expected 8388350.0, actual 8388350 (1.00x) +Testing collisions (low 32-bit) - Expected 8192.0, actual 8184 (1.00x) (-7) +Testing collisions (low 26-40 bits) - Worst is 39 bits: 68/63 (1.06x) +Testing collisions (low 12-bit) - Expected 8384510.0, actual 8384510 (1.00x) +Testing collisions (low 8-bit) - Expected 8388350.0, actual 8388350 (1.00x) +Testing distribution - Worst bias is the 20-bit window at bit 42 - 0.041% + + +Combination 128-bytes [0-1] Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8192.0, actual 8275 (1.01x) (84) +Testing collisions (high 26-40 bits) - Worst is 40 bits: 36/31 (1.13x) +Testing collisions (high 12-bit) - Expected 8384510.0, actual 8384510 (1.00x) +Testing collisions (high 8-bit) - Expected 8388350.0, actual 8388350 (1.00x) +Testing collisions (low 32-bit) - Expected 8192.0, actual 8208 (1.00x) (17) +Testing collisions (low 26-40 bits) - Worst is 37 bits: 270/255 (1.05x) +Testing collisions (low 12-bit) - Expected 8384510.0, actual 8384510 (1.00x) +Testing collisions (low 8-bit) - Expected 8388350.0, actual 8388350 (1.00x) +Testing distribution - Worst bias is the 20-bit window at bit 1 - 0.043% + + +Combination 128-bytes [0-last] Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8192.0, actual 8243 (1.01x) (52) +Testing collisions (high 26-40 bits) - Worst is 34 bits: 2082/2047 (1.02x) +Testing collisions (high 12-bit) - Expected 8384510.0, actual 8384510 (1.00x) +Testing collisions (high 8-bit) - Expected 8388350.0, actual 8388350 (1.00x) +Testing collisions (low 32-bit) - Expected 8192.0, actual 8315 (1.02x) (124) +Testing collisions (low 26-40 bits) - Worst is 40 bits: 38/31 (1.19x) +Testing collisions (low 12-bit) - Expected 8384510.0, actual 8384510 (1.00x) +Testing collisions (low 8-bit) - Expected 8388350.0, actual 8388350 (1.00x) +Testing distribution - Worst bias is the 19-bit window at bit 25 - 0.039% + + +[[[ Keyset 'Window' Tests ]]] + +Keyset 'Window' - 32-bit key, 25-bit window - 32 tests, 33554432 keys per test +Window at 0 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 1 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 2 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 3 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 4 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 5 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 6 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 7 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 8 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 9 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 10 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 11 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 12 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 13 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 14 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 15 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 16 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 17 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 18 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 19 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 20 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 21 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 22 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 23 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 24 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 25 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 26 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 27 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 28 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 29 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 30 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 31 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 32 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) + +[[[ Keyset 'Cyclic' Tests ]]] + +Keyset 'Cyclic' - 8 cycles of 8 bytes - 1000000 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 116.4, actual 96 (0.82x) +Testing collisions (high 23-34 bits) - Worst is 24 bits: 28916/29802 (0.97x) +Testing collisions (high 12-bit) - Expected 995904.0, actual 995904 (1.00x) +Testing collisions (high 8-bit) - Expected 999744.0, actual 999744 (1.00x) +Testing collisions (low 32-bit) - Expected 116.4, actual 126 (1.08x) (10) +Testing collisions (low 23-34 bits) - Worst is 32 bits: 126/116 (1.08x) +Testing collisions (low 12-bit) - Expected 995904.0, actual 995904 (1.00x) +Testing collisions (low 8-bit) - Expected 999744.0, actual 999744 (1.00x) +Testing distribution - Worst bias is the 17-bit window at bit 13 - 0.085% + +Keyset 'Cyclic' - 8 cycles of 9 bytes - 1000000 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 116.4, actual 95 (0.82x) +Testing collisions (high 23-34 bits) - Worst is 34 bits: 30/29 (1.03x) +Testing collisions (high 12-bit) - Expected 995904.0, actual 995904 (1.00x) +Testing collisions (high 8-bit) - Expected 999744.0, actual 999744 (1.00x) +Testing collisions (low 32-bit) - Expected 116.4, actual 123 (1.06x) (7) +Testing collisions (low 23-34 bits) - Worst is 34 bits: 37/29 (1.27x) +Testing collisions (low 12-bit) - Expected 995904.0, actual 995904 (1.00x) +Testing collisions (low 8-bit) - Expected 999744.0, actual 999744 (1.00x) +Testing distribution - Worst bias is the 17-bit window at bit 47 - 0.120% + +Keyset 'Cyclic' - 8 cycles of 10 bytes - 1000000 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 116.4, actual 115 (0.99x) (-1) +Testing collisions (high 23-34 bits) - Worst is 33 bits: 62/58 (1.07x) +Testing collisions (high 12-bit) - Expected 995904.0, actual 995904 (1.00x) +Testing collisions (high 8-bit) - Expected 999744.0, actual 999744 (1.00x) +Testing collisions (low 32-bit) - Expected 116.4, actual 114 (0.98x) +Testing collisions (low 23-34 bits) - Worst is 34 bits: 35/29 (1.20x) +Testing collisions (low 12-bit) - Expected 995904.0, actual 995904 (1.00x) +Testing collisions (low 8-bit) - Expected 999744.0, actual 999744 (1.00x) +Testing distribution - Worst bias is the 17-bit window at bit 7 - 0.123% + +Keyset 'Cyclic' - 8 cycles of 11 bytes - 1000000 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 116.4, actual 117 (1.01x) (1) +Testing collisions (high 23-34 bits) - Worst is 33 bits: 66/58 (1.13x) +Testing collisions (high 12-bit) - Expected 995904.0, actual 995904 (1.00x) +Testing collisions (high 8-bit) - Expected 999744.0, actual 999744 (1.00x) +Testing collisions (low 32-bit) - Expected 116.4, actual 106 (0.91x) +Testing collisions (low 23-34 bits) - Worst is 34 bits: 31/29 (1.07x) +Testing collisions (low 12-bit) - Expected 995904.0, actual 995904 (1.00x) +Testing collisions (low 8-bit) - Expected 999744.0, actual 999744 (1.00x) +Testing distribution - Worst bias is the 17-bit window at bit 57 - 0.192% + +Keyset 'Cyclic' - 8 cycles of 12 bytes - 1000000 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 116.4, actual 105 (0.90x) +Testing collisions (high 23-34 bits) - Worst is 34 bits: 38/29 (1.31x) +Testing collisions (high 12-bit) - Expected 995904.0, actual 995904 (1.00x) +Testing collisions (high 8-bit) - Expected 999744.0, actual 999744 (1.00x) +Testing collisions (low 32-bit) - Expected 116.4, actual 114 (0.98x) +Testing collisions (low 23-34 bits) - Worst is 28 bits: 1868/1862 (1.00x) +Testing collisions (low 12-bit) - Expected 995904.0, actual 995904 (1.00x) +Testing collisions (low 8-bit) - Expected 999744.0, actual 999744 (1.00x) +Testing distribution - Worst bias is the 17-bit window at bit 47 - 0.099% + +Keyset 'Cyclic' - 8 cycles of 16 bytes - 1000000 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 116.4, actual 99 (0.85x) +Testing collisions (high 23-34 bits) - Worst is 28 bits: 1951/1862 (1.05x) +Testing collisions (high 12-bit) - Expected 995904.0, actual 995904 (1.00x) +Testing collisions (high 8-bit) - Expected 999744.0, actual 999744 (1.00x) +Testing collisions (low 32-bit) - Expected 116.4, actual 123 (1.06x) (7) +Testing collisions (low 23-34 bits) - Worst is 32 bits: 123/116 (1.06x) +Testing collisions (low 12-bit) - Expected 995904.0, actual 995904 (1.00x) +Testing collisions (low 8-bit) - Expected 999744.0, actual 999744 (1.00x) +Testing distribution - Worst bias is the 17-bit window at bit 35 - 0.105% + + +[[[ Keyset 'TwoBytes' Tests ]]] + +Keyset 'TwoBytes' - up-to-4-byte keys, 652545 total keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 49.6, actual 58 (1.17x) (9) +Testing collisions (high 23-33 bits) - Worst is 32 bits: 58/49 (1.17x) +Testing collisions (high 12-bit) - Expected 648449.0, actual 648449 (1.00x) +Testing collisions (high 8-bit) - Expected 652289.0, actual 652289 (1.00x) +Testing collisions (low 32-bit) - Expected 49.6, actual 40 (0.81x) +Testing collisions (low 23-33 bits) - Worst is 30 bits: 213/198 (1.07x) +Testing collisions (low 12-bit) - Expected 648449.0, actual 648449 (1.00x) +Testing collisions (low 8-bit) - Expected 652289.0, actual 652289 (1.00x) +Testing distribution - Worst bias is the 16-bit window at bit 4 - 0.136% + +Keyset 'TwoBytes' - up-to-8-byte keys, 5471025 total keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 3484.6, actual 3477 (1.00x) (-7) +Testing collisions (high 26-39 bits) - Worst is 38 bits: 62/54 (1.14x) +Testing collisions (high 12-bit) - Expected 5466929.0, actual 5466929 (1.00x) +Testing collisions (high 8-bit) - Expected 5470769.0, actual 5470769 (1.00x) +Testing collisions (low 32-bit) - Expected 3484.6, actual 3518 (1.01x) (34) +Testing collisions (low 26-39 bits) - Worst is 36 bits: 224/217 (1.03x) +Testing collisions (low 12-bit) - Expected 5466929.0, actual 5466929 (1.00x) +Testing collisions (low 8-bit) - Expected 5470769.0, actual 5470769 (1.00x) +Testing distribution - Worst bias is the 20-bit window at bit 9 - 0.071% + +Keyset 'TwoBytes' - up-to-12-byte keys, 18616785 total keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 40347.8, actual 40448 (1.00x) (101) +Testing collisions (high 27-42 bits) - Worst is 35 bits: 5127/5043 (1.02x) +Testing collisions (high 12-bit) - Expected 18612689.0, actual 18612689 (1.00x) +Testing collisions (high 8-bit) - Expected 18616529.0, actual 18616529 (1.00x) +Testing collisions (low 32-bit) - Expected 40347.8, actual 40175 (1.00x) (-172) +Testing collisions (low 27-42 bits) - Worst is 33 bits: 20112/20173 (1.00x) +Testing collisions (low 12-bit) - Expected 18612689.0, actual 18612689 (1.00x) +Testing collisions (low 8-bit) - Expected 18616529.0, actual 18616529 (1.00x) +Testing distribution - Worst bias is the 20-bit window at bit 24 - 0.022% + +Keyset 'TwoBytes' - up-to-16-byte keys, 44251425 total keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 227963.2, actual 227655 (1.00x) (-308) +Testing collisions (high 29-45 bits) - Worst is 38 bits: 3590/3561 (1.01x) +Testing collisions (high 12-bit) - Expected 44247329.0, actual 44247329 (1.00x) +Testing collisions (high 8-bit) - Expected 44251169.0, actual 44251169 (1.00x) +Testing collisions (low 32-bit) - Expected 227963.2, actual 226913 (1.00x) (-1050) +Testing collisions (low 29-45 bits) - Worst is 37 bits: 7121/7123 (1.00x) +Testing collisions (low 12-bit) - Expected 44247329.0, actual 44247329 (1.00x) +Testing collisions (low 8-bit) - Expected 44251169.0, actual 44251169 (1.00x) +Testing distribution - Worst bias is the 20-bit window at bit 22 - 0.009% + +Keyset 'TwoBytes' - up-to-20-byte keys, 86536545 total keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 871784.7, actual 868710 (1.00x) (-3074) +Testing collisions (high 30-47 bits) - Worst is 47 bits: 30/26 (1.13x) +Testing collisions (high 12-bit) - Expected 86532449.0, actual 86532449 (1.00x) +Testing collisions (high 8-bit) - Expected 86536289.0, actual 86536289 (1.00x) +Testing collisions (low 32-bit) - Expected 871784.7, actual 864922 (0.99x) (-6862) +Testing collisions (low 30-47 bits) - Worst is 45 bits: 118/106 (1.11x) +Testing collisions (low 12-bit) - Expected 86532449.0, actual 86532449 (1.00x) +Testing collisions (low 8-bit) - Expected 86536289.0, actual 86536289 (1.00x) +Testing distribution - Worst bias is the 20-bit window at bit 24 - 0.004% + + +[[[ Keyset 'Text' Tests ]]] + +Keyset 'Text' - keys of form "FooXXXXBar" - 14776336 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 25418.1, actual 25174 (0.99x) (-244) +Testing collisions (high 27-42 bits) - Worst is 31 bits: 50550/50836 (0.99x) +Testing collisions (high 12-bit) - Expected 14772240.0, actual 14772240 (1.00x) +Testing collisions (high 8-bit) - Expected 14776080.0, actual 14776080 (1.00x) +Testing collisions (low 32-bit) - Expected 25418.1, actual 25567 (1.01x) (149) +Testing collisions (low 27-42 bits) - Worst is 41 bits: 55/49 (1.11x) +Testing collisions (low 12-bit) - Expected 14772240.0, actual 14772240 (1.00x) +Testing collisions (low 8-bit) - Expected 14776080.0, actual 14776080 (1.00x) +Testing distribution - Worst bias is the 20-bit window at bit 61 - 0.025% + +Keyset 'Text' - keys of form "FooBarXXXX" - 14776336 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 25418.1, actual 25389 (1.00x) (-29) +Testing collisions (high 27-42 bits) - Worst is 40 bits: 106/99 (1.07x) +Testing collisions (high 12-bit) - Expected 14772240.0, actual 14772240 (1.00x) +Testing collisions (high 8-bit) - Expected 14776080.0, actual 14776080 (1.00x) +Testing collisions (low 32-bit) - Expected 25418.1, actual 25370 (1.00x) (-48) +Testing collisions (low 27-42 bits) - Worst is 42 bits: 29/24 (1.17x) +Testing collisions (low 12-bit) - Expected 14772240.0, actual 14772240 (1.00x) +Testing collisions (low 8-bit) - Expected 14776080.0, actual 14776080 (1.00x) +Testing distribution - Worst bias is the 20-bit window at bit 55 - 0.020% + +Keyset 'Text' - keys of form "XXXXFooBar" - 14776336 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 25418.1, actual 25523 (1.00x) (105) +Testing collisions (high 27-42 bits) - Worst is 34 bits: 6505/6354 (1.02x) +Testing collisions (high 12-bit) - Expected 14772240.0, actual 14772240 (1.00x) +Testing collisions (high 8-bit) - Expected 14776080.0, actual 14776080 (1.00x) +Testing collisions (low 32-bit) - Expected 25418.1, actual 25486 (1.00x) (68) +Testing collisions (low 27-42 bits) - Worst is 39 bits: 219/198 (1.10x) +Testing collisions (low 12-bit) - Expected 14772240.0, actual 14772240 (1.00x) +Testing collisions (low 8-bit) - Expected 14776080.0, actual 14776080 (1.00x) +Testing distribution - Worst bias is the 20-bit window at bit 62 - 0.016% + +Keyset 'Words' - 4000000 random keys of len 6-16 from alnum charset +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 1862.6, actual 1928 (1.04x) (66) +Testing collisions (high 25-38 bits) - Worst is 32 bits: 1928/1862 (1.04x) +Testing collisions (high 12-bit) - Expected 3995904.0, actual 3995904 (1.00x) +Testing collisions (high 8-bit) - Expected 3999744.0, actual 3999744 (1.00x) +Testing collisions (low 32-bit) - Expected 1862.6, actual 1861 (1.00x) (-1) +Testing collisions (low 25-38 bits) - Worst is 38 bits: 34/29 (1.17x) +Testing collisions (low 12-bit) - Expected 3995904.0, actual 3995904 (1.00x) +Testing collisions (low 8-bit) - Expected 3999744.0, actual 3999744 (1.00x) +Testing distribution - Worst bias is the 19-bit window at bit 32 - 0.073% + +Keyset 'Words' - 4000000 random keys of len 6-16 from password charset +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 1862.6, actual 1964 (1.05x) (102) +Testing collisions (high 25-38 bits) - Worst is 33 bits: 1006/931 (1.08x) +Testing collisions (high 12-bit) - Expected 3995904.0, actual 3995904 (1.00x) +Testing collisions (high 8-bit) - Expected 3999744.0, actual 3999744 (1.00x) +Testing collisions (low 32-bit) - Expected 1862.6, actual 1913 (1.03x) (51) +Testing collisions (low 25-38 bits) - Worst is 38 bits: 34/29 (1.17x) +Testing collisions (low 12-bit) - Expected 3995904.0, actual 3995904 (1.00x) +Testing collisions (low 8-bit) - Expected 3999744.0, actual 3999744 (1.00x) +Testing distribution - Worst bias is the 19-bit window at bit 21 - 0.090% + +Keyset 'Words' - 102401 dict words +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 1.2, actual 2 (1.64x) (1) +Testing collisions (high 20-27 bits) - Worst is 24 bits: 351/312 (1.12x) +Testing collisions (high 12-bit) - Expected 98305.0, actual 98305 (1.00x) +Testing collisions (high 8-bit) - Expected 102145.0, actual 102145 (1.00x) +Testing collisions (low 32-bit) - Expected 1.2, actual 0 (0.00x) +Testing collisions (low 20-27 bits) - Worst is 27 bits: 45/39 (1.15x) +Testing collisions (low 12-bit) - Expected 98305.0, actual 98305 (1.00x) +Testing collisions (low 8-bit) - Expected 102145.0, actual 102145 (1.00x) +Testing distribution - Worst bias is the 14-bit window at bit 0 - 0.511% + + +[[[ Keyset 'Zeroes' Tests ]]] + +Keyset 'Zeroes' - 204800 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 4.9, actual 2 (0.41x) +Testing collisions (high 21-29 bits) - Worst is 25 bits: 647/624 (1.04x) +Testing collisions (high 12-bit) - Expected 200704.0, actual 200704 (1.00x) +Testing collisions (high 8-bit) - Expected 204544.0, actual 204544 (1.00x) +Testing collisions (low 32-bit) - Expected 4.9, actual 1 (0.20x) +Testing collisions (low 21-29 bits) - Worst is 23 bits: 2466/2499 (0.99x) +Testing collisions (low 12-bit) - Expected 200704.0, actual 200704 (1.00x) +Testing collisions (low 8-bit) - Expected 204544.0, actual 204544 (1.00x) +Testing distribution - Worst bias is the 15-bit window at bit 49 - 0.287% + + +[[[ Keyset 'Seed' Tests ]]] + +Keyset 'Seed' - 5000000 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 2910.4, actual 2880 (0.99x) (-30) +Testing collisions (high 26-39 bits) - Worst is 34 bits: 728/727 (1.00x) +Testing collisions (high 12-bit) - Expected 4995904.0, actual 4995904 (1.00x) +Testing collisions (high 8-bit) - Expected 4999744.0, actual 4999744 (1.00x) +Testing collisions (low 32-bit) - Expected 2910.4, actual 2967 (1.02x) (57) +Testing collisions (low 26-39 bits) - Worst is 37 bits: 104/90 (1.14x) +Testing collisions (low 12-bit) - Expected 4995904.0, actual 4995904 (1.00x) +Testing collisions (low 8-bit) - Expected 4999744.0, actual 4999744 (1.00x) +Testing distribution - Worst bias is the 19-bit window at bit 1 - 0.073% + + +[[[ Keyset 'PerlinNoise' Tests ]]] + +Testing 16777216 coordinates (L2) : +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 32768.0, actual 32536 (0.99x) (-231) +Testing collisions (high 27-42 bits) - Worst is 42 bits: 49/31 (1.53x) +Testing collisions (high 12-bit) - Expected 16773120.0, actual 16773120 (1.00x) +Testing collisions (high 8-bit) - Expected 16776960.0, actual 16776960 (1.00x) +Testing collisions (low 32-bit) - Expected 32768.0, actual 32601 (0.99x) (-166) +Testing collisions (low 27-42 bits) - Worst is 35 bits: 4114/4095 (1.00x) +Testing collisions (low 12-bit) - Expected 16773120.0, actual 16773120 (1.00x) +Testing collisions (low 8-bit) - Expected 16776960.0, actual 16776960 (1.00x) + + +[[[ Diff 'Differential' Tests ]]] + +Testing 8303632 up-to-5-bit differentials in 64-bit keys -> 64 bit hashes. +1000 reps, 8303632000 total tests, expecting 0.00 random collisions.......... +0 total collisions, of which 0 single collisions were ignored + +Testing 11017632 up-to-4-bit differentials in 128-bit keys -> 64 bit hashes. +1000 reps, 11017632000 total tests, expecting 0.00 random collisions.......... +0 total collisions, of which 0 single collisions were ignored + +Testing 2796416 up-to-3-bit differentials in 256-bit keys -> 64 bit hashes. +1000 reps, 2796416000 total tests, expecting 0.00 random collisions.......... +0 total collisions, of which 0 single collisions were ignored + + +[[[ DiffDist 'Differential Distribution' Tests ]]] + +Testing bit 0 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 512 (1.00x) (1) +Testing collisions (high 24-36 bits) - Worst is 31 bits: 1034/1023 (1.01x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 533 (1.04x) (22) +Testing collisions (low 24-36 bits) - Worst is 34 bits: 145/127 (1.13x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 1 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 529 (1.03x) (18) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 36/31 (1.13x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 492 (0.96x) +Testing collisions (low 24-36 bits) - Worst is 27 bits: 16152/16383 (0.99x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 2 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 492 (0.96x) +Testing collisions (high 24-36 bits) - Worst is 34 bits: 136/127 (1.06x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 514 (1.00x) (3) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 38/31 (1.19x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 3 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 506 (0.99x) (-5) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 67/63 (1.05x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 507 (0.99x) (-4) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 34/31 (1.06x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 4 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 493 (0.96x) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 39/31 (1.22x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 530 (1.04x) (19) +Testing collisions (low 24-36 bits) - Worst is 34 bits: 146/127 (1.14x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 5 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 520 (1.02x) (9) +Testing collisions (high 24-36 bits) - Worst is 31 bits: 1052/1023 (1.03x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 500 (0.98x) +Testing collisions (low 24-36 bits) - Worst is 33 bits: 264/255 (1.03x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 6 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 549 (1.07x) (38) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 41/31 (1.28x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 514 (1.00x) (3) +Testing collisions (low 24-36 bits) - Worst is 34 bits: 130/127 (1.02x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 7 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 471 (0.92x) +Testing collisions (high 24-36 bits) - Worst is 30 bits: 2065/2047 (1.01x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 501 (0.98x) +Testing collisions (low 24-36 bits) - Worst is 28 bits: 8319/8191 (1.02x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 8 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 524 (1.02x) (13) +Testing collisions (high 24-36 bits) - Worst is 32 bits: 524/511 (1.02x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 524 (1.02x) (13) +Testing collisions (low 24-36 bits) - Worst is 35 bits: 78/63 (1.22x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 9 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 514 (1.00x) (3) +Testing collisions (high 24-36 bits) - Worst is 29 bits: 4161/4095 (1.02x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 494 (0.96x) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 33/31 (1.03x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 10 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 538 (1.05x) (27) +Testing collisions (high 24-36 bits) - Worst is 31 bits: 1086/1023 (1.06x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 536 (1.05x) (25) +Testing collisions (low 24-36 bits) - Worst is 35 bits: 77/63 (1.20x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 11 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 499 (0.97x) +Testing collisions (high 24-36 bits) - Worst is 33 bits: 274/255 (1.07x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 548 (1.07x) (37) +Testing collisions (low 24-36 bits) - Worst is 35 bits: 73/63 (1.14x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 12 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 500 (0.98x) +Testing collisions (high 24-36 bits) - Worst is 28 bits: 8243/8191 (1.01x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 490 (0.96x) +Testing collisions (low 24-36 bits) - Worst is 29 bits: 4076/4095 (1.00x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 13 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 509 (0.99x) (-2) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 42/31 (1.31x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 500 (0.98x) +Testing collisions (low 24-36 bits) - Worst is 35 bits: 76/63 (1.19x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 14 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 541 (1.06x) (30) +Testing collisions (high 24-36 bits) - Worst is 34 bits: 141/127 (1.10x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 518 (1.01x) (7) +Testing collisions (low 24-36 bits) - Worst is 32 bits: 518/511 (1.01x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 15 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 514 (1.00x) (3) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 69/63 (1.08x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 527 (1.03x) (16) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 42/31 (1.31x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 16 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 499 (0.97x) +Testing collisions (high 24-36 bits) - Worst is 34 bits: 131/127 (1.02x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 519 (1.01x) (8) +Testing collisions (low 24-36 bits) - Worst is 31 bits: 1052/1023 (1.03x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 17 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 500 (0.98x) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 35/31 (1.09x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 513 (1.00x) (2) +Testing collisions (low 24-36 bits) - Worst is 33 bits: 277/255 (1.08x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 18 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 531 (1.04x) (20) +Testing collisions (high 24-36 bits) - Worst is 33 bits: 276/255 (1.08x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 495 (0.97x) +Testing collisions (low 24-36 bits) - Worst is 35 bits: 69/63 (1.08x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 19 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 531 (1.04x) (20) +Testing collisions (high 24-36 bits) - Worst is 33 bits: 278/255 (1.09x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 557 (1.09x) (46) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 38/31 (1.19x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 20 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 544 (1.06x) (33) +Testing collisions (high 24-36 bits) - Worst is 32 bits: 544/511 (1.06x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 557 (1.09x) (46) +Testing collisions (low 24-36 bits) - Worst is 34 bits: 143/127 (1.12x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 21 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 500 (0.98x) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 35/31 (1.09x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 531 (1.04x) (20) +Testing collisions (low 24-36 bits) - Worst is 34 bits: 137/127 (1.07x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 22 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 520 (1.02x) (9) +Testing collisions (high 24-36 bits) - Worst is 34 bits: 134/127 (1.05x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 498 (0.97x) +Testing collisions (low 24-36 bits) - Worst is 27 bits: 16348/16383 (1.00x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 23 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 522 (1.02x) (11) +Testing collisions (high 24-36 bits) - Worst is 32 bits: 522/511 (1.02x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 509 (0.99x) (-2) +Testing collisions (low 24-36 bits) - Worst is 35 bits: 68/63 (1.06x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 24 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 517 (1.01x) (6) +Testing collisions (high 24-36 bits) - Worst is 33 bits: 261/255 (1.02x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 489 (0.96x) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 32/31 (1.00x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 25 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 532 (1.04x) (21) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 39/31 (1.22x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 499 (0.97x) +Testing collisions (low 24-36 bits) - Worst is 34 bits: 129/127 (1.01x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 26 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 494 (0.96x) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 70/63 (1.09x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 500 (0.98x) +Testing collisions (low 24-36 bits) - Worst is 31 bits: 1032/1023 (1.01x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 27 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 520 (1.02x) (9) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 37/31 (1.16x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 516 (1.01x) (5) +Testing collisions (low 24-36 bits) - Worst is 32 bits: 516/511 (1.01x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 28 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 486 (0.95x) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 66/63 (1.03x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 461 (0.90x) +Testing collisions (low 24-36 bits) - Worst is 28 bits: 8374/8191 (1.02x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 29 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 468 (0.91x) +Testing collisions (high 24-36 bits) - Worst is 29 bits: 4195/4095 (1.02x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 492 (0.96x) +Testing collisions (low 24-36 bits) - Worst is 27 bits: 16390/16383 (1.00x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 30 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 504 (0.98x) (-7) +Testing collisions (high 24-36 bits) - Worst is 33 bits: 269/255 (1.05x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 514 (1.00x) (3) +Testing collisions (low 24-36 bits) - Worst is 35 bits: 80/63 (1.25x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 31 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 508 (0.99x) (-3) +Testing collisions (high 24-36 bits) - Worst is 31 bits: 1017/1023 (0.99x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 532 (1.04x) (21) +Testing collisions (low 24-36 bits) - Worst is 35 bits: 77/63 (1.20x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 32 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 541 (1.06x) (30) +Testing collisions (high 24-36 bits) - Worst is 34 bits: 137/127 (1.07x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 487 (0.95x) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 33/31 (1.03x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 33 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 505 (0.99x) (-6) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 39/31 (1.22x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 474 (0.93x) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 36/31 (1.13x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 34 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 539 (1.05x) (28) +Testing collisions (high 24-36 bits) - Worst is 32 bits: 539/511 (1.05x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 523 (1.02x) (12) +Testing collisions (low 24-36 bits) - Worst is 34 bits: 145/127 (1.13x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 35 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 463 (0.90x) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 32/31 (1.00x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 564 (1.10x) (53) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 42/31 (1.31x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 36 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 519 (1.01x) (8) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 36/31 (1.13x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 506 (0.99x) (-5) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 36/31 (1.13x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 37 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 524 (1.02x) (13) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 79/63 (1.23x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 535 (1.04x) (24) +Testing collisions (low 24-36 bits) - Worst is 33 bits: 270/255 (1.05x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 38 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 536 (1.05x) (25) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 79/63 (1.23x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 538 (1.05x) (27) +Testing collisions (low 24-36 bits) - Worst is 32 bits: 538/511 (1.05x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 39 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 557 (1.09x) (46) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 80/63 (1.25x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 530 (1.04x) (19) +Testing collisions (low 24-36 bits) - Worst is 35 bits: 70/63 (1.09x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 40 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 543 (1.06x) (32) +Testing collisions (high 24-36 bits) - Worst is 34 bits: 144/127 (1.13x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 542 (1.06x) (31) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 36/31 (1.13x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 41 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 497 (0.97x) +Testing collisions (high 24-36 bits) - Worst is 31 bits: 1031/1023 (1.01x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 509 (0.99x) (-2) +Testing collisions (low 24-36 bits) - Worst is 34 bits: 139/127 (1.09x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 42 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 514 (1.00x) (3) +Testing collisions (high 24-36 bits) - Worst is 30 bits: 2135/2047 (1.04x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 535 (1.04x) (24) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 35/31 (1.09x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 43 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 498 (0.97x) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 68/63 (1.06x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 478 (0.93x) +Testing collisions (low 24-36 bits) - Worst is 28 bits: 8288/8191 (1.01x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 44 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 511 (1.00x) +Testing collisions (high 24-36 bits) - Worst is 31 bits: 1028/1023 (1.00x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 500 (0.98x) +Testing collisions (low 24-36 bits) - Worst is 31 bits: 1054/1023 (1.03x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 45 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 517 (1.01x) (6) +Testing collisions (high 24-36 bits) - Worst is 34 bits: 140/127 (1.09x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 526 (1.03x) (15) +Testing collisions (low 24-36 bits) - Worst is 32 bits: 526/511 (1.03x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 46 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 535 (1.04x) (24) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 34/31 (1.06x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 499 (0.97x) +Testing collisions (low 24-36 bits) - Worst is 30 bits: 2042/2047 (1.00x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 47 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 521 (1.02x) (10) +Testing collisions (high 24-36 bits) - Worst is 31 bits: 1054/1023 (1.03x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 486 (0.95x) +Testing collisions (low 24-36 bits) - Worst is 29 bits: 4074/4095 (0.99x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 48 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 502 (0.98x) (-9) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 44/31 (1.38x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 498 (0.97x) +Testing collisions (low 24-36 bits) - Worst is 28 bits: 8186/8191 (1.00x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 49 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 494 (0.96x) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 38/31 (1.19x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 508 (0.99x) (-3) +Testing collisions (low 24-36 bits) - Worst is 31 bits: 1016/1023 (0.99x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 50 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 508 (0.99x) (-3) +Testing collisions (high 24-36 bits) - Worst is 33 bits: 259/255 (1.01x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 519 (1.01x) (8) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 37/31 (1.16x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 51 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 518 (1.01x) (7) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 79/63 (1.23x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 523 (1.02x) (12) +Testing collisions (low 24-36 bits) - Worst is 33 bits: 272/255 (1.06x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 52 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 551 (1.08x) (40) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 38/31 (1.19x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 486 (0.95x) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 39/31 (1.22x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 53 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 495 (0.97x) +Testing collisions (high 24-36 bits) - Worst is 30 bits: 2090/2047 (1.02x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 510 (1.00x) (-1) +Testing collisions (low 24-36 bits) - Worst is 31 bits: 1038/1023 (1.01x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 54 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 543 (1.06x) (32) +Testing collisions (high 24-36 bits) - Worst is 34 bits: 137/127 (1.07x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 517 (1.01x) (6) +Testing collisions (low 24-36 bits) - Worst is 30 bits: 2099/2047 (1.02x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 55 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 471 (0.92x) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 36/31 (1.13x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 539 (1.05x) (28) +Testing collisions (low 24-36 bits) - Worst is 33 bits: 271/255 (1.06x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 56 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 519 (1.01x) (8) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 73/63 (1.14x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 475 (0.93x) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 33/31 (1.03x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 57 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 512 (1.00x) (1) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 67/63 (1.05x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 507 (0.99x) (-4) +Testing collisions (low 24-36 bits) - Worst is 35 bits: 65/63 (1.02x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 58 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 528 (1.03x) (17) +Testing collisions (high 24-36 bits) - Worst is 32 bits: 528/511 (1.03x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 512 (1.00x) (1) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 40/31 (1.25x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 59 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 506 (0.99x) (-5) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 66/63 (1.03x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 511 (1.00x) +Testing collisions (low 24-36 bits) - Worst is 31 bits: 1022/1023 (1.00x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 60 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 502 (0.98x) (-9) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 43/31 (1.34x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 519 (1.01x) (8) +Testing collisions (low 24-36 bits) - Worst is 34 bits: 136/127 (1.06x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 61 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 524 (1.02x) (13) +Testing collisions (high 24-36 bits) - Worst is 33 bits: 265/255 (1.04x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 529 (1.03x) (18) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 37/31 (1.16x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 62 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 496 (0.97x) +Testing collisions (high 24-36 bits) - Worst is 29 bits: 4125/4095 (1.01x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 490 (0.96x) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 38/31 (1.19x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 63 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 479 (0.94x) +Testing collisions (high 24-36 bits) - Worst is 33 bits: 262/255 (1.02x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 510 (1.00x) (-1) +Testing collisions (low 24-36 bits) - Worst is 34 bits: 133/127 (1.04x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + + +[[[ MomentChi2 Tests ]]] + +Analyze hashes produced from a serie of linearly increasing numbers of 32-bit, using a step of 3 ... +Target values to approximate : 38918200.000000 - 410450.000000 +Popcount 1 stats : 38919632.307917 - 410479.005598 +Popcount 0 stats : 38918367.673773 - 410464.964389 +MomentChi2 for bits 1 : 2.49901 +MomentChi2 for bits 0 : 0.0342478 + +Derivative stats (transition from 2 consecutive values) : +Popcount 1 stats : 38921086.495604 - 410506.484777 +Popcount 0 stats : 38916867.679739 - 410442.803573 +MomentChi2 for deriv b1 : 10.149 +MomentChi2 for deriv b0 : 2.16237 + + Good ! + + +[[[ Prng Tests ]]] + +Generating 33554432 random numbers : +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 131072.0, actual 130738 (1.00x) (-333) +Testing collisions (high 28-44 bits) - Worst is 43 bits: 76/63 (1.19x) +Testing collisions (high 12-bit) - Expected 33550336.0, actual 33550336 (1.00x) +Testing collisions (high 8-bit) - Expected 33554176.0, actual 33554176 (1.00x) +Testing collisions (low 32-bit) - Expected 131072.0, actual 130564 (1.00x) (-507) +Testing collisions (low 28-44 bits) - Worst is 38 bits: 2080/2047 (1.02x) +Testing collisions (low 12-bit) - Expected 33550336.0, actual 33550336 (1.00x) +Testing collisions (low 8-bit) - Expected 33554176.0, actual 33554176 (1.00x) + + +Input vcode 0x00000001, Output vcode 0x00000001, Result vcode 0x00000001 +Verification value is 0x00000001 - Testing took 631.756439 seconds +------------------------------------------------------------------------------- diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/src/aes_hash.rs b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/src/aes_hash.rs new file mode 100644 index 0000000..d3b673f --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/src/aes_hash.rs @@ -0,0 +1,434 @@ +use crate::convert::*; +use crate::operations::*; +use crate::random_state::PI; +use crate::RandomState; +use core::hash::Hasher; + +/// A `Hasher` for hashing an arbitrary stream of bytes. +/// +/// Instances of [`AHasher`] represent state that is updated while hashing data. +/// +/// Each method updates the internal state based on the new data provided. Once +/// all of the data has been provided, the resulting hash can be obtained by calling +/// `finish()` +/// +/// [Clone] is also provided in case you wish to calculate hashes for two different items that +/// start with the same data. +/// +#[derive(Debug, Clone)] +pub struct AHasher { + enc: u128, + sum: u128, + key: u128, +} + +impl AHasher { + /// Creates a new hasher keyed to the provided keys. + /// + /// Normally hashers are created via `AHasher::default()` for fixed keys or `RandomState::new()` for randomly + /// generated keys and `RandomState::with_seeds(a,b)` for seeds that are set and can be reused. All of these work at + /// map creation time (and hence don't have any overhead on a per-item bais). + /// + /// This method directly creates the hasher instance and performs no transformation on the provided seeds. This may + /// be useful where a HashBuilder is not desired, such as for testing purposes. + /// + /// # Example + /// + /// ``` + /// use std::hash::Hasher; + /// use ahash::AHasher; + /// + /// let mut hasher = AHasher::new_with_keys(1234, 5678); + /// + /// hasher.write_u32(1989); + /// hasher.write_u8(11); + /// hasher.write_u8(9); + /// hasher.write(b"Huh?"); + /// + /// println!("Hash is {:x}!", hasher.finish()); + /// ``` + #[inline] + pub(crate) fn new_with_keys(key1: u128, key2: u128) -> Self { + let pi: [u128; 2] = PI.convert(); + let key1 = key1 ^ pi[0]; + let key2 = key2 ^ pi[1]; + Self { + enc: key1, + sum: key2, + key: key1 ^ key2, + } + } + + #[allow(unused)] // False positive + pub(crate) fn test_with_keys(key1: u128, key2: u128) -> Self { + Self { + enc: key1, + sum: key2, + key: key1 ^ key2, + } + } + + #[inline] + pub(crate) fn from_random_state(rand_state: &RandomState) -> Self { + let key1 = [rand_state.k0, rand_state.k1].convert(); + let key2 = [rand_state.k2, rand_state.k3].convert(); + Self { + enc: key1, + sum: key2, + key: key1 ^ key2, + } + } + + #[inline(always)] + fn hash_in(&mut self, new_value: u128) { + self.enc = aesenc(self.enc, new_value); + self.sum = shuffle_and_add(self.sum, new_value); + } + + #[inline(always)] + fn hash_in_2(&mut self, v1: u128, v2: u128) { + self.enc = aesenc(self.enc, v1); + self.sum = shuffle_and_add(self.sum, v1); + self.enc = aesenc(self.enc, v2); + self.sum = shuffle_and_add(self.sum, v2); + } + + #[inline] + #[cfg(feature = "specialize")] + fn short_finish(&self) -> u64 { + let combined = aesdec(self.sum, self.enc); + let result: [u64; 2] = aesenc(combined, combined).convert(); + result[0] + } +} + +/// Provides [Hasher] methods to hash all of the primitive types. +/// +/// [Hasher]: core::hash::Hasher +impl Hasher for AHasher { + #[inline] + fn write_u8(&mut self, i: u8) { + self.write_u64(i as u64); + } + + #[inline] + fn write_u16(&mut self, i: u16) { + self.write_u64(i as u64); + } + + #[inline] + fn write_u32(&mut self, i: u32) { + self.write_u64(i as u64); + } + + #[inline] + fn write_u128(&mut self, i: u128) { + self.hash_in(i); + } + + #[inline] + #[cfg(any( + target_pointer_width = "64", + target_pointer_width = "32", + target_pointer_width = "16" + ))] + fn write_usize(&mut self, i: usize) { + self.write_u64(i as u64); + } + + #[inline] + #[cfg(target_pointer_width = "128")] + fn write_usize(&mut self, i: usize) { + self.write_u128(i as u128); + } + + #[inline] + fn write_u64(&mut self, i: u64) { + self.write_u128(i as u128); + } + + #[inline] + #[allow(clippy::collapsible_if)] + fn write(&mut self, input: &[u8]) { + let mut data = input; + let length = data.len(); + add_in_length(&mut self.enc, length as u64); + + //A 'binary search' on sizes reduces the number of comparisons. + if data.len() <= 8 { + let value = read_small(data); + self.hash_in(value.convert()); + } else { + if data.len() > 32 { + if data.len() > 64 { + let tail = data.read_last_u128x4(); + let mut current: [u128; 4] = [self.key; 4]; + current[0] = aesenc(current[0], tail[0]); + current[1] = aesdec(current[1], tail[1]); + current[2] = aesenc(current[2], tail[2]); + current[3] = aesdec(current[3], tail[3]); + let mut sum: [u128; 2] = [self.key, !self.key]; + sum[0] = add_by_64s(sum[0].convert(), tail[0].convert()).convert(); + sum[1] = add_by_64s(sum[1].convert(), tail[1].convert()).convert(); + sum[0] = shuffle_and_add(sum[0], tail[2]); + sum[1] = shuffle_and_add(sum[1], tail[3]); + while data.len() > 64 { + let (blocks, rest) = data.read_u128x4(); + current[0] = aesenc(current[0], blocks[0]); + current[1] = aesenc(current[1], blocks[1]); + current[2] = aesenc(current[2], blocks[2]); + current[3] = aesenc(current[3], blocks[3]); + sum[0] = shuffle_and_add(sum[0], blocks[0]); + sum[1] = shuffle_and_add(sum[1], blocks[1]); + sum[0] = shuffle_and_add(sum[0], blocks[2]); + sum[1] = shuffle_and_add(sum[1], blocks[3]); + data = rest; + } + self.hash_in_2(current[0], current[1]); + self.hash_in_2(current[2], current[3]); + self.hash_in_2(sum[0], sum[1]); + } else { + //len 33-64 + let (head, _) = data.read_u128x2(); + let tail = data.read_last_u128x2(); + self.hash_in_2(head[0], head[1]); + self.hash_in_2(tail[0], tail[1]); + } + } else { + if data.len() > 16 { + //len 17-32 + self.hash_in_2(data.read_u128().0, data.read_last_u128()); + } else { + //len 9-16 + let value: [u64; 2] = [data.read_u64().0, data.read_last_u64()]; + self.hash_in(value.convert()); + } + } + } + } + #[inline] + fn finish(&self) -> u64 { + let combined = aesdec(self.sum, self.enc); + let result: [u64; 2] = aesenc(aesenc(combined, self.key), combined).convert(); + result[1] + } +} + +#[cfg(feature = "specialize")] +pub(crate) struct AHasherU64 { + pub(crate) buffer: u64, + pub(crate) pad: u64, +} + +/// A specialized hasher for only primitives under 64 bits. +#[cfg(feature = "specialize")] +impl Hasher for AHasherU64 { + #[inline] + fn finish(&self) -> u64 { + let rot = (self.pad & 63) as u32; + self.buffer.rotate_left(rot) + } + + #[inline] + fn write(&mut self, _bytes: &[u8]) { + unreachable!("Specialized hasher was called with a different type of object") + } + + #[inline] + fn write_u8(&mut self, i: u8) { + self.write_u64(i as u64); + } + + #[inline] + fn write_u16(&mut self, i: u16) { + self.write_u64(i as u64); + } + + #[inline] + fn write_u32(&mut self, i: u32) { + self.write_u64(i as u64); + } + + #[inline] + fn write_u64(&mut self, i: u64) { + self.buffer = folded_multiply(i ^ self.buffer, MULTIPLE); + } + + #[inline] + fn write_u128(&mut self, _i: u128) { + unreachable!("Specialized hasher was called with a different type of object") + } + + #[inline] + fn write_usize(&mut self, _i: usize) { + unreachable!("Specialized hasher was called with a different type of object") + } +} + +#[cfg(feature = "specialize")] +pub(crate) struct AHasherFixed(pub AHasher); + +/// A specialized hasher for fixed size primitives larger than 64 bits. +#[cfg(feature = "specialize")] +impl Hasher for AHasherFixed { + #[inline] + fn finish(&self) -> u64 { + self.0.short_finish() + } + + #[inline] + fn write(&mut self, bytes: &[u8]) { + self.0.write(bytes) + } + + #[inline] + fn write_u8(&mut self, i: u8) { + self.write_u64(i as u64); + } + + #[inline] + fn write_u16(&mut self, i: u16) { + self.write_u64(i as u64); + } + + #[inline] + fn write_u32(&mut self, i: u32) { + self.write_u64(i as u64); + } + + #[inline] + fn write_u64(&mut self, i: u64) { + self.0.write_u64(i); + } + + #[inline] + fn write_u128(&mut self, i: u128) { + self.0.write_u128(i); + } + + #[inline] + fn write_usize(&mut self, i: usize) { + self.0.write_usize(i); + } +} + +#[cfg(feature = "specialize")] +pub(crate) struct AHasherStr(pub AHasher); + +/// A specialized hasher for strings +/// Note that the other types don't panic because the hash impl for String tacks on an unneeded call. (As does vec) +#[cfg(feature = "specialize")] +impl Hasher for AHasherStr { + #[inline] + fn finish(&self) -> u64 { + let result: [u64; 2] = self.0.enc.convert(); + result[0] + } + + #[inline] + fn write(&mut self, bytes: &[u8]) { + if bytes.len() > 8 { + self.0.write(bytes); + self.0.enc = aesdec(self.0.sum, self.0.enc); + self.0.enc = aesenc(aesenc(self.0.enc, self.0.key), self.0.enc); + } else { + add_in_length(&mut self.0.enc, bytes.len() as u64); + + let value = read_small(bytes).convert(); + self.0.sum = shuffle_and_add(self.0.sum, value); + self.0.enc = aesdec(self.0.sum, self.0.enc); + self.0.enc = aesenc(aesenc(self.0.enc, self.0.key), self.0.enc); + } + } + + #[inline] + fn write_u8(&mut self, _i: u8) {} + + #[inline] + fn write_u16(&mut self, _i: u16) {} + + #[inline] + fn write_u32(&mut self, _i: u32) {} + + #[inline] + fn write_u64(&mut self, _i: u64) {} + + #[inline] + fn write_u128(&mut self, _i: u128) {} + + #[inline] + fn write_usize(&mut self, _i: usize) {} +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::convert::Convert; + use crate::operations::aesenc; + use crate::RandomState; + use std::hash::{BuildHasher, Hasher}; + #[test] + fn test_sanity() { + let mut hasher = RandomState::with_seeds(1, 2, 3, 4).build_hasher(); + hasher.write_u64(0); + let h1 = hasher.finish(); + hasher.write(&[1, 0, 0, 0, 0, 0, 0, 0]); + let h2 = hasher.finish(); + assert_ne!(h1, h2); + } + + #[cfg(feature = "compile-time-rng")] + #[test] + fn test_builder() { + use std::collections::HashMap; + use std::hash::BuildHasherDefault; + + let mut map = HashMap::>::default(); + map.insert(1, 3); + } + + #[cfg(feature = "compile-time-rng")] + #[test] + fn test_default() { + let hasher_a = AHasher::default(); + let a_enc: [u64; 2] = hasher_a.enc.convert(); + let a_sum: [u64; 2] = hasher_a.sum.convert(); + assert_ne!(0, a_enc[0]); + assert_ne!(0, a_enc[1]); + assert_ne!(0, a_sum[0]); + assert_ne!(0, a_sum[1]); + assert_ne!(a_enc[0], a_enc[1]); + assert_ne!(a_sum[0], a_sum[1]); + assert_ne!(a_enc[0], a_sum[0]); + assert_ne!(a_enc[1], a_sum[1]); + let hasher_b = AHasher::default(); + let b_enc: [u64; 2] = hasher_b.enc.convert(); + let b_sum: [u64; 2] = hasher_b.sum.convert(); + assert_eq!(a_enc[0], b_enc[0]); + assert_eq!(a_enc[1], b_enc[1]); + assert_eq!(a_sum[0], b_sum[0]); + assert_eq!(a_sum[1], b_sum[1]); + } + + #[test] + fn test_hash() { + let mut result: [u64; 2] = [0x6c62272e07bb0142, 0x62b821756295c58d]; + let value: [u64; 2] = [1 << 32, 0xFEDCBA9876543210]; + result = aesenc(value.convert(), result.convert()).convert(); + result = aesenc(result.convert(), result.convert()).convert(); + let mut result2: [u64; 2] = [0x6c62272e07bb0142, 0x62b821756295c58d]; + let value2: [u64; 2] = [1, 0xFEDCBA9876543210]; + result2 = aesenc(value2.convert(), result2.convert()).convert(); + result2 = aesenc(result2.convert(), result.convert()).convert(); + let result: [u8; 16] = result.convert(); + let result2: [u8; 16] = result2.convert(); + assert_ne!(hex::encode(result), hex::encode(result2)); + } + + #[test] + fn test_conversion() { + let input: &[u8] = "dddddddd".as_bytes(); + let bytes: u64 = as_array!(input, 8).convert(); + assert_eq!(bytes, 0x6464646464646464); + } +} diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/src/convert.rs b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/src/convert.rs new file mode 100644 index 0000000..712eae1 --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/src/convert.rs @@ -0,0 +1,162 @@ +pub(crate) trait Convert { + fn convert(self) -> To; +} + +macro_rules! convert { + ($a:ty, $b:ty) => { + impl Convert<$b> for $a { + #[inline(always)] + fn convert(self) -> $b { + zerocopy::transmute!(self) + } + } + impl Convert<$a> for $b { + #[inline(always)] + fn convert(self) -> $a { + zerocopy::transmute!(self) + } + } + }; +} + +convert!([u128; 4], [u64; 8]); +convert!([u128; 4], [u32; 16]); +convert!([u128; 4], [u16; 32]); +convert!([u128; 4], [u8; 64]); +convert!([u128; 2], [u64; 4]); +convert!([u128; 2], [u32; 8]); +convert!([u128; 2], [u16; 16]); +convert!([u128; 2], [u8; 32]); +convert!(u128, [u64; 2]); +convert!(u128, [u32; 4]); +convert!(u128, [u16; 8]); +convert!(u128, [u8; 16]); +convert!([u64; 8], [u32; 16]); +convert!([u64; 8], [u16; 32]); +convert!([u64; 8], [u8; 64]); +convert!([u64; 4], [u32; 8]); +convert!([u64; 4], [u16; 16]); +convert!([u64; 4], [u8; 32]); +convert!([u64; 2], [u32; 4]); +convert!([u64; 2], [u16; 8]); +convert!([u64; 2], [u8; 16]); +convert!([u32; 4], [u16; 8]); +convert!([u32; 4], [u8; 16]); +convert!([u16; 8], [u8; 16]); +convert!(u64, [u32; 2]); +convert!(u64, [u16; 4]); +convert!(u64, [u8; 8]); +convert!([u32; 2], [u16; 4]); +convert!([u32; 2], [u8; 8]); +convert!(u32, [u16; 2]); +convert!(u32, [u8; 4]); +convert!([u16; 2], [u8; 4]); +convert!(u16, [u8; 2]); +convert!([[u64; 4]; 2], [u8; 64]); + +convert!([f64; 2], [u8; 16]); +convert!([f32; 4], [u8; 16]); +convert!(f64, [u8; 8]); +convert!([f32; 2], [u8; 8]); +convert!(f32, [u8; 4]); + +macro_rules! as_array { + ($input:expr, $len:expr) => {{ + { + #[inline(always)] + fn as_array(slice: &[T]) -> &[T; $len] { + core::convert::TryFrom::try_from(slice).unwrap() + } + as_array($input) + } + }}; +} + +pub(crate) trait ReadFromSlice { + fn read_u16(&self) -> (u16, &[u8]); + fn read_u32(&self) -> (u32, &[u8]); + fn read_u64(&self) -> (u64, &[u8]); + fn read_u128(&self) -> (u128, &[u8]); + fn read_u128x2(&self) -> ([u128; 2], &[u8]); + fn read_u128x4(&self) -> ([u128; 4], &[u8]); + fn read_last_u16(&self) -> u16; + fn read_last_u32(&self) -> u32; + fn read_last_u64(&self) -> u64; + fn read_last_u128(&self) -> u128; + fn read_last_u128x2(&self) -> [u128; 2]; + fn read_last_u128x4(&self) -> [u128; 4]; +} + +impl ReadFromSlice for [u8] { + #[inline(always)] + fn read_u16(&self) -> (u16, &[u8]) { + let (value, rest) = self.split_at(2); + (as_array!(value, 2).convert(), rest) + } + + #[inline(always)] + fn read_u32(&self) -> (u32, &[u8]) { + let (value, rest) = self.split_at(4); + (as_array!(value, 4).convert(), rest) + } + + #[inline(always)] + fn read_u64(&self) -> (u64, &[u8]) { + let (value, rest) = self.split_at(8); + (as_array!(value, 8).convert(), rest) + } + + #[inline(always)] + fn read_u128(&self) -> (u128, &[u8]) { + let (value, rest) = self.split_at(16); + (as_array!(value, 16).convert(), rest) + } + + #[inline(always)] + fn read_u128x2(&self) -> ([u128; 2], &[u8]) { + let (value, rest) = self.split_at(32); + (as_array!(value, 32).convert(), rest) + } + + #[inline(always)] + fn read_u128x4(&self) -> ([u128; 4], &[u8]) { + let (value, rest) = self.split_at(64); + (as_array!(value, 64).convert(), rest) + } + + #[inline(always)] + fn read_last_u16(&self) -> u16 { + let (_, value) = self.split_at(self.len() - 2); + as_array!(value, 2).convert() + } + + #[inline(always)] + fn read_last_u32(&self) -> u32 { + let (_, value) = self.split_at(self.len() - 4); + as_array!(value, 4).convert() + } + + #[inline(always)] + fn read_last_u64(&self) -> u64 { + let (_, value) = self.split_at(self.len() - 8); + as_array!(value, 8).convert() + } + + #[inline(always)] + fn read_last_u128(&self) -> u128 { + let (_, value) = self.split_at(self.len() - 16); + as_array!(value, 16).convert() + } + + #[inline(always)] + fn read_last_u128x2(&self) -> [u128; 2] { + let (_, value) = self.split_at(self.len() - 32); + as_array!(value, 32).convert() + } + + #[inline(always)] + fn read_last_u128x4(&self) -> [u128; 4] { + let (_, value) = self.split_at(self.len() - 64); + as_array!(value, 64).convert() + } +} diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/src/fallback_hash.rs b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/src/fallback_hash.rs new file mode 100644 index 0000000..f78074d --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/src/fallback_hash.rs @@ -0,0 +1,368 @@ +use crate::convert::*; +use crate::operations::folded_multiply; +use crate::operations::read_small; +use crate::operations::MULTIPLE; +use crate::random_state::PI; +use crate::RandomState; +use core::hash::Hasher; + +const ROT: u32 = 23; //17 + +/// A `Hasher` for hashing an arbitrary stream of bytes. +/// +/// Instances of [`AHasher`] represent state that is updated while hashing data. +/// +/// Each method updates the internal state based on the new data provided. Once +/// all of the data has been provided, the resulting hash can be obtained by calling +/// `finish()` +/// +/// [Clone] is also provided in case you wish to calculate hashes for two different items that +/// start with the same data. +/// +#[derive(Debug, Clone)] +pub struct AHasher { + buffer: u64, + pad: u64, + extra_keys: [u64; 2], +} + +impl AHasher { + /// Creates a new hasher keyed to the provided key. + #[inline] + #[allow(dead_code)] // Is not called if non-fallback hash is used. + pub(crate) fn new_with_keys(key1: u128, key2: u128) -> AHasher { + let pi: [u128; 2] = PI.convert(); + let key1: [u64; 2] = (key1 ^ pi[0]).convert(); + let key2: [u64; 2] = (key2 ^ pi[1]).convert(); + AHasher { + buffer: key1[0], + pad: key1[1], + extra_keys: key2, + } + } + + #[allow(unused)] // False positive + pub(crate) fn test_with_keys(key1: u128, key2: u128) -> Self { + let key1: [u64; 2] = key1.convert(); + let key2: [u64; 2] = key2.convert(); + Self { + buffer: key1[0], + pad: key1[1], + extra_keys: key2, + } + } + + #[inline] + #[allow(dead_code)] // Is not called if non-fallback hash is used. + pub(crate) fn from_random_state(rand_state: &RandomState) -> AHasher { + AHasher { + buffer: rand_state.k0, + pad: rand_state.k1, + extra_keys: [rand_state.k2, rand_state.k3], + } + } + + /// This update function has the goal of updating the buffer with a single multiply + /// FxHash does this but is vulnerable to attack. To avoid this input needs to be masked to with an + /// unpredictable value. Other hashes such as murmurhash have taken this approach but were found vulnerable + /// to attack. The attack was based on the idea of reversing the pre-mixing (Which is necessarily + /// reversible otherwise bits would be lost) then placing a difference in the highest bit before the + /// multiply used to mix the data. Because a multiply can never affect the bits to the right of it, a + /// subsequent update that also differed in this bit could result in a predictable collision. + /// + /// This version avoids this vulnerability while still only using a single multiply. It takes advantage + /// of the fact that when a 64 bit multiply is performed the upper 64 bits are usually computed and thrown + /// away. Instead it creates two 128 bit values where the upper 64 bits are zeros and multiplies them. + /// (The compiler is smart enough to turn this into a 64 bit multiplication in the assembly) + /// Then the upper bits are xored with the lower bits to produce a single 64 bit result. + /// + /// To understand why this is a good scrambling function it helps to understand multiply-with-carry PRNGs: + /// https://en.wikipedia.org/wiki/Multiply-with-carry_pseudorandom_number_generator + /// If the multiple is chosen well, this creates a long period, decent quality PRNG. + /// Notice that this function is equivalent to this except the `buffer`/`state` is being xored with each + /// new block of data. In the event that data is all zeros, it is exactly equivalent to a MWC PRNG. + /// + /// This is impervious to attack because every bit buffer at the end is dependent on every bit in + /// `new_data ^ buffer`. For example suppose two inputs differed in only the 5th bit. Then when the + /// multiplication is performed the `result` will differ in bits 5-69. More specifically it will differ by + /// 2^5 * MULTIPLE. However in the next step bits 65-128 are turned into a separate 64 bit value. So the + /// differing bits will be in the lower 6 bits of this value. The two intermediate values that differ in + /// bits 5-63 and in bits 0-5 respectively get added together. Producing an output that differs in every + /// bit. The addition carries in the multiplication and at the end additionally mean that the even if an + /// attacker somehow knew part of (but not all) the contents of the buffer before hand, + /// they would not be able to predict any of the bits in the buffer at the end. + #[inline(always)] + fn update(&mut self, new_data: u64) { + self.buffer = folded_multiply(new_data ^ self.buffer, MULTIPLE); + } + + /// Similar to the above this function performs an update using a "folded multiply". + /// However it takes in 128 bits of data instead of 64. Both halves must be masked. + /// + /// This makes it impossible for an attacker to place a single bit difference between + /// two blocks so as to cancel each other. + /// + /// However this is not sufficient. to prevent (a,b) from hashing the same as (b,a) the buffer itself must + /// be updated between calls in a way that does not commute. To achieve this XOR and Rotate are used. + /// Add followed by xor is not the same as xor followed by add, and rotate ensures that the same out bits + /// can't be changed by the same set of input bits. To cancel this sequence with subsequent input would require + /// knowing the keys. + #[inline(always)] + fn large_update(&mut self, new_data: u128) { + let block: [u64; 2] = new_data.convert(); + let combined = folded_multiply(block[0] ^ self.extra_keys[0], block[1] ^ self.extra_keys[1]); + self.buffer = (self.buffer.wrapping_add(self.pad) ^ combined).rotate_left(ROT); + } + + #[inline] + #[cfg(feature = "specialize")] + fn short_finish(&self) -> u64 { + self.buffer.wrapping_add(self.pad) + } +} + +/// Provides [Hasher] methods to hash all of the primitive types. +/// +/// [Hasher]: core::hash::Hasher +impl Hasher for AHasher { + #[inline] + fn write_u8(&mut self, i: u8) { + self.update(i as u64); + } + + #[inline] + fn write_u16(&mut self, i: u16) { + self.update(i as u64); + } + + #[inline] + fn write_u32(&mut self, i: u32) { + self.update(i as u64); + } + + #[inline] + fn write_u64(&mut self, i: u64) { + self.update(i as u64); + } + + #[inline] + fn write_u128(&mut self, i: u128) { + self.large_update(i); + } + + #[inline] + #[cfg(any( + target_pointer_width = "64", + target_pointer_width = "32", + target_pointer_width = "16" + ))] + fn write_usize(&mut self, i: usize) { + self.write_u64(i as u64); + } + + #[inline] + #[cfg(target_pointer_width = "128")] + fn write_usize(&mut self, i: usize) { + self.write_u128(i as u128); + } + + #[inline] + #[allow(clippy::collapsible_if)] + fn write(&mut self, input: &[u8]) { + let mut data = input; + let length = data.len() as u64; + //Needs to be an add rather than an xor because otherwise it could be canceled with carefully formed input. + self.buffer = self.buffer.wrapping_add(length).wrapping_mul(MULTIPLE); + //A 'binary search' on sizes reduces the number of comparisons. + if data.len() > 8 { + if data.len() > 16 { + let tail = data.read_last_u128(); + self.large_update(tail); + while data.len() > 16 { + let (block, rest) = data.read_u128(); + self.large_update(block); + data = rest; + } + } else { + self.large_update([data.read_u64().0, data.read_last_u64()].convert()); + } + } else { + let value = read_small(data); + self.large_update(value.convert()); + } + } + + #[inline] + fn finish(&self) -> u64 { + let rot = (self.buffer & 63) as u32; + folded_multiply(self.buffer, self.pad).rotate_left(rot) + } +} + +#[cfg(feature = "specialize")] +pub(crate) struct AHasherU64 { + pub(crate) buffer: u64, + pub(crate) pad: u64, +} + +/// A specialized hasher for only primitives under 64 bits. +#[cfg(feature = "specialize")] +impl Hasher for AHasherU64 { + #[inline] + fn finish(&self) -> u64 { + let rot = (self.pad & 63) as u32; + self.buffer.rotate_left(rot) + } + + #[inline] + fn write(&mut self, _bytes: &[u8]) { + unreachable!("Specialized hasher was called with a different type of object") + } + + #[inline] + fn write_u8(&mut self, i: u8) { + self.write_u64(i as u64); + } + + #[inline] + fn write_u16(&mut self, i: u16) { + self.write_u64(i as u64); + } + + #[inline] + fn write_u32(&mut self, i: u32) { + self.write_u64(i as u64); + } + + #[inline] + fn write_u64(&mut self, i: u64) { + self.buffer = folded_multiply(i ^ self.buffer, MULTIPLE); + } + + #[inline] + fn write_u128(&mut self, _i: u128) { + unreachable!("Specialized hasher was called with a different type of object") + } + + #[inline] + fn write_usize(&mut self, _i: usize) { + unreachable!("Specialized hasher was called with a different type of object") + } +} + +#[cfg(feature = "specialize")] +pub(crate) struct AHasherFixed(pub AHasher); + +/// A specialized hasher for fixed size primitives larger than 64 bits. +#[cfg(feature = "specialize")] +impl Hasher for AHasherFixed { + #[inline] + fn finish(&self) -> u64 { + self.0.short_finish() + } + + #[inline] + fn write(&mut self, bytes: &[u8]) { + self.0.write(bytes) + } + + #[inline] + fn write_u8(&mut self, i: u8) { + self.write_u64(i as u64); + } + + #[inline] + fn write_u16(&mut self, i: u16) { + self.write_u64(i as u64); + } + + #[inline] + fn write_u32(&mut self, i: u32) { + self.write_u64(i as u64); + } + + #[inline] + fn write_u64(&mut self, i: u64) { + self.0.write_u64(i); + } + + #[inline] + fn write_u128(&mut self, i: u128) { + self.0.write_u128(i); + } + + #[inline] + fn write_usize(&mut self, i: usize) { + self.0.write_usize(i); + } +} + +#[cfg(feature = "specialize")] +pub(crate) struct AHasherStr(pub AHasher); + +/// A specialized hasher for a single string +/// Note that the other types don't panic because the hash impl for String tacks on an unneeded call. (As does vec) +#[cfg(feature = "specialize")] +impl Hasher for AHasherStr { + #[inline] + fn finish(&self) -> u64 { + self.0.finish() + } + + #[inline] + fn write(&mut self, bytes: &[u8]) { + if bytes.len() > 8 { + self.0.write(bytes) + } else { + let value = read_small(bytes); + self.0.buffer = folded_multiply(value[0] ^ self.0.buffer, value[1] ^ self.0.extra_keys[1]); + self.0.pad = self.0.pad.wrapping_add(bytes.len() as u64); + } + } + + #[inline] + fn write_u8(&mut self, _i: u8) {} + + #[inline] + fn write_u16(&mut self, _i: u16) {} + + #[inline] + fn write_u32(&mut self, _i: u32) {} + + #[inline] + fn write_u64(&mut self, _i: u64) {} + + #[inline] + fn write_u128(&mut self, _i: u128) {} + + #[inline] + fn write_usize(&mut self, _i: usize) {} +} + +#[cfg(test)] +mod tests { + use crate::convert::Convert; + use crate::fallback_hash::*; + + #[test] + fn test_hash() { + let mut hasher = AHasher::new_with_keys(0, 0); + let value: u64 = 1 << 32; + hasher.update(value); + let result = hasher.buffer; + let mut hasher = AHasher::new_with_keys(0, 0); + let value2: u64 = 1; + hasher.update(value2); + let result2 = hasher.buffer; + let result: [u8; 8] = result.convert(); + let result2: [u8; 8] = result2.convert(); + assert_ne!(hex::encode(result), hex::encode(result2)); + } + + #[test] + fn test_conversion() { + let input: &[u8] = "dddddddd".as_bytes(); + let bytes: u64 = as_array!(input, 8).convert(); + assert_eq!(bytes, 0x6464646464646464); + } +} diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/src/hash_map.rs b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/src/hash_map.rs new file mode 100644 index 0000000..2b6fbdc --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/src/hash_map.rs @@ -0,0 +1,501 @@ +use std::borrow::Borrow; +use std::collections::hash_map::{IntoKeys, IntoValues}; +use std::collections::{hash_map, HashMap}; +use std::fmt::{self, Debug}; +use std::hash::{BuildHasher, Hash}; +use std::iter::FromIterator; +use std::ops::{Deref, DerefMut, Index}; +use std::panic::UnwindSafe; + +#[cfg(feature = "serde")] +use serde::{ + de::{Deserialize, Deserializer}, + ser::{Serialize, Serializer}, +}; + +use crate::RandomState; + +/// A [`HashMap`](std::collections::HashMap) using [`RandomState`](crate::RandomState) to hash the items. +/// (Requires the `std` feature to be enabled.) +#[derive(Clone)] +pub struct AHashMap(HashMap); + +impl From> for AHashMap { + fn from(item: HashMap) -> Self { + AHashMap(item) + } +} + +impl From<[(K, V); N]> for AHashMap +where + K: Eq + Hash, +{ + /// # Examples + /// + /// ``` + /// use ahash::AHashMap; + /// + /// let map1 = AHashMap::from([(1, 2), (3, 4)]); + /// let map2: AHashMap<_, _> = [(1, 2), (3, 4)].into(); + /// assert_eq!(map1, map2); + /// ``` + fn from(arr: [(K, V); N]) -> Self { + Self::from_iter(arr) + } +} + +impl Into> for AHashMap { + fn into(self) -> HashMap { + self.0 + } +} + +impl AHashMap { + /// This crates a hashmap using [RandomState::new] which obtains its keys from [RandomSource]. + /// See the documentation in [RandomSource] for notes about key strength. + pub fn new() -> Self { + AHashMap(HashMap::with_hasher(RandomState::new())) + } + + /// This crates a hashmap with the specified capacity using [RandomState::new]. + /// See the documentation in [RandomSource] for notes about key strength. + pub fn with_capacity(capacity: usize) -> Self { + AHashMap(HashMap::with_capacity_and_hasher(capacity, RandomState::new())) + } +} + +impl AHashMap +where + S: BuildHasher, +{ + pub fn with_hasher(hash_builder: S) -> Self { + AHashMap(HashMap::with_hasher(hash_builder)) + } + + pub fn with_capacity_and_hasher(capacity: usize, hash_builder: S) -> Self { + AHashMap(HashMap::with_capacity_and_hasher(capacity, hash_builder)) + } +} + +impl AHashMap +where + K: Hash + Eq, + S: BuildHasher, +{ + /// Returns a reference to the value corresponding to the key. + /// + /// The key may be any borrowed form of the map's key type, but + /// [`Hash`] and [`Eq`] on the borrowed form *must* match those for + /// the key type. + /// + /// # Examples + /// + /// ``` + /// use std::collections::HashMap; + /// + /// let mut map = HashMap::new(); + /// map.insert(1, "a"); + /// assert_eq!(map.get(&1), Some(&"a")); + /// assert_eq!(map.get(&2), None); + /// ``` + #[inline] + pub fn get(&self, k: &Q) -> Option<&V> + where + K: Borrow, + Q: Hash + Eq, + { + self.0.get(k) + } + + /// Returns the key-value pair corresponding to the supplied key. + /// + /// The supplied key may be any borrowed form of the map's key type, but + /// [`Hash`] and [`Eq`] on the borrowed form *must* match those for + /// the key type. + /// + /// # Examples + /// + /// ``` + /// use std::collections::HashMap; + /// + /// let mut map = HashMap::new(); + /// map.insert(1, "a"); + /// assert_eq!(map.get_key_value(&1), Some((&1, &"a"))); + /// assert_eq!(map.get_key_value(&2), None); + /// ``` + #[inline] + pub fn get_key_value(&self, k: &Q) -> Option<(&K, &V)> + where + K: Borrow, + Q: Hash + Eq, + { + self.0.get_key_value(k) + } + + /// Returns a mutable reference to the value corresponding to the key. + /// + /// The key may be any borrowed form of the map's key type, but + /// [`Hash`] and [`Eq`] on the borrowed form *must* match those for + /// the key type. + /// + /// # Examples + /// + /// ``` + /// use std::collections::HashMap; + /// + /// let mut map = HashMap::new(); + /// map.insert(1, "a"); + /// if let Some(x) = map.get_mut(&1) { + /// *x = "b"; + /// } + /// assert_eq!(map[&1], "b"); + /// ``` + #[inline] + pub fn get_mut(&mut self, k: &Q) -> Option<&mut V> + where + K: Borrow, + Q: Hash + Eq, + { + self.0.get_mut(k) + } + + /// Inserts a key-value pair into the map. + /// + /// If the map did not have this key present, [`None`] is returned. + /// + /// If the map did have this key present, the value is updated, and the old + /// value is returned. The key is not updated, though; this matters for + /// types that can be `==` without being identical. See the [module-level + /// documentation] for more. + /// + /// # Examples + /// + /// ``` + /// use std::collections::HashMap; + /// + /// let mut map = HashMap::new(); + /// assert_eq!(map.insert(37, "a"), None); + /// assert_eq!(map.is_empty(), false); + /// + /// map.insert(37, "b"); + /// assert_eq!(map.insert(37, "c"), Some("b")); + /// assert_eq!(map[&37], "c"); + /// ``` + #[inline] + pub fn insert(&mut self, k: K, v: V) -> Option { + self.0.insert(k, v) + } + + /// Creates a consuming iterator visiting all the keys in arbitrary order. + /// The map cannot be used after calling this. + /// The iterator element type is `K`. + /// + /// # Examples + /// + /// ``` + /// use std::collections::HashMap; + /// + /// let map = HashMap::from([ + /// ("a", 1), + /// ("b", 2), + /// ("c", 3), + /// ]); + /// + /// let mut vec: Vec<&str> = map.into_keys().collect(); + /// // The `IntoKeys` iterator produces keys in arbitrary order, so the + /// // keys must be sorted to test them against a sorted array. + /// vec.sort_unstable(); + /// assert_eq!(vec, ["a", "b", "c"]); + /// ``` + /// + /// # Performance + /// + /// In the current implementation, iterating over keys takes O(capacity) time + /// instead of O(len) because it internally visits empty buckets too. + #[inline] + pub fn into_keys(self) -> IntoKeys { + self.0.into_keys() + } + + /// Creates a consuming iterator visiting all the values in arbitrary order. + /// The map cannot be used after calling this. + /// The iterator element type is `V`. + /// + /// # Examples + /// + /// ``` + /// use std::collections::HashMap; + /// + /// let map = HashMap::from([ + /// ("a", 1), + /// ("b", 2), + /// ("c", 3), + /// ]); + /// + /// let mut vec: Vec = map.into_values().collect(); + /// // The `IntoValues` iterator produces values in arbitrary order, so + /// // the values must be sorted to test them against a sorted array. + /// vec.sort_unstable(); + /// assert_eq!(vec, [1, 2, 3]); + /// ``` + /// + /// # Performance + /// + /// In the current implementation, iterating over values takes O(capacity) time + /// instead of O(len) because it internally visits empty buckets too. + #[inline] + pub fn into_values(self) -> IntoValues { + self.0.into_values() + } + + /// Removes a key from the map, returning the value at the key if the key + /// was previously in the map. + /// + /// The key may be any borrowed form of the map's key type, but + /// [`Hash`] and [`Eq`] on the borrowed form *must* match those for + /// the key type. + /// + /// # Examples + /// + /// ``` + /// use std::collections::HashMap; + /// + /// let mut map = HashMap::new(); + /// map.insert(1, "a"); + /// assert_eq!(map.remove(&1), Some("a")); + /// assert_eq!(map.remove(&1), None); + /// ``` + #[inline] + pub fn remove(&mut self, k: &Q) -> Option + where + K: Borrow, + Q: Hash + Eq, + { + self.0.remove(k) + } +} + +impl Deref for AHashMap { + type Target = HashMap; + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +impl DerefMut for AHashMap { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.0 + } +} + +impl UnwindSafe for AHashMap +where + K: UnwindSafe, + V: UnwindSafe, +{ +} + +impl PartialEq for AHashMap +where + K: Eq + Hash, + V: PartialEq, + S: BuildHasher, +{ + fn eq(&self, other: &AHashMap) -> bool { + self.0.eq(&other.0) + } +} + +impl Eq for AHashMap +where + K: Eq + Hash, + V: Eq, + S: BuildHasher, +{ +} + +impl Index<&Q> for AHashMap +where + K: Eq + Hash + Borrow, + Q: Eq + Hash, + S: BuildHasher, +{ + type Output = V; + + /// Returns a reference to the value corresponding to the supplied key. + /// + /// # Panics + /// + /// Panics if the key is not present in the `HashMap`. + #[inline] + fn index(&self, key: &Q) -> &V { + self.0.index(key) + } +} + +impl Debug for AHashMap +where + K: Debug, + V: Debug, + S: BuildHasher, +{ + fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { + self.0.fmt(fmt) + } +} + +impl FromIterator<(K, V)> for AHashMap +where + K: Eq + Hash, +{ + /// This crates a hashmap from the provided iterator using [RandomState::new]. + /// See the documentation in [RandomSource] for notes about key strength. + fn from_iter>(iter: T) -> Self { + let mut inner = HashMap::with_hasher(RandomState::new()); + inner.extend(iter); + AHashMap(inner) + } +} + +impl<'a, K, V, S> IntoIterator for &'a AHashMap { + type Item = (&'a K, &'a V); + type IntoIter = hash_map::Iter<'a, K, V>; + fn into_iter(self) -> Self::IntoIter { + (&self.0).iter() + } +} + +impl<'a, K, V, S> IntoIterator for &'a mut AHashMap { + type Item = (&'a K, &'a mut V); + type IntoIter = hash_map::IterMut<'a, K, V>; + fn into_iter(self) -> Self::IntoIter { + (&mut self.0).iter_mut() + } +} + +impl IntoIterator for AHashMap { + type Item = (K, V); + type IntoIter = hash_map::IntoIter; + fn into_iter(self) -> Self::IntoIter { + self.0.into_iter() + } +} + +impl Extend<(K, V)> for AHashMap +where + K: Eq + Hash, + S: BuildHasher, +{ + #[inline] + fn extend>(&mut self, iter: T) { + self.0.extend(iter) + } +} + +impl<'a, K, V, S> Extend<(&'a K, &'a V)> for AHashMap +where + K: Eq + Hash + Copy + 'a, + V: Copy + 'a, + S: BuildHasher, +{ + #[inline] + fn extend>(&mut self, iter: T) { + self.0.extend(iter) + } +} + +/// NOTE: For safety this trait impl is only available available if either of the flags `runtime-rng` (on by default) or +/// `compile-time-rng` are enabled. This is to prevent weakly keyed maps from being accidentally created. Instead one of +/// constructors for [RandomState] must be used. +#[cfg(any(feature = "compile-time-rng", feature = "runtime-rng", feature = "no-rng"))] +impl Default for AHashMap { + #[inline] + fn default() -> AHashMap { + AHashMap(HashMap::default()) + } +} + +#[cfg(feature = "serde")] +impl Serialize for AHashMap +where + K: Serialize + Eq + Hash, + V: Serialize, +{ + fn serialize(&self, serializer: S) -> Result { + self.deref().serialize(serializer) + } +} + +#[cfg(feature = "serde")] +impl<'de, K, V> Deserialize<'de> for AHashMap +where + K: Deserialize<'de> + Eq + Hash, + V: Deserialize<'de>, +{ + fn deserialize>(deserializer: D) -> Result { + let hash_map = HashMap::deserialize(deserializer); + hash_map.map(|hash_map| Self(hash_map)) + } + + fn deserialize_in_place>(deserializer: D, place: &mut Self) -> Result<(), D::Error> { + use serde::de::{MapAccess, Visitor}; + + struct MapInPlaceVisitor<'a, K: 'a, V: 'a>(&'a mut AHashMap); + + impl<'a, 'de, K, V> Visitor<'de> for MapInPlaceVisitor<'a, K, V> + where + K: Deserialize<'de> + Eq + Hash, + V: Deserialize<'de>, + { + type Value = (); + + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + formatter.write_str("a map") + } + + fn visit_map(self, mut map: A) -> Result + where + A: MapAccess<'de>, + { + self.0.clear(); + self.0.reserve(map.size_hint().unwrap_or(0).min(4096)); + + while let Some((key, value)) = map.next_entry()? { + self.0.insert(key, value); + } + + Ok(()) + } + } + + deserializer.deserialize_map(MapInPlaceVisitor(place)) + } +} + +#[cfg(test)] +mod test { + use super::*; + #[test] + fn test_borrow() { + let mut map: AHashMap = AHashMap::new(); + map.insert("foo".to_string(), "Bar".to_string()); + map.insert("Bar".to_string(), map.get("foo").unwrap().to_owned()); + } + + #[cfg(feature = "serde")] + #[test] + fn test_serde() { + let mut map = AHashMap::new(); + map.insert("for".to_string(), 0); + map.insert("bar".to_string(), 1); + let mut serialization = serde_json::to_string(&map).unwrap(); + let mut deserialization: AHashMap = serde_json::from_str(&serialization).unwrap(); + assert_eq!(deserialization, map); + + map.insert("baz".to_string(), 2); + serialization = serde_json::to_string(&map).unwrap(); + let mut deserializer = serde_json::Deserializer::from_str(&serialization); + AHashMap::deserialize_in_place(&mut deserializer, &mut deserialization).unwrap(); + assert_eq!(deserialization, map); + } +} diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/src/hash_quality_test.rs b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/src/hash_quality_test.rs new file mode 100644 index 0000000..25356e4 --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/src/hash_quality_test.rs @@ -0,0 +1,534 @@ +use core::hash::{Hash, Hasher}; +use std::collections::{HashMap}; + +fn assert_sufficiently_different(a: u64, b: u64, tolerance: i32) { + let (same_byte_count, same_nibble_count) = count_same_bytes_and_nibbles(a, b); + assert!(same_byte_count <= tolerance, "{:x} vs {:x}: {:}", a, b, same_byte_count); + assert!( + same_nibble_count <= tolerance * 3, + "{:x} vs {:x}: {:}", + a, + b, + same_nibble_count + ); + let flipped_bits = (a ^ b).count_ones(); + assert!( + flipped_bits > 12 && flipped_bits < 52, + "{:x} and {:x}: {:}", + a, + b, + flipped_bits + ); + for rotate in 0..64 { + let flipped_bits2 = (a ^ (b.rotate_left(rotate))).count_ones(); + assert!( + flipped_bits2 > 10 && flipped_bits2 < 54, + "{:x} and {:x}: {:}", + a, + b.rotate_left(rotate), + flipped_bits2 + ); + } +} + +fn count_same_bytes_and_nibbles(a: u64, b: u64) -> (i32, i32) { + let mut same_byte_count = 0; + let mut same_nibble_count = 0; + for byte in 0..8 { + let ba = (a >> (8 * byte)) as u8; + let bb = (b >> (8 * byte)) as u8; + if ba == bb { + same_byte_count += 1; + } + if ba & 0xF0u8 == bb & 0xF0u8 { + same_nibble_count += 1; + } + if ba & 0x0Fu8 == bb & 0x0Fu8 { + same_nibble_count += 1; + } + } + (same_byte_count, same_nibble_count) +} + +fn gen_combinations(options: &[u32; 11], depth: u32, so_far: Vec, combinations: &mut Vec>) { + if depth == 0 { + return; + } + for option in options { + let mut next = so_far.clone(); + next.push(*option); + combinations.push(next.clone()); + gen_combinations(options, depth - 1, next, combinations); + } +} + +fn test_no_full_collisions(gen_hash: impl Fn() -> T) { + let options: [u32; 11] = [ + 0x00000000, 0x10000000, 0x20000000, 0x40000000, 0x80000000, 0xF0000000, + 1, 2, 4, 8, 15 + ]; + let mut combinations = Vec::new(); + gen_combinations(&options, 7, Vec::new(), &mut combinations); + let mut map: HashMap> = HashMap::new(); + for combination in combinations { + use zerocopy::AsBytes; + let array = combination.as_slice().as_bytes().to_vec(); + let mut hasher = gen_hash(); + hasher.write(&array); + let hash = hasher.finish(); + if let Some(value) = map.get(&hash) { + assert_eq!( + value, &array, + "Found a collision between {:x?} and {:x?}. Hash: {:x?}", + value, &array, &hash + ); + } else { + map.insert(hash, array); + } + } + assert_eq!(21435887, map.len()); //11^7 + 11^6 ... +} + +fn test_keys_change_output(constructor: impl Fn(u128, u128) -> T) { + let mut a = constructor(1, 1); + let mut b = constructor(1, 2); + let mut c = constructor(2, 1); + let mut d = constructor(2, 2); + "test".hash(&mut a); + "test".hash(&mut b); + "test".hash(&mut c); + "test".hash(&mut d); + assert_sufficiently_different(a.finish(), b.finish(), 1); + assert_sufficiently_different(a.finish(), c.finish(), 1); + assert_sufficiently_different(a.finish(), d.finish(), 1); + assert_sufficiently_different(b.finish(), c.finish(), 1); + assert_sufficiently_different(b.finish(), d.finish(), 1); + assert_sufficiently_different(c.finish(), d.finish(), 1); +} + +fn test_input_affect_every_byte(constructor: impl Fn(u128, u128) -> T) { + let base = hash_with(&0, constructor(0, 0)); + for shift in 0..16 { + let mut alternitives = vec![]; + for v in 0..256 { + let input = (v as u128) << (shift * 8); + let hasher = constructor(0, 0); + alternitives.push(hash_with(&input, hasher)); + } + assert_each_byte_differs(shift, base, alternitives); + } +} + +///Ensures that for every bit in the output there is some value for each byte in the key that flips it. +fn test_keys_affect_every_byte(item: H, constructor: impl Fn(u128, u128) -> T) { + let base = hash_with(&item, constructor(0, 0)); + for shift in 0..16 { + let mut alternitives1 = vec![]; + let mut alternitives2 = vec![]; + for v in 0..256 { + let input = (v as u128) << (shift * 8); + let hasher1 = constructor(input, 0); + let hasher2 = constructor(0, input); + let h1 = hash_with(&item, hasher1); + let h2 = hash_with(&item, hasher2); + alternitives1.push(h1); + alternitives2.push(h2); + } + assert_each_byte_differs(shift, base, alternitives1); + assert_each_byte_differs(shift, base, alternitives2); + } +} + +fn assert_each_byte_differs(num: u64, base: u64, alternitives: Vec) { + let mut changed_bits = 0_u64; + for alternitive in alternitives { + changed_bits |= base ^ alternitive + } + assert_eq!( + core::u64::MAX, + changed_bits, + "Bits changed: {:x} on num: {:?}. base {:x}", + changed_bits, + num, + base + ); +} + +fn test_finish_is_consistent(constructor: impl Fn(u128, u128) -> T) { + let mut hasher = constructor(1, 2); + "Foo".hash(&mut hasher); + let a = hasher.finish(); + let b = hasher.finish(); + assert_eq!(a, b); +} + +fn test_single_key_bit_flip(constructor: impl Fn(u128, u128) -> T) { + for bit in 0..128 { + let mut a = constructor(0, 0); + let mut b = constructor(0, 1 << bit); + let mut c = constructor(1 << bit, 0); + "1234".hash(&mut a); + "1234".hash(&mut b); + "1234".hash(&mut c); + assert_sufficiently_different(a.finish(), b.finish(), 2); + assert_sufficiently_different(a.finish(), c.finish(), 2); + assert_sufficiently_different(b.finish(), c.finish(), 2); + let mut a = constructor(0, 0); + let mut b = constructor(0, 1 << bit); + let mut c = constructor(1 << bit, 0); + "12345678".hash(&mut a); + "12345678".hash(&mut b); + "12345678".hash(&mut c); + assert_sufficiently_different(a.finish(), b.finish(), 2); + assert_sufficiently_different(a.finish(), c.finish(), 2); + assert_sufficiently_different(b.finish(), c.finish(), 2); + let mut a = constructor(0, 0); + let mut b = constructor(0, 1 << bit); + let mut c = constructor(1 << bit, 0); + "1234567812345678".hash(&mut a); + "1234567812345678".hash(&mut b); + "1234567812345678".hash(&mut c); + assert_sufficiently_different(a.finish(), b.finish(), 2); + assert_sufficiently_different(a.finish(), c.finish(), 2); + assert_sufficiently_different(b.finish(), c.finish(), 2); + } +} + +fn test_all_bytes_matter(hasher: impl Fn() -> T) { + let mut item = vec![0; 256]; + let base_hash = hash(&item, &hasher); + for pos in 0..256 { + item[pos] = 255; + let hash = hash(&item, &hasher); + assert_ne!(base_hash, hash, "Position {} did not affect output", pos); + item[pos] = 0; + } +} + +fn test_no_pair_collisions(hasher: impl Fn() -> T) { + let base = [0_u64, 0_u64]; + let base_hash = hash(&base, &hasher); + for bitpos1 in 0..64 { + let a = 1_u64 << bitpos1; + for bitpos2 in 0..bitpos1 { + let b = 1_u64 << bitpos2; + let aa = hash(&[a, a], &hasher); + let ab = hash(&[a, b], &hasher); + let ba = hash(&[b, a], &hasher); + let bb = hash(&[b, b], &hasher); + assert_sufficiently_different(base_hash, aa, 3); + assert_sufficiently_different(base_hash, ab, 3); + assert_sufficiently_different(base_hash, ba, 3); + assert_sufficiently_different(base_hash, bb, 3); + assert_sufficiently_different(aa, ab, 3); + assert_sufficiently_different(ab, ba, 3); + assert_sufficiently_different(ba, bb, 3); + assert_sufficiently_different(aa, ba, 3); + assert_sufficiently_different(ab, bb, 3); + assert_sufficiently_different(aa, bb, 3); + } + } +} + +fn hash(b: &H, hash_builder: &dyn Fn() -> T) -> u64 { + let mut hasher = hash_builder(); + b.hash(&mut hasher); + hasher.finish() +} + +fn hash_with(b: &H, mut hasher: T) -> u64 { + b.hash(&mut hasher); + hasher.finish() +} + +fn test_single_bit_flip(hasher: impl Fn() -> T) { + let size = 32; + let compare_value = hash(&0u32, &hasher); + for pos in 0..size { + let test_value = hash(&(1u32 << pos), &hasher); + assert_sufficiently_different(compare_value, test_value, 2); + } + let size = 64; + let compare_value = hash(&0u64, &hasher); + for pos in 0..size { + let test_value = hash(&(1u64 << pos), &hasher); + assert_sufficiently_different(compare_value, test_value, 2); + } + let size = 128; + let compare_value = hash(&0u128, &hasher); + for pos in 0..size { + let test_value = hash(&(1u128 << pos), &hasher); + dbg!(compare_value, test_value); + assert_sufficiently_different(compare_value, test_value, 2); + } +} + +fn test_padding_doesnot_collide(hasher: impl Fn() -> T) { + for c in 0..128u8 { + for string in ["", "\0", "\x01", "1234", "12345678", "1234567812345678"].iter() { + let mut short = hasher(); + string.hash(&mut short); + let value = short.finish(); + let mut padded = string.to_string(); + for num in 1..=128 { + let mut long = hasher(); + padded.push(c as char); + padded.hash(&mut long); + let (same_bytes, same_nibbles) = count_same_bytes_and_nibbles(value, long.finish()); + assert!( + same_bytes <= 3, + "{} bytes of {} -> {:x} vs {:x}", + num, + c, + value, + long.finish() + ); + assert!( + same_nibbles <= 8, + "{} bytes of {} -> {:x} vs {:x}", + num, + c, + value, + long.finish() + ); + let flipped_bits = (value ^ long.finish()).count_ones(); + assert!(flipped_bits > 10); + } + if string.len() > 0 { + let mut padded = string[1..].to_string(); + padded.push(c as char); + for num in 2..=128 { + let mut long = hasher(); + padded.push(c as char); + padded.hash(&mut long); + let (same_bytes, same_nibbles) = count_same_bytes_and_nibbles(value, long.finish()); + assert!( + same_bytes <= 3, + "string {:?} + {} bytes of {} -> {:x} vs {:x}", + string, + num, + c, + value, + long.finish() + ); + assert!( + same_nibbles <= 8, + "string {:?} + {} bytes of {} -> {:x} vs {:x}", + string, + num, + c, + value, + long.finish() + ); + let flipped_bits = (value ^ long.finish()).count_ones(); + assert!(flipped_bits > 10); + } + } + } + } +} + +fn test_length_extension(hasher: impl Fn(u128, u128) -> T) { + for key in 0..256 { + let h1 = hasher(key, key); + let v1 = hash_with(&[0_u8, 0, 0, 0, 0, 0, 0, 0], h1); + let h2 = hasher(key, key); + let v2 = hash_with(&[1_u8, 0, 0, 0, 0, 0, 0, 0, 0], h2); + assert_ne!(v1, v2); + } +} + +fn test_sparse(hasher: impl Fn() -> T) { + let mut buf = [0u8; 256]; + let mut hashes = HashMap::new(); + for idx_1 in 0..256 { + for idx_2 in idx_1+1..256 { + for value_1 in [1, 2, 4, 8, 16, 32, 64, 128] { + for value_2 in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 15, 16, 17, 18, 20, 24, 31, 32, 33, 48, 64, 96, 127, 128, 129, 192, 254, 255] { + buf[idx_1] = value_1; + buf[idx_2] = value_2; + let hash_value = hash_with(&buf, &mut hasher()); + let keys = hashes.entry(hash_value).or_insert(Vec::new()); + keys.push((idx_1, value_1, idx_2, value_2)); + buf[idx_1] = 0; + buf[idx_2] = 0; + } + } + } + } + hashes.retain(|_key, value| value.len() != 1); + assert_eq!(0, hashes.len(), "Collision with: {:?}", hashes); +} + +#[cfg(test)] +mod fallback_tests { + use crate::fallback_hash::*; + use crate::hash_quality_test::*; + + #[test] + fn fallback_single_bit_flip() { + test_single_bit_flip(|| AHasher::new_with_keys(0, 0)) + } + + #[test] + fn fallback_single_key_bit_flip() { + test_single_key_bit_flip(AHasher::new_with_keys) + } + + #[test] + fn fallback_all_bytes_matter() { + test_all_bytes_matter(|| AHasher::new_with_keys(0, 0)); + } + + #[test] + fn fallback_test_no_pair_collisions() { + test_no_pair_collisions(|| AHasher::new_with_keys(0, 0)); + } + + #[test] + fn fallback_test_no_full_collisions() { + test_no_full_collisions(|| AHasher::new_with_keys(0, 0)); + } + + #[test] + fn fallback_keys_change_output() { + test_keys_change_output(AHasher::new_with_keys); + } + + #[test] + fn fallback_input_affect_every_byte() { + test_input_affect_every_byte(AHasher::new_with_keys); + } + + #[test] + fn fallback_keys_affect_every_byte() { + //For fallback second key is not used in every hash. + #[cfg(all(not(feature = "specialize"), feature = "folded_multiply"))] + test_keys_affect_every_byte(0, |a, b| AHasher::new_with_keys(a ^ b, a)); + test_keys_affect_every_byte("", |a, b| AHasher::new_with_keys(a ^ b, a)); + test_keys_affect_every_byte((0, 0), |a, b| AHasher::new_with_keys(a ^ b, a)); + } + + #[test] + fn fallback_finish_is_consistant() { + test_finish_is_consistent(AHasher::test_with_keys) + } + + #[test] + fn fallback_padding_doesnot_collide() { + test_padding_doesnot_collide(|| AHasher::new_with_keys(0, 0)); + test_padding_doesnot_collide(|| AHasher::new_with_keys(0, 2)); + test_padding_doesnot_collide(|| AHasher::new_with_keys(2, 0)); + test_padding_doesnot_collide(|| AHasher::new_with_keys(2, 2)); + } + + #[test] + fn fallback_length_extension() { + test_length_extension(|a, b| AHasher::new_with_keys(a, b)); + } + + #[test] + fn test_no_sparse_collisions() { + test_sparse(|| AHasher::new_with_keys(0, 0)); + test_sparse(|| AHasher::new_with_keys(1, 2)); + } +} + +///Basic sanity tests of the cypto properties of aHash. +#[cfg(any( + all(any(target_arch = "x86", target_arch = "x86_64"), target_feature = "aes", not(miri)), + all( + any(target_arch = "arm", target_arch = "aarch64"), + any(target_feature = "aes", target_feature = "crypto"), + not(miri), + feature = "stdsimd" + ) +))] +#[cfg(test)] +mod aes_tests { + use crate::aes_hash::*; + use crate::hash_quality_test::*; + use std::hash::{Hash, Hasher}; + + //This encrypts to 0. + const BAD_KEY2: u128 = 0x6363_6363_6363_6363_6363_6363_6363_6363; + //This decrypts to 0. + const BAD_KEY: u128 = 0x5252_5252_5252_5252_5252_5252_5252_5252; + + #[test] + fn test_single_bit_in_byte() { + let mut hasher1 = AHasher::test_with_keys(0, 0); + 8_u32.hash(&mut hasher1); + let mut hasher2 = AHasher::test_with_keys(0, 0); + 0_u32.hash(&mut hasher2); + assert_sufficiently_different(hasher1.finish(), hasher2.finish(), 1); + } + + #[test] + fn aes_single_bit_flip() { + test_single_bit_flip(|| AHasher::test_with_keys(BAD_KEY, BAD_KEY)); + test_single_bit_flip(|| AHasher::test_with_keys(BAD_KEY2, BAD_KEY2)); + } + + #[test] + fn aes_single_key_bit_flip() { + test_single_key_bit_flip(AHasher::test_with_keys) + } + + #[test] + fn aes_all_bytes_matter() { + test_all_bytes_matter(|| AHasher::test_with_keys(BAD_KEY, BAD_KEY)); + test_all_bytes_matter(|| AHasher::test_with_keys(BAD_KEY2, BAD_KEY2)); + } + + #[test] + fn aes_test_no_pair_collisions() { + test_no_pair_collisions(|| AHasher::test_with_keys(BAD_KEY, BAD_KEY)); + test_no_pair_collisions(|| AHasher::test_with_keys(BAD_KEY2, BAD_KEY2)); + } + + #[test] + fn ase_test_no_full_collisions() { + test_no_full_collisions(|| AHasher::test_with_keys(12345, 67890)); + } + + #[test] + fn aes_keys_change_output() { + test_keys_change_output(AHasher::test_with_keys); + } + + #[test] + fn aes_input_affect_every_byte() { + test_input_affect_every_byte(AHasher::test_with_keys); + } + + #[test] + fn aes_keys_affect_every_byte() { + #[cfg(not(feature = "specialize"))] + test_keys_affect_every_byte(0, AHasher::test_with_keys); + test_keys_affect_every_byte("", AHasher::test_with_keys); + test_keys_affect_every_byte((0, 0), AHasher::test_with_keys); + } + + #[test] + fn aes_finish_is_consistant() { + test_finish_is_consistent(AHasher::test_with_keys) + } + + #[test] + fn aes_padding_doesnot_collide() { + test_padding_doesnot_collide(|| AHasher::test_with_keys(BAD_KEY, BAD_KEY)); + test_padding_doesnot_collide(|| AHasher::test_with_keys(BAD_KEY2, BAD_KEY2)); + } + + #[test] + fn aes_length_extension() { + test_length_extension(|a, b| AHasher::test_with_keys(a, b)); + } + + #[test] + fn aes_no_sparse_collisions() { + test_sparse(|| AHasher::test_with_keys(0, 0)); + test_sparse(|| AHasher::test_with_keys(1, 2)); + } +} diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/src/hash_set.rs b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/src/hash_set.rs new file mode 100644 index 0000000..d03bef5 --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/src/hash_set.rs @@ -0,0 +1,352 @@ +use crate::RandomState; +use std::collections::{hash_set, HashSet}; +use std::fmt::{self, Debug}; +use std::hash::{BuildHasher, Hash}; +use std::iter::FromIterator; +use std::ops::{BitAnd, BitOr, BitXor, Deref, DerefMut, Sub}; + +#[cfg(feature = "serde")] +use serde::{ + de::{Deserialize, Deserializer}, + ser::{Serialize, Serializer}, +}; + +/// A [`HashSet`](std::collections::HashSet) using [`RandomState`](crate::RandomState) to hash the items. +/// (Requires the `std` feature to be enabled.) +#[derive(Clone)] +pub struct AHashSet(HashSet); + +impl From> for AHashSet { + fn from(item: HashSet) -> Self { + AHashSet(item) + } +} + +impl From<[T; N]> for AHashSet +where + T: Eq + Hash, +{ + /// # Examples + /// + /// ``` + /// use ahash::AHashSet; + /// + /// let set1 = AHashSet::from([1, 2, 3, 4]); + /// let set2: AHashSet<_> = [1, 2, 3, 4].into(); + /// assert_eq!(set1, set2); + /// ``` + fn from(arr: [T; N]) -> Self { + Self::from_iter(arr) + } +} + +impl Into> for AHashSet { + fn into(self) -> HashSet { + self.0 + } +} + +impl AHashSet { + /// This crates a hashset using [RandomState::new]. + /// See the documentation in [RandomSource] for notes about key strength. + pub fn new() -> Self { + AHashSet(HashSet::with_hasher(RandomState::new())) + } + + /// This crates a hashset with the specified capacity using [RandomState::new]. + /// See the documentation in [RandomSource] for notes about key strength. + pub fn with_capacity(capacity: usize) -> Self { + AHashSet(HashSet::with_capacity_and_hasher(capacity, RandomState::new())) + } +} + +impl AHashSet +where + S: BuildHasher, +{ + pub fn with_hasher(hash_builder: S) -> Self { + AHashSet(HashSet::with_hasher(hash_builder)) + } + + pub fn with_capacity_and_hasher(capacity: usize, hash_builder: S) -> Self { + AHashSet(HashSet::with_capacity_and_hasher(capacity, hash_builder)) + } +} + +impl Deref for AHashSet { + type Target = HashSet; + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +impl DerefMut for AHashSet { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.0 + } +} + +impl PartialEq for AHashSet +where + T: Eq + Hash, + S: BuildHasher, +{ + fn eq(&self, other: &AHashSet) -> bool { + self.0.eq(&other.0) + } +} + +impl Eq for AHashSet +where + T: Eq + Hash, + S: BuildHasher, +{ +} + +impl BitOr<&AHashSet> for &AHashSet +where + T: Eq + Hash + Clone, + S: BuildHasher + Default, +{ + type Output = AHashSet; + + /// Returns the union of `self` and `rhs` as a new `AHashSet`. + /// + /// # Examples + /// + /// ``` + /// use ahash::AHashSet; + /// + /// let a: AHashSet<_> = vec![1, 2, 3].into_iter().collect(); + /// let b: AHashSet<_> = vec![3, 4, 5].into_iter().collect(); + /// + /// let set = &a | &b; + /// + /// let mut i = 0; + /// let expected = [1, 2, 3, 4, 5]; + /// for x in &set { + /// assert!(expected.contains(x)); + /// i += 1; + /// } + /// assert_eq!(i, expected.len()); + /// ``` + fn bitor(self, rhs: &AHashSet) -> AHashSet { + AHashSet(self.0.bitor(&rhs.0)) + } +} + +impl BitAnd<&AHashSet> for &AHashSet +where + T: Eq + Hash + Clone, + S: BuildHasher + Default, +{ + type Output = AHashSet; + + /// Returns the intersection of `self` and `rhs` as a new `AHashSet`. + /// + /// # Examples + /// + /// ``` + /// use ahash::AHashSet; + /// + /// let a: AHashSet<_> = vec![1, 2, 3].into_iter().collect(); + /// let b: AHashSet<_> = vec![2, 3, 4].into_iter().collect(); + /// + /// let set = &a & &b; + /// + /// let mut i = 0; + /// let expected = [2, 3]; + /// for x in &set { + /// assert!(expected.contains(x)); + /// i += 1; + /// } + /// assert_eq!(i, expected.len()); + /// ``` + fn bitand(self, rhs: &AHashSet) -> AHashSet { + AHashSet(self.0.bitand(&rhs.0)) + } +} + +impl BitXor<&AHashSet> for &AHashSet +where + T: Eq + Hash + Clone, + S: BuildHasher + Default, +{ + type Output = AHashSet; + + /// Returns the symmetric difference of `self` and `rhs` as a new `AHashSet`. + /// + /// # Examples + /// + /// ``` + /// use ahash::AHashSet; + /// + /// let a: AHashSet<_> = vec![1, 2, 3].into_iter().collect(); + /// let b: AHashSet<_> = vec![3, 4, 5].into_iter().collect(); + /// + /// let set = &a ^ &b; + /// + /// let mut i = 0; + /// let expected = [1, 2, 4, 5]; + /// for x in &set { + /// assert!(expected.contains(x)); + /// i += 1; + /// } + /// assert_eq!(i, expected.len()); + /// ``` + fn bitxor(self, rhs: &AHashSet) -> AHashSet { + AHashSet(self.0.bitxor(&rhs.0)) + } +} + +impl Sub<&AHashSet> for &AHashSet +where + T: Eq + Hash + Clone, + S: BuildHasher + Default, +{ + type Output = AHashSet; + + /// Returns the difference of `self` and `rhs` as a new `AHashSet`. + /// + /// # Examples + /// + /// ``` + /// use ahash::AHashSet; + /// + /// let a: AHashSet<_> = vec![1, 2, 3].into_iter().collect(); + /// let b: AHashSet<_> = vec![3, 4, 5].into_iter().collect(); + /// + /// let set = &a - &b; + /// + /// let mut i = 0; + /// let expected = [1, 2]; + /// for x in &set { + /// assert!(expected.contains(x)); + /// i += 1; + /// } + /// assert_eq!(i, expected.len()); + /// ``` + fn sub(self, rhs: &AHashSet) -> AHashSet { + AHashSet(self.0.sub(&rhs.0)) + } +} + +impl Debug for AHashSet +where + T: Debug, + S: BuildHasher, +{ + fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { + self.0.fmt(fmt) + } +} + +impl FromIterator for AHashSet +where + T: Eq + Hash, +{ + /// This crates a hashset from the provided iterator using [RandomState::new]. + /// See the documentation in [RandomSource] for notes about key strength. + #[inline] + fn from_iter>(iter: I) -> AHashSet { + let mut inner = HashSet::with_hasher(RandomState::new()); + inner.extend(iter); + AHashSet(inner) + } +} + +impl<'a, T, S> IntoIterator for &'a AHashSet { + type Item = &'a T; + type IntoIter = hash_set::Iter<'a, T>; + fn into_iter(self) -> Self::IntoIter { + (&self.0).iter() + } +} + +impl IntoIterator for AHashSet { + type Item = T; + type IntoIter = hash_set::IntoIter; + fn into_iter(self) -> Self::IntoIter { + self.0.into_iter() + } +} + +impl Extend for AHashSet +where + T: Eq + Hash, + S: BuildHasher, +{ + #[inline] + fn extend>(&mut self, iter: I) { + self.0.extend(iter) + } +} + +impl<'a, T, S> Extend<&'a T> for AHashSet +where + T: 'a + Eq + Hash + Copy, + S: BuildHasher, +{ + #[inline] + fn extend>(&mut self, iter: I) { + self.0.extend(iter) + } +} + +/// NOTE: For safety this trait impl is only available available if either of the flags `runtime-rng` (on by default) or +/// `compile-time-rng` are enabled. This is to prevent weakly keyed maps from being accidentally created. Instead one of +/// constructors for [RandomState] must be used. +#[cfg(any(feature = "compile-time-rng", feature = "runtime-rng", feature = "no-rng"))] +impl Default for AHashSet { + /// Creates an empty `AHashSet` with the `Default` value for the hasher. + #[inline] + fn default() -> AHashSet { + AHashSet(HashSet::default()) + } +} + +#[cfg(feature = "serde")] +impl Serialize for AHashSet +where + T: Serialize + Eq + Hash, +{ + fn serialize(&self, serializer: S) -> Result { + self.deref().serialize(serializer) + } +} + +#[cfg(feature = "serde")] +impl<'de, T> Deserialize<'de> for AHashSet +where + T: Deserialize<'de> + Eq + Hash, +{ + fn deserialize>(deserializer: D) -> Result { + let hash_set = HashSet::deserialize(deserializer); + hash_set.map(|hash_set| Self(hash_set)) + } + + fn deserialize_in_place>(deserializer: D, place: &mut Self) -> Result<(), D::Error> { + HashSet::deserialize_in_place(deserializer, place) + } +} + +#[cfg(all(test, feature = "serde"))] +mod test { + use super::*; + + #[test] + fn test_serde() { + let mut set = AHashSet::new(); + set.insert("for".to_string()); + set.insert("bar".to_string()); + let mut serialization = serde_json::to_string(&set).unwrap(); + let mut deserialization: AHashSet = serde_json::from_str(&serialization).unwrap(); + assert_eq!(deserialization, set); + + set.insert("baz".to_string()); + serialization = serde_json::to_string(&set).unwrap(); + let mut deserializer = serde_json::Deserializer::from_str(&serialization); + AHashSet::deserialize_in_place(&mut deserializer, &mut deserialization).unwrap(); + assert_eq!(deserialization, set); + } +} diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/src/lib.rs b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/src/lib.rs new file mode 100644 index 0000000..0907786 --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/src/lib.rs @@ -0,0 +1,398 @@ +#![allow(warnings)] + +//! AHash is a high performance keyed hash function. +//! +//! It quickly provides a high quality hash where the result is not predictable without knowing the Key. +//! AHash works with `HashMap` to hash keys, but without allowing for the possibility that an malicious user can +//! induce a collision. +//! +//! # How aHash works +//! +//! When it is available aHash uses the hardware AES instructions to provide a keyed hash function. +//! When it is not, aHash falls back on a slightly slower alternative algorithm. +//! +//! Because aHash does not have a fixed standard for its output, it is able to improve over time. +//! But this also means that different computers or computers using different versions of ahash may observe different +//! hash values for the same input. +#![cfg_attr( + all(feature = "std", any(feature = "compile-time-rng", feature = "runtime-rng", feature = "no-rng")), + doc = r##" +# Basic Usage +AHash provides an implementation of the [Hasher] trait. +To construct a HashMap using aHash as its hasher do the following: +``` +use ahash::{AHasher, RandomState}; +use std::collections::HashMap; + +let mut map: HashMap = HashMap::default(); +map.insert(12, 34); +``` + +### Randomness + +The above requires a source of randomness to generate keys for the hashmap. By default this obtained from the OS. +It is also possible to have randomness supplied via the `compile-time-rng` flag, or manually. + +### If randomess is not available + +[AHasher::default()] can be used to hash using fixed keys. This works with +[BuildHasherDefault](std::hash::BuildHasherDefault). For example: + +``` +use std::hash::BuildHasherDefault; +use std::collections::HashMap; +use ahash::AHasher; + +let mut m: HashMap<_, _, BuildHasherDefault> = HashMap::default(); + # m.insert(12, 34); +``` +It is also possible to instantiate [RandomState] directly: + +``` +use ahash::HashMap; +use ahash::RandomState; + +let mut m = HashMap::with_hasher(RandomState::with_seed(42)); + # m.insert(1, 2); +``` +Or for uses besides a hashhmap: +``` +use std::hash::BuildHasher; +use ahash::RandomState; + +let hash_builder = RandomState::with_seed(42); +let hash = hash_builder.hash_one("Some Data"); +``` +There are several constructors for [RandomState] with different ways to supply seeds. + +# Convenience wrappers + +For convenience, both new-type wrappers and type aliases are provided. + +The new type wrappers are called called `AHashMap` and `AHashSet`. +``` +use ahash::AHashMap; + +let mut map: AHashMap = AHashMap::new(); +map.insert(12, 34); +``` +This avoids the need to type "RandomState". (For convience `From`, `Into`, and `Deref` are provided). + +# Aliases + +For even less typing and better interop with existing libraries (such as rayon) which require a `std::collection::HashMap` , +the type aliases [HashMap], [HashSet] are provided. + +``` +use ahash::{HashMap, HashMapExt}; + +let mut map: HashMap = HashMap::new(); +map.insert(12, 34); +``` +Note the import of [HashMapExt]. This is needed for the constructor. + +"## +)] +#![deny(clippy::correctness, clippy::complexity, clippy::perf)] +#![allow(clippy::pedantic, clippy::cast_lossless, clippy::unreadable_literal)] +#![cfg_attr(all(not(test), not(feature = "std")), no_std)] +#![cfg_attr(feature = "specialize", feature(min_specialization))] +#![cfg_attr(feature = "specialize", feature(build_hasher_simple_hash_one))] + +#[macro_use] +mod convert; + +mod fallback_hash; + +cfg_if::cfg_if! { + if #[cfg(any( + all(any(target_arch = "x86", target_arch = "x86_64"), target_feature = "aes", not(miri)), + all(any(target_arch = "arm", target_arch = "aarch64"), + any(target_feature = "aes", target_feature = "crypto"), + not(miri), + feature = "stdsimd") + ))] { + mod aes_hash; + pub use crate::aes_hash::AHasher; + } else { + pub use crate::fallback_hash::AHasher; + } +} + +cfg_if::cfg_if! { + if #[cfg(feature = "std")] { + mod hash_map; + mod hash_set; + + pub use crate::hash_map::AHashMap; + pub use crate::hash_set::AHashSet; + + /// [Hasher]: std::hash::Hasher + /// [HashMap]: std::collections::HashMap + /// Type alias for [HashMap] + pub type HashMap = std::collections::HashMap; + + /// Type alias for [HashSet] + pub type HashSet = std::collections::HashSet; + } +} + +#[cfg(test)] +mod hash_quality_test; + +mod operations; +pub mod random_state; +mod specialize; + +pub use crate::random_state::RandomState; + +use core::hash::BuildHasher; +use core::hash::Hash; +use core::hash::Hasher; + +#[cfg(feature = "std")] +/// A convenience trait that can be used together with the type aliases defined to +/// get access to the `new()` and `with_capacity()` methods for the HashMap type alias. +pub trait HashMapExt { + /// Constructs a new HashMap + fn new() -> Self; + /// Constructs a new HashMap with a given initial capacity + fn with_capacity(capacity: usize) -> Self; +} + +#[cfg(feature = "std")] +/// A convenience trait that can be used together with the type aliases defined to +/// get access to the `new()` and `with_capacity()` methods for the HashSet type aliases. +pub trait HashSetExt { + /// Constructs a new HashSet + fn new() -> Self; + /// Constructs a new HashSet with a given initial capacity + fn with_capacity(capacity: usize) -> Self; +} + +#[cfg(feature = "std")] +impl HashMapExt for std::collections::HashMap +where + S: BuildHasher + Default, +{ + fn new() -> Self { + std::collections::HashMap::with_hasher(S::default()) + } + + fn with_capacity(capacity: usize) -> Self { + std::collections::HashMap::with_capacity_and_hasher(capacity, S::default()) + } +} + +#[cfg(feature = "std")] +impl HashSetExt for std::collections::HashSet +where + S: BuildHasher + Default, +{ + fn new() -> Self { + std::collections::HashSet::with_hasher(S::default()) + } + + fn with_capacity(capacity: usize) -> Self { + std::collections::HashSet::with_capacity_and_hasher(capacity, S::default()) + } +} + +/// Provides a default [Hasher] with fixed keys. +/// This is typically used in conjunction with [BuildHasherDefault] to create +/// [AHasher]s in order to hash the keys of the map. +/// +/// Generally it is preferable to use [RandomState] instead, so that different +/// hashmaps will have different keys. However if fixed keys are desirable this +/// may be used instead. +/// +/// # Example +/// ``` +/// use std::hash::BuildHasherDefault; +/// use ahash::{AHasher, RandomState}; +/// use std::collections::HashMap; +/// +/// let mut map: HashMap> = HashMap::default(); +/// map.insert(12, 34); +/// ``` +/// +/// [BuildHasherDefault]: std::hash::BuildHasherDefault +/// [Hasher]: std::hash::Hasher +/// [HashMap]: std::collections::HashMap +impl Default for AHasher { + /// Constructs a new [AHasher] with fixed keys. + /// If `std` is enabled these will be generated upon first invocation. + /// Otherwise if the `compile-time-rng`feature is enabled these will be generated at compile time. + /// If neither of these features are available, hardcoded constants will be used. + /// + /// Because the values are fixed, different hashers will all hash elements the same way. + /// This could make hash values predictable, if DOS attacks are a concern. If this behaviour is + /// not required, it may be preferable to use [RandomState] instead. + /// + /// # Examples + /// + /// ``` + /// use ahash::AHasher; + /// use std::hash::Hasher; + /// + /// let mut hasher_1 = AHasher::default(); + /// let mut hasher_2 = AHasher::default(); + /// + /// hasher_1.write_u32(1234); + /// hasher_2.write_u32(1234); + /// + /// assert_eq!(hasher_1.finish(), hasher_2.finish()); + /// ``` + #[inline] + fn default() -> AHasher { + RandomState::with_fixed_keys().build_hasher() + } +} + +/// Used for specialization. (Sealed) +pub(crate) trait BuildHasherExt: BuildHasher { + #[doc(hidden)] + fn hash_as_u64(&self, value: &T) -> u64; + + #[doc(hidden)] + fn hash_as_fixed_length(&self, value: &T) -> u64; + + #[doc(hidden)] + fn hash_as_str(&self, value: &T) -> u64; +} + +impl BuildHasherExt for B { + #[inline] + #[cfg(feature = "specialize")] + default fn hash_as_u64(&self, value: &T) -> u64 { + let mut hasher = self.build_hasher(); + value.hash(&mut hasher); + hasher.finish() + } + #[inline] + #[cfg(not(feature = "specialize"))] + fn hash_as_u64(&self, value: &T) -> u64 { + let mut hasher = self.build_hasher(); + value.hash(&mut hasher); + hasher.finish() + } + #[inline] + #[cfg(feature = "specialize")] + default fn hash_as_fixed_length(&self, value: &T) -> u64 { + let mut hasher = self.build_hasher(); + value.hash(&mut hasher); + hasher.finish() + } + #[inline] + #[cfg(not(feature = "specialize"))] + fn hash_as_fixed_length(&self, value: &T) -> u64 { + let mut hasher = self.build_hasher(); + value.hash(&mut hasher); + hasher.finish() + } + #[inline] + #[cfg(feature = "specialize")] + default fn hash_as_str(&self, value: &T) -> u64 { + let mut hasher = self.build_hasher(); + value.hash(&mut hasher); + hasher.finish() + } + #[inline] + #[cfg(not(feature = "specialize"))] + fn hash_as_str(&self, value: &T) -> u64 { + let mut hasher = self.build_hasher(); + value.hash(&mut hasher); + hasher.finish() + } +} + +// #[inline(never)] +// #[doc(hidden)] +// pub fn hash_test(input: &[u8]) -> u64 { +// let a = RandomState::with_seeds(11, 22, 33, 44); +// <[u8]>::get_hash(input, &a) +// } + +#[cfg(feature = "std")] +#[cfg(test)] +mod test { + use crate::convert::Convert; + use crate::specialize::CallHasher; + use crate::*; + use std::collections::HashMap; + use std::hash::Hash; + + #[test] + fn test_ahash_alias_map_construction() { + let mut map = super::HashMap::with_capacity(1234); + map.insert(1, "test"); + } + + #[test] + fn test_ahash_alias_set_construction() { + let mut set = super::HashSet::with_capacity(1234); + set.insert(1); + } + + #[test] + fn test_default_builder() { + use core::hash::BuildHasherDefault; + + let mut map = HashMap::>::default(); + map.insert(1, 3); + } + + #[test] + fn test_builder() { + let mut map = HashMap::::default(); + map.insert(1, 3); + } + + #[test] + fn test_conversion() { + let input: &[u8] = b"dddddddd"; + let bytes: u64 = as_array!(input, 8).convert(); + assert_eq!(bytes, 0x6464646464646464); + } + + #[test] + fn test_non_zero() { + let mut hasher1 = AHasher::new_with_keys(0, 0); + let mut hasher2 = AHasher::new_with_keys(0, 0); + "foo".hash(&mut hasher1); + "bar".hash(&mut hasher2); + assert_ne!(hasher1.finish(), 0); + assert_ne!(hasher2.finish(), 0); + assert_ne!(hasher1.finish(), hasher2.finish()); + + let mut hasher1 = AHasher::new_with_keys(0, 0); + let mut hasher2 = AHasher::new_with_keys(0, 0); + 3_u64.hash(&mut hasher1); + 4_u64.hash(&mut hasher2); + assert_ne!(hasher1.finish(), 0); + assert_ne!(hasher2.finish(), 0); + assert_ne!(hasher1.finish(), hasher2.finish()); + } + + #[test] + fn test_non_zero_specialized() { + let hasher_build = RandomState::with_seeds(0, 0, 0, 0); + + let h1 = str::get_hash("foo", &hasher_build); + let h2 = str::get_hash("bar", &hasher_build); + assert_ne!(h1, 0); + assert_ne!(h2, 0); + assert_ne!(h1, h2); + + let h1 = u64::get_hash(&3_u64, &hasher_build); + let h2 = u64::get_hash(&4_u64, &hasher_build); + assert_ne!(h1, 0); + assert_ne!(h2, 0); + assert_ne!(h1, h2); + } + + #[test] + fn test_ahasher_construction() { + let _ = AHasher::new_with_keys(1234, 5678); + } +} diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/src/operations.rs b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/src/operations.rs new file mode 100644 index 0000000..6963894 --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/src/operations.rs @@ -0,0 +1,378 @@ +use crate::convert::*; +use zerocopy::transmute; + +///This constant comes from Kunth's prng (Empirically it works better than those from splitmix32). +pub(crate) const MULTIPLE: u64 = 6364136223846793005; + +/// This is a constant with a lot of special properties found by automated search. +/// See the unit tests below. (Below are alternative values) +#[cfg(all(target_feature = "ssse3", not(miri)))] +const SHUFFLE_MASK: u128 = 0x020a0700_0c01030e_050f0d08_06090b04_u128; +//const SHUFFLE_MASK: u128 = 0x000d0702_0a040301_05080f0c_0e0b0609_u128; +//const SHUFFLE_MASK: u128 = 0x040A0700_030E0106_0D050F08_020B0C09_u128; + +#[inline(always)] +#[cfg(feature = "folded_multiply")] +pub(crate) const fn folded_multiply(s: u64, by: u64) -> u64 { + let result = (s as u128).wrapping_mul(by as u128); + ((result & 0xffff_ffff_ffff_ffff) as u64) ^ ((result >> 64) as u64) +} + +#[inline(always)] +#[cfg(not(feature = "folded_multiply"))] +pub(crate) const fn folded_multiply(s: u64, by: u64) -> u64 { + let b1 = s.wrapping_mul(by.swap_bytes()); + let b2 = s.swap_bytes().wrapping_mul(!by); + b1 ^ b2.swap_bytes() +} + +/// Given a small (less than 8 byte slice) returns the same data stored in two u32s. +/// (order of and non-duplication of bytes is NOT guaranteed) +#[inline(always)] +pub(crate) fn read_small(data: &[u8]) -> [u64; 2] { + debug_assert!(data.len() <= 8); + if data.len() >= 2 { + if data.len() >= 4 { + //len 4-8 + [data.read_u32().0 as u64, data.read_last_u32() as u64] + } else { + //len 2-3 + [data.read_u16().0 as u64, data[data.len() - 1] as u64] + } + } else { + if data.len() > 0 { + [data[0] as u64, data[0] as u64] + } else { + [0, 0] + } + } +} + +#[inline(always)] +pub(crate) fn shuffle(a: u128) -> u128 { + #[cfg(all(target_feature = "ssse3", not(miri)))] + { + #[cfg(target_arch = "x86")] + use core::arch::x86::*; + #[cfg(target_arch = "x86_64")] + use core::arch::x86_64::*; + unsafe { transmute!(_mm_shuffle_epi8(transmute!(a), transmute!(SHUFFLE_MASK))) } + } + #[cfg(not(all(target_feature = "ssse3", not(miri))))] + { + a.swap_bytes() + } +} + +#[allow(unused)] //not used by fallback +#[inline(always)] +pub(crate) fn add_and_shuffle(a: u128, b: u128) -> u128 { + let sum = add_by_64s(a.convert(), b.convert()); + shuffle(sum.convert()) +} + +#[allow(unused)] //not used by fallback +#[inline(always)] +pub(crate) fn shuffle_and_add(base: u128, to_add: u128) -> u128 { + let shuffled: [u64; 2] = shuffle(base).convert(); + add_by_64s(shuffled, to_add.convert()).convert() +} + +#[cfg(all(any(target_arch = "x86", target_arch = "x86_64"), target_feature = "sse2", not(miri)))] +#[inline(always)] +pub(crate) fn add_by_64s(a: [u64; 2], b: [u64; 2]) -> [u64; 2] { + unsafe { + #[cfg(target_arch = "x86")] + use core::arch::x86::*; + #[cfg(target_arch = "x86_64")] + use core::arch::x86_64::*; + transmute!(_mm_add_epi64(transmute!(a), transmute!(b))) + } +} + +#[cfg(not(all(any(target_arch = "x86", target_arch = "x86_64"), target_feature = "sse2", not(miri))))] +#[inline(always)] +pub(crate) fn add_by_64s(a: [u64; 2], b: [u64; 2]) -> [u64; 2] { + [a[0].wrapping_add(b[0]), a[1].wrapping_add(b[1])] +} + +#[cfg(all(any(target_arch = "x86", target_arch = "x86_64"), target_feature = "aes", not(miri)))] +#[allow(unused)] +#[inline(always)] +pub(crate) fn aesenc(value: u128, xor: u128) -> u128 { + #[cfg(target_arch = "x86")] + use core::arch::x86::*; + #[cfg(target_arch = "x86_64")] + use core::arch::x86_64::*; + unsafe { + let value = transmute!(value); + transmute!(_mm_aesenc_si128(value, transmute!(xor))) + } +} + +#[cfg(all( + any(target_arch = "arm", target_arch = "aarch64"), + any(target_feature = "aes", target_feature = "crypto"), + not(miri), + feature = "stdsimd" +))] +#[allow(unused)] +#[inline(always)] +pub(crate) fn aesenc(value: u128, xor: u128) -> u128 { + #[cfg(target_arch = "aarch64")] + use core::arch::aarch64::*; + #[cfg(target_arch = "arm")] + use core::arch::arm::*; + unsafe { + let value = transmute!(value); + xor ^ std::mem::transmute::<_, u128>(vaesmcq_u8(vaeseq_u8(value, transmute!(0u128)))) + } +} + +#[cfg(all(any(target_arch = "x86", target_arch = "x86_64"), target_feature = "aes", not(miri)))] +#[allow(unused)] +#[inline(always)] +pub(crate) fn aesdec(value: u128, xor: u128) -> u128 { + #[cfg(target_arch = "x86")] + use core::arch::x86::*; + #[cfg(target_arch = "x86_64")] + use core::arch::x86_64::*; + unsafe { + let value = transmute!(value); + transmute!(_mm_aesdec_si128(value, transmute!(xor))) + } +} + +#[cfg(all( + any(target_arch = "arm", target_arch = "aarch64"), + any(target_feature = "aes", target_feature = "crypto"), + not(miri), + feature = "stdsimd" +))] +#[allow(unused)] +#[inline(always)] +pub(crate) fn aesdec(value: u128, xor: u128) -> u128 { + #[cfg(target_arch = "aarch64")] + use core::arch::aarch64::*; + #[cfg(target_arch = "arm")] + use core::arch::arm::*; + unsafe { + let value = transmute!(value); + xor ^ std::mem::transmute::<_, u128>(vaesimcq_u8(vaesdq_u8(value, transmute!(0u128)))) + } +} + +#[allow(unused)] +#[inline(always)] +pub(crate) fn add_in_length(enc: &mut u128, len: u64) { + #[cfg(all(target_arch = "x86_64", target_feature = "sse2", not(miri)))] + { + #[cfg(target_arch = "x86_64")] + use core::arch::x86_64::*; + + unsafe { + let enc = enc as *mut u128; + let len = _mm_cvtsi64_si128(len as i64); + let data = _mm_loadu_si128(enc.cast()); + let sum = _mm_add_epi64(data, len); + _mm_storeu_si128(enc.cast(), sum); + } + } + #[cfg(not(all(target_arch = "x86_64", target_feature = "sse2", not(miri))))] + { + let mut t: [u64; 2] = enc.convert(); + t[0] = t[0].wrapping_add(len); + *enc = t.convert(); + } +} + +#[cfg(test)] +mod test { + use super::*; + use crate::convert::Convert; + + // This is code to search for the shuffle constant + // + //thread_local! { static MASK: Cell = Cell::new(0); } + // + // fn shuffle(a: u128) -> u128 { + // use std::intrinsics::transmute; + // #[cfg(target_arch = "x86")] + // use core::arch::x86::*; + // #[cfg(target_arch = "x86_64")] + // use core::arch::x86_64::*; + // MASK.with(|mask| { + // unsafe { transmute!(_mm_shuffle_epi8(transmute!(a), transmute!(mask.get()))) } + // }) + // } + // + // #[test] + // fn find_shuffle() { + // use rand::prelude::*; + // use SliceRandom; + // use std::panic; + // use std::io::Write; + // + // let mut value: [u8; 16] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 ,13, 14, 15]; + // let mut rand = thread_rng(); + // let mut successful_list = HashMap::new(); + // for _attempt in 0..10000000 { + // rand.shuffle(&mut value); + // let test_val = value.convert(); + // MASK.with(|mask| { + // mask.set(test_val); + // }); + // if let Ok(successful) = panic::catch_unwind(|| { + // test_shuffle_does_not_collide_with_aes(); + // test_shuffle_moves_high_bits(); + // test_shuffle_moves_every_value(); + // //test_shuffle_does_not_loop(); + // value + // }) { + // let successful: u128 = successful.convert(); + // successful_list.insert(successful, iters_before_loop()); + // } + // } + // let write_file = File::create("/tmp/output").unwrap(); + // let mut writer = BufWriter::new(&write_file); + // + // for success in successful_list { + // writeln!(writer, "Found successful: {:x?} - {:?}", success.0, success.1); + // } + // } + // + // fn iters_before_loop() -> u32 { + // let numbered = 0x00112233_44556677_8899AABB_CCDDEEFF; + // let mut shuffled = shuffle(numbered); + // let mut count = 0; + // loop { + // // println!("{:>16x}", shuffled); + // if numbered == shuffled { + // break; + // } + // count += 1; + // shuffled = shuffle(shuffled); + // } + // count + // } + + #[cfg(all( + any(target_arch = "x86", target_arch = "x86_64"), + target_feature = "ssse3", + target_feature = "aes", + not(miri) + ))] + #[test] + fn test_shuffle_does_not_collide_with_aes() { + let mut value: [u8; 16] = [0; 16]; + let zero_mask_enc = aesenc(0, 0); + let zero_mask_dec = aesdec(0, 0); + for index in 0..16 { + value[index] = 1; + let excluded_positions_enc: [u8; 16] = aesenc(value.convert(), zero_mask_enc).convert(); + let excluded_positions_dec: [u8; 16] = aesdec(value.convert(), zero_mask_dec).convert(); + let actual_location: [u8; 16] = shuffle(value.convert()).convert(); + for pos in 0..16 { + if actual_location[pos] != 0 { + assert_eq!( + 0, excluded_positions_enc[pos], + "Forward Overlap between {:?} and {:?} at {}", + excluded_positions_enc, actual_location, index + ); + assert_eq!( + 0, excluded_positions_dec[pos], + "Reverse Overlap between {:?} and {:?} at {}", + excluded_positions_dec, actual_location, index + ); + } + } + value[index] = 0; + } + } + + #[test] + fn test_shuffle_contains_each_value() { + let value: [u8; 16] = 0x00010203_04050607_08090A0B_0C0D0E0F_u128.convert(); + let shuffled: [u8; 16] = shuffle(value.convert()).convert(); + for index in 0..16_u8 { + assert!(shuffled.contains(&index), "Value is missing {}", index); + } + } + + #[test] + fn test_shuffle_moves_every_value() { + let mut value: [u8; 16] = [0; 16]; + for index in 0..16 { + value[index] = 1; + let shuffled: [u8; 16] = shuffle(value.convert()).convert(); + assert_eq!(0, shuffled[index], "Value is not moved {}", index); + value[index] = 0; + } + } + + #[test] + fn test_shuffle_moves_high_bits() { + assert!( + shuffle(1) > (1_u128 << 80), + "Low bits must be moved to other half {:?} -> {:?}", + 0, + shuffle(1) + ); + + assert!( + shuffle(1_u128 << 58) >= (1_u128 << 64), + "High bits must be moved to other half {:?} -> {:?}", + 7, + shuffle(1_u128 << 58) + ); + assert!( + shuffle(1_u128 << 58) < (1_u128 << 112), + "High bits must not remain high {:?} -> {:?}", + 7, + shuffle(1_u128 << 58) + ); + assert!( + shuffle(1_u128 << 64) < (1_u128 << 64), + "Low bits must be moved to other half {:?} -> {:?}", + 8, + shuffle(1_u128 << 64) + ); + assert!( + shuffle(1_u128 << 64) >= (1_u128 << 16), + "Low bits must not remain low {:?} -> {:?}", + 8, + shuffle(1_u128 << 64) + ); + + assert!( + shuffle(1_u128 << 120) < (1_u128 << 50), + "High bits must be moved to low half {:?} -> {:?}", + 15, + shuffle(1_u128 << 120) + ); + } + + #[cfg(all( + any(target_arch = "x86", target_arch = "x86_64"), + target_feature = "ssse3", + not(miri) + ))] + #[test] + fn test_shuffle_does_not_loop() { + let numbered = 0x00112233_44556677_8899AABB_CCDDEEFF; + let mut shuffled = shuffle(numbered); + for count in 0..100 { + // println!("{:>16x}", shuffled); + assert_ne!(numbered, shuffled, "Equal after {} vs {:x}", count, shuffled); + shuffled = shuffle(shuffled); + } + } + + #[test] + fn test_add_length() { + let mut enc = (u64::MAX as u128) << 64 | 50; + add_in_length(&mut enc, u64::MAX); + assert_eq!(enc >> 64, u64::MAX as u128); + assert_eq!(enc as u64, 49); + } +} diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/src/random_state.rs b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/src/random_state.rs new file mode 100644 index 0000000..54b754d --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/src/random_state.rs @@ -0,0 +1,529 @@ +use core::hash::Hash; +cfg_if::cfg_if! { + if #[cfg(any( + all(any(target_arch = "x86", target_arch = "x86_64"), target_feature = "aes", not(miri)), + all(any(target_arch = "arm", target_arch = "aarch64"), any(target_feature = "aes", target_feature = "crypto"), not(miri), feature = "stdsimd") + ))] { + use crate::aes_hash::*; + } else { + use crate::fallback_hash::*; + } +} +cfg_if::cfg_if! { + if #[cfg(feature = "specialize")]{ + use crate::BuildHasherExt; + } +} +cfg_if::cfg_if! { + if #[cfg(feature = "std")] { + extern crate std as alloc; + } else { + extern crate alloc; + } +} + +#[cfg(feature = "atomic-polyfill")] +use atomic_polyfill as atomic; +#[cfg(not(feature = "atomic-polyfill"))] +use core::sync::atomic; + +use alloc::boxed::Box; +use atomic::{AtomicUsize, Ordering}; +use core::any::{Any, TypeId}; +use core::fmt; +use core::hash::BuildHasher; +use core::hash::Hasher; + +pub(crate) const PI: [u64; 4] = [ + 0x243f_6a88_85a3_08d3, + 0x1319_8a2e_0370_7344, + 0xa409_3822_299f_31d0, + 0x082e_fa98_ec4e_6c89, +]; + +pub(crate) const PI2: [u64; 4] = [ + 0x4528_21e6_38d0_1377, + 0xbe54_66cf_34e9_0c6c, + 0xc0ac_29b7_c97c_50dd, + 0x3f84_d5b5_b547_0917, +]; + +cfg_if::cfg_if! { + if #[cfg(all(feature = "compile-time-rng", any(test, fuzzing)))] { + #[inline] + fn get_fixed_seeds() -> &'static [[u64; 4]; 2] { + use const_random::const_random; + + const RAND: [[u64; 4]; 2] = [ + [ + const_random!(u64), + const_random!(u64), + const_random!(u64), + const_random!(u64), + ], [ + const_random!(u64), + const_random!(u64), + const_random!(u64), + const_random!(u64), + ] + ]; + &RAND + } + } else if #[cfg(all(feature = "runtime-rng", not(fuzzing)))] { + #[inline] + fn get_fixed_seeds() -> &'static [[u64; 4]; 2] { + use crate::convert::Convert; + + static SEEDS: OnceBox<[[u64; 4]; 2]> = OnceBox::new(); + + SEEDS.get_or_init(|| { + let mut result: [u8; 64] = [0; 64]; + getrandom::getrandom(&mut result).expect("getrandom::getrandom() failed."); + Box::new(result.convert()) + }) + } + } else if #[cfg(feature = "compile-time-rng")] { + #[inline] + fn get_fixed_seeds() -> &'static [[u64; 4]; 2] { + use const_random::const_random; + + const RAND: [[u64; 4]; 2] = [ + [ + const_random!(u64), + const_random!(u64), + const_random!(u64), + const_random!(u64), + ], [ + const_random!(u64), + const_random!(u64), + const_random!(u64), + const_random!(u64), + ] + ]; + &RAND + } + } else { + #[inline] + fn get_fixed_seeds() -> &'static [[u64; 4]; 2] { + &[PI, PI2] + } + } +} + +cfg_if::cfg_if! { + if #[cfg(not(all(target_arch = "arm", target_os = "none")))] { + use once_cell::race::OnceBox; + + static RAND_SOURCE: OnceBox> = OnceBox::new(); + } +} +/// A supplier of Randomness used for different hashers. +/// See [set_random_source]. +/// +/// If [set_random_source] aHash will default to the best available source of randomness. +/// In order this is: +/// 1. OS provided random number generator (available if the `runtime-rng` flag is enabled which it is by default) - This should be very strong. +/// 2. Strong compile time random numbers used to permute a static "counter". (available if `compile-time-rng` is enabled. +/// __Enabling this is recommended if `runtime-rng` is not possible__) +/// 3. A static counter that adds the memory address of each [RandomState] created permuted with fixed constants. +/// (Similar to above but with fixed keys) - This is the weakest option. The strength of this heavily depends on whether or not ASLR is enabled. +/// (Rust enables ASLR by default) +pub trait RandomSource { + fn gen_hasher_seed(&self) -> usize; +} + +struct DefaultRandomSource { + counter: AtomicUsize, +} + +impl DefaultRandomSource { + fn new() -> DefaultRandomSource { + DefaultRandomSource { + counter: AtomicUsize::new(&PI as *const _ as usize), + } + } + + #[cfg(all(target_arch = "arm", target_os = "none"))] + const fn default() -> DefaultRandomSource { + DefaultRandomSource { + counter: AtomicUsize::new(PI[3] as usize), + } + } +} + +impl RandomSource for DefaultRandomSource { + cfg_if::cfg_if! { + if #[cfg(all(target_arch = "arm", target_os = "none"))] { + fn gen_hasher_seed(&self) -> usize { + let stack = self as *const _ as usize; + let previous = self.counter.load(Ordering::Relaxed); + let new = previous.wrapping_add(stack); + self.counter.store(new, Ordering::Relaxed); + new + } + } else { + fn gen_hasher_seed(&self) -> usize { + let stack = self as *const _ as usize; + self.counter.fetch_add(stack, Ordering::Relaxed) + } + } + } +} + +cfg_if::cfg_if! { + if #[cfg(all(target_arch = "arm", target_os = "none"))] { + #[inline] + fn get_src() -> &'static dyn RandomSource { + static RAND_SOURCE: DefaultRandomSource = DefaultRandomSource::default(); + &RAND_SOURCE + } + } else { + /// Provides an optional way to manually supply a source of randomness for Hasher keys. + /// + /// The provided [RandomSource] will be used to be used as a source of randomness by [RandomState] to generate new states. + /// If this method is not invoked the standard source of randomness is used as described in the Readme. + /// + /// The source of randomness can only be set once, and must be set before the first RandomState is created. + /// If the source has already been specified `Err` is returned with a `bool` indicating if the set failed because + /// method was previously invoked (true) or if the default source is already being used (false). + #[cfg(not(all(target_arch = "arm", target_os = "none")))] + pub fn set_random_source(source: impl RandomSource + Send + Sync + 'static) -> Result<(), bool> { + RAND_SOURCE.set(Box::new(Box::new(source))).map_err(|s| s.as_ref().type_id() != TypeId::of::<&DefaultRandomSource>()) + } + + #[inline] + fn get_src() -> &'static dyn RandomSource { + RAND_SOURCE.get_or_init(|| Box::new(Box::new(DefaultRandomSource::new()))).as_ref() + } + } +} + +/// Provides a [Hasher] factory. This is typically used (e.g. by [HashMap]) to create +/// [AHasher]s in order to hash the keys of the map. See `build_hasher` below. +/// +/// [build_hasher]: ahash:: +/// [Hasher]: std::hash::Hasher +/// [BuildHasher]: std::hash::BuildHasher +/// [HashMap]: std::collections::HashMap +/// +/// There are multiple constructors each is documented in more detail below: +/// +/// | Constructor | Dynamically random? | Seed | +/// |---------------|---------------------|------| +/// |`new` | Each instance unique|_[RandomSource]_| +/// |`generate_with`| Each instance unique|`u64` x 4 + [RandomSource]| +/// |`with_seed` | Fixed per process |`u64` + static random number| +/// |`with_seeds` | Fixed |`u64` x 4| +/// +#[derive(Clone)] +pub struct RandomState { + pub(crate) k0: u64, + pub(crate) k1: u64, + pub(crate) k2: u64, + pub(crate) k3: u64, +} + +impl fmt::Debug for RandomState { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.pad("RandomState { .. }") + } +} + +impl RandomState { + + /// Create a new `RandomState` `BuildHasher` using random keys. + /// + /// Each instance will have a unique set of keys derived from [RandomSource]. + /// + #[inline] + pub fn new() -> RandomState { + let src = get_src(); + let fixed = get_fixed_seeds(); + Self::from_keys(&fixed[0], &fixed[1], src.gen_hasher_seed()) + } + + /// Create a new `RandomState` `BuildHasher` based on the provided seeds, but in such a way + /// that each time it is called the resulting state will be different and of high quality. + /// This allows fixed constant or poor quality seeds to be provided without the problem of different + /// `BuildHasher`s being identical or weak. + /// + /// This is done via permuting the provided values with the value of a static counter and memory address. + /// (This makes this method somewhat more expensive than `with_seeds` below which does not do this). + /// + /// The provided values (k0-k3) do not need to be of high quality but they should not all be the same value. + #[inline] + pub fn generate_with(k0: u64, k1: u64, k2: u64, k3: u64) -> RandomState { + let src = get_src(); + let fixed = get_fixed_seeds(); + RandomState::from_keys(&fixed[0], &[k0, k1, k2, k3], src.gen_hasher_seed()) + } + + fn from_keys(a: &[u64; 4], b: &[u64; 4], c: usize) -> RandomState { + let &[k0, k1, k2, k3] = a; + let mut hasher = AHasher::from_random_state(&RandomState { k0, k1, k2, k3 }); + hasher.write_usize(c); + let mix = |l: u64, r: u64| { + let mut h = hasher.clone(); + h.write_u64(l); + h.write_u64(r); + h.finish() + }; + RandomState { + k0: mix(b[0], b[2]), + k1: mix(b[1], b[3]), + k2: mix(b[2], b[1]), + k3: mix(b[3], b[0]), + } + } + + /// Internal. Used by Default. + #[inline] + pub(crate) fn with_fixed_keys() -> RandomState { + let [k0, k1, k2, k3] = get_fixed_seeds()[0]; + RandomState { k0, k1, k2, k3 } + } + + /// Build a `RandomState` from a single key. The provided key does not need to be of high quality, + /// but all `RandomState`s created from the same key will produce identical hashers. + /// (In contrast to `generate_with` above) + /// + /// This allows for explicitly setting the seed to be used. + /// + /// Note: This method does not require the provided seed to be strong. + #[inline] + pub fn with_seed(key: usize) -> RandomState { + let fixed = get_fixed_seeds(); + RandomState::from_keys(&fixed[0], &fixed[1], key) + } + + /// Allows for explicitly setting the seeds to used. + /// All `RandomState`s created with the same set of keys key will produce identical hashers. + /// (In contrast to `generate_with` above) + /// + /// Note: If DOS resistance is desired one of these should be a decent quality random number. + /// If 4 high quality random number are not cheaply available this method is robust against 0s being passed for + /// one or more of the parameters or the same value being passed for more than one parameter. + /// It is recommended to pass numbers in order from highest to lowest quality (if there is any difference). + #[inline] + pub const fn with_seeds(k0: u64, k1: u64, k2: u64, k3: u64) -> RandomState { + RandomState { + k0: k0 ^ PI2[0], + k1: k1 ^ PI2[1], + k2: k2 ^ PI2[2], + k3: k3 ^ PI2[3], + } + } + + /// Calculates the hash of a single value. This provides a more convenient (and faster) way to obtain a hash: + /// For example: + #[cfg_attr( + feature = "std", + doc = r##" # Examples +``` + use std::hash::BuildHasher; + use ahash::RandomState; + + let hash_builder = RandomState::new(); + let hash = hash_builder.hash_one("Some Data"); +``` + "## + )] + /// This is similar to: + #[cfg_attr( + feature = "std", + doc = r##" # Examples +``` + use std::hash::{BuildHasher, Hash, Hasher}; + use ahash::RandomState; + + let hash_builder = RandomState::new(); + let mut hasher = hash_builder.build_hasher(); + "Some Data".hash(&mut hasher); + let hash = hasher.finish(); +``` + "## + )] + /// (Note that these two ways to get a hash may not produce the same value for the same data) + /// + /// This is intended as a convenience for code which *consumes* hashes, such + /// as the implementation of a hash table or in unit tests that check + /// whether a custom [`Hash`] implementation behaves as expected. + /// + /// This must not be used in any code which *creates* hashes, such as in an + /// implementation of [`Hash`]. The way to create a combined hash of + /// multiple values is to call [`Hash::hash`] multiple times using the same + /// [`Hasher`], not to call this method repeatedly and combine the results. + #[inline] + pub fn hash_one(&self, x: T) -> u64 + where + Self: Sized, + { + use crate::specialize::CallHasher; + T::get_hash(&x, self) + } +} + +/// Creates an instance of RandomState using keys obtained from the random number generator. +/// Each instance created in this way will have a unique set of keys. (But the resulting instance +/// can be used to create many hashers each or which will have the same keys.) +/// +/// This is the same as [RandomState::new()] +/// +/// NOTE: For safety this trait impl is only available available if either of the flags `runtime-rng` (on by default) or +/// `compile-time-rng` are enabled. This is to prevent weakly keyed maps from being accidentally created. Instead one of +/// constructors for [RandomState] must be used. +#[cfg(any(feature = "compile-time-rng", feature = "runtime-rng", feature = "no-rng"))] +impl Default for RandomState { + #[inline] + fn default() -> Self { + Self::new() + } +} + +impl BuildHasher for RandomState { + type Hasher = AHasher; + + /// Constructs a new [AHasher] with keys based on this [RandomState] object. + /// This means that two different [RandomState]s will will generate + /// [AHasher]s that will return different hashcodes, but [Hasher]s created from the same [BuildHasher] + /// will generate the same hashes for the same input data. + /// + #[cfg_attr( + feature = "std", + doc = r##" # Examples +``` + use ahash::{AHasher, RandomState}; + use std::hash::{Hasher, BuildHasher}; + + let build_hasher = RandomState::new(); + let mut hasher_1 = build_hasher.build_hasher(); + let mut hasher_2 = build_hasher.build_hasher(); + + hasher_1.write_u32(1234); + hasher_2.write_u32(1234); + + assert_eq!(hasher_1.finish(), hasher_2.finish()); + + let other_build_hasher = RandomState::new(); + let mut different_hasher = other_build_hasher.build_hasher(); + different_hasher.write_u32(1234); + assert_ne!(different_hasher.finish(), hasher_1.finish()); +``` + "## + )] + /// [Hasher]: std::hash::Hasher + /// [BuildHasher]: std::hash::BuildHasher + /// [HashMap]: std::collections::HashMap + #[inline] + fn build_hasher(&self) -> AHasher { + AHasher::from_random_state(self) + } + + + /// Calculates the hash of a single value. This provides a more convenient (and faster) way to obtain a hash: + /// For example: + #[cfg_attr( + feature = "std", + doc = r##" # Examples +``` + use std::hash::BuildHasher; + use ahash::RandomState; + + let hash_builder = RandomState::new(); + let hash = hash_builder.hash_one("Some Data"); +``` + "## + )] + /// This is similar to: + #[cfg_attr( + feature = "std", + doc = r##" # Examples +``` + use std::hash::{BuildHasher, Hash, Hasher}; + use ahash::RandomState; + + let hash_builder = RandomState::new(); + let mut hasher = hash_builder.build_hasher(); + "Some Data".hash(&mut hasher); + let hash = hasher.finish(); +``` + "## + )] + /// (Note that these two ways to get a hash may not produce the same value for the same data) + /// + /// This is intended as a convenience for code which *consumes* hashes, such + /// as the implementation of a hash table or in unit tests that check + /// whether a custom [`Hash`] implementation behaves as expected. + /// + /// This must not be used in any code which *creates* hashes, such as in an + /// implementation of [`Hash`]. The way to create a combined hash of + /// multiple values is to call [`Hash::hash`] multiple times using the same + /// [`Hasher`], not to call this method repeatedly and combine the results. + #[cfg(feature = "specialize")] + #[inline] + fn hash_one(&self, x: T) -> u64 { + RandomState::hash_one(self, x) + } +} + +#[cfg(feature = "specialize")] +impl BuildHasherExt for RandomState { + #[inline] + fn hash_as_u64(&self, value: &T) -> u64 { + let mut hasher = AHasherU64 { + buffer: self.k0, + pad: self.k1, + }; + value.hash(&mut hasher); + hasher.finish() + } + + #[inline] + fn hash_as_fixed_length(&self, value: &T) -> u64 { + let mut hasher = AHasherFixed(self.build_hasher()); + value.hash(&mut hasher); + hasher.finish() + } + + #[inline] + fn hash_as_str(&self, value: &T) -> u64 { + let mut hasher = AHasherStr(self.build_hasher()); + value.hash(&mut hasher); + hasher.finish() + } +} + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn test_unique() { + let a = RandomState::generate_with(1, 2, 3, 4); + let b = RandomState::generate_with(1, 2, 3, 4); + assert_ne!(a.build_hasher().finish(), b.build_hasher().finish()); + } + + #[cfg(all(feature = "runtime-rng", not(all(feature = "compile-time-rng", test))))] + #[test] + fn test_not_pi() { + assert_ne!(PI, get_fixed_seeds()[0]); + } + + #[cfg(all(feature = "compile-time-rng", any(not(feature = "runtime-rng"), test)))] + #[test] + fn test_not_pi_const() { + assert_ne!(PI, get_fixed_seeds()[0]); + } + + #[cfg(all(not(feature = "runtime-rng"), not(feature = "compile-time-rng")))] + #[test] + fn test_pi() { + assert_eq!(PI, get_fixed_seeds()[0]); + } + + #[test] + fn test_with_seeds_const() { + const _CONST_RANDOM_STATE: RandomState = RandomState::with_seeds(17, 19, 21, 23); + } +} diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/src/specialize.rs b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/src/specialize.rs new file mode 100644 index 0000000..05d335b --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/src/specialize.rs @@ -0,0 +1,218 @@ +use core::hash::BuildHasher; +use core::hash::Hash; +use core::hash::Hasher; + +#[cfg(not(feature = "std"))] +extern crate alloc; +#[cfg(feature = "std")] +extern crate std as alloc; + +#[cfg(feature = "specialize")] +use crate::BuildHasherExt; +#[cfg(feature = "specialize")] +use alloc::string::String; +#[cfg(feature = "specialize")] +use alloc::vec::Vec; + +/// Provides a way to get an optimized hasher for a given data type. +/// Rather than using a Hasher generically which can hash any value, this provides a way to get a specialized hash +/// for a specific type. So this may be faster for primitive types. +pub(crate) trait CallHasher { + fn get_hash(value: &H, build_hasher: &B) -> u64; +} + +#[cfg(not(feature = "specialize"))] +impl CallHasher for T +where + T: Hash + ?Sized, +{ + #[inline] + fn get_hash(value: &H, build_hasher: &B) -> u64 { + let mut hasher = build_hasher.build_hasher(); + value.hash(&mut hasher); + hasher.finish() + } +} + +#[cfg(feature = "specialize")] +impl CallHasher for T +where + T: Hash + ?Sized, +{ + #[inline] + default fn get_hash(value: &H, build_hasher: &B) -> u64 { + let mut hasher = build_hasher.build_hasher(); + value.hash(&mut hasher); + hasher.finish() + } +} + +macro_rules! call_hasher_impl { + ($typ:ty) => { + #[cfg(feature = "specialize")] + impl CallHasher for $typ { + #[inline] + fn get_hash(value: &H, build_hasher: &B) -> u64 { + build_hasher.hash_as_u64(value) + } + } + }; +} +call_hasher_impl!(u8); +call_hasher_impl!(u16); +call_hasher_impl!(u32); +call_hasher_impl!(u64); +call_hasher_impl!(i8); +call_hasher_impl!(i16); +call_hasher_impl!(i32); +call_hasher_impl!(i64); + +#[cfg(feature = "specialize")] +impl CallHasher for u128 { + #[inline] + fn get_hash(value: &H, build_hasher: &B) -> u64 { + build_hasher.hash_as_fixed_length(value) + } +} + +#[cfg(feature = "specialize")] +impl CallHasher for i128 { + #[inline] + fn get_hash(value: &H, build_hasher: &B) -> u64 { + build_hasher.hash_as_fixed_length(value) + } +} + +#[cfg(feature = "specialize")] +impl CallHasher for usize { + #[inline] + fn get_hash(value: &H, build_hasher: &B) -> u64 { + build_hasher.hash_as_fixed_length(value) + } +} + +#[cfg(feature = "specialize")] +impl CallHasher for isize { + #[inline] + fn get_hash(value: &H, build_hasher: &B) -> u64 { + build_hasher.hash_as_fixed_length(value) + } +} + +#[cfg(feature = "specialize")] +impl CallHasher for [u8] { + #[inline] + fn get_hash(value: &H, build_hasher: &B) -> u64 { + build_hasher.hash_as_str(value) + } +} + +#[cfg(feature = "specialize")] +impl CallHasher for Vec { + #[inline] + fn get_hash(value: &H, build_hasher: &B) -> u64 { + build_hasher.hash_as_str(value) + } +} + +#[cfg(feature = "specialize")] +impl CallHasher for str { + #[inline] + fn get_hash(value: &H, build_hasher: &B) -> u64 { + build_hasher.hash_as_str(value) + } +} + +#[cfg(all(feature = "specialize"))] +impl CallHasher for String { + #[inline] + fn get_hash(value: &H, build_hasher: &B) -> u64 { + build_hasher.hash_as_str(value) + } +} + +#[cfg(test)] +mod test { + use super::*; + use crate::*; + + #[test] + #[cfg(feature = "specialize")] + pub fn test_specialized_invoked() { + let build_hasher = RandomState::with_seeds(1, 2, 3, 4); + let shortened = u64::get_hash(&0, &build_hasher); + let mut hasher = AHasher::new_with_keys(1, 2); + 0_u64.hash(&mut hasher); + assert_ne!(hasher.finish(), shortened); + } + + /// Tests that some non-trivial transformation takes place. + #[test] + pub fn test_input_processed() { + let build_hasher = RandomState::with_seeds(2, 2, 2, 2); + assert_ne!(0, u64::get_hash(&0, &build_hasher)); + assert_ne!(1, u64::get_hash(&0, &build_hasher)); + assert_ne!(2, u64::get_hash(&0, &build_hasher)); + assert_ne!(3, u64::get_hash(&0, &build_hasher)); + assert_ne!(4, u64::get_hash(&0, &build_hasher)); + assert_ne!(5, u64::get_hash(&0, &build_hasher)); + + assert_ne!(0, u64::get_hash(&1, &build_hasher)); + assert_ne!(1, u64::get_hash(&1, &build_hasher)); + assert_ne!(2, u64::get_hash(&1, &build_hasher)); + assert_ne!(3, u64::get_hash(&1, &build_hasher)); + assert_ne!(4, u64::get_hash(&1, &build_hasher)); + assert_ne!(5, u64::get_hash(&1, &build_hasher)); + + let xored = u64::get_hash(&0, &build_hasher) ^ u64::get_hash(&1, &build_hasher); + assert_ne!(0, xored); + assert_ne!(1, xored); + assert_ne!(2, xored); + assert_ne!(3, xored); + assert_ne!(4, xored); + assert_ne!(5, xored); + } + + #[test] + pub fn test_ref_independent() { + let build_hasher = RandomState::with_seeds(1, 2, 3, 4); + assert_eq!(u8::get_hash(&&1, &build_hasher), u8::get_hash(&1, &build_hasher)); + assert_eq!(u16::get_hash(&&2, &build_hasher), u16::get_hash(&2, &build_hasher)); + assert_eq!(u32::get_hash(&&3, &build_hasher), u32::get_hash(&3, &build_hasher)); + assert_eq!(u64::get_hash(&&4, &build_hasher), u64::get_hash(&4, &build_hasher)); + assert_eq!(u128::get_hash(&&5, &build_hasher), u128::get_hash(&5, &build_hasher)); + assert_eq!( + str::get_hash(&"test", &build_hasher), + str::get_hash("test", &build_hasher) + ); + assert_eq!( + str::get_hash(&"test", &build_hasher), + String::get_hash(&"test".to_string(), &build_hasher) + ); + #[cfg(feature = "specialize")] + assert_eq!( + str::get_hash(&"test", &build_hasher), + <[u8]>::get_hash("test".as_bytes(), &build_hasher) + ); + + let build_hasher = RandomState::with_seeds(10, 20, 30, 40); + assert_eq!(u8::get_hash(&&&1, &build_hasher), u8::get_hash(&1, &build_hasher)); + assert_eq!(u16::get_hash(&&&2, &build_hasher), u16::get_hash(&2, &build_hasher)); + assert_eq!(u32::get_hash(&&&3, &build_hasher), u32::get_hash(&3, &build_hasher)); + assert_eq!(u64::get_hash(&&&4, &build_hasher), u64::get_hash(&4, &build_hasher)); + assert_eq!(u128::get_hash(&&&5, &build_hasher), u128::get_hash(&5, &build_hasher)); + assert_eq!( + str::get_hash(&&"test", &build_hasher), + str::get_hash("test", &build_hasher) + ); + assert_eq!( + str::get_hash(&&"test", &build_hasher), + String::get_hash(&"test".to_string(), &build_hasher) + ); + #[cfg(feature = "specialize")] + assert_eq!( + str::get_hash(&&"test", &build_hasher), + <[u8]>::get_hash(&"test".to_string().into_bytes(), &build_hasher) + ); + } +} diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/tests/bench.rs b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/tests/bench.rs new file mode 100644 index 0000000..5bc0fc9 --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/tests/bench.rs @@ -0,0 +1,198 @@ +#![cfg_attr(feature = "specialize", feature(build_hasher_simple_hash_one))] + +use ahash::{AHasher, RandomState}; +use criterion::*; +use fxhash::FxHasher; +use rand::Rng; +use std::collections::hash_map::DefaultHasher; +use std::hash::{BuildHasherDefault, Hash, Hasher}; + +// Needs to be in sync with `src/lib.rs` +const AHASH_IMPL: &str = if cfg!(any( + all( + any(target_arch = "x86", target_arch = "x86_64"), + target_feature = "aes", + not(miri), + ), + all( + any(target_arch = "arm", target_arch = "aarch64"), + any(target_feature = "aes", target_feature = "crypto"), + not(miri), + feature = "stdsimd", + ), +)) { + "aeshash" +} else { + "fallbackhash" +}; + +fn ahash(b: &H) -> u64 { + let build_hasher = RandomState::with_seeds(1, 2, 3, 4); + build_hasher.hash_one(b) +} + +fn fnvhash(b: &H) -> u64 { + let mut hasher = fnv::FnvHasher::default(); + b.hash(&mut hasher); + hasher.finish() +} + +fn siphash(b: &H) -> u64 { + let mut hasher = DefaultHasher::default(); + b.hash(&mut hasher); + hasher.finish() +} + +fn fxhash(b: &H) -> u64 { + let mut hasher = FxHasher::default(); + b.hash(&mut hasher); + hasher.finish() +} + +fn seahash(b: &H) -> u64 { + let mut hasher = seahash::SeaHasher::default(); + b.hash(&mut hasher); + hasher.finish() +} + +const STRING_LENGTHS: [u32; 12] = [1, 3, 4, 7, 8, 15, 16, 24, 33, 68, 132, 1024]; + +fn gen_strings() -> Vec { + STRING_LENGTHS + .iter() + .map(|len| { + let mut string = String::default(); + for pos in 1..=*len { + let c = (48 + (pos % 10) as u8) as char; + string.push(c); + } + string + }) + .collect() +} + +macro_rules! bench_inputs { + ($group:ident, $hash:ident) => { + // Number of iterations per batch should be high enough to hide timing overhead. + let size = BatchSize::NumIterations(2_000); + + let mut rng = rand::thread_rng(); + $group.bench_function("u8", |b| b.iter_batched(|| rng.gen::(), |v| $hash(&v), size)); + $group.bench_function("u16", |b| b.iter_batched(|| rng.gen::(), |v| $hash(&v), size)); + $group.bench_function("u32", |b| b.iter_batched(|| rng.gen::(), |v| $hash(&v), size)); + $group.bench_function("u64", |b| b.iter_batched(|| rng.gen::(), |v| $hash(&v), size)); + $group.bench_function("u128", |b| b.iter_batched(|| rng.gen::(), |v| $hash(&v), size)); + $group.bench_with_input("strings", &gen_strings(), |b, s| b.iter(|| $hash(black_box(s)))); + }; +} + +fn bench_ahash(c: &mut Criterion) { + let mut group = c.benchmark_group(AHASH_IMPL); + bench_inputs!(group, ahash); +} + +fn bench_fx(c: &mut Criterion) { + let mut group = c.benchmark_group("fx"); + bench_inputs!(group, fxhash); +} + +fn bench_fnv(c: &mut Criterion) { + let mut group = c.benchmark_group("fnv"); + bench_inputs!(group, fnvhash); +} + +fn bench_sea(c: &mut Criterion) { + let mut group = c.benchmark_group("sea"); + bench_inputs!(group, seahash); +} + +fn bench_sip(c: &mut Criterion) { + let mut group = c.benchmark_group("sip"); + bench_inputs!(group, siphash); +} + +fn bench_map(c: &mut Criterion) { + #[cfg(feature = "std")] + { + let mut group = c.benchmark_group("map"); + group.bench_function("aHash-alias", |b| { + b.iter(|| { + let hm: ahash::HashMap = (0..1_000_000).map(|i| (i, i)).collect(); + let mut sum = 0; + for i in 0..1_000_000 { + if let Some(x) = hm.get(&i) { + sum += x; + } + } + }) + }); + group.bench_function("aHash-hashBrown", |b| { + b.iter(|| { + let hm: hashbrown::HashMap = (0..1_000_000).map(|i| (i, i)).collect(); + let mut sum = 0; + for i in 0..1_000_000 { + if let Some(x) = hm.get(&i) { + sum += x; + } + } + }) + }); + group.bench_function("aHash-hashBrown-explicit", |b| { + b.iter(|| { + let hm: hashbrown::HashMap = (0..1_000_000).map(|i| (i, i)).collect(); + let mut sum = 0; + for i in 0..1_000_000 { + if let Some(x) = hm.get(&i) { + sum += x; + } + } + }) + }); + group.bench_function("aHash-wrapper", |b| { + b.iter(|| { + let hm: ahash::AHashMap = (0..1_000_000).map(|i| (i, i)).collect(); + let mut sum = 0; + for i in 0..1_000_000 { + if let Some(x) = hm.get(&i) { + sum += x; + } + } + }) + }); + group.bench_function("aHash-rand", |b| { + b.iter(|| { + let hm: std::collections::HashMap = (0..1_000_000).map(|i| (i, i)).collect(); + let mut sum = 0; + for i in 0..1_000_000 { + if let Some(x) = hm.get(&i) { + sum += x; + } + } + }) + }); + group.bench_function("aHash-default", |b| { + b.iter(|| { + let hm: std::collections::HashMap> = + (0..1_000_000).map(|i| (i, i)).collect(); + let mut sum = 0; + for i in 0..1_000_000 { + if let Some(x) = hm.get(&i) { + sum += x; + } + } + }) + }); + } +} + +criterion_main!(benches); + +criterion_group!( + benches, + bench_ahash, + bench_fx, + bench_fnv, + bench_sea, + bench_sip, + bench_map +); diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/tests/map_tests.rs b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/tests/map_tests.rs new file mode 100644 index 0000000..8d798a0 --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/tests/map_tests.rs @@ -0,0 +1,234 @@ +#![cfg_attr(feature = "specialize", feature(build_hasher_simple_hash_one))] + +use std::hash::{BuildHasher, Hash, Hasher}; + +use ahash::RandomState; +use criterion::*; +use fxhash::FxHasher; + +fn gen_word_pairs() -> Vec { + let words: Vec<_> = r#" +a, ability, able, about, above, accept, according, account, across, act, action, +activity, actually, add, address, administration, admit, adult, affect, after, +again, against, age, agency, agent, ago, agree, agreement, ahead, air, all, +allow, almost, alone, along, already, also, although, always, American, among, +amount, analysis, and, animal, another, answer, any, anyone, anything, appear, +apply, approach, area, argue, arm, around, arrive, art, article, artist, as, +ask, assume, at, attack, attention, attorney, audience, author, authority, +available, avoid, away, baby, back, bad, bag, ball, bank, bar, base, be, beat, +beautiful, because, become, bed, before, begin, behavior, behind, believe, +benefit, best, better, between, beyond, big, bill, billion, bit, black, blood, +blue, board, body, book, born, both, box, boy, break, bring, brother, budget, +build, building, business, but, buy, by, call, camera, campaign, can, cancer, +candidate, capital, car, card, care, career, carry, case, catch, cause, cell, +center, central, century, certain, certainly, chair, challenge, chance, change, +character, charge, check, child, choice, choose, church, citizen, city, civil, +claim, class, clear, clearly, close, coach, cold, collection, college, color, +come, commercial, common, community, company, compare, computer, concern, +condition, conference, Congress, consider, consumer, contain, continue, control, +cost, could, country, couple, course, court, cover, create, crime, cultural, +culture, cup, current, customer, cut, dark, data, daughter, day, dead, deal, +death, debate, decade, decide, decision, deep, defense, degree, Democrat, +democratic, describe, design, despite, detail, determine, develop, development, +die, difference, different, difficult, dinner, direction, director, discover, +discuss, discussion, disease, do, doctor, dog, door, down, draw, dream, drive, +drop, drug, during, each, early, east, easy, eat, economic, economy, edge, +education, effect, effort, eight, either, election, else, employee, end, energy, +enjoy, enough, enter, entire, environment, environmental, especially, establish, +even, evening, event, ever, every, everybody, everyone, everything, evidence, +exactly, example, executive, exist, expect, experience, expert, explain, eye, +face, fact, factor, fail, fall, family, far, fast, father, fear, federal, feel, +feeling, few, field, fight, figure, fill, film, final, finally, financial, find, +fine, finger, finish, fire, firm, first, fish, five, floor, fly, focus, follow, +food, foot, for, force, foreign, forget, form, former, forward, four, free, +friend, from, front, full, fund, future, game, garden, gas, general, generation, +get, girl, give, glass, go, goal, good, government, great, green, ground, group, +grow, growth, guess, gun, guy, hair, half, hand, hang, happen, happy, hard, +have, he, head, health, hear, heart, heat, heavy, help, her, here, herself, +high, him, himself, his, history, hit, hold, home, hope, hospital, hot, hotel, +hour, house, how, however, huge, human, hundred, husband, I, idea, identify, if, +image, imagine, impact, important, improve, in, include, including, increase, +indeed, indicate, individual, industry, information, inside, instead, +institution, interest, interesting, international, interview, into, investment, +involve, issue, it, item, its, itself, job, join, just, keep, key, kid, kill, +kind, kitchen, know, knowledge, land, language, large, last, late, later, laugh, +law, lawyer, lay, lead, leader, learn, least, leave, left, leg, legal, less, +let, letter, level, lie, life, light, like, likely, line, list, listen, little, +live, local, long, look, lose, loss, lot, love, low, machine, magazine, main, +maintain, major, majority, make, man, manage, management, manager, many, market, +marriage, material, matter, may, maybe, me, mean, measure, media, medical, meet, +meeting, member, memory, mention, message, method, middle, might, military, +million, mind, minute, miss, mission, model, modern, moment, money, month, more, +morning, most, mother, mouth, move, movement, movie, Mr, Mrs, much, music, must, +my, myself, name, nation, national, natural, nature, near, nearly, necessary, +need, network, never, new, news, newspaper, next, nice, night, no, none, nor, +north, not, note, nothing, notice, now, n't, number, occur, of, off, offer, +office, officer, official, often, oh, oil, ok, old, on, once, one, only, onto, +open, operation, opportunity, option, or, order, organization, other, others, +our, out, outside, over, own, owner, page, pain, painting, paper, parent, part, +participant, particular, particularly, partner, party, pass, past, patient, +pattern, pay, peace, people, per, perform, performance, perhaps, period, person, +personal, phone, physical, pick, picture, piece, place, plan, plant, play, +player, PM, point, police, policy, political, politics, poor, popular, +population, position, positive, possible, power, practice, prepare, present, +president, pressure, pretty, prevent, price, private, probably, problem, +process, produce, product, production, professional, professor, program, +project, property, protect, prove, provide, public, pull, purpose, push, put, +quality, question, quickly, quite, race, radio, raise, range, rate, rather, +reach, read, ready, real, reality, realize, really, reason, receive, recent, +recently, recognize, record, red, reduce, reflect, region, relate, relationship, +religious, remain, remember, remove, report, represent, Republican, require, +research, resource, respond, response, responsibility, rest, result, return, +reveal, rich, right, rise, risk, road, rock, role, room, rule, run, safe, same, +save, say, scene, school, science, scientist, score, sea, season, seat, second, +section, security, see, seek, seem, sell, send, senior, sense, series, serious, +serve, service, set, seven, several, sex, sexual, shake, share, she, shoot, +short, shot, should, shoulder, show, side, sign, significant, similar, simple, +simply, since, sing, single, sister, sit, site, situation, six, size, skill, +skin, small, smile, so, social, society, soldier, some, somebody, someone, +something, sometimes, son, song, soon, sort, sound, source, south, southern, +space, speak, special, specific, speech, spend, sport, spring, staff, stage, +stand, standard, star, start, state, statement, station, stay, step, still, +stock, stop, store, story, strategy, street, strong, structure, student, study, +stuff, style, subject, success, successful, such, suddenly, suffer, suggest, +summer, support, sure, surface, system, table, take, talk, task, tax, teach, +teacher, team, technology, television, tell, ten, tend, term, test, than, thank, +that, the, their, them, themselves, then, theory, there, these, they, thing, +think, third, this, those, though, thought, thousand, threat, three, through, +throughout, throw, thus, time, to, today, together, tonight, too, top, total, +tough, toward, town, trade, traditional, training, travel, treat, treatment, +tree, trial, trip, trouble, true, truth, try, turn, TV, two, type, under, +understand, unit, until, up, upon, us, use, usually, value, various, very, +victim, view, violence, visit, voice, vote, wait, walk, wall, want, war, watch, +water, way, we, weapon, wear, week, weight, well, west, western, what, whatever, +when, where, whether, which, while, white, who, whole, whom, whose, why, wide, +wife, will, win, wind, window, wish, with, within, without, woman, wonder, word, +work, worker, world, worry, would, write, writer, wrong, yard, yeah, year, yes, +yet, you, young, your, yourself"# + .split(',') + .map(|word| word.trim()) + .collect(); + + let mut word_pairs: Vec<_> = Vec::new(); + for word in &words { + for other_word in &words { + word_pairs.push(word.to_string() + " " + other_word); + } + } + assert_eq!(1_000_000, word_pairs.len()); + word_pairs +} + +#[allow(unused)] // False positive +fn test_hash_common_words(build_hasher: &B) { + let word_pairs: Vec<_> = gen_word_pairs(); + check_for_collisions(build_hasher, &word_pairs, 32); +} + +#[allow(unused)] // False positive +fn check_for_collisions(build_hasher: &B, items: &[H], bucket_count: usize) { + let mut buckets = vec![0; bucket_count]; + for item in items { + let value = hash(item, build_hasher) as usize; + buckets[value % bucket_count] += 1; + } + let mean = items.len() / bucket_count; + let max = *buckets.iter().max().unwrap(); + let min = *buckets.iter().min().unwrap(); + assert!( + (min as f64) > (mean as f64) * 0.95, + "min: {}, max:{}, {:?}", + min, + max, + buckets + ); + assert!( + (max as f64) < (mean as f64) * 1.05, + "min: {}, max:{}, {:?}", + min, + max, + buckets + ); +} + +#[cfg(feature = "specialize")] +#[allow(unused)] // False positive +fn hash(b: &H, build_hasher: &B) -> u64 { + build_hasher.hash_one(b) +} + +#[cfg(not(feature = "specialize"))] +#[allow(unused)] // False positive +fn hash(b: &H, build_hasher: &B) -> u64 { + let mut hasher = build_hasher.build_hasher(); + b.hash(&mut hasher); + hasher.finish() +} + +#[test] +fn test_bucket_distribution() { + let build_hasher = RandomState::with_seeds(1, 2, 3, 4); + test_hash_common_words(&build_hasher); + let sequence: Vec<_> = (0..320000).collect(); + check_for_collisions(&build_hasher, &sequence, 32); + let sequence: Vec<_> = (0..2560000).collect(); + check_for_collisions(&build_hasher, &sequence, 256); + let sequence: Vec<_> = (0..320000).map(|i| i * 1024).collect(); + check_for_collisions(&build_hasher, &sequence, 32); + let sequence: Vec<_> = (0..2560000_u64).map(|i| i * 1024).collect(); + check_for_collisions(&build_hasher, &sequence, 256); +} + +#[cfg(feature = "std")] +#[test] +fn test_ahash_alias_map_construction() { + let mut map = ahash::HashMap::default(); + map.insert(1, "test"); + use ahash::HashMapExt; + let mut map = ahash::HashMap::with_capacity(1234); + map.insert(1, "test"); +} + +#[cfg(feature = "std")] +#[test] +fn test_ahash_alias_set_construction() { + let mut set = ahash::HashSet::default(); + set.insert(1); + + use ahash::HashSetExt; + let mut set = ahash::HashSet::with_capacity(1235); + set.insert(1); +} + +fn ahash_vec(b: &Vec) -> u64 { + let mut total: u64 = 0; + for item in b { + let mut hasher = RandomState::with_seeds(12, 34, 56, 78).build_hasher(); + item.hash(&mut hasher); + total = total.wrapping_add(hasher.finish()); + } + total +} + +fn fxhash_vec(b: &Vec) -> u64 { + let mut total: u64 = 0; + for item in b { + let mut hasher = FxHasher::default(); + item.hash(&mut hasher); + total = total.wrapping_add(hasher.finish()); + } + total +} + +fn bench_ahash_words(c: &mut Criterion) { + let words = gen_word_pairs(); + c.bench_function("aes_words", |b| b.iter(|| black_box(ahash_vec(&words)))); +} + +fn bench_fx_words(c: &mut Criterion) { + let words = gen_word_pairs(); + c.bench_function("fx_words", |b| b.iter(|| black_box(fxhash_vec(&words)))); +} + +criterion_main!(benches); +criterion_group!(benches, bench_ahash_words, bench_fx_words,); diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/tests/nopanic.rs b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/tests/nopanic.rs new file mode 100644 index 0000000..56f754c --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.4-stdsimd.patch/tests/nopanic.rs @@ -0,0 +1,81 @@ +use ahash::{AHasher, RandomState}; +use std::hash::{BuildHasher, Hash, Hasher}; + +#[macro_use] +extern crate no_panic; + +#[inline(never)] +#[no_panic] +fn hash_test_final(num: i32, string: &str) -> (u64, u64) { + use core::hash::Hasher; + let mut hasher1 = RandomState::with_seeds(1, 2, 3, 4).build_hasher(); + let mut hasher2 = RandomState::with_seeds(3, 4, 5, 6).build_hasher(); + hasher1.write_i32(num); + hasher2.write(string.as_bytes()); + (hasher1.finish(), hasher2.finish()) +} + +#[inline(never)] +fn hash_test_final_wrapper(num: i32, string: &str) { + hash_test_final(num, string); +} + +struct SimpleBuildHasher { + hasher: AHasher, +} + +impl SimpleBuildHasher { + fn hash_one(&self, x: T) -> u64 + where + Self: Sized, + { + let mut hasher = self.build_hasher(); + x.hash(&mut hasher); + hasher.finish() + } +} + +impl BuildHasher for SimpleBuildHasher { + type Hasher = AHasher; + + fn build_hasher(&self) -> Self::Hasher { + self.hasher.clone() + } +} + +#[inline(never)] +#[no_panic] +fn hash_test_specialize(num: i32, string: &str) -> (u64, u64) { + let hasher1 = RandomState::with_seeds(1, 2, 3, 4).build_hasher(); + let hasher2 = RandomState::with_seeds(1, 2, 3, 4).build_hasher(); + ( + SimpleBuildHasher { hasher: hasher1 }.hash_one(num), + SimpleBuildHasher { hasher: hasher2 }.hash_one(string.as_bytes()), + ) +} + +#[inline(never)] +fn hash_test_random_wrapper(num: i32, string: &str) { + hash_test_specialize(num, string); +} + +#[inline(never)] +#[no_panic] +fn hash_test_random(num: i32, string: &str) -> (u64, u64) { + let build_hasher1 = RandomState::with_seeds(1, 2, 3, 4); + let build_hasher2 = RandomState::with_seeds(1, 2, 3, 4); + (build_hasher1.hash_one(&num), build_hasher2.hash_one(string.as_bytes())) +} + +#[inline(never)] +fn hash_test_specialize_wrapper(num: i32, string: &str) { + hash_test_specialize(num, string); +} + +#[test] +fn test_no_panic() { + hash_test_final_wrapper(2, "Foo"); + hash_test_specialize_wrapper(2, "Bar"); + hash_test_random(2, "Baz"); + hash_test_random_wrapper(2, "Bat"); +} diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/.github/workflows/rust.yml b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/.github/workflows/rust.yml new file mode 100644 index 0000000..f09853c --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/.github/workflows/rust.yml @@ -0,0 +1,169 @@ +name: Rust + +on: [push, pull_request] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Install latest stable + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + components: clippy + - name: check nostd + uses: actions-rs/cargo@v1 + with: + command: check + args: --no-default-features + - name: test nostd + uses: actions-rs/cargo@v1 + with: + command: test + args: --no-default-features + - name: check constrandom + uses: actions-rs/cargo@v1 + with: + command: check + args: --no-default-features --features compile-time-rng + - name: test constrandom + uses: actions-rs/cargo@v1 + with: + command: test + args: --no-default-features --features compile-time-rng + - name: check fixed-seed + uses: actions-rs/cargo@v1 + with: + command: check + args: --no-default-features --features std + - name: check + uses: actions-rs/cargo@v1 + with: + command: check + - name: test + uses: actions-rs/cargo@v1 + with: + command: test + nightly: + name: nightly + runs-on: ubuntu-latest + env: + RUSTFLAGS: -C target-cpu=native + steps: + - uses: actions/checkout@v2 + - name: Install latest nightly + uses: actions-rs/toolchain@v1 + with: + toolchain: nightly + override: true + components: clippy + - name: check nightly + uses: actions-rs/cargo@v1 + with: + command: check + - name: test nightly + uses: actions-rs/cargo@v1 + with: + command: test + - name: check serde + uses: actions-rs/cargo@v1 + with: + command: check + args: --features serde + - name: test serde + uses: actions-rs/cargo@v1 + with: + command: test + args: --features serde + linux_arm7: + name: Linux ARMv7 + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions-rs/toolchain@v1 + with: + toolchain: stable + target: armv7-unknown-linux-gnueabihf + - uses: actions-rs/cargo@v1 + with: + command: check + args: --target armv7-unknown-linux-gnueabihf + aarch64-apple-darwin: + name: Aarch64 Apple Darwin + runs-on: macos-latest + steps: + - uses: actions/checkout@v2 + - uses: actions-rs/toolchain@v1 + with: + toolchain: stable + target: aarch64-apple-darwin + - uses: actions-rs/cargo@v1 + with: + command: check + args: --target aarch64-apple-darwin + i686-unknown-linux-gnu: + name: Linux i686 + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions-rs/toolchain@v1 + with: + toolchain: stable + target: i686-unknown-linux-gnu + - name: Install cross compile tools + run: sudo apt-get install -y gcc-multilib libc6-i386 libc6-dev-i386 + - uses: actions-rs/cargo@v1 + with: + command: check + args: --target i686-unknown-linux-gnu + - uses: actions-rs/cargo@v1 + with: + command: test + args: --target i686-unknown-linux-gnu + x86_64-unknown-linux-gnu: + name: Linux x86_64 - nightly + runs-on: ubuntu-latest + env: + RUSTFLAGS: -C target-cpu=skylake -C target-feature=+aes + steps: + - uses: actions/checkout@v2 + - uses: actions-rs/toolchain@v1 + with: + toolchain: nightly + override: true + target: x86_64-unknown-linux-gnu + - uses: actions-rs/cargo@v1 + with: + command: check + args: --target x86_64-unknown-linux-gnu + - uses: actions-rs/cargo@v1 + with: + command: test + args: --target x86_64-unknown-linux-gnu + thumbv6m: + name: thumbv6m + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions-rs/toolchain@v1 + with: + toolchain: stable + target: thumbv6m-none-eabi + - uses: actions-rs/cargo@v1 + with: + command: check + args: --target thumbv6m-none-eabi --no-default-features + wasm32-unknown-unknown: + name: wasm + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions-rs/toolchain@v1 + with: + toolchain: stable + target: wasm32-unknown-unknown + - uses: actions-rs/cargo@v1 + with: + command: check + args: --target wasm32-unknown-unknown --no-default-features diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/.gitignore b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/.gitignore new file mode 100644 index 0000000..fc89f1b --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/.gitignore @@ -0,0 +1,3 @@ +.idea/ +Cargo.lock +target diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/Cargo.toml b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/Cargo.toml new file mode 100644 index 0000000..6bb1486 --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/Cargo.toml @@ -0,0 +1,103 @@ +[package] +name = "ahash" +version = "0.8.5" +authors = ["Tom Kaitchuck "] +license = "MIT OR Apache-2.0" +description = "A non-cryptographic hash function using AES-NI for high performance" +documentation = "https://docs.rs/ahash" +repository = "https://github.com/tkaitchuck/ahash" +keywords = ["hash", "hasher", "hashmap", "aes", "no-std"] +categories = ["algorithms", "data-structures", "no-std"] +edition = "2018" +readme = "README.md" +build = "./build.rs" +exclude = ["/smhasher", "/benchmark_tools"] + +[lib] +name = "ahash" +path = "src/lib.rs" +test = true +doctest = true +bench = true +doc = true + +[features] +stdsimd = [] +default = ["std", "runtime-rng"] + +# Enabling this will enable `AHashMap` and `AHashSet`. +std = [] + +# Runtime random key generation using getrandom. +runtime-rng = ["getrandom"] + +# This is an alternative to runtime key generation which does compile time key generation if runtime-rng is not available. +# (If runtime-rng is enabled this does nothing.) +# If this is on (and runtime-rng is off) it implies the produced binary will not be identical. +# If this is disabled and runtime-rng is unavailable constant keys are used. +compile-time-rng = ["const-random"] + +# Do not use any random number generator (either at compile time or runtime) +# If either runtime-rng or compile-time-rng are enabled this does nothing. +no-rng = [] + +# in case this is being used on an architecture lacking core::sync::atomic::AtomicUsize and friends +atomic-polyfill = [ "dep:atomic-polyfill", "once_cell/atomic-polyfill"] + +[[bench]] +name = "ahash" +path = "tests/bench.rs" +harness = false + +[[bench]] +name = "map" +path = "tests/map_tests.rs" +harness = false + +[profile.test] +opt-level = 2 +lto = 'fat' + +[profile.release] +opt-level = 3 +debug = false +lto = 'fat' +debug-assertions = false +codegen-units = 1 + +[profile.bench] +opt-level = 3 +debug = false +lto = 'fat' +debug-assertions = false +codegen-units = 1 + +[build-dependencies] +version_check = "0.9.4" + +[dependencies] +const-random = { version = "0.1.12", optional = true } +serde = { version = "1.0.117", optional = true } +cfg-if = "1.0" +atomic-polyfill = { version="1.0.1", optional=true} +getrandom = { version = "0.2.7", optional = true } +zerocopy = { version = "0.7.0", default-features = false, features = ["simd"] } + +[target.'cfg(not(all(target_arch = "arm", target_os = "none")))'.dependencies] +once_cell = { version = "1.13.1", default-features = false, features = ["unstable", "alloc"] } + +[dev-dependencies] +no-panic = "0.1.10" +criterion = {version = "0.3.2", features = ["html_reports"] } +seahash = "4.0" +fnv = "1.0.5" +fxhash = "0.2.1" +hex = "0.4.2" +rand = "0.8.5" +serde_json = "1.0.59" +hashbrown = "0.12.3" + +[package.metadata.docs.rs] +rustc-args = ["-C", "target-feature=+aes"] +rustdoc-args = ["-C", "target-feature=+aes"] +features = ["std"] diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/FAQ.md b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/FAQ.md new file mode 100644 index 0000000..26c4a68 --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/FAQ.md @@ -0,0 +1,118 @@ +## How does aHash prevent DOS attacks + +AHash is designed to [prevent an adversary that does not know the key from being able to create hash collisions or partial collisions.](https://github.com/tkaitchuck/aHash/wiki/How-aHash-is-resists-DOS-attacks) + +If you are a cryptographer and would like to help review aHash's algorithm, please post a comment [here](https://github.com/tkaitchuck/aHash/issues/11). + +In short, this is achieved by ensuring that: + +* aHash is designed to [resist differential crypto analysis](https://github.com/tkaitchuck/aHash/wiki/How-aHash-is-resists-DOS-attacks#differential-analysis). Meaning it should not be possible to devise a scheme to "cancel" out a modification of the internal state from a block of input via some corresponding change in a subsequent block of input. + * This is achieved by not performing any "premixing" - This reversible mixing gave previous hashes such as murmurhash confidence in their quality, but could be undone by a deliberate attack. + * Before it is used each chunk of input is "masked" such as by xoring it with an unpredictable value. +* aHash obeys the '[strict avalanche criterion](https://en.wikipedia.org/wiki/Avalanche_effect#Strict_avalanche_criterion)': +Each bit of input has the potential to flip every bit of the output. +* Similarly, each bit in the key can affect every bit in the output. +* Input bits never effect just one, or a very few, bits in intermediate state. This is specifically designed to prevent the sort of +[differential attacks launched by the sipHash authors](https://emboss.github.io/blog/2012/12/14/breaking-murmur-hash-flooding-dos-reloaded/) which cancel previous inputs. +* The `finish` call at the end of the hash is designed to not expose individual bits of the internal state. + * For example in the main algorithm 256bits of state and 256bits of keys are reduced to 64 total bits using 3 rounds of AES encryption. +Reversing this is more than non-trivial. Most of the information is by definition gone, and any given bit of the internal state is fully diffused across the output. +* In both aHash and its fallback the internal state is divided into two halves which are updated by two unrelated techniques using the same input. - This means that if there is a way to attack one of them it likely won't be able to attack both of them at the same time. +* It is deliberately difficult to 'chain' collisions. (This has been the major technique used to weaponize attacks on other hash functions) + +More details are available on [the wiki](https://github.com/tkaitchuck/aHash/wiki/How-aHash-is-resists-DOS-attacks). + +## Why not use a cryptographic hash in a hashmap. + +Cryptographic hashes are designed to make is nearly impossible to find two items that collide when the attacker has full control +over the input. This has several implications: + +* They are very difficult to construct, and have to go to a lot of effort to ensure that collisions are not possible. +* They have no notion of a 'key'. Rather, they are fully deterministic and provide exactly one hash for a given input. + +For a HashMap the requirements are different. + +* Speed is very important, especially for short inputs. Often the key for a HashMap is a single `u32` or similar, and to be effective +the bucket that it should be hashed to needs to be computed in just a few CPU cycles. +* A hashmap does not need to provide a hard and fast guarantee that no two inputs will ever collide. Hence, hashCodes are not 256bits +but are just 64 or 32 bits in length. Often the first thing done with the hashcode is to truncate it further to compute which among a few buckets should be used for a key. + * Here collisions are expected, and a cheap to deal with provided there is no systematic way to generated huge numbers of values that all +go to the same bucket. + * This also means that unlike a cryptographic hash partial collisions matter. It doesn't do a hashmap any good to produce a unique 256bit hash if +the lower 12 bits are all the same. This means that even a provably irreversible hash would not offer protection from a DOS attack in a hashmap +because an attacker can easily just brute force the bottom N bits. + +From a cryptography point of view, a hashmap needs something closer to a block cypher. +Where the input can be quickly mixed in a way that cannot be reversed without knowing a key. + +## Why isn't aHash cryptographically secure + +It is not designed to be. +Attempting to use aHash as a secure hash will likely fail to hold up for several reasons: + +1. aHash relies on random keys which are assumed to not be observable by an attacker. For a cryptographic hash all inputs can be seen and controlled by the attacker. +2. aHash has not yet gone through peer review, which is a pre-requisite for security critical algorithms. +3. Because aHash uses reduced rounds of AES as opposed to the standard of 10. Things like the SQUARE attack apply to part of the internal state. +(These are mitigated by other means to prevent producing collections, but would be a problem in other contexts). +4. Like any cypher based hash, it will show certain statistical deviations from truly random output when comparing a (VERY) large number of hashes. +(By definition cyphers have fewer collisions than truly random data.) + +There are efforts to build a secure hash function that uses AES-NI for acceleration, but aHash is not one of them. + +## How is aHash so fast + +AHash uses a number of tricks. + +One trick is taking advantage of specialization. If aHash is compiled on nightly it will take +advantage of specialized hash implementations for strings, slices, and primitives. + +Another is taking advantage of hardware instructions. +When it is available aHash uses AES rounds using the AES-NI instruction. AES-NI is very fast (on an intel i7-6700 it +is as fast as a 64 bit multiplication.) and handles 16 bytes of input at a time, while being a very strong permutation. + +This is obviously much faster than most standard approaches to hashing, and does a better job of scrambling data than most non-secure hashes. + +On an intel i7-6700 compiled on nightly Rust with flags `-C opt-level=3 -C target-cpu=native -C codegen-units=1`: + +| Input | SipHash 1-3 time | FnvHash time|FxHash time| aHash time| aHash Fallback* | +|----------------|-----------|-----------|-----------|-----------|---------------| +| u8 | 9.3271 ns | 0.808 ns | **0.594 ns** | 0.7704 ns | 0.7664 ns | +| u16 | 9.5139 ns | 0.803 ns | **0.594 ns** | 0.7653 ns | 0.7704 ns | +| u32 | 9.1196 ns | 1.4424 ns | **0.594 ns** | 0.7637 ns | 0.7712 ns | +| u64 | 10.854 ns | 3.0484 ns | **0.628 ns** | 0.7788 ns | 0.7888 ns | +| u128 | 12.465 ns | 7.0728 ns | 0.799 ns | **0.6174 ns** | 0.6250 ns | +| 1 byte string | 11.745 ns | 2.4743 ns | 2.4000 ns | **1.4921 ns** | 1.5861 ns | +| 3 byte string | 12.066 ns | 3.5221 ns | 2.9253 ns | **1.4745 ns** | 1.8518 ns | +| 4 byte string | 11.634 ns | 4.0770 ns | 1.8818 ns | **1.5206 ns** | 1.8924 ns | +| 7 byte string | 14.762 ns | 5.9780 ns | 3.2282 ns | **1.5207 ns** | 1.8933 ns | +| 8 byte string | 13.442 ns | 4.0535 ns | 2.9422 ns | **1.6262 ns** | 1.8929 ns | +| 15 byte string | 16.880 ns | 8.3434 ns | 4.6070 ns | **1.6265 ns** | 1.7965 ns | +| 16 byte string | 15.155 ns | 7.5796 ns | 3.2619 ns | **1.6262 ns** | 1.8011 ns | +| 24 byte string | 16.521 ns | 12.492 ns | 3.5424 ns | **1.6266 ns** | 2.8311 ns | +| 68 byte string | 24.598 ns | 50.715 ns | 5.8312 ns | **4.8282 ns** | 5.4824 ns | +| 132 byte string| 39.224 ns | 119.96 ns | 11.777 ns | **6.5087 ns** | 9.1459 ns | +|1024 byte string| 254.00 ns | 1087.3 ns | 156.41 ns | **25.402 ns** | 54.566 ns | + +* Fallback refers to the algorithm aHash would use if AES instructions are unavailable. +For reference a hash that does nothing (not even reads the input data takes) **0.520 ns**. So that represents the fastest +possible time. + +As you can see above aHash like `FxHash` provides a large speedup over `SipHash-1-3` which is already nearly twice as fast as `SipHash-2-4`. + +Rust's HashMap by default uses `SipHash-1-3` because faster hash functions such as `FxHash` are predictable and vulnerable to denial of +service attacks. While `aHash` has both very strong scrambling and very high performance. + +AHash performs well when dealing with large inputs because aHash reads 8 or 16 bytes at a time. (depending on availability of AES-NI) + +Because of this, and its optimized logic, `aHash` is able to outperform `FxHash` with strings. +It also provides especially good performance dealing with unaligned input. +(Notice the big performance gaps between 3 vs 4, 7 vs 8 and 15 vs 16 in `FxHash` above) + +### Which CPUs can use the hardware acceleration + +Hardware AES instructions are built into Intel processors built after 2010 and AMD processors after 2012. +It is also available on [many other CPUs](https://en.wikipedia.org/wiki/AES_instruction_set) should in eventually +be able to get aHash to work. However, only X86 and X86-64 are the only supported architectures at the moment, as currently +they are the only architectures for which Rust provides an intrinsic. + +aHash also uses `sse2` and `sse3` instructions. X86 processors that have `aesni` also have these instruction sets. diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/LICENSE-APACHE b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/LICENSE-APACHE new file mode 100644 index 0000000..16fe87b --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/LICENSE-APACHE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/LICENSE-MIT b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/LICENSE-MIT new file mode 100644 index 0000000..cba2010 --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/LICENSE-MIT @@ -0,0 +1,25 @@ +Copyright (c) 2018 Tom Kaitchuck + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/README.md b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/README.md new file mode 100644 index 0000000..18c421d --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/README.md @@ -0,0 +1,108 @@ +# aHash ![Build Status](https://img.shields.io/github/actions/workflow/status/tkaitchuck/aHash/rust.yml?branch=master) ![Licence](https://img.shields.io/crates/l/ahash) ![Downloads](https://img.shields.io/crates/d/ahash) + +AHash is the [fastest](https://github.com/tkaitchuck/aHash/blob/master/compare/readme.md#Speed), +[DOS resistant hash](https://github.com/tkaitchuck/aHash/wiki/How-aHash-is-resists-DOS-attacks) currently available in Rust. +AHash is intended *exclusively* for use in in-memory hashmaps. + +AHash's output is of [high quality](https://github.com/tkaitchuck/aHash/blob/master/compare/readme.md#Quality) but aHash is **not** a cryptographically secure hash. + +## Design + +Because AHash is a keyed hash, each map will produce completely different hashes, which cannot be predicted without knowing the keys. +[This prevents DOS attacks where an attacker sends a large number of items whose hashes collide that get used as keys in a hashmap.](https://github.com/tkaitchuck/aHash/wiki/How-aHash-is-resists-DOS-attacks) + +This also avoids [accidentally quadratic behavior by reading from one map and writing to another.](https://accidentallyquadratic.tumblr.com/post/153545455987/rust-hash-iteration-reinsertion) + +## Goals and Non-Goals + +AHash does *not* have a fixed standard for its output. This allows it to improve over time. For example, +if any faster algorithm is found, aHash will be updated to incorporate the technique. +Similarly, should any flaw in aHash's DOS resistance be found, aHash will be changed to correct the flaw. + +Because it does not have a fixed standard, different computers or computers on different versions of the code will observe different hash values. +As such, aHash is not recommended for use other than in-memory maps. Specifically, aHash is not intended for network use or in applications which persist hashed values. +(In these cases `HighwayHash` would be a better choice) + +Additionally, aHash is not intended to be cryptographically secure and should not be used as a MAC, or anywhere which requires a cryptographically secure hash. +(In these cases `SHA-3` would be a better choice) + +## Usage + +AHash is a drop in replacement for the default implementation of the `Hasher` trait. To construct a `HashMap` using aHash +as its hasher do the following: + +```rust +use ahash::{AHasher, RandomState}; +use std::collections::HashMap; + +let mut map: HashMap = HashMap::default(); +map.insert(12, 34); +``` +For convenience, wrappers called `AHashMap` and `AHashSet` are also provided. +These do the same thing with slightly less typing. +```rust +use ahash::AHashMap; + +let mut map: AHashMap = AHashMap::new(); +map.insert(12, 34); +map.insert(56, 78); +``` + +## Flags + +The aHash package has the following flags: +* `std`: This enables features which require the standard library. (On by default) This includes providing the utility classes `AHashMap` and `AHashSet`. +* `serde`: Enables `serde` support for the utility classes `AHashMap` and `AHashSet`. +* `runtime-rng`: To obtain a seed for Hashers will obtain randomness from the operating system. (On by default) +This is done using the [getrandom](https://github.com/rust-random/getrandom) crate. +* `compile-time-rng`: For OS targets without access to a random number generator, `compile-time-rng` provides an alternative. +If `getrandom` is unavailable and `compile-time-rng` is enabled, aHash will generate random numbers at compile time and embed them in the binary. +This allows for DOS resistance even if there is no random number generator available at runtime (assuming the compiled binary is not public). +This makes the binary non-deterministic. (If non-determinism is a problem see [constrandom's documentation](https://github.com/tkaitchuck/constrandom#deterministic-builds)) + +If both `runtime-rng` and `compile-time-rng` are enabled the `runtime-rng` will take precedence and `compile-time-rng` will do nothing. +If neither flag is set, seeds can be supplied by the application. [Multiple apis](https://docs.rs/ahash/latest/ahash/random_state/struct.RandomState.html) +are available to do this. + +## Comparison with other hashers + +A full comparison with other hashing algorithms can be found [here](https://github.com/tkaitchuck/aHash/blob/master/compare/readme.md) + +![Hasher performance](https://docs.google.com/spreadsheets/d/e/2PACX-1vSK7Li2nS-Bur9arAYF9IfT37MP-ohAe1v19lZu5fd9MajI1fSveLAQZyEie4Ea9k5-SWHTff7nL2DW/pubchart?oid=1323618938&format=image) + +For a more representative performance comparison which includes the overhead of using a HashMap, see [HashBrown's benchmarks](https://github.com/rust-lang/hashbrown#performance) +as HashBrown now uses aHash as its hasher by default. + +## Hash quality + +AHash passes the full [SMHasher test suite](https://github.com/rurban/smhasher). + +The code to reproduce the result, and the full output [are checked into the repo](https://github.com/tkaitchuck/aHash/tree/master/smhasher). + +## Additional FAQ + +A separate FAQ document is maintained [here](https://github.com/tkaitchuck/aHash/blob/master/FAQ.md). +If you have questions not covered there, open an issue [here](https://github.com/tkaitchuck/aHash/issues). + +## License + +Licensed under either of: + + * Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0) + * MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT) + +at your option. + +## Contribution + +Unless you explicitly state otherwise, any contribution intentionally submitted +for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any +additional terms or conditions. + + + + + + + + diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/benchmark_tools/Cargo.toml b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/benchmark_tools/Cargo.toml new file mode 100644 index 0000000..70fcee5 --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/benchmark_tools/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "aHash" +version = "0.1.0" +edition = "2018" +publish = false +description = "A tool for benchmarking hashing algorithms" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +once_cell = "1.8.0" +byteorder = "1.4.3" +ahash = "0.7.4" \ No newline at end of file diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/benchmark_tools/benchmark_tools.iml b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/benchmark_tools/benchmark_tools.iml new file mode 100644 index 0000000..2fecef3 --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/benchmark_tools/benchmark_tools.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/benchmark_tools/src/data_reader.rs b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/benchmark_tools/src/data_reader.rs new file mode 100644 index 0000000..cd13526 --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/benchmark_tools/src/data_reader.rs @@ -0,0 +1,51 @@ +use std::fs::File; +use std::hash::{BuildHasher, Hasher}; +use std::io::{BufReader, BufRead, Error, Read}; +use byteorder::{ReadBytesExt, LittleEndian}; + +pub fn test_hasher(input_file: File, builder: B) -> Result { + let mut result: u64 = 0; + let mut input = BufReader::new(input_file); + let mut hasher = builder.build_hasher(); + while input.has_data_left()? { + let code = input.read_u8()?; + match code { + b'1' => { + let i = input.read_u8()?; + hasher.write_u8(i); + } + b'2' => { + let i = input.read_u16::()?; + hasher.write_u16(i); + } + b'4' => { + let i = input.read_u32::()?; + hasher.write_u32(i); + } + b'8' => { + let i = input.read_u64::()?; + hasher.write_u64(i); + } + b'B' => { + let i = input.read_u128::()?; + hasher.write_u128(i); + } + b'u' => { + let i = input.read_u64::()?; + hasher.write_usize(i as usize); + } + b's' => { + let len = input.read_u32::()?; + let mut slice = vec![0; len as usize]; + input.read_exact(&mut slice[..])?; + hasher.write(&slice[..]); + } + b'f' => { + result = result.wrapping_add(hasher.finish()); + hasher = builder.build_hasher(); + } + code => panic!("Unexpected code: {}", code) + } + } + Ok(result) +} \ No newline at end of file diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/benchmark_tools/src/main.rs b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/benchmark_tools/src/main.rs new file mode 100644 index 0000000..386f136 --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/benchmark_tools/src/main.rs @@ -0,0 +1,34 @@ +#![feature(buf_read_has_data_left)] + +mod persisting_hasher; +mod data_reader; + +use persisting_hasher::*; +use data_reader::*; +use std::collections::HashMap; +use std::fs::File; +use std::time::SystemTime; +use std::alloc::System; + +fn capture_output_example() { + let builder = PersistingHasherBuilder::default(); + let mut map = HashMap::with_capacity_and_hasher(10, builder); + map.insert(1, 2); + map.insert(3, 4); + let builder = PersistingHasherBuilder::default(); + let mut map = HashMap::with_capacity_and_hasher(10, builder); + map.insert("1", 2); + map.insert("3", 4); + PersistingHasherBuilder::default().flush(); +} + +fn main() { + // capture_output_example(); + + //Given a previously captured set of hashed data, time how long it takes using a different algorithm. + let file = File::open("hash_output-295253").unwrap(); + let rand = ahash::RandomState::new(); + let start_time = SystemTime::now(); + let result = test_hasher(file, rand).unwrap(); + println!("Completed after {:?} with result: {:x}", SystemTime::now().duration_since(start_time).unwrap(), result) +} diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/benchmark_tools/src/persisting_hasher.rs b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/benchmark_tools/src/persisting_hasher.rs new file mode 100644 index 0000000..b50060d --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/benchmark_tools/src/persisting_hasher.rs @@ -0,0 +1,144 @@ +use std::convert::TryInto; +use std::fs::File; +use std::hash::{Hasher, BuildHasher}; +use std::io::{BufWriter, Write}; +use std::sync::{Arc, Mutex}; +use std::sync::atomic::{AtomicU64, Ordering}; +use once_cell::sync::OnceCell; +use std::process::id; + +static GLOBAL_COUNT: AtomicU64 = AtomicU64::new(0); +static GLOBAL_OUT: OnceCell>>> = OnceCell::new(); + +pub struct PersistingHasherBuilder { + id: u64, + out: Arc>>, +} + +impl PersistingHasherBuilder { + pub fn flush(&self) { + let mut guard = self.out.lock().unwrap(); + guard.flush().unwrap(); + } +} + +impl Default for PersistingHasherBuilder { + fn default() -> Self { + PersistingHasherBuilder { + id: GLOBAL_COUNT.fetch_add(1, Ordering::SeqCst), + out: GLOBAL_OUT.get_or_init(|| + Arc::new(Mutex::new(BufWriter::new(File::create( + format!("hash_output-{}", id())).unwrap())))).clone(), + } + } +} + +impl BuildHasher for PersistingHasherBuilder { + type Hasher = PersistingHasher; + + fn build_hasher(&self) -> Self::Hasher { + PersistingHasher { + hash: self.id, + out: self.out.clone(), + } + } +} + +pub struct PersistingHasher { + /// Used to compute a hash + hash: u64, + /// File to write data out to + out: Arc>>, +} + +impl PersistingHasher { + fn add_to_hash(&mut self, i: u64) { + self.hash = self + .hash + .rotate_right(31) + .wrapping_add(i) + .wrapping_mul(0xcfee444d8b59a89b); + } +} + +impl Hasher for PersistingHasher { + fn finish(&self) -> u64 { + let mut guard = self.out.lock().unwrap(); + write!(guard, "f").unwrap(); + self.hash + } + + fn write(&mut self, mut bytes: &[u8]) { + let read_u64 = |bytes: &[u8]| u64::from_ne_bytes(bytes[..8].try_into().unwrap()); + + while bytes.len() >= 8 { + self.add_to_hash(read_u64(bytes)); + bytes = &bytes[8..]; + } + if bytes.len() >= 4 { + self.add_to_hash(u32::from_ne_bytes(bytes[..4].try_into().unwrap()) as u64); + bytes = &bytes[4..]; + } + if bytes.len() >= 2 { + self.add_to_hash(u16::from_ne_bytes(bytes[..2].try_into().unwrap()) as u64); + bytes = &bytes[2..]; + } + if bytes.len() >= 1 { + self.add_to_hash(bytes[0] as u64); + } + + let mut guard = self.out.lock().unwrap(); + write!(guard, "s").unwrap(); + guard.write_all(&(bytes.len() as u32).to_le_bytes()).unwrap(); + guard.write_all(bytes).unwrap(); + } + + fn write_u8(&mut self, i: u8) { + self.add_to_hash(i as u64); + + let mut guard = self.out.lock().unwrap(); + write!(guard, "1").unwrap(); + guard.write_all(&i.to_le_bytes()).unwrap(); + } + + fn write_u16(&mut self, i: u16) { + self.add_to_hash(i as u64); + + let mut guard = self.out.lock().unwrap(); + write!(guard, "2").unwrap(); + guard.write_all(&i.to_le_bytes()).unwrap(); + } + + fn write_u32(&mut self, i: u32) { + self.add_to_hash(i as u64); + + let mut guard = self.out.lock().unwrap(); + write!(guard, "4").unwrap(); + guard.write_all(&i.to_le_bytes()).unwrap(); + } + + fn write_u64(&mut self, i: u64) { + self.add_to_hash(i as u64); + + let mut guard = self.out.lock().unwrap(); + write!(guard, "8").unwrap(); + guard.write_all(&i.to_le_bytes()).unwrap(); + } + + fn write_u128(&mut self, i: u128) { + self.add_to_hash((i >> 64) as u64); + self.add_to_hash(i as u64); + + let mut guard = self.out.lock().unwrap(); + write!(guard, "B").unwrap(); + guard.write_all(&i.to_le_bytes()).unwrap(); + } + + fn write_usize(&mut self, i: usize) { + self.add_to_hash(i as u64); + + let mut guard = self.out.lock().unwrap(); + write!(guard, "u").unwrap(); + guard.write_all(&(i as u64).to_le_bytes()).unwrap(); + } +} \ No newline at end of file diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/build.rs b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/build.rs new file mode 100644 index 0000000..0c5b769 --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/build.rs @@ -0,0 +1,23 @@ +#![deny(warnings)] + +use std::env; + +fn main() { + println!("cargo:rerun-if-changed=build.rs"); + if let Some(true) = version_check::supports_feature("specialize") { + println!("cargo:rustc-cfg=feature=\"specialize\""); + } + if let Some(true) = version_check::supports_feature("stdsimd") { + println!("cargo:rustc-cfg=feature=\"stdsimd\""); + } + let arch = env::var("CARGO_CFG_TARGET_ARCH").expect("CARGO_CFG_TARGET_ARCH was not set"); + if arch.eq_ignore_ascii_case("x86_64") + || arch.eq_ignore_ascii_case("aarch64") + || arch.eq_ignore_ascii_case("mips64") + || arch.eq_ignore_ascii_case("powerpc64") + || arch.eq_ignore_ascii_case("riscv64gc") + || arch.eq_ignore_ascii_case("s390x") + { + println!("cargo:rustc-cfg=feature=\"folded_multiply\""); + } +} diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/compare/Cargo.toml b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/compare/Cargo.toml new file mode 100644 index 0000000..88bdf19 --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/compare/Cargo.toml @@ -0,0 +1,43 @@ +[package] +name = "ahash-compare" +version = "0.0.1" +authors = ["Tom Kaitchuck "] +license = "MIT OR Apache-2.0" +description = "A hash algorithm benchmark" +documentation = "https://docs.rs/ahash" +repository = "https://github.com/tkaitchuck/ahash" +keywords = ["hash", "hashmap", "aes", "aes-ni", "no-std"] +edition = "2018" +readme = "README.md" + +[features] +default = ["std"] +std = ["ahash/std"] +compile-time-rng = ["ahash/compile-time-rng"] + +[[bench]] +name = "compare" +path = "tests/compare.rs" +harness = false + +[profile.bench] +opt-level = 3 +debug = false +lto = 'fat' +debug-assertions = false +codegen-units = 1 + +[dependencies] +ahash = { path = "../", default-features = false } + +[dev-dependencies] +criterion = "0.3.3" +fnv = "1.0.7" +fxhash = "0.2.1" +farmhash = "1.1.5" +highway = "1.1.0" +metrohash = "1.0.6" +siphasher = "1" +t1ha = "0.1.0" +wyhash = "0.5" +xxhash-rust = {version = "0.8", features = ["xxh3"]} diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/compare/Table.png b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/compare/Table.png new file mode 100644 index 0000000000000000000000000000000000000000..89e67ee124857ad5143e7b9e066bedfe5c35c2a6 GIT binary patch literal 281849 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 z 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%0Dd(<see>x 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%0AVs8rCw-BOpyn*j4k@>VG%u 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�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 LvSfvXap3;|@xrjN literal 0 HcmV?d00001 diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/compare/readme.md b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/compare/readme.md new file mode 100644 index 0000000..58146e5 --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/compare/readme.md @@ -0,0 +1,123 @@ +# Comparison with other hashers + +[![Comparison chart](Table.png)](https://docs.google.com/spreadsheets/d/e/2PACX-1vSK7Li2nS-Bur9arAYF9IfT37MP-ohAe1v19lZu5fd9MajI1fSveLAQZyEie4Ea9k5-SWHTff7nL2DW/pubhtml?gid=0&single=true) + +## Design + +AHash is designed *exclusively* for use in in-memory hashmaps. It does not have a fixed standard, but uses different +algorithms depending on the availability of hardware instructions. Whenever possible aHash uses the [hardware AES instruction](https://en.wikipedia.org/wiki/AES_instruction_set) +on X86 processors when it is available. If no specialized instructions are available, it falls back on an +[algorithm based on multiplication](https://github.com/tkaitchuck/aHash/wiki/AHash-fallback-algorithm)). + +Because aHash does not have a fixed standard for its output, it can optimize its performance to a much greater extent than +algorithms which don't have this flexibility. This is great for Hashmaps but makes aHash inappropriate for applications where +a hash needs to be sent over the network, or persisted. + +## Quality + +**AHash passes the full [SMHasher test suite](https://github.com/rurban/smhasher)** both with and without AES support. +The output of the tests is checked into the [smhasher subdirectory](../smhasher). + +At **over 50GB/s** aHash is the fastest algorithm to pass the full test suite by more than a factor of 2. +Even the fallback algorithm is in the top 5 in terms of throughput, beating out many other algorithms that rely on SSE and AVX instructions. + +## Speed + +aHash is the fastest non-trivial hasher implementation in Rust. Below is a comparison with 10 other popular hashing algorithms. + +![Hasher perfromance](https://docs.google.com/spreadsheets/d/e/2PACX-1vSK7Li2nS-Bur9arAYF9IfT37MP-ohAe1v19lZu5fd9MajI1fSveLAQZyEie4Ea9k5-SWHTff7nL2DW/pubchart?oid=1323618938&format=image) + +## DOS resistance + +AHash provides DOS resistance by incorporating random keys into the hash. There is a full explanation [here](https://github.com/tkaitchuck/aHash/wiki/How-aHash-is-resists-DOS-attacks). + +If the `std` feature flag is enabled (On by default) it uses the `getrandom` crate to generate random seeds upon initialization. +If `std` is disabled and the `compile-time-rng` flag is enabled instead it will use the `const-random` to generate random seeds +at compile time and embed them into the application binary. + +If neither `std` or `compile-time-rng` flags are enabled aHash will fall back on using the numeric value of memory addresses as a source of randomness. +This is somewhat strong if ALSR is turned on (it is by default in Rust) but for some platforms this is not available. +As a result this should not be relied on. For this reason it is strongly recommended that if you disable `std` because you program needs to run in a +`no-std` environment to enable the `compile-time-rng` feature flag. + + +# Why use aHash over X + +## SipHash + +For a hashmap: Because aHash nearly **10x** faster. + +SipHash is however useful in other contexts, such as for a HMAC, where aHash would be completely inappropriate. + +*SipHash-2-4* is designed to provide DOS attack resistance, and has no presently known attacks +against this claim that doesn't involve learning bits of the key. + +SipHash is also available in the "1-3" variant which is about twice as fast as the standard version. +The SipHash authors don't recommend using this variation when DOS attacks are a concern, but there are still no known +practical DOS attacks against the algorithm. Rust has opted for the "1-3" version as the default in `std::collections::HashMap`, +because the speed trade off of "2-4" was not worth it. + +As you can see in the graph above, aHash is **much** faster than even *SipHash-1-3*, and also provides DOS resistance. + +## FxHash + +In terms of performance, aHash is faster than the FXhash for strings and byte arrays but not primitives. +So it might seem like using Fxhash for hashmaps when the key is a primitive is a good idea. This is *not* the case. + +When FX hash is operating on a 4 or 8 byte input such as a u32 or a u64, it reduces to multiplying the input by a fixed +constant. This is a bad hashing algorithm because it means that lower bits can never be influenced by any higher bit. In +the context of a hashmap where the low order bits are used to determine which bucket to put an item in, this isn't +any better than the identity function. Any keys that happen to end in the same bit pattern will all collide. +Some examples of where this is likely to occur are: + +* Strings encoded in base64 +* Null terminated strings (when working with C code) +* Integers that have the lower bits as zeros. (IE any multiple of small power of 2, which isn't a rare pattern in computer programs.) + * For example when taking lengths of data or locations in data it is common for values to +have a multiple of 1024, if these were used as keys in a map they will collide and end up in the same bucket. + +Like any non-keyed hash FxHash can be attacked. But FxHash is so prone to this that you may find yourself doing it accidentally. + +For example, it is possible to [accidentally introduce quadratic behavior by reading from one map in iteration order and writing to another.](https://accidentallyquadratic.tumblr.com/post/153545455987/rust-hash-iteration-reinsertion) + +Fxhash flaws make sense when you understand it for what it is. It is a quick and dirty hash, nothing more. +it was not published and promoted by its creator, it was **found**! + +Because it is error-prone, FxHash should never be used as a default. In specialized instances where the keys are understood +it makes sense, but given that aHash is faster on almost any object, it's probably not worth it. + +## FnvHash + +FnvHash is also a poor default. It only handles one byte at a time, so its performance really suffers with large inputs. +It is also non-keyed so it is still subject to DOS attacks and [accidentally quadratic behavior.](https://accidentallyquadratic.tumblr.com/post/153545455987/rust-hash-iteration-reinsertion) + +## MurmurHash, CityHash, MetroHash, FarmHash, and HighwayHash + +Murmur, City, Metro, Farm and Highway are all related, and appear to directly replace one another. + +They are all fine hashing algorithms, they do a good job of scrambling data, but they are all targeted at a different +usecase. They are intended to work in distributed systems where the hash is expected to be the same over time and from one +computer to the next, efficiently hashing large volumes of data. + +This is quite different from the needs of a Hasher used in a hashmap. In a map the typical value is under 10 bytes. None +of these algorithms scale down to handle that small of data at a competitive time. What's more the restriction that they +provide consistent output prevents them from taking advantage of different hardware capabilities on different CPUs. It makes +sense for a hashmap to work differently on a phone than on a server, or in WASM. + +If you need to persist or transmit a hash of a file, then using one of these is probably a good idea. +HighwayHash seems to be the preferred solution as it offers high throughput for large objects and is DOS resistant. + +## t1ha and XXHash +Like aHash, t1ha and XXHash are targeted at hashmaps and uses hardware instructions including AES for different platforms rather than having a single standard. +Both are fast, but AHash is faster than either one, both with and without AES. This is particularly true of smaller inputs such as integers. +T1ha's hashes do not pass the full of the SMHasher test suite. + +Neither XXHash nor T1ha explicitly claim DOS resistance, but both are keyed hashes, and do not have any obvious way to force collisions. +As of this writing there doesn't appear to be a maintained crate implementing the latest version of t1ha. + +## wyHash +Similarly, wyHash is targeted at hashmaps. WyHash is quite fast, but is not DOS resistant. + +There are fixed strings which when encountered caused the internal state to reset. This makes wyHash trivial to attack. + +AHash outperforms wyHash across all input sizes, regardless of which CPU instructions are available. \ No newline at end of file diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/compare/resources/sheet.css b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/compare/resources/sheet.css new file mode 100644 index 0000000..eb0ebd6 --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/compare/resources/sheet.css @@ -0,0 +1 @@ +a{text-decoration:none}a:link{color:#15c}a:visited{color:#61c}a:active{color:#d14836}a:hover{text-decoration:underline}.quantumIconsIcon{font-family:'Material Icons Extended';font-weight:normal;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-rendering:optimizeLegibility;text-transform:none;display:inline-block;word-wrap:normal;direction:ltr;font-feature-settings:'liga' 1;-webkit-font-smoothing:antialiased}html[dir="rtl"] .quantumIconsRtlIcon{-moz-transform:scaleX(-1);-o-transform:scaleX(-1);-webkit-transform:scaleX(-1);transform:scaleX(-1);filter:FlipH;-ms-filter:"FlipH"}.ac-renderer{font:normal 13px Arial,sans-serif;position:absolute;background:#fff;border:1px solid #666;-moz-box-shadow:2px 2px 2px rgba(102,102,102,.4);-webkit-box-shadow:2px 2px 2px rgba(102,102,102,.4);width:300px}.ac-row{cursor:pointer;padding:.4em}.ac-highlighted{font-weight:bold}.ac-active{background-color:#b2b4bf}.goog-inline-block{position:relative;display:-moz-inline-box;display:inline-block}* html .goog-inline-block{display:inline}*:first-child+html .goog-inline-block{display:inline}.jfk-button{-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;cursor:default;font-size:11px;font-weight:bold;text-align:center;white-space:nowrap;margin-right:16px;height:27px;line-height:27px;min-width:54px;outline:0px;padding:0 8px}.jfk-button-hover{-webkit-box-shadow:0 1px 1px rgba(0,0,0,.1);-moz-box-shadow:0 1px 1px rgba(0,0,0,.1);box-shadow:0 1px 1px rgba(0,0,0,.1)}.jfk-button-selected{-webkit-box-shadow:inset 0px 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0px 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0px 1px 2px rgba(0,0,0,0.1)}.jfk-button .jfk-button-img{margin-top:-3px;vertical-align:middle}.jfk-button-label{margin-left:5px}.jfk-button-narrow{min-width:34px;padding:0}.jfk-button-collapse-left,.jfk-button-collapse-right{z-index:1}.jfk-button-collapse-left.jfk-button-disabled{z-index:0}.jfk-button-checked.jfk-button-collapse-left,.jfk-button-checked.jfk-button-collapse-right{z-index:2}.jfk-button-collapse-left:focus,.jfk-button-collapse-right:focus,.jfk-button-hover.jfk-button-collapse-left,.jfk-button-hover.jfk-button-collapse-right{z-index:3}.jfk-button-collapse-left{margin-left:-1px;-moz-border-radius-bottomleft:0;-moz-border-radius-topleft:0;-webkit-border-bottom-left-radius:0;-webkit-border-top-left-radius:0;border-bottom-left-radius:0;border-top-left-radius:0}.jfk-button-collapse-right{margin-right:0px;-moz-border-radius-topright:0;-moz-border-radius-bottomright:0;-webkit-border-top-right-radius:0;-webkit-border-bottom-right-radius:0;border-top-right-radius:0;border-bottom-right-radius:0}.jfk-button.jfk-button-disabled:active{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.jfk-button-action{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;background-color:#4d90fe;background-image:-webkit-linear-gradient(top,#4d90fe,#4787ed);background-image:-moz-linear-gradient(top,#4d90fe,#4787ed);background-image:-ms-linear-gradient(top,#4d90fe,#4787ed);background-image:-o-linear-gradient(top,#4d90fe,#4787ed);background-image:linear-gradient(top,#4d90fe,#4787ed);border:1px solid #3079ed;color:#fff}.jfk-button-action.jfk-button-hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;background-color:#357ae8;background-image:-webkit-linear-gradient(top,#4d90fe,#357ae8);background-image:-moz-linear-gradient(top,#4d90fe,#357ae8);background-image:-ms-linear-gradient(top,#4d90fe,#357ae8);background-image:-o-linear-gradient(top,#4d90fe,#357ae8);background-image:linear-gradient(top,#4d90fe,#357ae8);border:1px solid #2f5bb7;border-bottom-color:#2f5bb7}.jfk-button-action:focus{-webkit-box-shadow:inset 0 0 0 1px #fff;-moz-box-shadow:inset 0 0 0 1px #fff;box-shadow:inset 0 0 0 1px #fff;border:1px solid #fff;border:rgba(0,0,0,0) solid 1px;outline:1px solid #4d90fe;outline:rgba(0,0,0,0) 0}.jfk-button-action.jfk-button-clear-outline{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;outline:none}.jfk-button-action:active{-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.3);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.3);box-shadow:inset 0 1px 2px rgba(0,0,0,0.3);background:#357ae8;border:1px solid #2f5bb7;border-top:1px solid #2f5bb7}.jfk-button-action.jfk-button-disabled{background:#4d90fe;filter:alpha(opacity=50);opacity:0.5}.jfk-button-contrast{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;background-color:#f5f5f5;background-image:-webkit-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:-moz-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:-ms-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:-o-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:linear-gradient(top,#f5f5f5,#f1f1f1);color:#333;border:1px solid #dcdcdc;border:1px solid rgba(0,0,0,0.1)}.jfk-button-contrast.jfk-button-hover,.jfk-button-contrast.jfk-button-clear-outline.jfk-button-hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;background-color:#f8f8f8;background-image:-webkit-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-moz-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-ms-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-o-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:linear-gradient(top,#f8f8f8,#f1f1f1);border:1px solid #c6c6c6;color:#111}.jfk-button-contrast:active,.jfk-button-contrast.jfk-button-hover:active{-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1);background:#f8f8f8}.jfk-button-contrast.jfk-button-selected,.jfk-button-contrast.jfk-button-clear-outline.jfk-button-selected{background-color:#eee;background-image:-webkit-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-moz-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-ms-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-o-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:linear-gradient(top,#f8f8f8,#f1f1f1);border:1px solid #ccc;color:#333}.jfk-button-contrast.jfk-button-checked,.jfk-button-contrast.jfk-button-clear-outline.jfk-button-checked{-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1);background-color:#eee;background-image:-webkit-linear-gradient(top,#eee,#e0e0e0);background-image:-moz-linear-gradient(top,#eee,#e0e0e0);background-image:-ms-linear-gradient(top,#eee,#e0e0e0);background-image:-o-linear-gradient(top,#eee,#e0e0e0);background-image:linear-gradient(top,#eee,#e0e0e0);border:1px solid #ccc;color:#333}.jfk-button-contrast:focus{border:1px solid #4d90fe;outline:none}.jfk-button-contrast.jfk-button-clear-outline{border:1px solid #dcdcdc;outline:none}.jfk-button-contrast.jfk-button-disabled{background:#fff;border:1px solid #f3f3f3;border:1px solid rgba(0,0,0,0.05);color:#b8b8b8}.jfk-button-contrast .jfk-button-img{opacity:.70}.jfk-button-contrast.jfk-button-checked .jfk-button-img,.jfk-button-contrast.jfk-button-selected .jfk-button-img,.jfk-button-contrast.jfk-button-hover .jfk-button-img{opacity:0.9}.jfk-button-contrast.jfk-button-disabled .jfk-button-img{filter:alpha(opacity=33);opacity:0.333}.jfk-button-default{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;background-color:#3d9400;background-image:-webkit-linear-gradient(top,#3d9400,#398a00);background-image:-moz-linear-gradient(top,#3d9400,#398a00);background-image:-ms-linear-gradient(top,#3d9400,#398a00);background-image:-o-linear-gradient(top,#3d9400,#398a00);background-image:linear-gradient(top,#3d9400,#398a00);border:1px solid #29691d;color:#fff;text-shadow:0px 1px rgba(0,0,0,0.1)}.jfk-button-default.jfk-button-hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;background-color:#368200;background-image:-webkit-linear-gradient(top,#3d9400,#368200);background-image:-moz-linear-gradient(top,#3d9400,#368200);background-image:-ms-linear-gradient(top,#3d9400,#368200);background-image:-o-linear-gradient(top,#3d9400,#368200);background-image:linear-gradient(top,#3d9400,#368200);border:1px solid #2d6200;border-bottom:1px solid #2d6200;text-shadow:0px 1px rgba(0,0,0,0.3)}.jfk-button-default:focus{-webkit-box-shadow:inset 0 0 0 1px #fff;-moz-box-shadow:inset 0 0 0 1px #fff;box-shadow:inset 0 0 0 1px #fff;border:1px solid #fff;border:rgba(0,0,0,0) solid 1px;outline:1px solid #3d9400;outline:rgba(0,0,0,0) 0}.jfk-button-default.jfk-button-clear-outline{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;outline:none}.jfk-button-default:active{-webkit-box-shadow:inset 0px 1px 2px rgba(0,0,0,0.3);-moz-box-shadow:inset 0px 1px 2px rgba(0,0,0,0.3);box-shadow:inset 0px 1px 2px rgba(0,0,0,0.3);background:#368200;border:1px solid #2d6200;border-top:1px solid #2d6200}.jfk-button-default.jfk-button-disabled{background:#3d9400;filter:alpha(opacity=50);opacity:0.5}.jfk-button-primary{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;background-color:#d14836;background-image:-webkit-linear-gradient(top,#dd4b39,#d14836);background-image:-moz-linear-gradient(top,#dd4b39,#d14836);background-image:-ms-linear-gradient(top,#dd4b39,#d14836);background-image:-o-linear-gradient(top,#dd4b39,#d14836);background-image:linear-gradient(top,#dd4b39,#d14836);border:1px solid transparent;color:#fff;text-shadow:0px 1px rgba(0,0,0,0.1);text-transform:uppercase}.jfk-button-primary.jfk-button-hover{-webkit-box-shadow:0px 1px 1px rgba(0,0,0,0.2);-moz-box-shadow:0px 1px 1px rgba(0,0,0,0.2);box-shadow:0px 1px 1px rgba(0,0,0,0.2);background-color:#c53727;background-image:-webkit-linear-gradient(top,#dd4b39,#c53727);background-image:-moz-linear-gradient(top,#dd4b39,#c53727);background-image:-ms-linear-gradient(top,#dd4b39,#c53727);background-image:-o-linear-gradient(top,#dd4b39,#c53727);background-image:linear-gradient(top,#dd4b39,#c53727);border:1px solid #b0281a;border-bottom-color:#af301f}.jfk-button-primary:focus{-webkit-box-shadow:inset 0 0 0 1px #fff;-moz-box-shadow:inset 0 0 0 1px #fff;box-shadow:inset 0 0 0 1px #fff;border:1px solid #fff;border:rgba(0,0,0,0) solid 1px;outline:1px solid #d14836;outline:rgba(0,0,0,0) 0}.jfk-button-primary.jfk-button-clear-outline{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;outline:none}.jfk-button-primary:active{-webkit-box-shadow:inset 0px 1px 2px rgba(0,0,0,0.3);-moz-box-shadow:inset 0px 1px 2px rgba(0,0,0,0.3);box-shadow:inset 0px 1px 2px rgba(0,0,0,0.3);background-color:#b0281a;background-image:-webkit-linear-gradient(top,#dd4b39,#b0281a);background-image:-moz-linear-gradient(top,#dd4b39,#b0281a);background-image:-ms-linear-gradient(top,#dd4b39,#b0281a);background-image:-o-linear-gradient(top,#dd4b39,#b0281a);background-image:linear-gradient(top,#dd4b39,#b0281a);border:1px solid #992a1b;border-top:1px solid #992a1b}.jfk-button-primary.jfk-button-disabled{background:#d14836;filter:alpha(opacity=50);opacity:0.5}.jfk-slideToggle{-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;-webkit-box-shadow:inset 0px 1px 2px 0 rgba(0,0,0,.1);-moz-box-shadow:inset 0px 1px 2px 0 rgba(0,0,0,.1);box-shadow:inset 0px 1px 2px 0 rgba(0,0,0,.1);background-color:#f5f5f5;background-image:-webkit-linear-gradient(top,#eee,#e0e0e0);background-image:-moz-linear-gradient(top,#eee,#e0e0e0);background-image:-ms-linear-gradient(top,#eee,#e0e0e0);background-image:-o-linear-gradient(top,#eee,#e0e0e0);background-image:linear-gradient(top,#eee,#e0e0e0);border:1px solid #ccc;color:#666;font-weight:bold;height:27px;line-height:27px;margin-right:16px;outline:none;overflow:hidden;padding:0;position:relative;width:94px}.jfk-slideToggle-on,.jfk-slideToggle-off,.jfk-slideToggle-thumb{display:inline-block;text-align:center;text-transform:uppercase;width:47px}.jfk-slideToggle-on{-webkit-box-shadow:inset 0 1px 2px 0 rgba(0,0,0,.1);-moz-box-shadow:inset 0 1px 2px 0 rgba(0,0,0,.1);box-shadow:inset 0 1px 2px 0 rgba(0,0,0,.1);background-color:#398bf2;background-image:-webkit-linear-gradient(top,#3b93ff,#3689ee);background-image:-moz-linear-gradient(top,#3b93ff,#3689ee);background-image:-ms-linear-gradient(top,#3b93ff,#3689ee);background-image:-o-linear-gradient(top,#3b93ff,#3689ee);background-image:linear-gradient(top,#3b93ff,#3689ee);color:#fff;height:27px}.jfk-slideToggle-off{-webkit-border-radius:2px 2px 0 0;-moz-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0}.jfk-slideToggle-thumb{-webkit-box-shadow:0px 1px 2px 0 rgba(0,0,0,.1);-moz-box-shadow:0px 1px 2px 0 rgba(0,0,0,.1);box-shadow:0px 1px 2px 0 rgba(0,0,0,.1);background-color:#f5f5f5;background-image:-webkit-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-moz-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-ms-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-o-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:linear-gradient(top,#f8f8f8,#f1f1f1);-webkit-transition:all .130s ease-out;-moz-transition:all .130s ease-out;-o-transition:all .130s ease-out;transition:all .130s ease-out;border:1px solid #ccc;display:block;height:27px;left:-1px;position:absolute;top:-1px}.jfk-slideToggle-thumb::after{content:'';background-image:-webkit-linear-gradient(left,#ccc 50%,transparent 50%),-webkit-linear-gradient(left,#ccc 50%,transparent 50%),-webkit-linear-gradient(left,#ccc 50%,transparent 50%),-webkit-linear-gradient(left,#ccc 50%,transparent 50%),-webkit-linear-gradient(left,#ccc 50%,transparent 50%);background-image:-moz-linear-gradient(left,#ccc 50%,transparent 50%),-moz-linear-gradient(left,#ccc 50%,transparent 50%),-moz-linear-gradient(left,#ccc 50%,transparent 50%),-moz-linear-gradient(left,#ccc 50%,transparent 50%),-moz-linear-gradient(left,#ccc 50%,transparent 50%);background-image:-ms-linear-gradient(left,#ccc 50%,transparent 50%),-ms-linear-gradient(left,#ccc 50%,transparent 50%),-ms-linear-gradient(left,#ccc 50%,transparent 50%),-ms-linear-gradient(left,#ccc 50%,transparent 50%),-ms-linear-gradient(left,#ccc 50%,transparent 50%);background-image:-o-linear-gradient(left,#ccc 50%,transparent 50%),-o-linear-gradient(left,#ccc 50%,transparent 50%),-o-linear-gradient(left,#ccc 50%,transparent 50%),-o-linear-gradient(left,#ccc 50%,transparent 50%),-o-linear-gradient(left,#ccc 50%,transparent 50%);background-image:linear-gradient(left,#ccc 50%,transparent 50%),linear-gradient(left,#ccc 50%,transparent 50%),linear-gradient(left,#ccc 50%,transparent 50%),linear-gradient(left,#ccc 50%,transparent 50%),linear-gradient(left,#ccc 50%,transparent 50%);background-position:0 0,0 2px,0 4px,0 6px,0 8px;background-repeat:repeat-x;background-size:2px 1px;display:block;height:9px;left:15px;position:absolute;top:9px;width:17px}.jfk-slideToggle.jfk-slideToggle-checked .jfk-slideToggle-thumb{left:47px}.jfk-slideToggle:focus{border:1px solid #4d90fe}.jfk-slideToggle.jfk-slideToggle-clearOutline{border:1px solid #ccc}.jfk-button-standard{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;background-color:#f5f5f5;background-image:-webkit-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:-moz-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:-ms-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:-o-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:linear-gradient(top,#f5f5f5,#f1f1f1);color:#333;border:1px solid #dcdcdc;border:1px solid rgba(0,0,0,0.1)}.jfk-button-standard.jfk-button-hover,.jfk-button-standard.jfk-button-clear-outline.jfk-button-hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;background-color:#f8f8f8;background-image:-webkit-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-moz-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-ms-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-o-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:linear-gradient(top,#f8f8f8,#f1f1f1);border:1px solid #c6c6c6;color:#111}.jfk-button-standard:active,.jfk-button-standard.jfk-button-hover:active{-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1);background:#f8f8f8;color:#111}.jfk-button-standard.jfk-button-selected,.jfk-button-standard.jfk-button-clear-outline.jfk-button-selected{background-color:#eee;background-image:-webkit-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-moz-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-ms-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-o-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:linear-gradient(top,#f8f8f8,#f1f1f1);border:1px solid #ccc;color:#333}.jfk-button-standard.jfk-button-checked,.jfk-button-standard.jfk-button-clear-outline.jfk-button-checked{-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1);background-color:#eee;background-image:-webkit-linear-gradient(top,#eee,#e0e0e0);background-image:-moz-linear-gradient(top,#eee,#e0e0e0);background-image:-ms-linear-gradient(top,#eee,#e0e0e0);background-image:-o-linear-gradient(top,#eee,#e0e0e0);background-image:linear-gradient(top,#eee,#e0e0e0);border:1px solid #ccc;color:#333}.jfk-button-standard:focus{border:1px solid #4d90fe;outline:none}.jfk-button-standard.jfk-button-clear-outline{border:1px solid #dcdcdc;border:1px solid rgba(0,0,0,0.1);outline:none}.jfk-button-standard.jfk-button-disabled{background:#fff;border:1px solid #f3f3f3;border:1px solid rgba(0,0,0,0.05);color:#b8b8b8}.jfk-button-standard .jfk-button-img{opacity:.70}.jfk-button-standard.jfk-button-checked .jfk-button-img,.jfk-button-standard.jfk-button-selected .jfk-button-img,.jfk-button-standard.jfk-button-hover .jfk-button-img{opacity:0.9}.jfk-button-standard.jfk-button-disabled .jfk-button-img{filter:alpha(opacity=33);opacity:0.333}.jfk-button-flat{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;border:1px solid transparent;font-size:13px;font-weight:normal;height:21px;line-height:21px;margin-right:1px;min-width:0;padding:0}.jfk-button-flat.jfk-button-hover,.jfk-button-flat.jfk-button-selected,.jfk-button-flat:focus,.jfk-button-flat:active{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.jfk-button-flat .jfk-button-img{height:21px;opacity:.70;width:21px}.jfk-button-flat .jfk-button-label{display:inline-block;margin:0;padding:0 1px}.jfk-button-flat.jfk-button-selected .jfk-button-img,.jfk-button-flat.jfk-button-hover .jfk-button-img{opacity:0.9}.jfk-button-flat.jfk-button-disabled .jfk-button-img{filter:alpha(opacity=33);opacity:0.333}.jfk-button-flat:focus{border:1px solid #4d90fe}.jfk-button-flat.jfk-button-clear-outline{border:1px solid transparent}.jfk-button-mini{background-color:#f5f5f5;background-image:-webkit-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:-moz-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:-ms-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:-o-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:linear-gradient(top,#f5f5f5,#f1f1f1);border:1px solid #dcdcdc;border:1px solid rgba(0,0,0,0.1);color:#333;height:17px;line-height:17px;min-width:22px;text-shadow:0px 1px rgba(0,0,0,0.1)}.jfk-button-mini.jfk-button-hover,.jfk-button-mini.jfk-button-clear-outline.jfk-button-hover{background-color:#f8f8f8;background-image:-webkit-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-moz-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-ms-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-o-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:linear-gradient(top,#f8f8f8,#f1f1f1);border:1px solid #c6c6c6;text-shadow:0px 1px rgba(0,0,0,0.3)}.jfk-button-mini:active{-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.jfk-button-mini.jfk-button-checked,.jfk-button-mini.jfk-button-clear-outline.jfk-button-checked{-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1);background-color:#e0e0e0;background-image:-webkit-linear-gradient(top,#eee,#e0e0e0);background-image:-moz-linear-gradient(top,#eee,#e0e0e0);background-image:-ms-linear-gradient(top,#eee,#e0e0e0);background-image:-o-linear-gradient(top,#eee,#e0e0e0);background-image:linear-gradient(top,#eee,#e0e0e0);border:1px solid #ccc;color:#333}.jfk-button-mini:focus{border:1px solid #4d90fe}.jfk-button-mini.jfk-button-clear-outline{border:1px solid #dcdcdc}.jfk-button-mini.jfk-button-disabled{background:#fff;border:1px solid #f3f3f3;border:1px solid rgba(0,0,0,0.05);color:#b8b8b8}.goog-modalpopup,.modal-dialog{-webkit-box-shadow:0 4px 16px rgba(0,0,0,.2);-moz-box-shadow:0 4px 16px rgba(0,0,0,.2);box-shadow:0 4px 16px rgba(0,0,0,.2);background:#fff;background-clip:padding-box;border:1px solid #acacac;border:1px solid rgba(0,0,0,.333);outline:0;position:absolute}.goog-modalpopup-bg,.modal-dialog-bg{background:#fff;left:0;position:absolute;top:0}div.goog-modalpopup-bg,div.modal-dialog-bg{filter:alpha(opacity=75);-moz-opacity:.75;opacity:.75}.modal-dialog{color:#000;padding:30px 42px}.modal-dialog-title{background-color:#fff;color:#000;cursor:default;font-size:16px;font-weight:normal;line-height:24px;margin:0 0 16px}.modal-dialog-title-close{height:11px;opacity:0.7;padding:17px;position:absolute;right:0px;top:0px;width:11px}.modal-dialog-title-close:after{content:'';background:url(//ssl.gstatic.com/ui/v1/dialog/close-x.png);position:absolute;height:11px;width:11px;right:17px}.modal-dialog-title-close:hover{opacity:1}.modal-dialog-content{background-color:#fff;line-height:1.4em;word-wrap:break-word}.modal-dialog-buttons{margin-top:16px}.modal-dialog-buttons button{-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;background-color:#f5f5f5;background-image:-webkit-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:-moz-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:-ms-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:-o-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:linear-gradient(top,#f5f5f5,#f1f1f1);border:1px solid #dcdcdc;border:1px solid rgba(0,0,0,0.1);color:#333;cursor:default;font-family:inherit;font-size:11px;font-weight:bold;height:29px;line-height:27px;margin:0 16px 0 0;min-width:72px;outline:0;padding:0 8px}.modal-dialog-buttons button:hover,.modal-dialog-buttons button:active{-webkit-box-shadow:0px 1px 1px rgba(0,0,0,0.1);-moz-box-shadow:0px 1px 1px rgba(0,0,0,0.1);box-shadow:0px 1px 1px rgba(0,0,0,0.1);background-color:#f8f8f8;background-image:-webkit-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-moz-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-ms-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-o-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:linear-gradient(top,#f8f8f8,#f1f1f1);border:1px solid #c6c6c6;color:#111}.modal-dialog-buttons button:active{-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.modal-dialog-buttons button:focus{border:1px solid #4d90fe}.modal-dialog-buttons button[disabled]{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;background:#fff;background-image:none;border:1px solid #f3f3f3;border:1px solid rgba(0,0,0,0.05);color:#b8b8b8}.modal-dialog-buttons .goog-buttonset-action{background-color:#4d90fe;background-image:-webkit-linear-gradient(top,#4d90fe,#4787ed);background-image:-moz-linear-gradient(top,#4d90fe,#4787ed);background-image:-ms-linear-gradient(top,#4d90fe,#4787ed);background-image:-o-linear-gradient(top,#4d90fe,#4787ed);background-image:linear-gradient(top,#4d90fe,#4787ed);border:1px solid #3079ed;color:#fff}.modal-dialog-buttons .goog-buttonset-action:hover,.modal-dialog-buttons .goog-buttonset-action:active{background-color:#357ae8;background-image:-webkit-linear-gradient(top,#4d90fe,#357ae8);background-image:-moz-linear-gradient(top,#4d90fe,#357ae8);background-image:-ms-linear-gradient(top,#4d90fe,#357ae8);background-image:-o-linear-gradient(top,#4d90fe,#357ae8);background-image:linear-gradient(top,#4d90fe,#357ae8);border:1px solid #2f5bb7;color:#fff}.modal-dialog-buttons .goog-buttonset-action:active{-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.3);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.3);box-shadow:inset 0 1px 2px rgba(0,0,0,0.3)}.modal-dialog-buttons .goog-buttonset-action:focus{-webkit-box-shadow:inset 0 0 0 1px #fff;-moz-box-shadow:inset 0 0 0 1px #fff;box-shadow:inset 0 0 0 1px #fff;border:1px solid #fff;border:rgba(0,0,0,0) solid 1px;outline:1px solid #4d90fe;outline:rgba(0,0,0,0) 0}.modal-dialog-buttons .goog-buttonset-action[disabled]{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;background:#4d90fe;color:#fff;filter:alpha(opacity=50);opacity:0.5}.jfk-alert,.jfk-confirm,.jfk-prompt{width:512px}.jfk-textinput{-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;border:1px solid #d9d9d9;border-top:1px solid #c0c0c0;font-size:13px;height:25px;padding:1px 8px}.jfk-textinput:focus{-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.3);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.3);box-shadow:inset 0 1px 2px rgba(0,0,0,0.3);border:1px solid #4d90fe;outline:none}.jfk-textinput::-ms-clear{display:none}.apps-action-shortcut-icon{direction:ltr;text-align:left;overflow:hidden;position:relative;vertical-align:middle}.apps-action-shortcut-img:before{content:url(//ssl.gstatic.com/docs/common/shortcut_sprite1.png)}.apps-action-shortcut-img{height:95px;position:absolute;width:21px}.apps-action-shortcut-back{left:0;top:-63px}.apps-action-shortcut-back-white{left:0;top:-21px}.apps-action-shortcut-close-x{left:0;top:-84px}.apps-action-shortcut-search{left:0;top:-42px}.apps-action-shortcut-search-white{left:0;top:0}.apps-ui-material-slide-toggle-container{-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:none;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;height:21px;outline:0;position:relative;width:35px}.apps-ui-material-slide-toggle-thumb{-webkit-transition-duration:0.28s;-moz-transition-duration:0.28s;-o-transition-duration:0.28s;transition-duration:0.28s;-webkit-transition-property:all;-moz-transition-property:all;-o-transition-property:all;transition-property:all;-webkit-transition-timing-function:cubic-bezier(0.4,0.0,0.2,1);-moz-transition-timing-function:cubic-bezier(0.4,0.0,0.2,1);-o-transition-timing-function:cubic-bezier(0.4,0.0,0.2,1);transition-timing-function:cubic-bezier(0.4,0.0,0.2,1);left:0;right:inherit;top:0;will-change:background-color}.apps-ui-material-slide-toggle-container-checked .apps-ui-material-slide-toggle-thumb{left:inherit;right:0}.apps-ui-material-slide-toggle-container-disabled{cursor:not-allowed}.apps-ui-material-slide-toggle-track{background-color:#000;border-radius:7px;height:14px;opacity:0.26;width:35px}.apps-ui-material-slide-toggle-container-checked .apps-ui-material-slide-toggle-track{opacity:0.5}.apps-ui-material-slide-toggle-thumb{background-color:#f1f1f1;border-radius:100%;box-shadow:0 0 2px rgba(0,0,0,.12),0 2px 4px rgba(0,0,0,.24);height:20px;width:20px;position:absolute}.apps-ui-material-slide-toggle-track,.apps-ui-material-slide-toggle-thumb{border:1px solid transparent}.apps-ui-material-slide-toggle-container-focused .apps-ui-material-slide-toggle-thumb{box-shadow:0 0 4px rgba(0,0,0,.14),0 4px 8px rgba(0,0,0,.28)}.apps-ui-material-slide-toggle-container-hover .apps-ui-material-slide-toggle-thumb{box-shadow:0 0 6px rgba(0,0,0,.16),0 6px 12px rgba(0,0,0,.32)}.apps-shortcutshelppopup{top:0;z-index:1002;color:#212121;font-family:roboto,arial,sans-serif;font-size:13px;position:fixed;text-align:center;background:#fafafa none repeat scroll 0;overflow:hidden;box-shadow:rgba(255,255,255,.9) 0px 1px 0px inset,rgba(0,0,0,.03) 0px -1px 0px inset,rgba(0,0,0,.15) 0 15px 10px,rgba(0,0,0,.3) 0 8px 36px;border:1px solid transparent}.apps-shortcutshelppopup input{font-family:roboto,arial,sans-serif}@media print{.apps-shortcutshelppopup{display:none}}.apps-shortcutshelppopup-bg{display:none;left:0;top:0;position:absolute}.apps-shortcutshelppopup-container{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;-moz-box-sizing:border-box;box-sizing:border-box;padding:16px 32px;width:800px;height:600px}.apps-shortcutshelppopup-header,.apps-shortcutshelppopup-content{border-collapse:collapse;width:100%}.apps-shortcutshelppopup-header{-ms-flex:0 0 auto;-webkit-flex:0 0 auto;flex:0 0 auto;border-bottom:1px solid #e5e5e5;text-align:left}.apps-shortcutshelppopup-content{font-size:13px;outline-offset:-1px}.apps-shortcutshelppopup-header-element{display:inline-block;vertical-align:middle;height:48px}.apps-shortcutshelppopup-title-container{white-space:nowrap;text-align:left}.apps-shortcutshelppopup-dialog-title{font-size:16px;color:#212121;display:inline-block;vertical-align:middle}.apps-shortcutshelppopup-input{font-size:13px;margin-left:16px;margin-right:0px;padding:0px 5px;vertical-align:middle;border-right:none;width:250px;height:27px;box-sizing:border-box}.apps-shortcutshelppopup-input-button-img{height:21px;width:21px;display:inline-block}.apps-shortcutshelppopup-input-button{-moz-box-sizing:border-box;box-sizing:border-box;cursor:pointer;display:inline-block;margin-left:0px;vertical-align:middle;border-top-left-radius:0;border-bottom-left-radius:0;line-height:25px}.apps-shortcutshelppopup-tearoff-link{font-size:13px;cursor:pointer;text-decoration:underline;color:#4581ff;vertical-align:middle;display:block;padding:16px 0 13px 0;font-weight:bold}.apps-shortcutshelppopup-close{position:absolute;top:0;right:0;padding-right:30px;padding-top:30px}.apps-shortcutshelppopup-close svg{fill:#5f6368}.apps-shortcutshelppopup-close-nav-widget-enabled{padding-right:18px;padding-top:20px}.apps-shortcutshelppopup-dialog .modal-dialog-title-close{cursor:pointer;position:static;padding:0px;margin:0;margin-left:32px;vertical-align:middle}.apps-shortcutshelppopup-dialog .modal-dialog-title-close:after{background:none;display:none}.apps-shortcutshelppopup-search-banner{-ms-flex:0 0 auto;-webkit-flex:0 0 auto;flex:0 0 auto;text-align:left;height:48px;padding-top:12px;box-sizing:border-box}.apps-shortcutshelppopup-search-banner.apps-shortcutshelppopup-empty-search{position:relative;left:0px;right:0px;text-align:center;top:113px;height:48px}.apps-shortcutshelppopup-reset-search-button{cursor:pointer;text-decoration:underline;position:relative;width:21px;min-width:21px;display:inline-block;margin-right:8px}.apps-shortcutshelppopup-reset-search-button-icon{height:21px;width:21px}.apps-shortcutshelppopup-search-label{margin:0;position:relative;font-size:15px;display:inline-block;vertical-align:middle}.apps-shortcutshelppopup-result-container{-ms-flex:1 1 auto;-webkit-flex:1 1 auto;flex:1 1 auto;overflow:auto}.apps-shortcutshelppopup-content-header{height:48px;padding-top:25px;text-align:left;font-size:13px;color:#212121;white-space:nowrap;margin:0px;-moz-box-sizing:border-box;box-sizing:border-box}.apps-shortcutshelppopup-content-header.apps-shortcutshelppopup-content-header-first{height:32px;padding-top:8px}.apps-shortcutshelppopup-content-element{text-align:left;vertical-align:middle;padding-top:0.15em;border-bottom:1px solid #ececec;height:32px;white-space:nowrap;-moz-box-sizing:border-box;box-sizing:border-box}.apps-shortcutshelppopup-shortcut-desc{color:#757575}.apps-shortcutshelppopup-shortcut-key{font-weight:bold}.apps-shortcutshelppopup-ac-renderer{z-index:1003;font-family:Arial,sans-serif;font-size:13px;position:absolute;background:#fff;border:1px solid #666;box-shadow:2px 2px 2px rgba(102,102,102,.4);width:250px;box-sizing:border-box}.apps-shortcutshelppopup-ac-row{cursor:pointer;padding:.4em}.apps-shortcutshelppopup-ac-renderer .ac-active{background-color:#eee}.apps-shortcutshelpcontentimpl-container{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;background-color:white;height:600px;width:800px}@media screen and (max-width:832px){.apps-shortcutshelpcontentimpl-container{max-width:95vw}}@media screen and (max-height:632px){.apps-shortcutshelpcontentimpl-container{height:95vh}}.apps-shortcutshelpcontentimpl-header{-ms-flex:0 0 auto;-webkit-flex:0 0 auto;flex:0 0 auto;border-bottom:1px solid rgba(0,0,0,0.12);text-align:left;border-collapse:collapse;width:100%;padding:16px 24px;box-sizing:border-box}.apps-shortcutshelpcontentimpl-header-element{display:inline-block;vertical-align:middle}.apps-shortcutshelpcontentimpl-title-container{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;white-space:nowrap;text-align:left}.apps-shortcutshelpcontentimpl-dialog-title{font-size:18px;color:rgba(0,0,0,.87);display:inline-block;vertical-align:middle;padding:16px 0;margin:0;font-weight:500}.apps-shortcutshelpcontentimpl-search{-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;border-radius:4px;margin-left:16px;margin-right:24px;vertical-align:middle;height:48px;padding:0;background-color:rgba(0,0,0,0.05);border:1px solid transparent}.apps-shortcutshelpcontentimpl-search-icon{width:24px;height:24px;margin:12px 8px 0 16px}.apps-shortcutshelpcontentimpl-search-icon svg{fill:#80868b}.apps-shortcutshelpcontentimpl-hc-black .apps-shortcutshelpcontentimpl-search-icon svg{fill:#fff}.apps-shortcutshelpcontentimpl-hc-white .apps-shortcutshelpcontentimpl-search-icon svg{fill:#000}.apps-shortcutshelpcontentimpl-search-focused{box-shadow:0 1px 1px rgba(0,0,0,0.24);background-color:#fff;transition:background-color 75ms}.apps-shortcutshelpcontentimpl-input{border:none;background-color:transparent;padding:0 10px;flex-grow:1;font-size:14px;height:46px;outline:none;box-shadow:none}.apps-shortcutshelpcontentimpl-input:focus{border:none;box-shadow:none}.apps-shortcutshelpcontentimpl-tearoff-link-container{-ms-flex:0 0 auto;-webkit-flex:0 0 auto;flex:0 0 auto;padding:10px;border-top:1px solid rgba(0,0,0,0.12);display:-webkit-inline-box;display:-moz-inline-box;display:-ms-inline-flexbox;display:-webkit-inline-flex;display:inline-flex;justify-content:center;align-items:center}.apps-shortcutshelpcontentimpl-tearoff-link-container-override-enabled{-ms-flex:0 0 50%;-webkit-flex:0 0 50%;flex:0 0 50%;padding:10px 0;display:-webkit-inline-box;display:-moz-inline-box;display:-ms-inline-flexbox;display:-webkit-inline-flex;display:inline-flex;justify-content:center;align-items:center}.apps-shortcutshelpcontentimpl-tearoff-link-container-legacy-enabled{display:-webkit-inline-box;display:-moz-inline-box;display:-ms-inline-flexbox;display:-webkit-inline-flex;display:inline-flex;justify-content:center;align-items:center;padding:10px 20px;text-transform:uppercase}.apps-shortcutshelpcontentimpl-link{font-size:13px;cursor:pointer;padding:9px 16px;border-radius:2px;font-weight:500}.apps-shortcutshelpcontentimpl-link,.apps-shortcutshelpcontentimpl-link:active{color:#1a73e8}.apps-shortcutshelpcontentimpl-link:hover{outline:none}.apps-shortcutshelpcontentimpl-link:focus{text-decoration:underline}.apps-shortcutshelpcontentimpl-link:visited{color:#1a73e8}.apps-shortcutshelpcontentimpl-override-shortcut-link{text-transform:uppercase}.apps-shortcutshelpcontentimpl-legacy-shortcut-link{display:-webkit-inline-box;display:-moz-inline-box;display:-ms-inline-flexbox;display:-webkit-inline-flex;display:inline-flex;justify-content:center;align-items:center}.apps-shortcutshelpcontentimpl-override-shortcut-link-disabled{cursor:inherit;opacity:0.6}.apps-shortcutshelpcontentimpl-link.apps-shortcutshelpcontentimpl-override-shortcut-link-disabled:focus,.apps-shortcutshelpcontentimpl-link.apps-shortcutshelpcontentimpl-override-shortcut-link-disabled:hover{text-decoration:none}.apps-shortcutshelpcontentimpl-search-banner{text-align:left;box-sizing:border-box;border-bottom:1px solid rgba(0,0,0,0.12);padding:26px 0}.apps-shortcutshelpcontentimpl-reset-search-button{cursor:pointer;text-decoration:underline;position:relative;width:21px;min-width:21px;display:inline-block;margin:0 8px;padding:0 8px 0 4px;border-color:transparent;background-color:transparent;background-image:none}.apps-shortcutshelpcontentimpl-override-banner{padding:5px 0 0 20px;line-height:16px;white-space:pre;color:rgba(0,0,0,.87)}.apps-shortcutshelpcontentimpl-override-shortcut-key{font-weight:bold}.apps-shortcutshelpcontentimpl-reset-search-button-icon{display:inline-block;vertical-align:middle;height:22px;width:21px}.apps-shortcutshelpcontentimpl-reset-search-button-img{position:absolute}.apps-shortcutshelpcontentimpl-reset-search-button-img:before{content:url('//ssl.gstatic.com/images/icons/material/system/svg/keyboard_arrow_left_24px.svg')}.apps-shortcutshelpcontentimpl-search-label{margin:0;position:relative;font-size:19px;display:inline-block;vertical-align:middle;color:rgba(0,0,0,.87)}.apps-shortcutshelpcontentimpl-ac-renderer{z-index:1003;font-family:Arial,sans-serif;font-size:13px;font-weight:normal;position:absolute;background:#fff;border:1px solid #666;box-shadow:2px 2px 2px rgba(102,102,102,.4);width:250px;box-sizing:border-box}.apps-shortcutshelpcontentimpl-ac-row{cursor:pointer;padding:.4em}.apps-shortcutshelpcontentimpl-ac-renderer .ac-active{background-color:#eee}.apps-shortcutshelpcontentimpl-content-container{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex:1 1 auto;-webkit-flex:1 1 auto;flex:1 1 auto;overflow:auto}.apps-shortcutshelpcontentimpl-sidebar{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;-ms-flex:0 0 192px;-webkit-flex:0 0 192px;flex:0 0 192px;vertical-align:top;position:relative;border-right:1px solid rgba(0,0,0,0.12);overflow-x:hidden;overflow-y:auto}.apps-shortcutshelpcontentimpl-shortcut-content{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;-ms-flex:1 1 auto;-webkit-flex:1 1 auto;flex:1 1 auto;overflow:auto}.apps-shortcutshelpcontentimpl-bottom-bar{-ms-flex:0 0 auto;-webkit-flex:0 0 auto;flex:0 0 auto;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;border-top:1px solid rgba(0,0,0,0.12)}.apps-shortcutshelpcontentimpl-override-container{-ms-flex:0 0 50%;-webkit-flex:0 0 50%;flex:0 0 50%;display:-webkit-inline-box;display:-moz-inline-box;display:-ms-inline-flexbox;display:-webkit-inline-flex;display:inline-flex;justify-content:center;align-items:center;box-sizing:border-box;border-left:1px solid rgba(0,0,0,0.12);border-collapse:collapse;padding:10px 0}.apps-shortcutshelpcontentimpl-legacy-help-container{display:-webkit-inline-box;display:-moz-inline-box;display:-ms-inline-flexbox;display:-webkit-inline-flex;display:inline-flex;-ms-flex:0 0 50%;-webkit-flex:0 0 50%;flex:0 0 50%;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;justify-content:flex-end}.apps-shortcutshelpcontentimpl-override-button-container{padding-left:16px}.apps-shortcutshelpcontentimpl-override-label{padding:0 5px 0 17px;font-weight:500;color:rgba(0,0,0,.87)}.apps-shortcutshelpcontentimpl-legacy-label{color:rgba(0,0,0,.87);font-weight:500;padding:0 15px 0 17px}.apps-shortcutshelpcontentimpl-legacy-toggle-container{align-items:center;box-sizing:border-box;display:-webkit-inline-box;display:-moz-inline-box;display:-ms-inline-flexbox;display:-webkit-inline-flex;display:inline-flex;-ms-flex:0 0 50%;-webkit-flex:0 0 50%;flex:0 0 50%;justify-content:flex-start;padding:0 5px 0 17px}.apps-actiondatawidget{-ms-flex:1 1 auto;-webkit-flex:1 1 auto;flex:1 1 auto;overflow:auto;position:relative;display:inline-block;outline:none;padding:0 5px 0 16px}.apps-actiondatawidget-key-focused{outline:rgba(0,0,0,.87) solid 1px;outline-offset:-1px}.apps-actiondatawidget-content{font-size:13px;outline-offset:-1px;table-layout:fixed;border-spacing:0}.apps-actiondatawidget-content-header{height:48px;padding-top:25px;text-align:left;font-size:13px;color:rgba(0,0,0,.87);white-space:nowrap;margin:0px;-moz-box-sizing:border-box;box-sizing:border-box}.apps-actiondatawidget-content-element{text-align:left;vertical-align:middle;border-bottom:1px solid rgba(0,0,0,0.12);white-space:nowrap;-moz-box-sizing:border-box;box-sizing:border-box;padding:11px 0}.apps-actiondatawidget-shortcut-desc{font-weight:normal;color:rgba(0,0,0,.87);word-wrap:break-word;white-space:normal;width:240px;vertical-align:top}.apps-actiondatawidget-shortcut-key{color:rgba(0,0,0,.87);width:310px}.apps-actiondatawidget-key-extra-padding{display:block;padding-bottom:11px}.apps-actiondatawidget-override-keys-on{color:rgba(0,0,0,.87);display:block}.apps-actiondatawidget-last-item{margin-bottom:2px}.apps-actiondatawidget-last-item-override-enabled{margin-bottom:2px}.apps-actiondatawidget-last-row{height:100%}.apps-actiondatawidget-override-keys-off{color:#bbbbbb;display:block}.apps-actiondatawidget-override-info-icon{height:17px;width:17px;float:right;display:block}.apps-actiondatawidget-override-info-svg{height:17px;width:17px;fill:#bbbbbb}.apps-shortcutshelpcontentimpl-hc-black .apps-actiondatawidget-override-info-svg{fill:white}.apps-actiondatawidget-override-keys-on .apps-actiondatawidget-override-info-svg{fill:#1a73e8}.jfk-tooltip.apps-actiondatawidget-override-info-icon-tooltip,.jfk-tooltip.apps-actiondatawidget-override-info-icon-tooltip-unsupported,.jfk-tooltip.apps-actiondatawidget-override-info-icon-tooltip-legacy{background-color:#727272;padding:7px 8px}.jfk-tooltip.apps-actiondatawidget-override-info-icon-tooltip{width:230px}.jfk-tooltip.apps-actiondatawidget-override-info-icon-tooltip-unsupported{width:182px}.jfk-tooltip.apps-actiondatawidget-override-info-icon-tooltip-legacy{width:190px}.apps-actiondatawidget-override-tooltip-text{line-height:17px}.apps-actiondatawidget-override-info-icon-tooltip .jfk-tooltip-arrowdown .jfk-tooltip-arrowimplafter{border-color:#727272 transparent}.apps-actiondatawidget-override-browser-behavior-msg{color:#c5dbff}.apps-navigationwidget{-ms-flex:1 1 auto;-webkit-flex:1 1 auto;flex:1 1 auto;display:inline-block;vertical-align:top;text-align:left;padding-top:4px;color:rgba(0,0,0,.87);outline:transparent}.apps-navigationwidget-item{min-height:33px;line-height:24px;padding:12px 1px 1px 24px}.apps-navigationwidget-item-selected{color:#1a73e8;font-weight:500;outline:1px solid transparent;outline-offset:-2px}.apps-navigationwidget-item-hover{cursor:pointer;background-color:#eee;outline:1px dotted transparent;outline-offset:-2px}.apps-navigationwidget-item-disabled{opacity:0.2}.companion-about-panel-button.app-switcher-button{bottom:0;position:absolute}.companion-about-panel-menu-header,.companion-about-panel-menu-text{color:#3c4043}.companion-about-panel-menu-header{font-size:18px;font-weight:500;line-height:24px;padding:6px 24px 2px}.companion-about-panel-menu-separator{border-top:1px solid #f1f3f4;margin:8px 0}.companion-about-panel-menu-item{border:none;cursor:pointer;height:48px;padding:0}.companion-about-panel-menu-item-highlight{background:#f1f3f4}.companion-about-panel-menu-item-icon-container{height:20px;padding:14px 16px 14px 24px;position:absolute;width:20px}.companion-about-panel-menu-item-disabled .companion-about-panel-menu-item-icon{fill:#dadce0}.companion-about-panel-menu-text{font-size:14px;letter-spacing:.2px;line-height:20px;padding:13px 24px 11px 60px}.companion-about-panel-menu-item-disabled .companion-about-panel-menu-text{color:#dadce0;cursor:default}.companion-app-switcher-container{background-color:white;border-left:1px solid #dadce0;box-sizing:border-box;display:flex;flex-direction:column;height:100%;position:relative;width:56px}.companion-app-switcher-guest-container{display:flex;flex:1 0 auto;flex-direction:column;margin-bottom:56px}.companion-app-switcher-add-on-container{display:flex;flex:0 1 100%;flex-direction:column;overflow:hidden;padding-top:16px}.companion-app-switcher-separator,.companion-app-switcher-add-on-container::before{border-top:1px solid #dadce0;content:'';display:block;flex:1 0 auto;margin:0 auto;padding-bottom:16px;width:20px}.companion-app-switcher-separator{margin-top:16px}.companion-theme-dark.companion-app-switcher-container,.companion-theme-light.companion-app-switcher-container{background-color:transparent}.companion-theme-dark.companion-app-switcher-container,.companion-theme-dark .companion-app-switcher-separator,.companion-theme-dark .companion-app-switcher-add-on-container::before{border-color:rgba(255,255,255,.12)}.companion-theme-light.companion-app-switcher-container,.companion-theme-light .companion-app-switcher-separator,.companion-theme-light .companion-app-switcher-add-on-container::before{border-color:rgba(100,121,143,.12)}.companion-guest-app-switcher{flex-grow:1;height:100px;outline:none;overflow:hidden}.companion-app-switcher-loading-indicator{padding:16px 0}.companion-app-switcher-loading-indicator-dot{-webkit-animation:dotLoadingAnimation 1.0s infinite ease-in-out both;animation:dotLoadingAnimation 1.0s infinite ease-in-out both;height:8px;background-color:#757575;border-radius:50%;margin:0 auto 12px;width:8px}.companion-theme-dark .companion-app-switcher-loading-indicator-dot{background-color:#fff}.companion-app-switcher-loading-indicator-dot:last-child{margin-bottom:0}.companion-app-switcher-loading-indicator-dot-1{-webkit-animation-delay:-0.5s;animation-delay:-0.5s}.companion-app-switcher-loading-indicator-dot-2{-webkit-animation-delay:-0.25s;animation-delay:-0.25s}@-webkit-keyframes dotLoadingAnimation{0%,80%,100%{opacity:0.5}40%{opacity:1.0}}@keyframes dotLoadingAnimation{0%,80%,100%{opacity:0.5}40%{opacity:1.0}}.app-switcher-button{cursor:pointer;height:56px;outline:none;pointer-events:none;position:relative;transition:all .3s cubic-bezier(.4,0,.2,1);width:56px}.app-switcher-button-disabled{cursor:default;opacity:.38}.app-switcher-button-focused .app-switcher-button-icon-background,.app-switcher-button-focused.app-switcher-button-hover .app-switcher-button-icon-background,.companion-theme-light .app-switcher-button-hover .app-switcher-button-icon-background,.companion-theme-light .app-switcher-button-open .app-switcher-button-icon-background,.companion-theme-light .app-switcher-button-selected.app-switcher-button-hover .app-switcher-button-icon-background{background-color:#e8eaed}.app-switcher-button-hover .app-switcher-button-icon-background,.app-switcher-button-open .app-switcher-button-icon-background,.companion-theme-light .app-switcher-button-selected .app-switcher-button-icon-background,.companion-theme-light .app-switcher-button-focused .app-switcher-button-icon-background{background-color:#f1f3f4}.companion-theme-dark .app-switcher-button-selected .app-switcher-button-icon-background,.companion-theme-dark .app-switcher-button-focused .app-switcher-button-icon-background{background-color:rgba(255,255,255,.24)}.companion-theme-dark .app-switcher-button-hover .app-switcher-button-icon-background,.companion-theme-dark .app-switcher-button-open .app-switcher-button-icon-background,.companion-theme-dark .app-switcher-button-selected.app-switcher-button-hover .app-switcher-button-icon-background{background-color:rgba(255,255,255,.12)}.app-switcher-button-icon-container{background-color:transparent;background-repeat:no-repeat;background-position:center;background-size:20px 20px;border-radius:50%;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;height:40px;left:8px;pointer-events:auto;position:absolute;top:8px;transition:all .3s cubic-bezier(.4,0,.2,1);width:40px}.app-switcher-button-icon-background{border-radius:50%;display:-webkit-flex;display:flex;height:40px;left:8px;position:absolute;top:8px;transition:all .3s cubic-bezier(.4,0,.2,1);width:40px}.app-switcher-button-icon{display:block;fill:#5f6368;margin:auto;transition:all .3s cubic-bezier(.4,0,.2,1)}.companion-theme-dark .app-switcher-button-icon{fill:#fff}.app-switcher-button-presence .app-switcher-button-icon-background.app-switcher-button-icon-background-inner{-webkit-animation:presence-scale-inner 3s cubic-bezier(0.05,0.69,0.67,1) infinite normal;animation:presence-scale-inner 3s cubic-bezier(0.05,0.69,0.67,1) infinite normal;height:calc(40px - 8px);width:calc(40px - 8px);left:calc((8px/2) + 8px);top:calc((8px/2) + 8px)}.app-switcher-button-presence .app-switcher-button-icon-background.app-switcher-button-icon-background-outer{-webkit-animation:presence-scale-outer 3s cubic-bezier(0.05,0.69,0.67,1) infinite normal;animation:presence-scale-outer 3s cubic-bezier(0.05,0.69,0.67,1) infinite normal;background-color:transparent;border-style:solid;border-width:calc(8px/2);height:40px;width:40px;left:calc(8px - (8px/2));top:calc(8px - (8px/2))}.app-switcher-button-inksplash .app-switcher-button-icon-background.app-switcher-button-icon-background-inner{-webkit-animation:inksplash-scale-background 2s cubic-bezier(0.05,0.69,0.67,1) infinite normal;animation:inksplash-scale-background 2s cubic-bezier(0.05,0.69,0.67,1) infinite normal}.app-switcher-button-inksplash .app-switcher-button-icon-container{-webkit-animation:inksplash-scale-icon 2s cubic-bezier(0.05,0.69,0.67,1) infinite normal;animation:inksplash-scale-icon 2s cubic-bezier(0.05,0.69,0.67,1) infinite normal}@keyframes presence-scale-inner{0%{opacity:0;transform:scale(0.57);visibility:hidden}15%{opacity:0;transform:scale(0.57);visibility:visible}35%{opacity:1;transform:scale(1)}60%{opacity:0;transform:scale(0.57)}100%{opacity:0;transform:scale(0.57);visibility:hidden}}@keyframes presence-scale-outer{0%{opacity:0;transform:scale(0.75);visibility:hidden}34%{opacity:0;transform:scale(0.75);visibility:visible}36%{opacity:0.99}65%{opacity:1}90%{transform:scale(1)}100%{opacity:0;transform:scale(1);visibility:hidden}}@keyframes inksplash-scale-background{0%{opacity:0;transform:scale(0.00)}35%{opacity:0;transform:scale(0.40)}50%{opacity:1}80%{transform:scale(2.05)}100%{opacity:0;transform:scale(0.00)}}@keyframes inksplash-scale-icon{0%{transform:scale(1.00)}20%{transform:scale(1.00)}30%{transform:scale(1.10)}40%{transform:scale(1.00)}100%{transform:scale(1.00)}}.app-switcher-menu{background:#fff;border:1px solid rgba(0,0,0,.2);border-radius:8px;box-shadow:0 1px 2px 0 rgba(60,64,67,.30),0 2px 6px 2px rgba(60,64,67,.15);min-width:180px;outline:none;overflow-y:auto;padding:8px 0;position:absolute;z-index:1202}.companion-collapser-button-container{bottom:0;display:-webkit-flex;display:flex;height:56px;overflow:hidden;pointer-events:none;position:absolute;right:0;width:56px}.companion-collapser-button-container.companion-collapser-button-container-elevated{margin-bottom:24px}.companion-collapser-button{bottom:0}.companion-collapser-button .app-switcher-button-icon-container,.companion-collapser-button .app-switcher-button-icon-background{border-radius:calc(56px - 8px - 10px)}.companion-collapser-button.app-switcher-button-checked .app-switcher-button-icon-background,.companion-theme-light .companion-collapser-button.app-switcher-button-checked .app-switcher-button-icon-background{background-color:#fff}.companion-collapser-button.app-switcher-button-checked.app-switcher-button-hover .app-switcher-button-icon-background,.companion-theme-light .companion-collapser-button.app-switcher-button-checked.app-switcher-button-hover .app-switcher-button-icon-background{background-color:#f1f3f4}.companion-theme-dark .companion-collapser-button.app-switcher-button-checked .app-switcher-button-icon-background{background-color:#595959}.companion-collapser-button.app-switcher-button-checked.app-switcher-button-focused .app-switcher-button-icon-background,.companion-theme-light .companion-collapser-button.app-switcher-button-checked.app-switcher-button-focused .app-switcher-button-icon-background{background-color:#e8eaed}.companion-collapser-button.app-switcher-button-checked{right:-24px}.companion-collapser-button.app-switcher-button-checked .app-switcher-button-icon-container,.companion-collapser-button.app-switcher-button-checked .app-switcher-button-icon-background{border-bottom-right-radius:0;border-top-right-radius:0;height:20px;left:0;margin:8px 0 8px 8px;padding:10px 0 10px 10px;top:0;width:calc(56px - 8px - 10px)}.companion-collapser-button.app-switcher-button-checked .app-switcher-button-icon-background{box-shadow:0 1px 1px 0 rgba(60,64,67,.3),0 1px 3px 1px rgba(60,64,67,.15)}.companion-collapser-button.app-switcher-button-checked.app-switcher-button-hover{right:0}.companion-collapser-button .app-switcher-button-icon{left:10px;position:absolute;top:10px}html[dir="rtl"] .companion-collapser-button .app-switcher-button-icon,body[dir="rtl"] .companion-collapser-button .app-switcher-button-icon{transform:rotate(180deg)}.companion-theme-dark .companion-collapser-button.app-switcher-button-checked.app-switcher-button-focused .app-switcher-button-icon-container,.companion-theme-dark .companion-collapser-button.app-switcher-button-checked.app-switcher-button-hover .app-switcher-button-icon-container{background-color:#414141}.companion-collapser-button.app-switcher-button-checked .app-switcher-button-icon{margin-left:-6px;transform:rotate(180deg)}.companion-collapser-button.app-switcher-button-checked.app-switcher-button-hover .app-switcher-button-icon{margin-left:0}html[dir="rtl"] .companion-collapser-button.app-switcher-button-checked .app-switcher-button-icon,body[dir="rtl"] .companion-collapser-button.app-switcher-button-checked .app-switcher-button-icon{transform:rotate(0deg)}.acdd-draggable-shadow{background-color:white;background-repeat:no-repeat;border:transparent;border-radius:8px;box-sizing:border-box;color:#666;height:56px;outline:none;padding:0 10px;pointer-events:none;position:fixed;z-index:999}.acdd-draggable-shadow.acdd-draggable-shadow-detail-type{background-position:20px center;background-size:24px 24px;height:56px;width:200px}.acdd-draggable-shadow.acdd-draggable-shadow-image-type{background-position:center;background-size:100% auto;height:120px;width:120px}.acdd-draggable-shadow.acdd-draggable-shadow-image-type.acdd-draggable-shadow-image-captioned{height:156px}.acdd-draggable-shadow-text-wrap{box-sizing:border-box;display:table-cell;padding-left:48px;max-width:200px;vertical-align:middle}.acdd-draggable-shadow-text-wrap .acdd-draggable-shadow-title{font-size:1.1em}.acdd-draggable-shadow-text-wrap .acdd-draggable-shadow-text{opacity:.75;padding-top:2px}.acdd-draggable-shadow-image-type .acdd-draggable-shadow-text{background-color:rgba(32,33,36,.71);border-radius:0 0 8px 8px;bottom:0;color:white;height:36px;left:0;padding:8px 10px;position:absolute;width:100%}.acdd-draggable-shadow .acdd-draggable-shadow-title,.acdd-draggable-shadow .acdd-draggable-shadow-text{box-sizing:border-box;margin:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.acdd-draggable-shadow .acdd-draggable-shadow-count-bubble{background-color:#202124;border-radius:20px;box-sizing:border-box;color:white;font-size:16px;height:40px;max-width:75%;min-width:40px;overflow:hidden;padding:9px 8px;position:absolute;right:-15px;text-align:center;text-overflow:ellipsis;top:-15px}.acga-topLevelDiv{height:100%;position:relative;width:100%}.acga-content{height:100%;left:0;position:absolute;top:0;width:100%;z-index:0}.agca-gab-unread-notifications::after{content:"";background-color:#db4437;border-radius:50%;height:8px;position:absolute;right:17px;top:17px;width:8px}.companion-guest-app-switcher .app-switcher-button-icon-background-outer{border-color:#e8f0fe}.companion-theme-light .agca-gab-blue .app-switcher-button-icon-background-outer{border-color:rgba(66,133,244,.24)}.agca-gab-green .app-switcher-button-icon-background-outer{border-color:#e6f4ea}.companion-theme-light .agca-gab-green .app-switcher-button-icon-background-outer{border-color:rgba(52,168,83,.24)}.agca-gab-yellow .app-switcher-button-icon-background-outer{border-color:#fef7e0}.companion-theme-light .agca-gab-yellow .app-switcher-button-icon-background-outer{border-color:rgba(251,188,4,.24)}.companion-theme-dark .agca-gab-button .app-switcher-button-icon-background-outer{border-color:rgba(255,255,255,.24)}.companion-guest-app-switcher .app-switcher-button-inksplash .app-switcher-button-icon-background-inner,.companion-guest-app-switcher .app-switcher-button-presence .app-switcher-button-icon-background-inner,.companion-guest-app-switcher .app-switcher-button-selected .app-switcher-button-icon-background-inner,.app-switcher-button-selected.agca-gab-blue.app-switcher-button-focused .app-switcher-button-icon-background-inner{background-color:#e8f0fe}.app-switcher-button-selected.agca-gab-blue.app-switcher-button-hover .app-switcher-button-icon-background-inner{background-color:#d2e3fc}.companion-theme-light .app-switcher-button-inksplash.agca-gab-blue .app-switcher-button-icon-background-inner,.companion-theme-light .app-switcher-button-presence.agca-gab-blue .app-switcher-button-icon-background-inner,.companion-theme-light .app-switcher-button-selected.agca-gab-blue .app-switcher-button-icon-background-inner,.companion-theme-light .app-switcher-button-selected.agca-gab-blue.app-switcher-button-focused .app-switcher-button-icon-background-inner{background-color:rgba(66,133,244,.24)}.companion-theme-light .agca-gab-blue.app-switcher-button-hover .app-switcher-button-icon-background-inner,.companion-theme-light .agca-gab-blue.app-switcher-button-focused .app-switcher-button-icon-background-inner{background-color:rgba(66,133,244,.12)}.app-switcher-button-inksplash.agca-gab-green .app-switcher-button-icon-background-inner,.app-switcher-button-presence.agca-gab-green .app-switcher-button-icon-background-inner,.app-switcher-button-selected.agca-gab-green .app-switcher-button-icon-background-inner,.app-switcher-button-selected.agca-gab-green.app-switcher-button-focused .app-switcher-button-icon-background-inner{background-color:#e6f4ea}.app-switcher-button-selected.agca-gab-green.app-switcher-button-hover .app-switcher-button-icon-background-inner{background-color:#ceead6}.companion-theme-light .app-switcher-button-inksplash.agca-gab-green .app-switcher-button-icon-background-inner,.companion-theme-light .app-switcher-button-presence.agca-gab-green .app-switcher-button-icon-background-inner,.companion-theme-light .app-switcher-button-selected.agca-gab-green .app-switcher-button-icon-background-inner,.companion-theme-light .app-switcher-button-selected.agca-gab-green.app-switcher-button-focused .app-switcher-button-icon-background-inner{background-color:rgba(52,168,83,.24)}.companion-theme-light .agca-gab-green.app-switcher-button-hover .app-switcher-button-icon-background-inner,.companion-theme-light .agca-gab-green.app-switcher-button-focused .app-switcher-button-icon-background-inner{background-color:rgba(52,168,83,.12)}.app-switcher-button-inksplash.agca-gab-yellow .app-switcher-button-icon-background-inner,.app-switcher-button-presence.agca-gab-yellow .app-switcher-button-icon-background-inner,.app-switcher-button-selected.agca-gab-yellow .app-switcher-button-icon-background-inner,.app-switcher-button-selected.agca-gab-yellow.app-switcher-button-focused .app-switcher-button-icon-background-inner{background-color:#fef7e0}.app-switcher-button-selected.agca-gab-yellow.app-switcher-button-hover .app-switcher-button-icon-background-inner{background-color:#feefc3}.companion-theme-light .app-switcher-button-inksplash.agca-gab-yellow .app-switcher-button-icon-background-inner,.companion-theme-light .app-switcher-button-presence.agca-gab-yellow .app-switcher-button-icon-background-inner,.companion-theme-light .app-switcher-button-selected.agca-gab-yellow .app-switcher-button-icon-background-inner,.companion-theme-light .app-switcher-button-selected.agca-gab-yellow.app-switcher-button-focused .app-switcher-button-icon-background-inner{background-color:rgba(251,188,4,.24)}.companion-theme-light .agca-gab-yellow.app-switcher-button-hover .app-switcher-button-icon-background-inner,.companion-theme-light .agca-gab-yellow.app-switcher-button-focused .app-switcher-button-icon-background-inner{background-color:rgba(251,188,4,.12)}.companion-theme-dark .agca-gab-button.app-switcher-button-inksplash .app-switcher-button-icon-background-inner,.companion-theme-dark .agca-gab-button.app-switcher-button-presence .app-switcher-button-icon-background-inner,.companion-theme-dark .agca-gab-button.app-switcher-button-selected .app-switcher-button-icon-background-inner,.companion-theme-dark .agca-gab-button.app-switcher-button-selected.app-switcher-button-focused .app-switcher-button-icon-background-inner{background-color:rgba(255,255,255,.24)}.companion-theme-dark .agca-gab-button.app-switcher-button-hover .app-switcher-button-icon-background-inner,.companion-theme-dark .agca-gab-button.app-switcher-button-focused .app-switcher-button-icon-background-inner{background-color:rgba(255,255,255,.12)}.agca-gab-icon-selection-indicator{background-color:#d704fb;border-radius:3px 0 0 3px;display:none;height:40px;position:absolute;right:1px;top:8px;width:3px}.agca-gab-button.app-switcher-button-selected .agca-gab-icon-selection-indicator{display:inherit}.agca-gab-blue .agca-gab-icon-selection-indicator{background-color:#4285f4}.agca-gab-green .agca-gab-icon-selection-indicator{background-color:#34a853}.agca-gab-yellow .agca-gab-icon-selection-indicator{background-color:#fbbc04}.companion-theme-dark .companion-overflow-menu-button:not(.app-switcher-button-hover) .app-switcher-button-icon-background{opacity:.7}.companion-shell-content-component{background-color:white;box-sizing:border-box;height:100%;left:0;padding-top:64px;position:absolute;top:0;width:100%}.companion-header-in-iframe .companion-shell-guest{padding-top:0}.companion-shell-loading{overflow:hidden;position:absolute;text-align:center}.companion-shell-offline,.companion-shell-permanent-failure,.companion-shell-timed-out,.companion-shell-unavailable{-webkit-align-items:center;align-items:center;display:-webkit-flex;display:flex;-webkit-flex-direction:column;flex-direction:column;-webkit-justify-content:center;justify-content:center;text-align:center}.companion-shell-offline-description,.companion-shell-offline-title,.companion-shell-unavailable-description,.companion-shell-unavailable-title{color:#5f6368;margin:0 70px}.companion-shell-offline-description,.companion-shell-unavailable-description{font-size:12px;line-height:16px}.companion-shell-offline-title,.companion-shell-unavailable-title{font-size:16px;font-weight:500;margin-bottom:2px;margin-top:34px}.companion-shell-permanent-failure-message,.companion-shell-timed-out-message{margin:10px;max-width:calc(100% - 20px)}.companion-shell-timed-out-retry{color:#4285f4;cursor:pointer;text-transform:uppercase}.companion-shell-iframe{border:0;height:100%;width:100%}.companion-shell-header{align-items:center;background-color:#fff;border-bottom:solid 1px #f1f3f4;box-sizing:border-box;display:-webkit-flex;display:flex;-webkit-flex-direction:row;flex-direction:row;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;height:64px;padding:0 10px;position:relative;z-index:1}.companion-shell-header-element{margin-left:10px;margin-right:10px}.companion-shell-title-container{display:-webkit-flex;display:flex;-webkit-flex-direction:column;flex-direction:column;-webkit-flex-grow:1;flex-grow:1;justify-content:center;width:1px}.companion-shell-title-element{margin:0}.companion-shell-title-text,.companion-shell-subtitle-text,.companion-shell-subtitle-text .goog-menu-button-caption{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.companion-shell-title-text,.companion-shell-subtitle-text{outline:none}.companion-shell-title-text.companion-shell-title-big{font-size:22px}.companion-shell-header-light-background .companion-shell-title-big{color:rgba(0,0,0,.54)}.companion-shell-header-dark-background .companion-shell-title-big{color:#fff}.companion-shell-title-text.companion-shell-title-small{color:#80868b;font-size:10px;font-weight:500;letter-spacing:1.5px;text-transform:uppercase}.companion-shell-title-text.companion-shell-title-small.companion-shell-subview{left:56px}.companion-shell-dropdown-container{font-size:0}.companion-shell-subtitle-text{color:#5f6368;font-size:16px;font-weight:500;line-height:20px}.companion-shell-subtitle-text.goog-menu-button-open{background-color:#f1f3f4}.companion-shell-subtitle-button{padding:0 2px 0 4px}.companion-shell-subtitle-button .companion-shell-subtitle-text,.companion-shell-subtitle-text .goog-menu-button-caption{padding:0}.companion-shell-subtitle-call-out{color:#1a73e8}.companion-shell-dropdown-button{background:none;border-radius:3px;border-width:0;box-sizing:border-box;cursor:pointer;display:inline-block;margin-left:-4px;max-width:100%;outline:none;padding:0 2px 0 4px}.companion-shell-dropdown-button.companion-shell-dropdown-button-hover{background-color:#f1f3f4}.companion-shell-dropdown-button.companion-shell-dropdown-button-focused,.companion-shell-dropdown-button.companion-shell-dropdown-button-open{background-color:#e8eaed}.companion-shell-dropdown-button.companion-shell-dropdown-button-disabled{opacity:.38}.companion-shell-dropdown-button .companion-shell-dropdown-button-outer-box{display:-webkit-flex;display:flex;-webkit-justify-content:flex-start;justify-content:flex-start}.companion-shell-dropdown-button .companion-shell-dropdown-button-inner-box{display:block;-webkit-flex-shrink:1;flex-shrink:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.companion-shell-dropdown-button-outer-box::after{content:'';display:block;background:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPScyNHB4JyBoZWlnaHQ9JzI0cHgnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nIzVmNjM2OCc+PHBhdGggZD0nTTcgMTBsNSA1IDUtNXonPjwvcGF0aD48cGF0aCBkPSdNMCAwaDI0djI0SDB6JyBmaWxsPSdub25lJz48L3BhdGg+PC9zdmc+") center no-repeat;-webkit-flex-shrink:0;flex-shrink:0;height:20px;margin:0 0 0 4px;padding:0;width:20px}.companion-shell-header-buttons{display:-webkit-flex;display:flex;height:24px;-webkit-justify-content:flex-end;justify-content:flex-end;position:absolute;right:8px;top:18px}.companion-shell-header-button{background:no-repeat center center;background-size:20px 20px;cursor:pointer;height:24px;width:24px}.companion-shell-header-light-background .companion-shell-header-svg-icon{fill:#000;opacity:.54}.companion-shell-header-dark-background .companion-shell-header-svg-icon{fill:#fff}html[dir="rtl"] .companion-shell-back-button,body[dir="rtl"] .companion-shell-back-button,html[dir="rtl"] .companion-shell-escape-hatch-button,body[dir="rtl"] .companion-shell-escape-hatch-button{transform:scaleX(-1)}.companion-shell-header-button.companion-shell-title-element{margin:0}.companion-shell-header-button:hover{opacity:.87}.companion-shell-subtitle-button[aria-disabled="true"],.companion-shell-header-button[aria-disabled="true"]{cursor:not-allowed;opacity:.38}.companion-shell-back-button{margin-right:2px}.goog-menu.companion-shell-drop-down-menu{background:#fff;border-width:0;border-radius:0 0 8px 8px;box-shadow:0px -3px 6px -3px rgba(0,0,0,.12),0 4px 8px -2px rgba(0,0,0,.14);box-sizing:border-box;max-height:400px;overflow-x:hidden;overflow-y:auto;padding-bottom:8px;position:absolute;width:100%;z-index:999}.goog-menuitem.companion-shell-drop-down-entry{border:none;height:40px;padding:0;width:300px}.goog-menuitem-highlight.companion-shell-drop-down-entry{background:#f1f3f4}.goog-menu.companion-shell-drop-down-menu .goog-menuseparator{border-top:1px solid rgba(32,33,36,0.06);margin:8px 0;padding:0}.companion-shell-drop-down-check{display:none;height:20px;padding:10px 16px;position:absolute;right:0;width:20px}.goog-option-selected .companion-shell-drop-down-check{display:block}.companion-shell-drop-down-entry.goog-option-selected{background-image:none}.companion-shell-drop-down-entry .goog-menuitem-checkbox,.companion-shell-drop-down-entry.goog-option-selected .goog-menuitem-checkbox{display:none}.companion-shell-drop-down-entry-text{box-sizing:border-box;font-size:14px;color:#202124;padding:10px 20px;letter-spacing:0.2px;line-height:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:300px}.goog-option-selected .companion-shell-drop-down-entry-text{padding-right:60px}.companion-shell-search-container{align-items:center;background-color:#fff;box-sizing:border-box;display:-webkit-flex;display:flex;-webkit-flex-direction:row;flex-direction:row;height:100%;left:0;padding:0 10px;position:absolute;top:0;width:100%}.companion-shell-search-icon,.companion-shell-search-close{margin-left:10px;margin-right:10px}.companion-shell-search-input{background-color:transparent;border:none;color:#5f6368;-webkit-flex-grow:1;flex-grow:1;font-size:16px;line-height:24px;outline:none;width:100px}.companion-shell-search-input::placeholder{color:#bdc1c6}.companion-shell-search-input::-webkit-input-placeholder{color:#bdc1c6}.companion-shell-search-input:-ms-input-placeholder{color:#bdc1c6}.companion-app-switcher-container .jfk-bubble{padding:16px;border-radius:8px;border-color:#e8eaed;border-width:1px;box-shadow:0 2px 6px rgba(60,64,67,0.3)}.companion-app-switcher-container .jfk-bubble-arrowright .jfk-bubble-arrowimplbefore{border-left-color:#e8eaed;border-right-color:#e8eaed}.app-switcher-notification-bubble{display:-webkit-flex;display:flex;-webkit-flex-direction:column;flex-direction:column}.app-switcher-notification-bubble .app-switcher-notification-bubble-header{display:-webkit-flex;display:flex;-webkit-flex-direction:row;flex-direction:row;height:32px}.app-switcher-notification-bubble .app-switcher-notification-bubble-image-container{width:32px;border-radius:50%}.app-switcher-notification-bubble .app-switcher-notification-bubble-image-container .app-switcher-notification-bubble-image{width:32px;height:32px;border-radius:50%;margin-right:8px}.app-switcher-notification-bubble .app-switcher-notification-bubble-text{height:calc(14px*2);width:auto;display:-webkit-flex;display:flex;-webkit-flex-direction:column;flex-direction:column;margin-left:8px;margin-bottom:8px}.app-switcher-notification-bubble .app-switcher-notification-bubble-text:focus{outline:none}.app-switcher-notification-bubble .app-switcher-notification-bubble-title-text{height:14px;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;color:#5f6368}.app-switcher-notification-bubble .app-switcher-notification-bubble-body-text{height:14px;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;color:#3c4043}.app-switcher-notification-bubble .app-switcher-notification-bubble-footer{margin-top:9px;height:32px;display:-webkit-flex;display:flex;-webkit-flex-direction:row;flex-direction:row}.app-switcher-notification-bubble .app-switcher-notification-bubble-footer .jfk-button{text-align:center;font-weight:500;font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;padding-left:8px;padding-right:16px;margin:0;height:30px;line-height:30px;color:#ffffff;max-width:300px;font-size:14px;border-radius:15px;-webkit-align-items:center;align-items:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.app-switcher-notification-bubble .app-switcher-notification-bubble-footer .app-switcher-notification-bubble-button-icon{width:16px;height:16px;padding-right:8px;padding-top:calc((30px - 16px)/2 - 1px);padding-bottom:calc((30px - 16px)/2);vertical-align:middle}.app-switcher-notification-bubble .app-switcher-notification-bubble-footer .app-switcher-notification-bubble-spacer{width:8px}.app-switcher-notification-bubble .app-switcher-notification-bubble-call-to-action-button{background-color:rgb(24,128,56)}.app-switcher-notification-bubble .app-switcher-notification-bubble-call-to-action-button.jfk-button-hover{background-color:#2a8947;box-shadow:0 1px 3px 1px rgba(24,128,56,0.15)}.app-switcher-notification-bubble .app-switcher-notification-bubble-call-to-action-button.jfk-button-focused{background-color:#4f9e67;box-shadow:0 1px 3px 1px rgba(24,128,56,0.15)}.app-switcher-notification-bubble .app-switcher-notification-bubble-call-to-action-button.jfk-button-focused.jfk-button-hover{background-color:#62a877;box-shadow:0 1px 3px 1px rgba(24,128,56,0.15)}.app-switcher-notification-bubble .app-switcher-notification-bubble-dismiss-button{background-color:rgb(217,48,37)}.app-switcher-notification-bubble .app-switcher-notification-bubble-dismiss-button.jfk-button-hover{background-color:#d3443b;box-shadow:0 1px 3px 1px rgba(217,48,37,0.15)}.app-switcher-notification-bubble .app-switcher-notification-bubble-dismiss-button.jfk-button-focused{background-color:#e06c64;box-shadow:0 1px 3px 1px rgba(217,48,37,0.15)}.app-switcher-notification-bubble .app-switcher-notification-bubble-dismiss-button.jfk-button-focused.jfk-button-hover{background-color:#e88a84;box-shadow:0 1px 3px 1px rgba(217,48,37,0.15)}.companion-overflow-menu-item{-webkit-align-items:center;align-items:center;cursor:pointer;display:-webkit-flex;display:flex;padding:8px}.companion-overflow-menu-item-highlight{background-color:#f1f3f4}.companion-overflow-menu-item-icon{background:transparent no-repeat center;background-size:20px 20px;border-radius:50%;height:40px;width:40px}.companion-overflow-menu-item-content{padding:0 6px;white-space:nowrap}.companion-overflow-menu-item-disabled{cursor:default;opacity:.38}.companion-server-render .acga-content{-webkit-animation:companion-server-render-guest-content-fadeout 333ms ease 0s 1 normal both paused;animation:companion-server-render-guest-content-fadeout 333ms ease 0s 1 normal both paused}.companion-server-render .companion-shell-splash-screen-ink-splash-color{display:none}.companion-server-render .companion-shell-splash-screen-app-logo{-webkit-animation:none;animation:none}.companion-server-render .companion-shell-splash-screen-beachball{display:none}@keyframes companion-server-render-guest-content-fadeout{from{opacity:.38}to{opacity:0}}.companion-shell{background-color:white;box-sizing:border-box;height:100%;width:300px}.companion-shell-addon-content-container,.companion-shell-guest-content-container,.companion-shell-native-content-container{height:100%}.companion-shell.companion-shell-overlay-content{border:0;box-shadow:0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12),0px 2px 4px -1px rgba(0,0,0,0.2);opacity:1}.companion-shell-app-switcher{bottom:0px;left:0px;position:absolute}.companion-shell-guest-container{height:100%}.companion-shell-splash-screen-container{height:680px;margin-left:50%;position:relative;top:calc(50% - (340px + 64px));transform:translateX(-50%);width:680px}html[dir="rtl"] .companion-shell-splash-screen-container,body[dir="rtl"] .companion-shell-splash-screen-container{transform:translateX(50%)}.companion-shell-splash-screen-ink-splash-color{-webkit-animation:ink-splash-opacity 1s cubic-bezier(0.08,0.8,0.67,1) 400ms 1 normal both,ink-splash-scale 1s cubic-bezier(0.05,0.69,0.67,1) 400ms 1 normal both;animation:ink-splash-opacity 1s cubic-bezier(0.08,0.8,0.67,1) 400ms 1 normal both,ink-splash-scale 1s cubic-bezier(0.05,0.69,0.67,1) 400ms 1 normal both;border-radius:50%;height:100%;width:100%}@keyframes ink-splash-opacity{from{opacity:1}to{opacity:0}}@keyframes ink-splash-scale{from{transform:scale(0)}to{transform:scale(1)}}.companion-shell-splash-screen-app-logo{-webkit-animation:app-logo-scale 330ms cubic-bezier(0.05,0.62,0.51,1.26) 333ms 1 normal backwards,app-logo-scale-bounce 170ms cubic-bezier(0.29,0,0.73,1) 667ms 1 normal forwards;animation:app-logo-scale 330ms cubic-bezier(0.05,0.62,0.51,1.26) 333ms 1 normal backwards,app-logo-scale-bounce 170ms cubic-bezier(0.29,0,0.73,1) 667ms 1 normal forwards;background-position:center;background-repeat:no-repeat;background-size:128px 128px;bottom:0;height:128px;left:0;margin:auto;position:absolute;right:0;top:0;width:128px}@keyframes app-logo-scale{from{transform:scale(0)}to{transform:scale(1)}}@keyframes app-logo-scale-bounce{0%,100%{transform:scale(1)}20%{transform:scale(0.95)}}.companion-shell-splash-screen-beachball{-webkit-animation:beachball-opacity 330ms linear 1s 1 normal both;animation:beachball-opacity 330ms linear 1s 1 normal both;bottom:0;height:20px;left:0;margin:auto;position:absolute;right:0;top:190px;width:20px}@keyframes beachball-opacity{from{opacity:0}to{opacity:1}}.companion-tooltip{background-color:rgba(60,64,67,.9);border-radius:4px;color:#fff;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;font-weight:500;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;letter-spacing:.3px;line-height:16px;padding:4px 8px;white-space:nowrap;z-index:9999}.request-file-scope-modal-container{align-items:center;background-color:rgb(0,0,0,.5);display:flex;height:100%;position:absolute;top:0;width:300px}.request-file-scope-modal{background:#fff;border-radius:8px;display:flex;margin:8px;min-height:100px;padding:24px 8px;width:100%}.request-file-scope-modal-icon-container{margin-top:-4px;padding-right:8px}.request-file-scope-modal-icon{height:48px;width:48px}.request-file-scope-modal-prompt{font-weight:bold;line-height:16px;padding-bottom:16px}.request-file-scope-modal-description{line-height:16px;padding-bottom:16px;word-break:break-all}.request-file-scope-modal-buttons{text-align:right;text-transform:uppercase}.appsAddonsHostCompanionContentholderEl{height:100%;position:relative;width:100%}.jfk-bubble{-webkit-box-shadow:0 1px 3px rgba(0,0,0,.2);-moz-box-shadow:0 1px 3px rgba(0,0,0,.2);box-shadow:0 1px 3px rgba(0,0,0,.2);background-color:#fff;border:1px solid;border-color:#bbb #bbb #a8a8a8;padding:16px;position:absolute;z-index:1201!important}.jfk-bubble-closebtn{background:url("//ssl.gstatic.com/ui/v1/icons/common/x_8px.png") no-repeat;border:1px solid transparent;height:21px;opacity:.4;outline:0;position:absolute;right:2px;top:2px;width:21px}.jfk-bubble-closebtn:focus{border:1px solid #4d90fe;opacity:.8}.jfk-bubble-arrow{position:absolute}.jfk-bubble-arrow .jfk-bubble-arrowimplbefore,.jfk-bubble-arrow .jfk-bubble-arrowimplafter{display:block;height:0;position:absolute;width:0}.jfk-bubble-arrow .jfk-bubble-arrowimplbefore{border:9px solid}.jfk-bubble-arrow .jfk-bubble-arrowimplafter{border:8px solid}.jfk-bubble-arrowdown{bottom:0}.jfk-bubble-arrowup{top:-9px}.jfk-bubble-arrowleft{left:-9px}.jfk-bubble-arrowright{right:0}.jfk-bubble-arrowdown .jfk-bubble-arrowimplbefore,.jfk-bubble-arrowup .jfk-bubble-arrowimplbefore{border-color:#bbb transparent;left:-9px}.jfk-bubble-arrowdown .jfk-bubble-arrowimplbefore{border-color:#a8a8a8 transparent}.jfk-bubble-arrowdown .jfk-bubble-arrowimplafter,.jfk-bubble-arrowup .jfk-bubble-arrowimplafter{border-color:#fff transparent;left:-8px}.jfk-bubble-arrowdown .jfk-bubble-arrowimplbefore{border-bottom-width:0}.jfk-bubble-arrowdown .jfk-bubble-arrowimplafter{border-bottom-width:0}.jfk-bubble-arrowup .jfk-bubble-arrowimplbefore{border-top-width:0}.jfk-bubble-arrowup .jfk-bubble-arrowimplafter{border-top-width:0;top:1px}.jfk-bubble-arrowleft .jfk-bubble-arrowimplbefore,.jfk-bubble-arrowright .jfk-bubble-arrowimplbefore{border-color:transparent #bbb;top:-9px}.jfk-bubble-arrowleft .jfk-bubble-arrowimplafter,.jfk-bubble-arrowright .jfk-bubble-arrowimplafter{border-color:transparent #fff;top:-8px}.jfk-bubble-arrowleft .jfk-bubble-arrowimplbefore{border-left-width:0}.jfk-bubble-arrowleft .jfk-bubble-arrowimplafter{border-left-width:0;left:1px}.jfk-bubble-arrowright .jfk-bubble-arrowimplbefore{border-right-width:0}.jfk-bubble-arrowright .jfk-bubble-arrowimplafter{border-right-width:0}.appsAddonsHostCompanionPromobubblePromobubblemanagerButton{float:right;margin-top:8px;padding:0}.appsAddonsHostCompanionPromobubblePromobubblemanagerBubble{outline:none}.companion-app-switcher-container .CSS_GSUITE_ADDONS_INSTALLATION_PROMO{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;background-color:#1a73e8;border-radius:8px;border-width:0;box-shadow:0 1px 2px 0 rgba(26,115,232,0.30),0 2px 6px 2px rgba(26,115,232,0.15);font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:.875rem;letter-spacing:.25px;padding:12px 16px 8px;width:288px}.companion-app-switcher-container.companion-app-switcher-container.companion-app-switcher-container .CSS_GSUITE_ADDONS_INSTALLATION_PROMO .jfk-button{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;background:#1a73e8;color:#fff;font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:.875rem;font-weight:500;letter-spacing:.25px;line-height:20px;margin:0 -8px;padding:4px 8px}.CSS_GSUITE_ADDONS_INSTALLATION_PROMO .jfk-button::before{background:#fff;border-radius:4px;content:'';display:block;opacity:0;position:absolute;transform:scale(0);transition-duration:.15s;transition-timing-function:.15s;transition-property:transform,opacity;z-index:-1}.CSS_GSUITE_ADDONS_INSTALLATION_PROMO .jfk-button-disabled{color:rgba(60,64,67,0.38);cursor:default}.CSS_GSUITE_ADDONS_INSTALLATION_PROMO .jfk-button-disabled::before{opacity:0}.CSS_GSUITE_ADDONS_INSTALLATION_PROMO .jfk-button-hover::before{opacity:0.06;transform:scale(1)}.CSS_GSUITE_ADDONS_INSTALLATION_PROMO .jfk-button-focused::before{opacity:0.12}.CSS_GSUITE_ADDONS_INSTALLATION_PROMO .jfk-button-active::before{opacity:0.12}.companion-app-switcher-container .CSS_GSUITE_ADDONS_INSTALLATION_PROMO .jfk-bubble-arrowimplbefore,.companion-app-switcher-container .CSS_GSUITE_ADDONS_INSTALLATION_PROMO .jfk-bubble-arrowimplafter{border-color:transparent #1a73e8}.CSS_GSUITE_ADDONS_TITLE{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;color:#fff;font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:1rem;font-weight:500;line-height:24px;letter-spacing:.25px;margin:0;margin-bottom:4px}.CSS_GSUITE_ADDONS_CONTENT{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;color:rgba(255,255,255,0.902);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:.875rem;letter-spacing:.2px;line-height:20px}.appsAddonsHostGsmAppfindercontainerEl{align-items:center;display:flex;height:100%;justify-content:center;left:0;position:absolute;top:0;width:100%;z-index:6000}.appsAddonsHostGsmAppfindercontainerMask{background:#fff;height:100%;left:0;opacity:0.5;position:absolute;top:0;width:100%}.appsAddonsHostGsmAppfindercontainerContent{border-radius:4px;box-shadow:rgba(0,0,0,0.2) 0px 4px 16px;outline:none;overflow:hidden;position:relative;z-index:0}.appsAddonsHostGsmAppfindercontainerLoadingScreen{align-items:center;background:#fff;display:flex;height:100%;justify-content:center;left:0;position:absolute;top:0;width:100%}.appsAddonsHostGsmAppfindercontainerLoadingScreenCloseBtn{background:transparent;border:0;cursor:pointer;margin:16px;outline:none;padding:0;position:absolute;right:0;top:0}.appsAddonsHostGsmAppfindercontainerLoadingScreenCloseIcon{fill:#000;height:20px;opacity:0.54;width:20px}.CSS_ADD_ONS_SPINNER_CONTAINER{height:44px;overflow:hidden;position:relative;width:100%}.CSS_ADD_ONS_QUANTUM_SPINNER{height:28px;position:absolute;top:8px;width:28px}.CSS_ADD_ONS_QUANTUM_SPINNER.CSS_ADD_ONS_SPINNER_ACTIVE{animation:container-rotate 1568ms linear infinite}.CSS_ADD_ONS_SPINNER_VCENTER{align-self:center}.CSS_ADD_ONS_SPINNER_LAYER{position:absolute;width:100%;height:100%;opacity:0}.CSS_ADD_ONS_SPINNER_BLUE{border-color:#4285f4}.CSS_ADD_ONS_SPINNER_RED{border-color:#db4437}.CSS_ADD_ONS_SPINNER_YELLOW{border-color:#f4b400}.CSS_ADD_ONS_SPINNER_GREEN{border-color:#0f9d58}.CSS_ADD_ONS_SPINNER_ACTIVE .CSS_ADD_ONS_SPINNER_LAYER.CSS_ADD_ONS_SPINNER_BLUE{animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,blue-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both}.CSS_ADD_ONS_SPINNER_ACTIVE .CSS_ADD_ONS_SPINNER_LAYER.CSS_ADD_ONS_SPINNER_RED{animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,red-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both}.CSS_ADD_ONS_SPINNER_ACTIVE .CSS_ADD_ONS_SPINNER_LAYER.CSS_ADD_ONS_SPINNER_YELLOW{animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,yellow-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both}.CSS_ADD_ONS_SPINNER_ACTIVE .CSS_ADD_ONS_SPINNER_LAYER.CSS_ADD_ONS_SPINNER_GREEN{animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,green-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both}.CSS_ADD_ONS_SPINNER_GAP_PATCH{position:absolute;box-sizing:border-box;top:0;width:10%;height:100%;overflow:hidden;border-color:inherit}.CSS_ADD_ONS_SPINNER_GAP_PATCH .CSS_ADD_ONS_SPINNER_CIRCLE{width:1000%}.CSS_ADD_ONS_CIRCLE_CLIPPER{display:inline-block;position:relative;width:50%;height:100%;overflow:hidden;border-color:inherit}.CSS_ADD_ONS_CIRCLE_CLIPPER .CSS_ADD_ONS_SPINNER_CIRCLE{width:200%}.CSS_ADD_ONS_SPINNER_CIRCLE{box-sizing:border-box;height:100%;border-width:3px;border-style:solid;border-color:inherit;border-bottom-color:transparent;border-radius:50%;animation:none}.CSS_ADD_ONS_CIRCLE_CLIPPER.CSS_ADD_ONS_SPINNER_LEFT .CSS_ADD_ONS_SPINNER_CIRCLE{-webkit-transform:rotate(129deg);transform:rotate(129deg)}.CSS_ADD_ONS_CIRCLE_CLIPPER.CSS_ADD_ONS_SPINNER_RIGHT .CSS_ADD_ONS_SPINNER_CIRCLE{-webkit-transform:rotate(-129deg);transform:rotate(-129deg)}.CSS_ADD_ONS_SPINNER_FIT{position:absolute;top:0;bottom:0;right:0;left:0}@keyframes white-fade-in-out{from{opacity:1}25%{opacity:1}26%{opacity:0}89%{opacity:0}90%{opacity:1}100%{opacity:1}}@-webkit-keyframes white-fade-in-out{from{opacity:1}25%{opacity:1}26%{opacity:0}89%{opacity:0}90%{opacity:1}100%{opacity:1}}@keyframes container-rotate{to{transform:rotate(360deg)}}@-webkit-keyframes container-rotate{to{transform:rotate(360deg)}}@keyframes fill-unfill-rotate{12.5%{transform:rotate(135deg)}25%{transform:rotate(270deg)}37.5%{transform:rotate(405deg)}50%{transform:rotate(540deg)}62.5%{transform:rotate(675deg)}75%{transform:rotate(810deg)}87.5%{transform:rotate(945deg)}to{transform:rotate(1080deg)}}@-webkit-keyframes fill-unfill-rotate{12.5%{transform:rotate(135deg)}25%{transform:rotate(270deg)}37.5%{transform:rotate(405deg)}50%{transform:rotate(540deg)}62.5%{transform:rotate(675deg)}75%{transform:rotate(810deg)}87.5%{transform:rotate(945deg)}to{transform:rotate(1080deg)}}@keyframes blue-fade-in-out{from{opacity:1}25%{opacity:1}26%{opacity:0}89%{opacity:0}90%{opacity:1}100%{opacity:1}}@-webkit-keyframes blue-fade-in-out{from{opacity:1}25%{opacity:1}26%{opacity:0}89%{opacity:0}90%{opacity:1}100%{opacity:1}}@keyframes red-fade-in-out{from{opacity:0}15%{opacity:0}25%{opacity:1}50%{opacity:1}51%{opacity:0}}@-webkit-keyframes red-fade-in-out{from{opacity:0}15%{opacity:0}25%{opacity:1}50%{opacity:1}51%{opacity:0}}@keyframes yellow-fade-in-out{from{opacity:0}40%{opacity:0}50%{opacity:1}75%{opacity:1}76%{opacity:0}}@-webkit-keyframes yellow-fade-in-out{from{opacity:0}40%{opacity:0}50%{opacity:1}75%{opacity:1}76%{opacity:0}}@keyframes green-fade-in-out{from{opacity:0}65%{opacity:0}75%{opacity:1}90%{opacity:1}100%{opacity:0}}@-webkit-keyframes green-fade-in-out{from{opacity:0}65%{opacity:0}75%{opacity:1}90%{opacity:1}100%{opacity:0}}.CSS_ADD_ONS_QUANTUM_SPINNER{left:50%;margin-left:-14px}.CSS_ADD_ONS_SPINNER_GAP_PATCH{left:45%}.CSS_ADD_ONS_SPINNER_GAP_PATCH .CSS_ADD_ONS_SPINNER_CIRCLE{left:-450%}.CSS_ADD_ONS_CIRCLE_CLIPPER.CSS_ADD_ONS_SPINNER_LEFT .CSS_ADD_ONS_SPINNER_CIRCLE{border-right-color:transparent}.CSS_ADD_ONS_CIRCLE_CLIPPER.CSS_ADD_ONS_SPINNER_RIGHT .CSS_ADD_ONS_SPINNER_CIRCLE{left:-100%;border-left-color:transparent}.CSS_ADD_ONS_SPINNER_ACTIVE .CSS_ADD_ONS_CIRCLE_CLIPPER.CSS_ADD_ONS_SPINNER_LEFT .CSS_ADD_ONS_SPINNER_CIRCLE{animation:left-spin 1333ms cubic-bezier(0.4,0.0,0.2,1) infinite both}.CSS_ADD_ONS_SPINNER_ACTIVE .CSS_ADD_ONS_CIRCLE_CLIPPER.CSS_ADD_ONS_SPINNER_RIGHT .CSS_ADD_ONS_SPINNER_CIRCLE{animation:right-spin 1333ms cubic-bezier(0.4,0.0,0.2,1) infinite both}@keyframes left-spin{from{transform:rotate(130deg)}50%{transform:rotate(-5deg)}to{transform:rotate(130deg)}}@-webkit-keyframes left-spin{from{transform:rotate(130deg)}50%{transform:rotate(-5deg)}to{transform:rotate(130deg)}}@keyframes right-spin{from{transform:rotate(-130deg)}50%{transform:rotate(5deg)}to{transform:rotate(-130deg)}}@-webkit-keyframes right-spin{from{transform:rotate(-130deg)}50%{transform:rotate(5deg)}to{transform:rotate(-130deg)}}.CSS_ADD_ONS_ELLIPSES{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.add-on-host-container,.add-on-host-content,.add-on-host-failure,.add-on-host-client-not-supported,.add-on-host-loading,.add-on-host-offline{height:100%;width:100%}.add-on-host-container{outline:none;position:relative}.add-on-host-content,.add-on-host-extra-content-container{bottom:0;left:0;outline:none;position:absolute}.add-on-host-content{outline:none;position:absolute}.add-on-host-non-content-wrapper{display:flex;flex-direction:column;height:100%}.add-on-host-non-content-wrapper.isHidden{visibility:hidden}.add-on-host-views-container{flex:1 1 auto;position:relative}.add-on-host-failure,.add-on-host-client-not-supported,.add-on-host-loading,.add-on-host-offline{align-items:center;background:#fff;display:flex;flex-direction:column;justify-content:center;position:absolute;text-align:center}.add-on-host-screen{align-items:center;box-sizing:border-box;display:flex;flex-direction:column;height:100%;justify-content:center;padding:16px;text-align:center;width:100%}.add-on-host-screen-image{width:75px;height:75px}.add-on-host-screen-svg{fill:#5f6368}.add-on-host-screen-primary-message{color:#5f6368;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:16px;font-weight:500;height:48px;letter-spacing:0.2px;line-height:24px;margin:40px 0 0 0}.add-on-host-screen-secondary-message{color:#5f6368;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;height:32px;letter-spacing:0.3px;line-height:16px}.add-on-host-clickable{color:#4285f4;cursor:pointer;font-size:inherit;outline:none;background:transparent;border:none}.add-on-host-retry{bottom:48px;position:absolute;text-transform:uppercase}.add-on-host-loading.add-on-host-loading-hidden{visibility:hidden}.add-on-host-offline-snack-bar{background:#202124;bottom:0;color:#fff;height:112px;position:fixed;transition:transform .218s ease-in-out;width:100%;z-index:99999}.add-on-host-offline-snack-bar.add-on-host-offline-snack-bar-hidden{transform:translate(0,120%)}.add-on-host-offline-snack-bar-content__description{font-family:Roboto,Arial,sans-serif;font-size:14px;letter-spacing:0.2px;line-height:20px;margin:24px 24px 0;vertical-align:top}.add-on-host-offline-snack-bar-content__btn{background:#202124;border:none;color:#fff;cursor:pointer;font-family:Roboto,Arial,sans-serif;font-size:16px;letter-spacing:0.2px;line-height:16px;margin:5px 16px 12px 218px;outline:none;padding:8px;vertical-align:top}.add-on-host-headerbar.companion-shell-header{border:none;height:40px;padding:0 16px}.add-on-host-headerbar .companion-shell-header-element.companion-shell-title-container{line-height:20px}.add-on-host-headerbar .companion-shell-title-text.companion-shell-title-big{font-size:16px}.add-on-host-headerbar .companion-shell-header-element.companion-shell-close-button{align-items:center;display:flex;height:32px;justify-content:center;margin:0;width:32px}.add-on-host-headerbar .companion-shell-header-svg-icon{width:20px;height:20px}.add-on-host-headerbar.companion-shell-header.add-on-host-headerbar-companion-style{height:64px;padding:0 10px}.add-on-host-headerbar.add-on-host-headerbar-companion-style .companion-shell-header-element.companion-shell-close-button{width:40px;height:40px}.docs-material-button{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:box-shadow 0.28s cubic-bezier(0.4,0.0,0.2,1);-moz-transition:box-shadow 0.28s cubic-bezier(0.4,0.0,0.2,1);-o-transition:box-shadow 0.28s cubic-bezier(0.4,0.0,0.2,1);transition:box-shadow 0.28s cubic-bezier(0.4,0.0,0.2,1);border-radius:2px;border:none;cursor:pointer;display:inline-block;font:500 13px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;height:32px;line-height:32px;margin:0 4px;overflow:hidden;outline:none;position:relative;text-align:center;text-transform:uppercase;vertical-align:middle}.docs-material-button-content{position:relative}.docs-material-button-ripple-element{border-radius:50%;left:50%;opacity:0;padding-bottom:200%;position:absolute;top:50%;transition:transform 0s linear 0.2s,opacity 0.2s ease-in;width:200%}.docs-material-button-ripple-effect>.docs-material-button-ripple-element{-webkit-transform:translate(-50%,-50%) scale(1);-moz-transform:translate(-50%,-50%) scale(1);-ms-transform:translate(-50%,-50%) scale(1);-o-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1);opacity:1;transition:transform 0.35s ease-out,opacity 0s linear;visibility:visible}.docs-material-button-disabled{box-shadow:none;cursor:default}.docs-material-button-flat-primary,.docs-material-button-flat-default,.docs-material-button-flat-dark{background-color:transparent;padding:0 8px}.docs-material-button-raised-primary,.docs-material-button-raised-default{padding:0 16px}.docs-material-button-hover.docs-material-button-raised-primary,.docs-material-button-hover.docs-material-button-raised-default{box-shadow:0px 2px 2px 0px rgba(0,0,0,0.14),0px 3px 1px -2px rgba(0,0,0,0.12),0px 1px 5px 0px rgba(0,0,0,0.2)}.docs-material-button-active.docs-material-button-raised-primary,.docs-material-button-active.docs-material-button-raised-default{box-shadow:0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12),0px 2px 4px -1px rgba(0,0,0,0.2)}.docs-material-button-raised-primary{background-color:#4285f4;color:#fff}.docs-material-button-flat-primary{color:#4285f4}.docs-material-button-flat-default{color:rgba(0,0,0,0.54)}.docs-material-button-flat-dark{color:#fff}.docs-material-button-hover.docs-material-button-flat-primary{background-color:rgba(66,133,244,.12)}.docs-material-button-hover.docs-material-button-flat-dark{background-color:rgba(256,256,256,0.1)}.docs-material-button-active.docs-material-button-flat-primary{color:#3367d6}.docs-material-button-raised-primary.docs-material-button-focused{border:1px inset rgba(0,0,0,0.38);background:#3b78e7;line-height:30px;padding:0 15px}.docs-material-button-raised-default.docs-material-button-focused{border:1px solid #4285f4;line-height:30px;padding:0 15px}.docs-material-button-flat-primary.docs-material-button-focused,.docs-material-button-flat-default.docs-material-button-focused{border:1px solid #4285f4;line-height:30px;padding:0 7px}.docs-material-button-flat-dark.docs-material-button-focused{border:1px solid #fff;line-height:30px;padding:0 7px}.docs-material-button.docs-material-button-focused.docs-material-button-no-focus-border{border:none;line-height:32px}.docs-material-button-raised-primary.docs-material-button-focused.docs-material-button-no-focus-border,.docs-material-button-raised-default.docs-material-button-focused.docs-material-button-no-focus-border{padding:0 16px}.docs-material-button-flat-primary.docs-material-button-focused.docs-material-button-no-focus-border,.docs-material-button-flat-default.docs-material-button-focused.docs-material-button-no-focus-border,.docs-material-button-flat-dark.docs-material-button-focused.docs-material-button-no-focus-border{padding:0 8px}.docs-material-button-focused{outline:1px dotted transparent;outline-offset:-4px}.docs-material-button-hover.docs-material-button-flat-default{background-color:rgba(0,0,0,0.12)}.docs-material-button-active.docs-material-button-flat-default{color:rgba(0,0,0,0.87)}.docs-material-button-raised-default{background-color:rgba(0,0,0,.04);color:rgba(0,0,0,0.54)}.docs-material-button-active.docs-material-button-raised-default{color:rgba(0,0,0,0.87)}.docs-material-button-disabled.docs-material-button-flat-primary,.docs-material-button-disabled.docs-material-button-flat-default,.docs-material-button-disabled.docs-material-button-raised-default{background-color:#fff;color:rgba(0,0,0,0.26)}.docs-material-button-disabled.docs-material-button-flat-dark{color:rgba(255,255,255,0.30)}.docs-material-button-disabled.docs-material-button-raised-primary{background-color:rgba(0,0,0,0.12);color:#fff}.docs-material-button-flat-primary>.docs-material-button-ripple-element{background-color:rgba(66,133,244,.32)}.docs-material-button-raised-primary>.docs-material-button-ripple-element{background-color:#3367d6}.docs-material-button-flat-default>.docs-material-button-ripple-element{background-color:rgba(0,0,0,.2)}.docs-material-button-flat-dark>.docs-material-button-ripple-element{background-color:rgba(256,256,256,0.24)}.docs-material-button-raised-default>.docs-material-button-ripple-element{background-color:rgba(0,0,0,0.12)}.docs-material-button-hairline-primary.docs-material-button{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:white;border:1px solid #dadce0!important;color:#188038;text-transform:none}.docs-material-button-hairline-default.docs-material-button{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:white;border:1px solid #dadce0!important;color:#188038;color:#5f6368;text-transform:none}.docs-material-button-hairline-default.docs-material-button-hover,.docs-material-button-hairline-primary.docs-material-button-hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#f8fcf9;border:1px solid #c8e7d1!important}.docs-material-button-hairline-default.docs-material-button-focused,.docs-material-button-hairline-primary.docs-material-button-focused,.docs-material-button-hairline-default.docs-material-button-focused.docs-material-button-no-focus-border,.docs-material-button-hairline-primary.docs-material-button-focused.docs-material-button-no-focus-border{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#e7f5eb;border:1px solid #bbe2c6!important}.docs-material-button-hairline-default.docs-material-button-hover.docs-material-button-focused,.docs-material-button-hairline-primary.docs-material-button-hover.docs-material-button-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#dff2e4;border:1px solid #b5e0c1!important}.docs-material-button-hairline-default.docs-material-button-active,.docs-material-button-hairline-primary.docs-material-button-active{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#dff2e4;border:1px solid transparent!important;box-shadow:0 2px 6px 2px rgba(60,64,67,.15)}.docs-material-button-hairline-default.docs-material-button-disabled,.docs-material-button-hairline-primary.docs-material-button-disabled{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:white;border:1px solid #f1f3f4!important;color:#3c4043;opacity:0.38}.docs-material-button-fill-primary.docs-material-button{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff}.docs-material-button-fill-primary.docs-material-button-hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#2a8947;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15)}.docs-material-button-fill-primary.docs-material-button-focused,.docs-material-button-fill-primary.docs-material-button-focused.docs-material-button-no-focus-border{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#4f9e67;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15)}.docs-material-button-fill-primary.docs-material-button-hover.docs-material-button-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#62a877;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15)}.docs-material-button-fill-primary.docs-material-button-active{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#62a877;box-shadow:0 2px 6px 2px rgba(52,168,83,0.15)}.docs-material-button-fill-primary.docs-material-button-disabled{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#f1f3f4;color:#3c4043;opacity:0.38}div.CSS_SHORTCUTS_HELP_POPUP{left:10%;width:80%;top:10%;z-index:1002;color:#fff;position:fixed;text-align:center;text-shadow:#000 1px 1px 7px;font-weight:bold;background:#000 none repeat scroll 0;overflow:hidden}@media print{div.CSS_SHORTCUTS_HELP_POPUP{display:none!important}}div.CSS_SHORTCUTS_HELP_POPUP_CONTAINER{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;max-height:inherit;overflow:auto;padding:1em}table.CSS_SHORTCUTS_HELP_POPUP_HEADER,table.CSS_SHORTCUTS_HELP_POPUP_CONTENT{width:100%}.CSS_SHORTCUTS_HELP_POPUP_HEADER_TABLE_ELEMENT{padding-bottom:0.8ex}.CSS_SHORTCUTS_HELP_POPUP_TITLE{font-size:15px;white-space:nowrap;text-align:left}.CSS_SHORTCUTS_HELP_POPUP_TEAROFF_LINK_CONTAINER{color:#dd0;text-align:right}.CSS_SHORTCUTS_HELP_POPUP_TEAROFF_LINK_WRAPPER{position:absolute;top:0;right:0;padding-right:32px;padding-top:16px}.CSS_SHORTCUTS_HELP_CLOSE_PLACEHOLDER{height:11px;width:11px;padding:6px;margin:24px}.CSS_SHORTCUTS_HELP_POPUP_TEAROFF_LINK{font-size:15px;cursor:pointer;text-decoration:underline;color:#dd0}table.CSS_SHORTCUTS_HELP_POPUP_CONTENT{border-top:1px solid #999;font-size:13px}.CSS_SHORTCUTS_HELP_POPUP_CONTENT_HEADER{color:#dd0;padding-top:1em;text-align:left}.CSS_SHORTCUTS_HELP_POPUP_CONTENT_ELEMENT{vertical-align:top;padding-top:0.15em}table.CSS_SHORTCUTS_HELP_POPUP_CONTENT td.CSS_SHORTCUTS_HELP_POPUP_KEY{font-weight:bold;padding-right:0.5em;text-align:right;white-space:nowrap}table.CSS_SHORTCUTS_HELP_POPUP_CONTENT td.CSS_SHORTCUTS_HELP_POPUP_DESCRIPTION{font-weight:normal;text-align:left}span.CSS_SHORTCUTS_HELP_POPUP_KEY_MNEMONIC{font-family:"Courier New";color:#dd0}.CSS_SHORTCUTS_HELP_POPUP_PREF_CONTAINER{border-top:1px solid #999;padding:.5em 0}.CSS_SHORTCUTS_HELP_POPUP_PREF_CONTENT{background:#dd0;color:#000;padding:3px 7px;text-align:left;font-size:13px;text-shadow:none}.CSS_SHORTCUTS_HELP_POPUP_PREF_ENABLED .CSS_SHORTCUTS_HELP_POPUP_PREF_CONTENT{background:none;color:#fff}.CSS_SHORTCUTS_HELP_POPUP_PREF_LINK{cursor:pointer;text-decoration:underline}.CSS_SHORTCUTS_HELP_POPUP_PREF_ENABLED .CSS_SHORTCUTS_HELP_POPUP_PREF_LINK{color:#dd0}.shortcuts-modalpopup-bg{display:none;left:0;top:0;position:absolute}.docs-save-indicator:not(:active):not(.docs-titlebar-badge-selected) .docs-icon-sync{opacity:0.63}.docs-gm .docs-save-indicator-caption{font-size:12px;padding-left:3px;padding-right:5px;vertical-align:middle}.docs-save-indicator.docs-titlebar-badge.docs-save-indicator-unsaved-changes,.docs-save-indicator.docs-titlebar-badge.docs-save-indicator-unsaved-changes.docs-titlebar-badge-selected{background-color:#fce8e6;color:#d93025}.docs-save-indicator.docs-titlebar-badge.docs-save-indicator-unsaved-changes:hover{background-color:#fadfdd;color:#d93025}.docs-save-indicator.docs-titlebar-badge.docs-save-indicator-unsaved-changes:active,.docs-save-indicator.docs-titlebar-badge.docs-save-indicator-unsaved-changes.docs-save-indicator-selected{background-color:#f5cfce;color:#d93025}.docs-save-indicator-popup{max-width:420px;min-width:320px}.docs-save-indicator-popup.jfk-bubble{outline:none;padding-left:35px}.docs-save-indicator-popup .jfk-bubble-arrow{display:none}.docs-gm .docs-save-indicator-popup-header{background-color:#e6f4ea;min-height:40px;padding:0}.docs-gm .docs-save-indicator-popup-footer{padding:12px 16px 12px 16px}.docs-gm .docs-save-indicator-popup-title-container{align-items:center;display:flex;min-height:inherit;padding:0 16px}.docs-material .docs-save-indicator-popup-title{color:#188038;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;margin:10px 0;width:fit-content}.docs-gm .docs-save-indicator-popup-subtitle-container{padding:0 0 12px}.docs-gm .docs-material .docs-save-indicator-popup-icon,.docs-gm .docs-material .docs-save-indicator-popup-subtitle-icon{height:24px;margin-right:10px;min-width:24px}.docs-save-indicator-popup-subtitle{color:#3c4043;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:500}.docs-save-indicator-popup-text{color:#3c4043;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;line-height:16px;max-width:fit-content;padding:0 0 12px}.docs-gm .docs-save-indicator-popup.jfk-bubble{border:0;border-radius:4px;overflow:hidden;padding:0;z-index:903!important}.docs-save-indicator-popup .docs-save-indicator-popup-button.docs-material-button-fill-primary.docs-material-button{align-items:center;display:flex;height:24px;margin-bottom:12px;margin-left:0;padding:0 12px;text-transform:none;width:fit-content}.docs-save-indicator-unsaved-changes .docs-save-indicator-popup-header{background-color:#fce8e6}.docs-save-indicator-unsaved-changes .docs-save-indicator-popup-title{color:#d93025}.docs-save-indicator-popup-button-container{align-items:baseline;display:flex}.docs-save-indicator-popup-shortcut{color:#5f6368;font-weight:bold;font-size:12px;padding-left:10px}.docs-save-indicator-popup.docs-save-indicator-unsaved-changes .docs-material-button.docs-save-indicator-popup-button{background-color:#d93025;color:white}.docs-save-indicator-popup.docs-save-indicator-unsaved-changes .docs-material-button.docs-save-indicator-popup-button.docs-material-button-hover,.docs-save-indicator-popup.docs-save-indicator-unsaved-changes .docs-material-button.docs-save-indicator-popup-button.docs-material-button-focused{background-color:#db4036;box-shadow:0 1px 3px 1px rgba(0,0,0,0.05)}.docs-save-indicator-popup.docs-save-indicator-unsaved-changes .docs-material-button.docs-save-indicator-popup-button.docs-material-button-active{background-color:#e5716a}.docs-save-indicator-popup.docs-save-indicator-unsaved-changes .docs-material-button.docs-save-indicator-popup-button.docs-material-button-disabled{background-color:#f1f3f4;color:#3c4043}.jfk-bubble.jfk-bubble-promo.docs-promo-bubble.docs-save-indicator-promo{background-color:#188038;border-radius:8px;box-shadow:0 2px 6px 2px rgba(26,115,232,0.15);margin-top:4px;width:262px}.docs-save-indicator-promo .docs-promo-container{padding:16px}.jfk-bubble.jfk-bubble-promo.docs-promo-bubble.docs-save-indicator-promo .jfk-bubble-arrowup .jfk-bubble-arrowimplbefore{border-color:transparent}.jfk-bubble.jfk-bubble-promo.docs-promo-bubble.docs-save-indicator-promo .jfk-bubble-arrowup .jfk-bubble-arrowimplafter{border-color:#188038 transparent}.docs-save-indicator-promo .docs-promo-text-container{width:auto}.docs-save-indicator-promo .docs-promo-header{color:#fff;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:16px;font-weight:500;opacity:1}.docs-save-indicator-promo .docs-promo-body{color:#fff;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;padding:4px 0}.docs-save-indicator-promo .docs-promo-action-container{color:#fff;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;margin:0 0 0 20px;text-transform:none}.docs-save-indicator-promo .docs-promo-action-container:focus{outline-color:#fff}.docs-save-indicator-promo .docs-promo-action-row{padding:0}.encrypted-doc-toast.docs-ui-toast{min-width:initial}.encrypted-doc-toast.docs-ui-toast .docs-ui-toast-content{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.encrypted-doc-toast.docs-ui-toast .docs-ui-toast-control-bar{display:none}.docs-companion-app-switcher-container{background-color:white;border-top:1px solid #d9d9d9;box-sizing:border-box;height:calc(100% - 60px);position:absolute;right:0;top:60px;width:56px;z-index:1}.docs-companion-app-switcher-container.docs-companion-app-switcher-container-collapsed{width:0;z-index:1001}.docs-material.docs-companion-app-switcher-container{height:calc(100% - 64px);top:64px}.docs-material.docs-companion-app-switcher-container.docs-companion-app-switcher-container-collapsed{width:0}.docs-companion-app-switcher-container.docs-app-switcher-container-hidden{display:none}.docs-companion-sidebar{box-shadow:0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12),0px 2px 4px -1px rgba(0,0,0,0.2);height:100%;outline:none;overflow:hidden;position:absolute;right:0;top:0;width:300px;z-index:901}.goog-custom-button{margin:2px;border:0;padding:0;font-family:Arial,sans-serif;color:#000;background:#ddd url(//ssl.gstatic.com/editor/button-bg.png) repeat-x top left;text-decoration:none;list-style:none;vertical-align:middle;cursor:default;outline:none}.goog-custom-button-outer-box,.goog-custom-button-inner-box{border-style:solid;border-color:#aaa;vertical-align:top}.goog-custom-button-outer-box{margin:0;border-width:1px 0;padding:0}.goog-custom-button-inner-box{margin:0 -1px;border-width:0 1px;padding:3px 4px;white-space:nowrap}* html .goog-custom-button-inner-box{left:-1px}* html .goog-custom-button-rtl .goog-custom-button-outer-box{left:-1px}* html .goog-custom-button-rtl .goog-custom-button-inner-box{right:auto}*:first-child+html .goog-custom-button-inner-box{left:-1px}*:first-child+html .goog-custom-button-rtl .goog-custom-button-inner-box{left:1px}::root .goog-custom-button,::root .goog-custom-button-outer-box{line-height:0}::root .goog-custom-button-inner-box{line-height:normal}.goog-custom-button-disabled{background-image:none!important;opacity:0.3;-moz-opacity:0.3;filter:alpha(opacity=30)}.goog-custom-button-disabled .goog-custom-button-outer-box,.goog-custom-button-disabled .goog-custom-button-inner-box{color:#333!important;border-color:#999!important}* html .goog-custom-button-disabled{margin:2px 1px!important;padding:0 1px!important}*:first-child+html .goog-custom-button-disabled{margin:2px 1px!important;padding:0 1px!important}.goog-custom-button-hover .goog-custom-button-outer-box,.goog-custom-button-hover .goog-custom-button-inner-box{border-color:#9cf #69e #69e #7af!important}.goog-custom-button-active,.goog-custom-button-checked{background-color:#bbb;background-position:bottom left}.goog-custom-button-focused .goog-custom-button-outer-box,.goog-custom-button-focused .goog-custom-button-inner-box{border-color:orange}.goog-custom-button-collapse-right,.goog-custom-button-collapse-right .goog-custom-button-outer-box,.goog-custom-button-collapse-right .goog-custom-button-inner-box{margin-right:0}.goog-custom-button-collapse-left,.goog-custom-button-collapse-left .goog-custom-button-outer-box,.goog-custom-button-collapse-left .goog-custom-button-inner-box{margin-left:0}.goog-custom-button-collapse-left .goog-custom-button-inner-box{border-left:1px solid #fff}.goog-custom-button-collapse-left.goog-custom-button-checked .goog-custom-button-inner-box{border-left:1px solid #ddd}* html .goog-custom-button-collapse-left .goog-custom-button-inner-box{left:0}*:first-child+html .goog-custom-button-collapse-left .goog-custom-button-inner-box{left:0}.goog-flat-button{position:relative;margin:2px;border:1px solid #000;padding:2px 6px;font:normal 13px "Trebuchet MS",Tahoma,Arial,sans-serif;color:#fff;background-color:#8c2425;cursor:pointer;outline:none}.goog-flat-button-disabled{border-color:#888;color:#888;background-color:#ccc;cursor:default}.goog-flat-button-hover{border-color:#8c2425;color:#8c2425;background-color:#eaa4a5}.goog-flat-button-active,.goog-flat-button-selected,.goog-flat-button-checked{border-color:#5b4169;color:#5b4169;background-color:#d1a8ea}.goog-flat-button-focused{border-color:#5b4169}.goog-flat-button-collapse-right{margin-right:0}.goog-flat-button-collapse-left{margin-left:0;border-left:none}.goog-button{color:#036;border-color:#036;background-color:#69c}.goog-button-disabled{border-color:#333;color:#333;background-color:#999}.goog-button-hover{color:#369;border-color:#369;background-color:#9cf}.goog-button-active{color:#69c;border-color:#69c}.goog-clipboard{width:16px;height:16px;background:url(//ssl.gstatic.com/docs/clipboard/icons3.png) no-repeat;vertical-align:middle}.goog-cbi1{background-position:-16px}.goog-cbi2{background-position:-32px}.goog-cbi3{background-position:-48px}.goog-cbi4{background-position:-64px}.goog-cbi5{background-position:-80px}.goog-menu-button{background:#ddd url(//ssl.gstatic.com/editor/button-bg.png) repeat-x top left;border:0;color:#000;cursor:pointer;list-style:none;margin:2px;outline:none;padding:0;text-decoration:none;vertical-align:middle}.goog-menu-button-outer-box,.goog-menu-button-inner-box{border-style:solid;border-color:#aaa;vertical-align:top}.goog-menu-button-outer-box{margin:0;border-width:1px 0;padding:0}.goog-menu-button-inner-box{margin:0 -1px;border-width:0 1px;padding:3px 4px}* html .goog-menu-button-inner-box{left:-1px}* html .goog-menu-button-rtl .goog-menu-button-outer-box{left:-1px;right:auto}* html .goog-menu-button-rtl .goog-menu-button-inner-box{right:auto}*:first-child+html .goog-menu-button-inner-box{left:-1px}*:first-child+html .goog-menu-button-rtl .goog-menu-button-inner-box{left:1px;right:auto}::root .goog-menu-button,::root .goog-menu-button-outer-box,::root .goog-menu-button-inner-box{line-height:0}::root .goog-menu-button-caption,::root .goog-menu-button-dropdown{line-height:normal}.goog-menu-button-disabled{background-image:none!important;opacity:0.3;-moz-opacity:0.3;filter:alpha(opacity=30)}.goog-menu-button-disabled .goog-menu-button-outer-box,.goog-menu-button-disabled .goog-menu-button-inner-box,.goog-menu-button-disabled .goog-menu-button-caption,.goog-menu-button-disabled .goog-menu-button-dropdown{color:#333!important;border-color:#999!important}* html .goog-menu-button-disabled{margin:2px 1px!important;padding:0 1px!important}*:first-child+html .goog-menu-button-disabled{margin:2px 1px!important;padding:0 1px!important}.goog-menu-button-hover .goog-menu-button-outer-box,.goog-menu-button-hover .goog-menu-button-inner-box{border-color:#9cf #69e #69e #7af!important}.goog-menu-button-active,.goog-menu-button-open{background-color:#bbb;background-position:bottom left}.goog-menu-button-focused .goog-menu-button-outer-box,.goog-menu-button-focused .goog-menu-button-inner-box{border-color:orange}.goog-menu-button-caption{padding:0 4px 0 0;vertical-align:top}.goog-menu-button-dropdown{height:15px;width:7px;background:url(//ssl.gstatic.com/editor/editortoolbar.png) no-repeat -388px 0;vertical-align:top}.goog-menu-button-collapse-right,.goog-menu-button-collapse-right .goog-menu-button-outer-box,.goog-menu-button-collapse-right .goog-menu-button-inner-box{margin-right:0}.goog-menu-button-collapse-left,.goog-menu-button-collapse-left .goog-menu-button-outer-box,.goog-menu-button-collapse-left .goog-menu-button-inner-box{margin-left:0}.goog-menu-button-collapse-left .goog-menu-button-inner-box{border-left:1px solid #fff}.goog-menu-button-collapse-left.goog-menu-button-checked .goog-menu-button-inner-box{border-left:1px solid #ddd}.goog-submenu-arrow{color:#000;left:auto;padding-right:6px;position:absolute;right:0;text-align:right}.goog-menuitem-rtl .goog-submenu-arrow{text-align:left;left:0;right:auto;padding-left:6px}.goog-menuitem-disabled .goog-submenu-arrow{color:#ccc}.a11y-settings-dialog{min-width:464px}.a11y-settings-dialog ul,.a11y-settings-dialog li{list-style:none;padding:0;margin:0}.a11y-settings-dialog .a11y-settings-dialog-indent-group{margin-left:30px}.a11y-settings-dialog .a11y-settings-dialog-learn-more{margin-top:8px}.a11y-settings-dialog .a11y-settings-dialog-description-text{margin-right:2px}.a11y-settings-dialog a,.a11y-settings-dialog a:hover,.a11y-settings-dialog a:visited,.a11y-settings-dialog a:focus,.a11y-settings-dialog a:active{color:#1a73e8}.a11y-settings-dialog .docs-material-gm-labeled-checkbox-description a{padding:3px 0}.a11y-settings-dialog a .docs-icon{pointer-events:none}.a11y-settings-dialog .docs-material-gm-dialog-buttons{padding-top:0}.activity-deck,.activity-deck-events-view{height:100%}.activity-list-container{background-color:#fff;font-family:Roboto,arial,sans-serif;font-size:13px;height:100%;position:relative}.activity-list{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;height:100%;overflow-y:scroll;position:relative;z-index:0}.activity-refresh-header{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background-color:#eee;height:0;overflow:hidden;padding-right:16px;position:absolute;top:0;width:100%;z-index:2}.activity-refresh-header .goog-inline-block.goog-flat-button{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 1px rgba(0,0,0,0.1);box-shadow:0 1px 1px rgba(0,0,0,0.1);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background-color:white;color:#15c;cursor:pointer;height:35px;line-height:35px;text-align:center;width:100%}.activity-list-static-header{box-sizing:border-box;left:0;overflow:hidden;padding-bottom:12px;position:absolute;right:16px;top:0;width:auto;z-index:1}.activity-list-loading{font-size:14px;font-weight:normal;margin-top:16px;text-align:center;width:100%}.activity-list-loading .drive-white-circle{display:none}.activity-list-loading-more.activity-list-loading{font-size:12px;font-weight:normal;margin-top:0;padding-bottom:8px}.activity-list-loading-more.activity-list-loading .activity-list-loading-icon,.activity-list-loading-more.activity-list-loading .activity-list-loading-icon img,.activity-list-loading-more.activity-list-loading .activity-list-loading-message{display:inline-block;vertical-align:middle}.activity-list-loading-more.activity-list-loading .activity-list-loading-message{margin-left:8px;padding-left:14px;padding-top:6px}.activity-list-no-activity{font-size:13px;margin-top:16px;text-align:center;width:100%}.activity-event.activity-event-new{background-color:#ffffd6}.activity-event.activity-event-background-transition{-webkit-transition:background-color 1000ms ease-in;-moz-transition:background-color 1000ms ease-in;-o-transition:background-color 1000ms ease-in;transition:background-color 1000ms ease-in}.activity-list-no-more-events-icon{display:inline-block;margin-bottom:10px}.activity-event{background-color:#fff;border-bottom:1px solid #dadce0;margin:0 0 12px;padding:0 0 12px;position:relative;width:100%}.activity-event>div:first-child{line-height:20px;padding:16px 0}.activity-event-action-icon{height:16px;padding:8px 4px;position:absolute;width:16px}.activity-event-available-action{border-top:1px solid #efefef;margin-left:24px;margin-top:16px;padding-top:16px}.activity-event-action-link-active{color:#4a4a4a;padding:0;position:relative}.activity-event-action-link-active svg{fill:#4a4a4a}.activity-event-action-link-active:focus,.activity-event-action-link-active:hover{color:#4285f4;cursor:pointer}.activity-event-action-link-active:focus svg,.activity-event-action-link-active:hover svg{fill:#4285f4}.activity-event-action-link-used{color:#ccc}.activity-event-action-link-used svg{fill:#ccc}.activity-event-action-text{font-weight:500;text-transform:uppercase}.activity-event-action-text-active{margin-left:32px;padding:8px 0}.activity-event-action-text-used{padding:8px 4px}.activity-list-error,.activity-list-no-more-events.activity-list-no-events{margin-bottom:20px;margin-top:10px;text-align:center}.activity-list-error-icon{display:inline-block;height:24px;margin-bottom:-5px;margin-right:20px;position:relative;width:24px}.activity-list-error-icon svg{bottom:0;position:absolute}.activity-list-events{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text}.activity-list-no-more-events{color:#5f6368;padding:0 24px 0 16px;text-align:left}.activity-list-no-more-events-text{color:#5f6368;font-size:13px;font-weight:normal;margin-bottom:0}.activity-list-no-more-events-description,.activity-list-no-more-events-learn-more{line-height:20px;margin:0;padding:14px 0}.activity-decorated-link{color:#15c;cursor:pointer;outline:none;text-decoration:none}.activity-decorated-link:focus,.activity-decorated-link:hover{text-decoration:underline}.activity-decorated-link:active{color:#d14836}.activity-list-error-try-again{color:#15c;cursor:pointer;outline:none;text-decoration:none}.activity-list-error-try-again:focus,.activity-list-error-try-again:hover,.activity-list-error-try-again .goog-flat-button-hover,.activity-list-error-try-again .goog-flat-button-focus{text-decoration:underline}.activity-list-error-try-again:active{color:#d14836}.activity-list-show-more,.activity-paging-footer-show-more .goog-flat-button{display:block;height:0;margin:0 5px;overflow:hidden}.activity-event-focus{outline:1px solid #4d90fe}.activity-hideable-focus-hidden .activity-event.activity-event-focus{outline:none}.activity-event-person{height:40px;left:16px;position:absolute;width:40px}.activity-event-person img{border-radius:50%;height:100%;width:100%}.activity-event-background svg{border-radius:50%;height:40px;width:40px}.activity-event-person-overlay{left:0;position:absolute;right:0;top:0}.activity-event-admin-icon svg{opacity:0.5}.activity-event-person-icon svg{margin-top:9px}.activity-event-admin-icon.activity-event-person-icon svg{margin-top:7px}.activity-event-drive-icon svg{margin-top:8px}.activity-event-person .activity-event-person-icon-container{border-radius:50%;height:40px;overflow:hidden;text-align:center;width:40px}.activity-event-admin-icon-container{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border:2px solid rgba(0,0,0,0.2)}.activity-event-person-icon-text{color:#fff;font-size:16px;line-height:40px;vertical-align:middle}.activity-event-header{margin-left:56px;padding:0 24px 0 16px}.activity-event-details-header{color:#5f6368;font-size:13px;width:auto}.activity-event-details-container{color:#5f6368;font-size:13px;font-weight:500;margin-top:4px}.activity-event-target-list{padding-left:72px}.activity-event-file-approval,.activity-event-people-names{color:#202124;font-weight:500}.activity-event-approval-status{margin-top:4px;font-weight:500}.activity-event-approval-approved{color:#0f9d58}.activity-event-approval-rejected{color:#db4437}.activity-event-action{font-weight:normal}.activity-event-action::before{content:" "}.activity-event-target-number{font-weight:bold}.activity-event-copy-action{font-weight:bold}.activity-event-target-icon{height:16px;position:absolute;width:24px}.activity-event-target.activity-event-target-first{border-top:none}.activity-event-target-icon .drive-shortcut-icon{bottom:2px;left:-4px;position:absolute}.activity-event-target{position:relative}.activity-event-parent{border-bottom:1px solid #efefef;margin-left:72px}.activity-event-target-details{margin-left:32px}.activity-event-target-details.activity-event-locatable-target{margin-right:24px}.activity-event-target-name{font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.activity-list-hidden-text{height:0;overflow:hidden;white-space:nowrap;width:0}.activity-event-target:hover,.activity-event-target:active,.activity-event-target:focus{background-color:#fff}.activity-event-target-name.activity-event-openable-target:hover,.activity-event-target-name.activity-event-openable-target:active,.activity-event-target-name.activity-event-openable-target:focus,.activity-event-target-name .activity-event-openable-target:hover,.activity-event-target-name .activity-event-openable-target:active,.activity-event-target-name .activity-event-openable-target:focus{color:#5f6368;cursor:pointer;outline:none;text-decoration:underline}.activity-event-scopes-show-more-button,.activity-event-scopes-show-less-button{display:flex;margin-left:24px}.activity-event-show-more-button,.activity-event-show-less-button{display:flex;margin-left:6px}.activity-event-toggle-button{border:1px solid transparent;border-radius:4px;box-shadow:none;box-sizing:border-box;color:#4285f4;cursor:pointer;font-family:Google Sans,QUANTUM_FONT_FAMILY;font-size:13px;font-weight:500;height:36px;letter-spacing:0.25px;line-height:16px;outline:none;margin-top:4px;padding:9px 24px 11px 24px}.activity-event-toggle-button-hover{background-color:rgba(66,133,244,.04)}.activity-event-toggle-button-focused{background-color:#e8f0fe}.activity-event-toggle-button-hover.activity-event-toggle-button-focused{background-color:rgba(66,133,244,0.16)}.activity-event-toggle-button-active{background-color:rgba(66,133,244,0.16);box-shadow:0 1px 2px 0 rgba(60,64,67,0.30),0 1px 3px 1px rgba(60,64,67,0.15)}.activity-event-focus .activity-event-toggle-button .activity-event-toggle-button-icon,.activity-event:hover .activity-event-toggle-button .activity-event-toggle-button-icon{visibility:visible}.activity-event:hover .activity-event-toggle-button{cursor:pointer}.activity-event-children{margin-left:24px}.activity-event-target-icon,.activity-event-target-details{padding:7px 0 6px}.activity-event-target-icon-img{max-height:16px;max-width:16px;padding:0 4px}.activity-event-section-title{background-color:#fff;border-bottom:1px solid #dadce0;color:#5f6368;font-size:13px;font-weight:500;line-height:48px;margin:0;padding:0 24px 0 16px;position:relative;transition:box-shadow 267ms cubic-bezier(0.4,0.0,0.2,1)}.activity-event-annotation{color:#5f6368;display:inline;float:right;font-size:12px;font-weight:normal;padding-right:16px;padding-top:0;position:relative}.activity-event-source{display:inline-block;max-width:136px;overflow:hidden;text-overflow:ellipsis;vertical-align:top;white-space:nowrap}.activity-event-info{color:#5f6368;padding-bottom:12px}.activity-event-timestamp{padding:0 16px 0 16px;display:inline}.activity-event-target-parent{color:#bababa;font-size:13px}.activity-event-target-parent.activity-event-openable-target:hover,.activity-event-target-parent.activity-event-openable-target:active,.activity-event-target-parent.activity-event-openable-target:focus{color:#00992c;cursor:pointer;outline:none}.activity-event-locate{height:32px;outline:none;position:absolute;right:3px;top:0;width:24px}.activity-event-locate svg{filter:alpha(opacity=0);opacity:0;margin-left:2px;margin-top:5px}.activity-event-locate:hover,.activity-event-locate:active,.activity-event-locate:focus,.activity-event-target:hover .activity-event-locate:hover,.activity-event-target:active .activity-event-locate:active,.activity-event-target:focus .activity-event-locate:focus{cursor:pointer}.activity-event-locate:hover svg,.activity-event-locate:active svg,.activity-event-locate:focus svg,.activity-event-target:hover .activity-event-locate:hover svg,.activity-event-target:active .activity-event-locate:active svg,.activity-event-target:focus .activity-event-locate:focus svg{filter:alpha(opacity=72);opacity:.72;cursor:pointer}.activity-event-target:hover .activity-event-locate svg,.activity-event-target:active .activity-event-locate svg,.activity-event-target:focus .activity-event-locate svg{filter:alpha(opacity=55);opacity:.55}.activity-event-user-deletion-overlay svg{margin-top:4px}.activity-list .drive-spinner{height:40px}.activity-entry-empty-trash-targets .activity-event-target-name{text-decoration:line-through}.activity-event-rename-old-title{color:#ccc;margin-top:8px;overflow:hidden;text-decoration:line-through;text-overflow:ellipsis;white-space:nowrap}.activity-event-scope-change-detail.activity-event-scope-change-detail-first{border-top:none}.activity-event-scope-change-detail{position:relative;padding:2px 0}.activity-event-scope-icon{border-radius:50%;display:inline-block;overflow:hidden;padding:0;position:relative;vertical-align:middle;z-index:1}.activity-event-scope-icon img{-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;height:24px;vertical-align:middle;width:24px}.activity-event-scope-icon-container .activity-event-scope-svg-icon{left:2px;position:absolute;top:2px}.activity-event-scope-background svg{-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;height:24px;width:24px}.activity-event-scope-icon .activity-event-scope-icon-container{height:24px;text-align:center;width:24px}.activity-event-scope-icon-text{color:#fff;height:24px;left:0;line-height:24px;position:absolute;top:0;width:24px}.activity-event-scope-element{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;font-weight:lighter;padding-left:48px;width:100%}.activity-event-scope-element-access{color:#5f6368;font-size:13px;float:right;padding-left:8px}.activity-event-scope-element-text{color:#5f6368;font-weight:500}.activity-event-scope-detail-unshared .activity-event-scope-element-text,.activity-event-scope-detail-unshared .activity-event-scope-detail-ba-display-name{text-decoration:line-through}.activity-event-scope-detail-icon-container{display:inline-block;line-height:normal;vertical-align:middle;width:0}.activity-event-scope-detail-unshared{filter:alpha(opacity=50);opacity:0.5}.activity-event-scope-detail-content-container{display:inline-block;line-height:normal;vertical-align:middle;width:100%}.activity-event-scopes-list{margin-top:12px;position:relative;padding:0 24px}.activity-event-scope-detail-ba-container{display:inline-block;margin-left:48px;vertical-align:middle}.activity-event-scope-detail-ba-display-name{color:#202124;font-weight:500}.activity-event-scope-detail-ba-subtext{color:#5f6368;font-size:13px}.activity-team-drive-setting-events{padding-top:10px}.activity-team-drive-setting-detail{display:flex;padding-left:35px}.activity-team-drive-setting-detail:not(:last-child){padding-bottom:10px}.activity-team-drive-setting-description{display:inline-block;font-weight:normal;padding-left:20px}.docs-tabbar{clear:left;display:flex;flex-direction:row;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;float:left;-webkit-justify-content:left;justify-content:left;outline:none}.docs-tabbar-tab{-ms-flex-align:center;-moz-box-align:center;-webkit-box-align:center;box-align:center;-webkit-align-items:center;align-items:center;border-bottom:2px solid transparent;border-top:2px solid transparent;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;cursor:pointer;display:flex;height:48px;box-pack:center;-ms-flex-pack:center;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center;max-width:264px;min-width:72px;padding:0px 24px}.docs-tabbar-tab-selected{border-bottom:2px solid #fff}.docs-hc-edge.docs-tabbar-tab.docs-tabbar-tab-selected .docs-tabbar-tablabel,.docs-hc-gecko.docs-tabbar-tab.docs-tabbar-tab-selected .docs-tabbar-tablabel,.docs-hc-ie.docs-tabbar-tab.docs-tabbar-tab-selected .docs-tabbar-tablabel{border-bottom:2px solid #fff;padding-bottom:0px}.docs-hc-edge.docs-tabbar-tab .docs-tabbar-tablabel,.docs-hc-gecko.docs-tabbar-tab .docs-tabbar-tablabel,.docs-hc-ie.docs-tabbar-tab .docs-tabbar-tablabel{padding-bottom:2px}.docs-tabbar-focused .docs-tabbar-tab-selected{background:rgba(255,255,255,0.12)}.docs-tabbar-mouseactive .docs-tabbar-tab{background:transparent}.docs-tabbar .docs-tabbar-tab-active{background:rgba(255,255,255,0.25)}.docs-tabbar-tablabel{color:rgba(255,255,255,0.7);font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;overflow:hidden;text-overflow:ellipsis;text-transform:uppercase;white-space:nowrap}.docs-tabbar-tab-selected .docs-tabbar-tablabel{color:#fff}div.docs-material-gm-checkbox,span.docs-material-gm-checkbox{border:2px solid #5f6368;border-radius:2px;box-sizing:border-box;cursor:pointer;height:18px;margin:1px;outline:none;flex-shrink:0;top:4px;width:18px;display:inline-block;vertical-align:middle}div.docs-material-gm-checkbox-checked,span.docs-material-gm-checkbox-checked,div.docs-material-gm-checkbox-undetermined,span.docs-material-gm-checkbox-undetermined{background-color:#188038;border:2px solid #188038}div.docs-material-gm-checkbox-checked:before,span.docs-material-gm-checkbox-checked:before{content:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmVyc2lvbj0iMS4xIgogICB2aWV3Qm94PSIwIDAgMSAxIgogICBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWluWU1pbiBtZWV0Ij4KICA8cGF0aAogICAgIGQ9Ik0gMC4wNDAzODA1OSwwLjYyNjc3NjcgMC4xNDY0NDY2MSwwLjUyMDcxMDY4IDAuNDI5Mjg5MzIsMC44MDM1NTMzOSAwLjMyMzIyMzMsMC45MDk2MTk0MSB6IE0gMC4yMTcxNTcyOSwwLjgwMzU1MzM5IDAuODUzNTUzMzksMC4xNjcxNTcyOSAwLjk1OTYxOTQxLDAuMjczMjIzMyAwLjMyMzIyMzMsMC45MDk2MTk0MSB6IgogICAgIGlkPSJyZWN0Mzc4MCIKICAgICBzdHlsZT0iZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgo8L3N2Zz4K");display:block;line-height:15px}div.docs-material-gm-checkbox-undetermined:before,span.docs-material-gm-checkbox-undetermined:before{border-top:2px solid white;content:'';display:block;height:0;margin-left:3px;margin-top:6px;width:8px}div.docs-material-gm-checkbox-focused,span.docs-material-gm-checkbox-focused{border:2px solid #188038}div.docs-material-gm-checkbox-disabled,span.docs-material-gm-checkbox-disabled{cursor:default;opacity:.38}div.docs-material-gm-checkbox-disabled.docs-material-gm-checkbox-checked,span.docs-material-gm-checkbox-disabled.docs-material-gm-checkbox-checked{background-clip:padding-box;background-color:#5f6368;border-color:#5f6368;opacity:.38}div.docs-material-gm-checkbox-checked.docs-material-gm-checkbox-focused,span.docs-material-gm-checkbox-checked.docs-material-gm-checkbox-focused{background-color:#188038;border:2px solid #188038}div.docs-material-gm-checkbox-disabled.docs-material-gm-checkbox-undetermined,span.docs-material-gm-checkbox-disabled.docs-material-gm-checkbox-undetermined{background-clip:padding-box;background-color:#5f6368;border-color:#5f6368;opacity:.38}div.docs-material-gm-checkbox-hover,span.docs-material-gm-checkbox-hover,div.docs-material-gm-checkbox-focused,span.docs-material-gm-checkbox-focused{outline:1px dotted transparent;outline-offset:3px}div.docs-material-gm-checkbox-active,span.docs-material-gm-checkbox-active{outline:1px solid transparent;outline-offset:3px}.docs-material-gm-labeled-checkbox{align-items:flex-start;cursor:pointer;display:flex;max-width:672px;outline:none;padding:8px 0;width:100%}.docs-material-gm-labeled-checkbox.docs-material-gm-labeled-checkbox-disabled{cursor:default}.docs-material-gm-labeled-checkbox-content{flex-shrink:1;margin-left:12px}.docs-material-gm-labeled-checkbox-circle{width:40px;height:40px;border-radius:50%;cursor:pointer;margin-left:-10px;margin-top:-10px;position:absolute}.docs-material-gm-labeled-checkbox-disabled .docs-material-gm-labeled-checkbox-circle{cursor:default}.docs-material-gm-labeled-checkbox-checkbox{border:2px solid #5f6368;border-radius:2px;box-sizing:border-box;cursor:pointer;height:18px;margin:1px;outline:none;flex-shrink:0;top:4px;width:18px}.docs-material-gm-labeled-checkbox-checkbox.docs-material-gm-labeled-checkbox-checked,.docs-material-gm-labeled-checkbox-checkbox.docs-material-gm-labeled-checkbox-undetermined{background-color:#188038;border:2px solid #188038}.docs-material-gm-labeled-checkbox-checkbox.docs-material-gm-labeled-checkbox-checked:before{content:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmVyc2lvbj0iMS4xIgogICB2aWV3Qm94PSIwIDAgMSAxIgogICBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWluWU1pbiBtZWV0Ij4KICA8cGF0aAogICAgIGQ9Ik0gMC4wNDAzODA1OSwwLjYyNjc3NjcgMC4xNDY0NDY2MSwwLjUyMDcxMDY4IDAuNDI5Mjg5MzIsMC44MDM1NTMzOSAwLjMyMzIyMzMsMC45MDk2MTk0MSB6IE0gMC4yMTcxNTcyOSwwLjgwMzU1MzM5IDAuODUzNTUzMzksMC4xNjcxNTcyOSAwLjk1OTYxOTQxLDAuMjczMjIzMyAwLjMyMzIyMzMsMC45MDk2MTk0MSB6IgogICAgIGlkPSJyZWN0Mzc4MCIKICAgICBzdHlsZT0iZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgo8L3N2Zz4K");display:block;line-height:15px}.docs-material-gm-labeled-checkbox-checkbox.docs-material-gm-labeled-checkbox-undetermined:before{border-top:2px solid white;content:'';display:block;height:0;margin-left:3px;margin-top:6px;width:8px}.docs-material-gm-labeled-checkbox-disabled .docs-material-gm-labeled-checkbox-checkbox{cursor:default;opacity:.38}.docs-material-gm-labeled-checkbox-hover .docs-material-gm-labeled-checkbox-checkbox,.docs-material-gm-labeled-checkbox-focused .docs-material-gm-labeled-checkbox-checkbox{outline:1px dotted transparent;outline-offset:3px}.docs-material-gm-labeled-checkbox-active .docs-material-gm-labeled-checkbox-checkbox{outline:1px solid transparent;outline-offset:3px}.docs-material-gm-labeled-checkbox-hover .docs-material-gm-labeled-checkbox-circle{background-color:#5f6368;opacity:.04}.docs-material-gm-labeled-checkbox-focused .docs-material-gm-labeled-checkbox-circle{background-color:#5f6368;opacity:.06}.docs-material-gm-labeled-checkbox-active .docs-material-gm-labeled-checkbox-circle{background-color:#5f6368;opacity:.1}.docs-material-gm-labeled-checkbox-disabled .docs-material-gm-labeled-checkbox-checkbox.docs-material-gm-labeled-checkbox-checked{background-clip:padding-box;background-color:#5f6368;border-color:#5f6368;opacity:.38}.docs-material-gm-labeled-checkbox-disabled .docs-material-gm-labeled-checkbox-checkbox.docs-material-gm-labeled-checkbox-undetermined{background-clip:padding-box;background-color:#5f6368;border-color:#5f6368;opacity:.38}.docs-material-gm-labeled-checkbox-hover .docs-material-gm-labeled-checkbox-checked+.docs-material-gm-labeled-checkbox-circle{background-color:#188038;opacity:.04}.docs-material-gm-labeled-checkbox-focused .docs-material-gm-labeled-checkbox-checked+.docs-material-gm-labeled-checkbox-circle{background-color:#188038;opacity:.06}.docs-material-gm-labeled-checkbox-active .docs-material-gm-labeled-checkbox-checked+.docs-material-gm-labeled-checkbox-circle{background-color:#188038;opacity:.1}.docs-material-gm-labeled-checkbox .docs-material-gm-labeled-checkbox-label{color:#3c4043;cursor:pointer;display:block;font:14px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;line-height:16px;overflow-wrap:break-word;padding:3px 0;width:auto;word-wrap:break-word}.docs-material-gm-labeled-checkbox.docs-material-gm-labeled-checkbox-disabled .docs-material-gm-labeled-checkbox-label{cursor:default;opacity:.38}.docs-material-gm-labeled-checkbox .docs-material-gm-labeled-checkbox-description{color:#80868b;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;padding:1px 0;width:100%}.docs-material-gm-labeled-checkbox.docs-material-gm-labeled-checkbox-disabled .docs-material-gm-labeled-checkbox-description{opacity:.38}.docs-material-gm-labeled-checkbox .docs-material-gm-labeled-checkbox-description-hide{display:none}.docs-material-labeled-checkbox-checkbox{outline:none}.docs-material-labeled-checkbox .docs-material-labeled-checkbox-checkbox{border:2px solid rgba(0,0,0,0.38);border-radius:2px;cursor:pointer;float:left;height:12px;margin:1px;position:relative;top:4px;vertical-align:middle;width:12px}.docs-material-labeled-checkbox-checkbox.docs-material-labeled-checkbox-checked:before{content:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmVyc2lvbj0iMS4xIgogICB2aWV3Qm94PSIwIDAgMSAxIgogICBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWluWU1pbiBtZWV0Ij4KICA8cGF0aAogICAgIGQ9Ik0gMC4wNDAzODA1OSwwLjYyNjc3NjcgMC4xNDY0NDY2MSwwLjUyMDcxMDY4IDAuNDI5Mjg5MzIsMC44MDM1NTMzOSAwLjMyMzIyMzMsMC45MDk2MTk0MSB6IE0gMC4yMTcxNTcyOSwwLjgwMzU1MzM5IDAuODUzNTUzMzksMC4xNjcxNTcyOSAwLjk1OTYxOTQxLDAuMjczMjIzMyAwLjMyMzIyMzMsMC45MDk2MTk0MSB6IgogICAgIGlkPSJyZWN0Mzc4MCIKICAgICBzdHlsZT0iZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgo8L3N2Zz4K");display:block;line-height:12px}.docs-material-labeled-checkbox-checkbox.docs-material-labeled-checkbox-checked{background-color:#4285f4;border:2px solid #4285f4}.docs-material-labeled-checkbox-focused .docs-material-labeled-checkbox-checkbox{border:2px solid #4285f4}.docs-material-labeled-checkbox-disabled .docs-material-labeled-checkbox-checkbox{border-color:rgba(0,0,0,0.26);cursor:default}.docs-material-labeled-checkbox-disabled .docs-material-labeled-checkbox-checkbox.docs-material-labeled-checkbox-checked{background-clip:padding-box;background-color:rgba(0,0,0,0.26);border-color:rgba(0,0,0,0.26)}.docs-material-labeled-checkbox-focused .docs-material-labeled-checkbox-checkbox.docs-material-labeled-checkbox-checked{background-color:#2a56c6;border:2px solid #2a56c6}.docs-material-labeled-checkbox .docs-material-labeled-checkbox-label{color:rgba(0,0,0,0.87);display:block;font:13px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;line-height:20px;margin-left:30px;overflow-wrap:break-word;padding:4px 0;vertical-align:middle;width:auto;word-wrap:break-word}.docs-material-labeled-checkbox.docs-material-labeled-checkbox-disabled .docs-material-labeled-checkbox-label{color:rgba(0,0,0,0.54)}.docs-material-labeled-checkbox .docs-material-labeled-checkbox-description-hide{display:none}.goog-menu{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:0 2px 4px rgba(0,0,0,0.2);-moz-box-shadow:0 2px 4px rgba(0,0,0,0.2);box-shadow:0 2px 4px rgba(0,0,0,0.2);-webkit-transition:opacity 0.218s;-moz-transition:opacity 0.218s;-o-transition:opacity 0.218s;transition:opacity 0.218s;background:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);cursor:default;font-size:13px;margin:0;outline:none;padding:6px 0;position:absolute}.goog-flat-menu-button{-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;background-color:#f5f5f5;background-image:-webkit-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:-moz-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:-ms-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:-o-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:linear-gradient(top,#f5f5f5,#f1f1f1);border:1px solid #dcdcdc;color:#333;cursor:default;font-size:11px;font-weight:bold;line-height:27px;list-style:none;margin:0 2px;min-width:46px;outline:none;padding:0 18px 0 6px;text-align:center;text-decoration:none}.goog-flat-menu-button-disabled{background-color:#fff;border-color:#f3f3f3;color:#b8b8b8}.goog-flat-menu-button.goog-flat-menu-button-hover{background-color:#f8f8f8;background-image:-webkit-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-moz-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-ms-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-o-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:linear-gradient(top,#f8f8f8,#f1f1f1);-webkit-box-shadow:0 1px 1px rgba(0,0,0,.1);-moz-box-shadow:0 1px 1px rgba(0,0,0,.1);box-shadow:0 1px 1px rgba(0,0,0,.1);border-color:#c6c6c6;color:#111}.goog-flat-menu-button.goog-flat-menu-button-focused{border-color:#4d90fe}.goog-flat-menu-button.goog-flat-menu-button-open,.goog-flat-menu-button.goog-flat-menu-button-active{-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1);background-color:#eee;background-image:-webkit-linear-gradient(top,#eee,#e0e0e0);background-image:-moz-linear-gradient(top,#eee,#e0e0e0);background-image:-ms-linear-gradient(top,#eee,#e0e0e0);background-image:-o-linear-gradient(top,#eee,#e0e0e0);background-image:linear-gradient(top,#eee,#e0e0e0);border:1px solid #ccc;color:#333;z-index:2}.goog-flat-menu-button-caption{vertical-align:top;white-space:nowrap}.goog-flat-menu-button-dropdown{border-color:#777 transparent;border-style:solid;border-width:4px 4px 0 4px;height:0;width:0;position:absolute;right:5px;top:12px}.goog-flat-menu-button .goog-flat-menu-button-img{margin-top:-3px;opacity:.70;vertical-align:middle}.goog-flat-menu-button-active .goog-flat-menu-button-img,.goog-flat-menu-button-open .goog-flat-menu-button-img,.goog-flat-menu-button-selected .goog-flat-menu-button-img,.goog-flat-menu-button-hover .goog-flat-menu-button-img{opacity:0.9}.goog-flat-menu-button-active .goog-flat-menu-button-dropdown,.goog-flat-menu-button-open .goog-flat-menu-button-dropdown,.goog-flat-menu-button-selected .goog-flat-menu-button-dropdown,.goog-flat-menu-button-hover .goog-flat-menu-button-dropdown{border-color:#595959 transparent}.goog-flat-menu-button-left,.goog-flat-menu-button-right{z-index:1}.goog-flat-menu-button-left.goog-flat-menu-button-disabled{z-index:0}.goog-flat-menu-button-right:focus,.goog-flat-menu-button-hover.goog-flat-menu-button-collapse-right{z-index:2}.goog-flat-menu-button-left:focus,.goog-flat-menu-button-hover.goog-flat-menu-button-collapse-left{z-index:2}.goog-flat-menu-button-collapse-left{margin-left:-1px;-moz-border-radius-bottomleft:0;-moz-border-radius-topleft:0;-webkit-border-bottom-left-radius:0;-webkit-border-top-left-radius:0;border-bottom-left-radius:0;border-top-left-radius:0;min-width:0;padding-left:0;vertical-align:top}.goog-flat-menu-button-collapse-right{margin-right:0px;-moz-border-radius-topright:0;-moz-border-radius-bottomright:0;-webkit-border-top-right-radius:0;-webkit-border-bottom-right-radius:0;border-top-right-radius:0;border-bottom-right-radius:0}.goog-menuitem,.goog-tristatemenuitem,.goog-filterobsmenuitem{position:relative;color:#333;cursor:pointer;list-style:none;margin:0;padding:6px 8em 6px 30px;white-space:nowrap}.goog-menu-nocheckbox .goog-menuitem,.goog-menu-noicon .goog-menuitem{padding-left:16px;vertical-align:middle}.goog-menu-noaccel .goog-menuitem{padding-right:44px}.goog-menuitem-disabled{cursor:default}.goog-menuitem-disabled .goog-menuitem-accel,.goog-menuitem-disabled .goog-menuitem-content{color:#ccc!important}.goog-menuitem-disabled .goog-menuitem-icon{filter:alpha(opacity=30);opacity:0.3}.goog-menuitem-highlight,.goog-menuitem-hover{background-color:#eee;border-color:#eee;border-style:dotted;border-width:1px 0;padding-top:5px;padding-bottom:5px}.goog-menuitem-highlight .goog-menuitem-content,.goog-menuitem-hover .goog-menuitem-content{color:#333}.goog-menuitem-checkbox,.goog-menuitem-icon{background-repeat:no-repeat;height:21px;left:3px;position:absolute;right:auto;top:3px;vertical-align:middle;width:21px}.goog-option-selected{background-image:url(//ssl.gstatic.com/ui/v1/menu/checkmark.png);background-repeat:no-repeat;background-position:left center}.goog-option-selected .goog-menuitem-content{color:#333}.goog-menuitem-accel{color:#777;direction:ltr;left:auto;padding:0 6px;position:absolute;right:0;text-align:right}.goog-menuitem-mnemonic-hint{text-decoration:underline}.goog-menuitem-mnemonic-separator{color:#777;font-size:12px;padding-left:4px}.goog-menuseparator{border-top:1px solid #ebebeb;margin-top:6px;margin-bottom:6px}.goog-submenu-arrow{-webkit-transition:all 0.218s;-moz-transition:all 0.218s;-o-transition:all 0.218s;transition:all 0.218s;font-size:70%;left:auto;right:10px;padding-top:3px;padding-right:0;position:absolute;text-align:right;opacity:.5;filter:alpha(opacity=50)}.goog-menuitem-highlight .goog-submenu-arrow,.goog-menuitem-hover .goog-submenu-arrow{-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none;border-left-color:#999;opacity:1.0}.goog-menuitem-disabled .goog-submenu-arrow{color:inherit;opacity:1.0}.docs-material-gm-labeled-select{color:#3c4043;outline:none;width:100%}.docs-material-gm-labeled-select-outer-box{border:1px solid #dadce0;border-radius:4px;box-sizing:border-box;cursor:pointer;padding:8px 6px 8px 8px;width:100%}.docs-material-gm-labeled-select-focused .docs-material-gm-labeled-select-outer-box{background-color:rgba(60,64,67,0.06);border:1px solid #dadce0}.docs-material-gm-labeled-select-hover .docs-material-gm-labeled-select-outer-box{background-color:rgba(60,64,67,0.04);border:1px solid #dadce0}.docs-material-gm-labeled-select-open .docs-material-gm-labeled-select-outer-box{background-color:rgba(60,64,67,0.04);border:1px solid transparent}.docs-material-gm-select-open.docs-material-gm-select-hover .docs-material-gm-labeled-select-outer-box{background-color:rgba(60,64,67,0.06)}.docs-material-gm-select-open.docs-material-gm-select-focused .docs-material-gm-labeled-select-outer-box{background-color:rgba(60,64,67,0.08)}.docs-material-gm-labeled-select-disabled .docs-material-gm-labeled-select-outer-box{border:1px solid #dadce0;box-shadow:none;cursor:default}.docs-material-gm-labeled-select-inner-box{align-items:center;display:flex;justify-content:space-between;position:relative;width:100%}.docs-material-gm-labeled-select-content{margin-bottom:8px}.docs-material-gm-labeled-select-caption{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;color:#202124;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;height:20px;line-height:20px;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.docs-material-gm-labeled-select-dropdown{align-items:center;display:flex;height:24px;justify-content:center;width:24px}.docs-material-gm-labeled-select-dropdown-icon{background:no-repeat url(//ssl.gstatic.com/docs/common/material_common_sprite222_grey_medium.svg) -40px -732px;height:18px;width:18px}.docs-material-gm-labeled-select-open .docs-material-gm-labeled-select-dropdown-icon{-moz-transform:rotate(180deg);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.docs-material-gm-labeled-select-label{color:#5f6368;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px}.docs-material-gm-select{color:#3c4043;outline:none;width:100%}.docs-material-gm-select-disabled{color:#5f6368;opacity:.38;cursor:default}.docs-material-gm-select-outer-box{border:1px solid #dadce0;border-radius:4px;box-sizing:border-box;cursor:pointer;padding:8px 6px 8px 8px;width:100%}.docs-material-gm-select-outer-box:active{background-color:#fff;border:1px solid transparent;box-shadow:0 2px 6px 2px rgba(60,64,67,.15)}.docs-material-gm-select-hover .docs-material-gm-select-outer-box{background-color:rgba(60,64,67,0.04);border:1px solid #dadce0}.docs-material-gm-select-focused .docs-material-gm-select-outer-box{background-color:rgba(60,64,67,0.06);border:1px solid #dadce0}.docs-material-gm-select-open .docs-material-gm-select-outer-box{background-color:rgba(60,64,67,0.04);border:1px solid transparent}.docs-material-gm-select-open.docs-material-gm-select-hover .docs-material-gm-select-outer-box{background-color:rgba(60,64,67,0.06)}.docs-material-gm-select-open.docs-material-gm-select-focused .docs-material-gm-select-outer-box{background-color:rgba(60,64,67,0.08)}.docs-material-gm-select-disabled .docs-material-gm-select-outer-box{border:1px solid #dadce0;box-shadow:none;cursor:default}.docs-material-gm-select-inner-box{align-items:center;display:flex;justify-content:space-between;position:relative;width:100%}.docs-material-gm-select-caption{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;color:#202124;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;height:20px;line-height:20px;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.docs-material-gm-select-dropdown{align-items:center;display:flex;height:24px;justify-content:center;width:24px}.docs-material-gm-select-dropdown-icon{background:no-repeat url(//ssl.gstatic.com/docs/common/material_common_sprite222_grey_medium.svg) -40px -732px;height:18px;width:18px}.docs-material-gm-select-open .docs-material-gm-select-dropdown-icon{-moz-transform:rotate(180deg);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.docs-material-labeled-select{outline:0;width:100%}.docs-material-labeled-select-outer-box{transition:border-color 300ms ease;border-bottom:1px solid rgba(0,0,0,0.12);cursor:pointer;height:26px;line-height:26px;margin-bottom:1px;width:100%}.docs-material-labeled-select-hover .docs-material-labeled-select-outer-box{border-bottom-color:rgba(0,0,0,0.38)}.docs-material-labeled-select-open .docs-material-labeled-select-outer-box,.docs-material-labeled-select-focused .docs-material-labeled-select-outer-box{border-bottom-width:2px;border-bottom-color:#4285f4;margin-bottom:0px}.docs-material-labeled-select-disabled .docs-material-labeled-select-outer-box{border-bottom:1px dotted rgba(0,0,0,0.12);cursor:default}.docs-material-labeled-select-inner-box{display:flex;justify-content:space-between}.docs-material-labeled-select-caption{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;color:rgba(0,0,0,0.87);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;height:26px;line-height:26px;max-width:100%;overflow:hidden;padding-right:24px;position:relative;text-overflow:ellipsis;white-space:nowrap}.docs-material-labeled-select-disabled .docs-material-labeled-select-caption{color:rgba(0,0,0,0.12)}.docs-material-labeled-select-dropdown{align-items:center;display:flex;height:24px;justify-content:center;width:24px}.docs-material-labeled-select-dropdown-icon{background:no-repeat url(//ssl.gstatic.com/docs/common/material_common_sprite222_grey_medium.svg) -40px -732px;height:18px;width:18px}.docs-material-labeled-select-hover .docs-material-labeled-select-dropdown-icon,.docs-material-labeled-select-focused .docs-material-labeled-select-dropdown-icon{opacity:0.54}.docs-material-labeled-select-disabled .docs-material-labeled-select-dropdown-icon{opacity:0.12}.docs-material-labeled-select-label{color:#616161;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:11px;line-height:16px}.docs-material-labeled-select-disabled .docs-material-labeled-select-label{opacity:0.12}.docs-material-select{color:rgba(0,0,0,0.87);cursor:pointer;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;height:26px;line-height:26px;outline:0;width:100%}.docs-material-select-disabled{color:rgba(0,0,0,0.12);cursor:default}.docs-material-select-outer-box{transition:border-color 300ms ease;border-bottom:1px solid rgba(0,0,0,0.12);height:26px;line-height:26px;margin-bottom:1px;width:100%}.docs-material-select-hover .docs-material-select-outer-box{border-bottom-color:rgba(0,0,0,0.38)}.docs-material-select-focused .docs-material-select-outer-box,.docs-material-select-open .docs-material-select-outer-box{border-bottom-width:2px;border-bottom-color:#4285f4;margin-bottom:0px}.docs-material-select-disabled .docs-material-select-outer-box{border-bottom:1px dotted rgba(0,0,0,0.12)}.docs-material-select-inner-box{position:relative;width:100%}.docs-material-select-caption{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;height:26px;line-height:26px;max-width:100%;overflow:hidden;padding-right:24px;position:relative;text-overflow:ellipsis;white-space:nowrap}.docs-material-select-dropdown{position:absolute;right:7px;top:10.5px}.docs-material-select-dropdown-icon{transition:opacity 0.3s ease;background:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI1IiBoZWlnaHQ9IjMiPjxwb2x5Z29uIHBvaW50cz0iMCwwIDUsMCAyLjUsMyIgZmlsbD0iIzAwMCIvPjwvc3ZnPg==") no-repeat;background-size:contain;height:5px;opacity:0.38;width:9px}.docs-material-select-hover .docs-material-select-dropdown-icon,.docs-material-select-focused .docs-material-select-dropdown-icon{opacity:0.54}.docs-material-select-disabled .docs-material-select-dropdown-icon{opacity:0.12}.docs-material-labeled-text-field{height:40px;line-height:40px;padding-top:5px;position:relative}.docs-material-labeled-text-field-input{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;transition:border-color 200ms cubic-bezier(0.4,0.0,0.2,1);background:none;border:none;border-bottom:1px solid rgba(0,0,0,0.12);color:rgba(0,0,0,0.87);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;height:26px;line-height:26px;outline:none;overflow:hidden;text-overflow:ellipsis;width:100%}.docs-material-labeled-text-field-hover .docs-material-labeled-text-field-input{border-bottom-color:rgba(0,0,0,0.38)}.docs-material-labeled-text-field-focused .docs-material-labeled-text-field-input{border-bottom:2px solid #4285f4}.docs-material-labeled-text-field-disabled .docs-material-labeled-text-field-input{border-bottom:1px dotted rgba(0,0,0,0.12);color:rgba(0,0,0,0.12);cursor:default}.docs-material-labeled-text-field-label{transition:transform 200ms cubic-bezier(0.4,0.0,1,1);color:#616161;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;line-height:45px;position:absolute;transform-origin:left bottom}.docs-material-labeled-text-field-has-text .docs-material-labeled-text-field-label,.docs-material-labeled-text-field-focused .docs-material-labeled-text-field-label{transform:translateY(-22px) scale(.846,.846)}.docs-material-labeled-text-field-focused .docs-material-labeled-text-field-label{color:#4285f4}.docs-material-labeled-text-field-disabled .docs-material-labeled-text-field-label{opacity:0.12}.docs-material-text-area{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;transition:border-color 250ms cubic-bezier(0.4,0.0,0.2,1);background:none;border:none;border-bottom:1px solid rgba(0,0,0,0.12);color:rgba(0,0,0,0.87);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;outline:none;resize:none;width:100%}.docs-material-text-area:hover{border-bottom-color:rgba(0,0,0,0.38)}.docs-material-text-area:focus{border-bottom:2px solid #4285f4}.docs-material-text-area:disabled{border-bottom:1px dotted rgba(0,0,0,0.12);color:rgba(0,0,0,0.12);cursor:default}.docs-material-text-field-input{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;transition:border-color 250ms cubic-bezier(0.4,0.0,0.2,1);background:none;border:none;border-bottom:1px solid rgba(0,0,0,0.12);color:rgba(0,0,0,0.87);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;height:26px;line-height:26px;outline:none;overflow:hidden;text-overflow:ellipsis;width:100%}.docs-material-text-field-hover .docs-material-text-field-input{border-bottom-color:rgba(0,0,0,0.38)}.docs-material-text-field-focused .docs-material-text-field-input{border-bottom:2px solid #4285f4}.docs-material-text-field-disabled .docs-material-text-field-input{border-bottom:1px dotted rgba(0,0,0,0.12);color:rgba(0,0,0,0.12);cursor:default}.drive-spinner{height:44px;overflow:hidden;position:relative}.drive-quantum-spinner{height:28px;left:50%;margin-left:-14px;position:absolute;top:8px;width:28px}.docs-analytics-icon{direction:ltr;text-align:left;overflow:hidden;position:relative;vertical-align:middle}.docs-analytics-img:before{content:url(//ssl.gstatic.com/docs/common/menu_feature_sprite7.svg)}.docs-analytics-img{height:4332px;position:absolute;width:72px}.docs-analytics-hc-edge .docs-analytics-icon,.docs-analytics-hc-gecko .docs-analytics-icon{filter:invert(100%)}.docs-analytics-hc-ie .docs-analytics-icon{-ms-high-contrast-adjust:none;background-color:white}.docs-analytics-arrow-downward-18px{left:0;top:-4296px}.docs-analytics-arrow-drop-down-black-18dp{left:-18px;top:-1944px}.docs-analytics-arrow-right-black-18dp{left:-18px;top:-3658px}.docs-analytics-arrow-upward-18px{left:0;top:-640px}.docs-analytics-close-black-24px{left:-24px;top:-452px}.docs-analytics-close-white-24px{left:-48px;top:-452px}.docs-analytics-info-outline-black-24px{left:-42px;top:-1098px}.docs-analytics-group-in-circle-32px{left:-24px;top:-1748px}.docs-analytics-keyboard-arrow-down-18px{left:-50px;top:-1222px}.docs-analytics-keyboard-arrow-up-18px{left:0;top:-2992px}.docs-analytics-document-icon-kix{left:0;top:-2974px}.docs-analytics-document-icon-punch{left:-24px;top:-1098px}.docs-analytics-document-icon-sketchy{left:-50px;top:-3034px}.docs-analytics-document-icon-ritz{left:-36px;top:-4314px}.docs-analytics-email-icon{left:-24px;top:-4146px}.analytics-dialog{border-radius:8px;height:100%;max-height:586px;max-width:880px;min-width:580px;width:100%}.analytics-dialog.analytics-dialog-collapsed{max-width:684px;width:calc(100% - (2*8px))}.analytics-dialog::before{border:1px solid transparent;border-radius:8px;bottom:-1px;content:'';left:-1px;position:absolute;right:-1px;top:-1px}.analytics-dialog-title{display:none}.analytics-vc-content .docs-material-gm-select-caption{padding-left:8px;width:100%}.analytics-vc-content .docs-material-gm-select-dropdown{padding-right:8px}.analytics-vc-content .docs-material-gm-select-outer-box{padding:0}.analytics-vc-content .goog-menu .goog-menuitem-highlight{border:none}.analytics-btn-fill.jfk-button{cursor:pointer;background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff}.analytics-btn-fill.jfk-button-hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#2a8947;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15)}.analytics-btn-fill.jfk-button-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#4f9e67;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15)}.analytics-btn-fill.jfk-button-focused.jfk-button-hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#62a877;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15)}.analytics-btn-fill.jfk-button-focused.jfk-button-active{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#62a877;box-shadow:0 2px 6px 2px rgba(52,168,83,0.15)}.analytics-btn-fill.jfk-button-disabled{cursor:default;background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#f1f3f4;color:#3c4043;opacity:0.38}.analytics-btn-hairline.jfk-button{cursor:pointer;background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:white;border:1px solid #dadce0!important;color:#188038}.analytics-btn-hairline.jfk-button-hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#f8fcf9;border:1px solid #c8e7d1!important}.analytics-btn-hairline.jfk-button-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#e7f5eb;border:1px solid #bbe2c6!important}.analytics-btn-hairline.jfk-button-focused.jfk-button-hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#dff2e4;border:1px solid #b5e0c1!important}.analytics-btn-hairline.jfk-button-focused.jfk-button-active{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#dff2e4;border:1px solid transparent!important;box-shadow:0 2px 6px 2px rgba(60,64,67,.15)}.analytics-btn-hairline.jfk-button-disabled{cursor:default;background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:white;border:1px solid #f1f3f4!important;color:#3c4043;opacity:0.38}.analytics-btn-text.jfk-button{cursor:pointer;background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:white;color:#188038}.analytics-btn-text.jfk-button-hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#f8fcf9;color:#188038}.analytics-btn-text.jfk-button-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#e7f5eb;color:#188038}.analytics-btn-text.jfk-button-focused.jfk-button-hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#dff2e4;color:#188038}.analytics-btn-text.jfk-button-focused.jfk-button-active{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#dff2e4;color:#188038;box-shadow:0 2px 6px 2px rgba(60,64,67,.15)}.analytics-btn-text.jfk-button-disabled{cursor:default;background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:white;color:#188038;color:#3c4043;opacity:0.38}.analytics-cotc{display:flex;flex-direction:column;-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;overflow-x:hidden;overflow-y:auto}.analytics-cotc-header{-webkit-align-items:center;align-items:center;display:flex;-ms-flex:0 0 auto;-webkit-flex:0 0 auto;flex:0 0 auto;flex-direction:row;justify-content:space-between;margin:18px 24px 0 24px;overflow:hidden}.analytics-cotc-legend{-webkit-align-items:center;align-items:center;color:#202124;display:flex;-ms-flex:0 0;-webkit-flex:0 0;flex:0 0;flex-direction:row;font-size:12px;margin:40px 24px 40px 45px;text-align:center}.analytics-cotc-legend-box{display:flex;margin-right:8px}.analytics-cotc-legend span{margin-right:24px}.analytics-ct-table{-webkit-align-items:flex-start;align-items:flex-start;border-collapse:collapse;display:flex;flex-direction:column;padding:20px;white-space:nowrap}.analytics-ct-table-header{display:flex;flex-direction:row;-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1}.analytics-ct-table-header-container{display:flex;height:11px;width:100%}.analytics-ct-table-date-container{margin:0;position:absolute}.analytics-ct-table-date{font-size:9px;margin-left:-50%}.analytics-ct-table-date-light{opacity:0.6}.analytics-ct-table-container{display:flex;flex:1 1 auto;overflow-y:auto;width:100%}.analytics-ct-table-contributors{border-collapse:collapse;max-height:100%;overflow-y:auto;table-layout:fixed;width:100%}.analytics-ct-contributor-row{align-items:center;border-right:1px solid #e3e3e3}.analytics-ct-contributor-row:last-child .analytics-ct-table-profile{border-bottom:0}.analytics-ct-contributor-row:last-child .analytics-ct-table-activity-cell-div{border-bottom:0}.analytics-ct-table-profile-container{background-color:#f9f9f9;height:38px;padding:0;width:170px}.analytics-ct-table-profile{-webkit-align-items:center;align-items:center;border-bottom:2px solid #fff;display:flex;flex-direction:row;height:100%;padding:3px 5px}.analytics-ct-table-profile .analytics-profile-image{max-height:24px;max-width:24px}.analytics-ct-table-name{color:#3c4043;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;padding-left:12px}.analytics-ct-table-activity-cell{flex-grow:1;height:38px;padding:0;position:relative}.analytics-ct-table-activity-cell-light-border::before,.analytics-ct-table-activity-cell-dark-border::before,.analytics-ct-table-activity-cell-light-border-disabled::before,.analytics-ct-table-activity-cell-dark-border-disabled::before{content:'';height:100%;position:absolute;left:0;top:0}.analytics-ct-table-activity-cell-light-border::before{border-left:1px solid #eeeeee}.analytics-ct-table-activity-cell-dark-border::before{border-left:1px solid #e0e0e0}.analytics-ct-table-activity-cell-light-border-disabled::before{border-left:1px solid #e0e0e0}.analytics-ct-table-activity-cell-dark-border-disabled::before{border-left:1px solid #dbdbdb}.analytics-ct-table-activity-cell-div{background-color:#f9f9f9;border-bottom:2px solid #fff;height:100%}.analytics-ct-table-activity-cell-div-disabled{background-color:#eeeeee;border-bottom:2px solid #f5f5f5}.analytics-ct-activity-edit-small,.analytics-ct-activity-edit-medium,.analytics-ct-activity-edit-large{height:100%;position:relative}.analytics-ct-activity-edit-small{background-color:#c4d9f2}.analytics-ct-activity-edit-medium{background-color:#87b5ea}.analytics-ct-activity-edit-large{background-color:#4a90e2}.analytics-ct-activity-comment-fg{background-color:#fff;border-radius:50%;height:4px;left:50%;margin-left:-2px;position:absolute;top:17px;width:4px;z-index:2}.analytics-ct-activity-comment-bg{background-color:#3c4043;border-radius:50%;height:8px;left:50%;margin-left:-4px;position:absolute;top:15px;width:8px;z-index:1}.analytics-ct{display:flex;flex-direction:column;-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;overflow-x:hidden;overflow-y:auto}.analytics-ct-header{display:flex;flex-direction:row;justify-content:space-between;margin:10px 19px 0}.analytics-ct-header-right{display:flex;flex-direction:row;justify-content:space-around;width:220px}.analytics-ct-header-right .analytics-selector{margin-top:8px;min-width:100px}.analytics-ct-legend{-webkit-align-items:center;align-items:center;-webkit-align-self:flex-end;align-self:flex-end;color:#5f6368;display:flex;-ms-flex:0 0;-webkit-flex:0 0;flex:0 0;flex-direction:row;font-size:12px;margin:0 20px 20px;text-align:center}.analytics-ct-legend-comment,.analytics-ct-legend-edit{display:flex;-webkit-align-items:center;align-items:center}.analytics-ct-legend-comment-disabled{opacity:30%}.analytics-ct-legend-comment-circle{background-color:#fff;border-radius:50%;border:2px solid #3c4043;height:4px;width:4px}.analytics-ct-legend-label{margin-left:4px}.analytics-ct-legend-box{-webkit-align-items:center;align-items:center;display:flex;margin-left:12px}.analytics-ct-legend-edit-bar{height:12px;width:4px}.analytics-drp{align-items:center;display:flex;flex-direction:row;margin-left:16px;max-width:400px}.analytics-drp-left,.analytics-drp-right{border-radius:20px;cursor:pointer;height:auto;padding:8px;right:11px}.analytics-drp-left.jfk-button-hover,.analytics-drp-right.jfk-button-hover{background-color:#f1f3f4}.analytics-drp-left.jfk-button-focused,.analytics-drp-right.jfk-button-focused{background-color:#e8eaed}.analytics-drp-left.jfk-button-disabled,.analytics-drp-right.jfk-button-disabled{opacity:0.6;cursor:default}.analytics-drp-date-range{color:#202124;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:16px}.analytics-drpd{-webkit-align-items:center;align-items:center;display:flex;height:28px;margin:auto 3px;padding:0}.docs-analytics-hc-ie .analytics-drpd{-ms-high-contrast-adjust:none;background-color:white}.analytics-drpd-icon{border-radius:100%;display:inline-block;height:9px;margin-right:8px;width:9px}.analytics-drpd .docs-material-menu-button-flat-default-dropdown{margin:0}.analytics-drpd.docs-material-menu-button-flat-default-hover{background-color:rgba(0,0,0,0.06)}.analytics-drpd.docs-material-menu-button-flat-default-focused{background-color:rgba(0,0,0,0.12);border-color:transparent}.analytics-drp .goog-menu .goog-menuitem{padding:6px 25px 6px 18px}.analytics-dialog-bg,.analytics-od-bg,.analytics-npd-bg{background:rgba(0,0,0,0.6);left:0;position:absolute;top:0}.analytics-dialog-bg,.analytics-od-bg{z-index:1002}.analytics-dialog,.analytics-od,.analytics-npd{background-color:#fff;border:0;border-radius:8px;box-shadow:0 16px 24px 2px rgba(0,0,0,0.14),0 6px 30px 5px rgba(0,0,0,0.12),0 8px 10px -5px rgba(0,0,0,0.14);display:flex;flex-direction:column;outline:0;position:absolute}.analytics-dialog,.analytics-od{z-index:1003}.analytics-dialog-content,.analytics-od-content,.analytics-npd-content{display:flex;flex-direction:column;-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;min-height:0}.analytics-npd-bg{z-index:1004}.analytics-npd{z-index:1005}.analytics-ec-content{-webkit-align-items:center;align-items:center;display:flex;flex-direction:column;box-pack:center;-ms-flex-pack:center;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center;width:100%}.analytics-ec-message-container{width:100%}.analytics-ec-message{color:rgba(0,0,0,0.6);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:16px;font-weight:400;line-height:24px;padding:16px 128px;text-align:center}.analytics-ec-container{-webkit-align-items:center;align-items:center;display:flex;-ms-flex:1;-webkit-flex:1;flex:1;flex-direction:column;-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;box-pack:center;-ms-flex-pack:center;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center;width:100%;height:100%}.analytics-vhc-feedbackcard{color:rgba(0,0,0,0.87);font-size:11px;font-style:italic;margin:0}.analytics-vhc-feedbackcard-button,.analytics-vhc-feedbackcard-button:link,.analytics-vhc-feedbackcard-button:visited{color:#4285f4;cursor:pointer;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:11px;font-style:italic;height:14px;line-height:14px;margin:0 0 0 2px;text-decoration:none}.analytics-vhfc-card{border-bottom-right-radius:8px;border-top:1px solid #e0e0e0;box-shadow:0 2px 12px 2px rgba(60,64,67,.15);-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-top:auto;z-index:1}.analytics-vhfc-settings-container,.analytics-vhfc-feedback-container,.analytics-vhfc-nudge-container{-webkit-align-items:center;align-items:center;display:flex;flex-direction:row}.analytics-vhfc-settings-container{height:56px;box-pack:justify;-ms-flex-pack:justify;-webkit-box-pack:justify;-webkit-justify-content:space-between;justify-content:space-between;padding:0 24px}.analytics-vhfc-label{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;margin-right:24px}.analytics-vhfc-label a:link,.analytics-vhfc-label a:visited{color:#4285f4;text-decoration:none}.analytics-vhfc-feedback-container{background-color:#f5f5f5;border-bottom-right-radius:8px;height:32px;padding:0 24px}.analytics-vhfc-feedback-container .analytics-vhc-feedbackcard{color:rgba(0,0,0,0.54);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400}.analytics-vhfc-feedback-container .analytics-vhc-feedbackcard-button{font-size:12px;font-style:normal}.analytics-vhfc-nudge-container{background-color:#fff;border-bottom-right-radius:8px;box-pack:justify;-ms-flex-pack:justify;-webkit-box-pack:justify;-webkit-justify-content:space-between;justify-content:space-between;height:56px;padding:0 8px 0 32px}.analytics-vhfc-nudge-buttons{align-items:center;display:flex;box-pack:justify;-ms-flex-pack:justify;-webkit-box-pack:justify;-webkit-justify-content:flex-end;justify-content:flex-end}.analytics-vhfc-nudge-cancel-button.jfk-button,.analytics-vhfc-nudge-continue-button.jfk-button{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;color:#188038;cursor:pointer;margin:0 8px;padding-left:8px;padding-right:8px;white-space:normal;word-wrap:break-word}.analytics-vhfc-nudge-cancel-button{color:#80868b}.analytics-vhfc-nudge-cancel-button.jfk-button-hover,.analytics-vhfc-nudge-continue-button.jfk-button-hover{background-color:#f8fcf9}.analytics-vhfc-nudge-cancel-button.jfk-button-focused,.analytics-vhfc-nudge-continue-button.jfk-button-focused{background-color:#e7f5eb}.analytics-vhfc-nudge-cancel-button.jfk-button-focused.jfk-button-hover,.analytics-vhfc-nudge-continue-button.jfk-button-focused.jfk-button-hover{background-color:#dff2e4}.analytics-vhfc-nudge-cancel-button.jfk-button-focused.jfk-button-active,.analytics-vhfc-nudge-continue-button.jfk-button-focused.jfk-button-active{background-color:#dff2e4;box-shadow:0 1px 3px 1px rgba(60,64,67,.15)}.analytics-vhfc-nudge-label{color:#3c4043;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;max-width:300px}.analytics-vhc-groupcard-root{border-bottom:0;position:relative}.analytics-vhc-groupcard-root::after{border-bottom:1px solid #e0e0e0;bottom:0;content:'';display:block;height:0;left:72px;position:absolute;width:calc(100% - 72px)}.analytics-vhc-groupcard-members .analytics-vhc-groupcard-root::after{left:48px;width:calc(100% - 48px)}.analytics-vhc-rowcard-root:last-child::after{display:none}.analytics-vhc-groupcard-root>.analytics-vhc-rowcard-row{border-bottom:1px solid transparent}.analytics-vhc-groupcard-root>.analytics-vhc-rowcard-row::after{border-bottom:0}.analytics-vhc-groupcard-root>.analytics-vhc-rowcard-row>.jfk-button{cursor:pointer;height:calc(48px - 2px);width:calc(100% - 2px)}.analytics-vhc-groupcard-root>.analytics-vhc-rowcard-row>.jfk-button-disabled{cursor:default}.analytics-vhc-groupcard-groupimg{height:32px;margin:0 16px 0 23px;vertical-align:middle;width:32px}.analytics-vhc-groupcard-message{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;padding:0 0 12px 72px}.analytics-vhc-groupcard-message-warning{color:rgba(0,0,0,0.6);font-style:italic}.analytics-vhc-groupcard-message-error{color:#dd4330}.analytics-vhc-groupcard-members{margin-left:72px}.analytics-vhc-groupcard-members .analytics-vhc-groupcard-members{margin-left:48px}.analytics-vhc-groupcard-members .analytics-vhc-groupcard-message{padding-left:48px}.analytics-vhc-groupcard-members .analytics-vhc-viewcardlist{border-top:0}.analytics-vhc-groupcard-members .analytics-vhc-viewcardlist>div:last-child,.analytics-vhc-groupcard-members .analytics-vhc-viewcardlist>.analytics-vhc-viewercard-root:last-child>.analytics-vhc-rowcard-row{border-bottom:0}.analytics-vhc-groupcard-members .analytics-vhc-rowcard-profile .analytics-profile-image,.analytics-vhc-groupcard-members .analytics-vhc-rowcard-profile .analytics-vhc-groupcard-groupimg{margin-left:0}.analytics-vhc-groupcard-root>.analytics-vhc-rowcard-row .analytics-vhc-rowcard-profile{border:0;box-shadow:none;font-weight:400;margin:0;min-width:0;padding:0}.analytics-vhc-groupcard-expand-icon{margin-top:-2px}.analytics-vhc-groupcard-contracted .analytics-vhc-groupcard-expand-icon{margin-left:-7px;margin-right:6px}.analytics-vhc-groupcard-expanded .analytics-vhc-groupcard-expand-icon{margin-left:-4px;margin-right:3px}.analytics-vhc-groupcard-expanded>.analytics-vhc-rowcard-row .analytics-vhc-rowcard-time{visibility:hidden}.analytics-vhc-groupcard-expanded>.analytics-vhc-rowcard-row .analytics-vhc-rowcard-tooltip-icon{visibility:hidden}.analytics-lmec-link,.analytics-lmec-link:active,.analytics-lmec-link:hover,.analytics-lmec-link:link,.analytics-lmec-link:visited{color:#4285f4;cursor:pointer;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:16px;font-weight:400;text-decoration:none}.analytics-vhc-listsortbutton{-webkit-align-items:center;align-items:center;cursor:pointer;display:flex;flex-direction:row;margin:auto 24px auto 24px}.analytics-vhc-listsortbutton-mouse-focus{outline:0}.analytics-vhc-listsortbutton:last-child{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin:auto -10px auto 0;width:107px}.analytics-vhc-checkboxes-visible .analytics-vhc-listsortbutton:last-child{margin:auto 72px auto 0;width:107px}.analytics-vhc-listsortbutton-name{color:#5f6368;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;margin:0 8px 0 0}.analytics-vhc-listsortbutton-arrow{height:18px;width:18px}.analytics-vhc-listsortbutton-uwsa .analytics-vhc-listsortbutton-arrow,.analytics-vhc-listsortbutton-uwsd .analytics-vhc-listsortbutton-arrow{visibility:hidden}.analytics-vhc-listsortbutton-ascending .analytics-vhc-listsortbutton-arrow,.analytics-vhc-listsortbutton-descending .analytics-vhc-listsortbutton-arrow{opacity:0.87}.analytics-low-data-treatment-title{color:#25272b;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:28px;padding:0 48px 8px 48px}.analytics-low-data-treatment-description{color:#414549;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:16px;line-height:24px;padding:0 48px 16px 48px}.analytics-dialog .analytics-low-data-treatment-sharebutton .docs-icon{margin-top:0;margin-bottom:0;margin-right:3px}.analytics-low-data-treatment-sharebutton.jfk-button{align-items:center;align-self:center;display:flex;flex-direction:row;box-pack:justify;-ms-flex-pack:justify;-webkit-box-pack:justify;-webkit-justify-content:center;justify-content:center;margin:0;padding-bottom:9px!important;padding-left:12px!important;padding-right:16px!important}.analytics-nc-container{display:flex;-ms-flex:1;-webkit-flex:1;flex:1;flex-direction:column;-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;min-height:0}.analytics-nc-navigationarea{display:flex;-ms-flex:1;-webkit-flex:1;flex:1;flex-direction:row;-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;min-height:0}.analytics-nc-tabbar{background-color:#fff;border-bottom-left-radius:8px;border-right:1px solid #e0e0e0;position:relative;width:256px;z-index:2}.analytics-nc-tabbar-collapsed{width:64px}.analytics-nc-content{display:flex;-ms-flex:1;-webkit-flex:1;flex:1;flex-direction:column;-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;min-height:0;overflow-x:hidden;width:623px}.analytics-nc-navigationbar{background-color:#fff;border-bottom:1px solid #e0e0e0;border-top-left-radius:8px;border-top-right-radius:8px;z-index:2}.analytics-npd{border-radius:8px;width:490px}.analytics-npd::before{border:1px solid transparent;border-radius:8px;bottom:-1px;content:'';left:-1px;position:absolute;right:-1px;top:-1px}.analytics-npd-title{color:#202124;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:22px;margin:24px 24px 0 24px}.analytics-npd-paragraph{color:rgba(0,0,0,0.6);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:16px;line-height:24px;margin:24px 24px 0 24px}.analytics-npd-buttons{display:flex;flex-direction:row;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;box-pack:justify;-ms-flex-pack:justify;-webkit-box-pack:justify;-webkit-justify-content:flex-end;justify-content:flex-end;margin:40px 0 24px 24px}.analytics-npd-cancelbutton{margin:0 8px}.analytics-npd-continuebutton{margin:0 24px 0 8px}.analytics-ntb-container .goog-tab-bar{background-color:#fff;margin-top:20px;width:100%}.analytics-ntb-container .goog-tab{-webkit-align-items:center;align-items:center;background-color:#fff!important;border:0;border-top-right-radius:20px;border-bottom-right-radius:20px;color:#3c4043;cursor:pointer;display:flex;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;-ms-flex:1;-webkit-flex:1;flex:1;flex-direction:row;-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;height:44px;margin:0 10px 0 0!important;padding:0!important;text-decoration:none}.analytics-nc-tabbar-collapsed .analytics-ntb-container .goog-tab{border-radius:22px;margin:0 10px!important}.analytics-ntb-container .goog-tab.goog-tab-hover{background-color:#f1f3f4!important}.analytics-ntb-container .goog-tab.goog-tab-selected{background-color:#e6f4ea!important;color:#188038;left:0}.analytics-ntb-container .goog-tab.goog-tab-selected::before,.analytics-ntb-container .goog-tab-hover::before{border-bottom:1px solid transparent;border-right:1px solid transparent;border-top:1px solid transparent;border-top-right-radius:20px;border-bottom-right-radius:20px;bottom:-1px;content:'';left:0;position:absolute;right:-1px;top:-1px;z-index:1}.analytics-ntb-container .goog-tab.goog-tab-selected.goog-tab-hover{background-color:#ceead6!important}.analytics-ntb-tab-icon{height:24px;margin:0 16px 0 24px;width:24px}.analytics-nc-tabbar-collapsed .analytics-ntb-tab-icon{margin:0 10px}.analytics-ntb-tab-text{max-width:180px}.analytics-ntb-tab-content{-webkit-align-items:center;align-items:center;display:flex;-ms-flex:1;-webkit-flex:1;flex:1;flex-direction:row;-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1}.analytics-nsc,.analytics-nsc-content{color:#202124;display:flex;flex-direction:column;-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;overflow-x:hidden;overflow-y:auto}.analytics-nsc-content{margin:24px 32px 0 32px}.analytics-nsc-offline,.analytics-nsc-save-failed{-webkit-align-items:center;align-items:center;background-color:#eeeeee;border-bottom:1px solid #e0e0e0;color:#dd4330;display:flex;flex-direction:row;font-size:13px;height:48px;padding:0 24px 0 24px}.analytics-nsc-heading,.analytics-nsc-subheading{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;line-height:26px;margin:0 0 16px 0}.analytics-nsc-heading{font-size:18px}.analytics-nsc-subheading{font-size:14px}.analytics-nsc-edit-digest-section{-webkit-align-items:center;align-items:center;display:flex;flex-direction:row;font-size:14px;height:48px;box-pack:justify;-ms-flex-pack:justify;-webkit-box-pack:justify;-webkit-justify-content:space-between;justify-content:space-between}.analytics-nsc-edit-digest-select{min-width:240px;width:auto}.analytics-nsc-edit-section,.analytics-nsc-form-section{margin-bottom:16px}.analytics-nsc-switches{display:flex;flex-direction:row}.analytics-nsc-switches .docs-material-gm-labeled-checkbox,.analytics-nsc-switches .docs-material-gm-labeled-checkbox-label{cursor:pointer}.analytics-nsc-switch{margin-right:32px}.analytics-nsc-footer{-webkit-align-items:center;align-items:center;display:flex;flex-direction:row;height:80px;box-pack:end;-ms-flex-pack:end;-webkit-box-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end;margin:0 32px}.analytics-nsc-cancel-button{margin-right:16px}.analytics-nvtt-content{display:flex;flex-direction:row;padding:9px 7px}.analytics-nvtt-text{color:#fff}.analytics-nvtt-learnmore,.analytics-nvtt-learnmore:visited,.analytics-nvtt-learnmore:link,.analytics-nvtt-learnmore:hover{color:#7baaf7;margin-left:14px;text-decoration:none}.analytics-ndch{-webkit-align-items:center;align-items:center;background-color:#fff;border:1px solid #dadce0;box-sizing:border-box;-webkit-border-radius:16px;-moz-border-radius:16px;border-radius:16px;display:flex;flex-direction:row;height:24px;margin:0 8px 4px 0}.analytics-ndch-viewer-icon,.analytics-ndch-group-icon{-webkit-border-radius:50%;-moz-border-radius:50%;border-radius:50%;height:20px;margin-left:1px;overflow:hidden;width:20px}.analytics-ndch-text{color:#5f6368;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:500;padding-left:8px}.analytics-ndch-remove-button{-webkit-align-items:center;align-items:center;cursor:pointer;display:flex;box-pack:center;-ms-flex-pack:center;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center;padding:0 4px 0 3px}.analytics-ndch-remove-button .docs-analytics-icon{opacity:0.87}.analytics-ndch:only-child .analytics-ndch-remove-button{display:none}.analytics-ndch:only-child .analytics-ndch-text{padding-right:8px}.analytics-ndc,.analytics-ndc-body{-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1}.analytics-ndc-body{display:flex;flex-direction:column;overflow-y:auto;padding:32px 32px 0 32px}.analytics-ndc-send-email-title{color:#202124;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:18px;margin-bottom:16px}.analytics-ndc-chip-title{color:rgba(0,0,0,0.54);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;margin-bottom:8px}.analytics-ndc-chip-container{display:flex;flex-direction:row;-moz-flex-wrap:wrap;-ms-flex-wrap:wrap;-webkit-flex-wrap:wrap;flex-wrap:wrap;max-height:71px;min-height:28px;overflow-y:auto}.analytics-ndc-subject-container{height:36px;margin-top:20px}.analytics-ndc-subject-container input::-ms-clear{display:none}.analytics-ndc-subject-container .docs-material-labeled-text-field{background-color:#fff;border:1px solid #dadce0;border-radius:4px;box-sizing:border-box;display:flex;flex-direction:column;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;height:initial;line-height:initial;padding:0}.analytics-ndc-subject-container .docs-material-labeled-text-field-hover{border:1px solid #bdc1c6;box-sizing:border-box}.analytics-ndc-subject-container .docs-material-labeled-text-field-focused{border:2px solid #1a73e8;box-sizing:border-box;margin:-1px 0 0 -1px}.analytics-ndc-subject-container .docs-material-labeled-text-field-content{padding:0 7px}.analytics-ndc-subject-container .docs-material-labeled-text-field-input{padding:0 8px}.analytics-ndc-subject-container .docs-material-labeled-text-field-input{color:#3c4043;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;height:100%;line-height:normal;padding:9px}.analytics-ndc-subject-container .docs-material-labeled-text-field-label{background-color:#fff;color:#5f6368;font-size:12px;line-height:13px;padding:0 3px;transform:translateY(-7px) scale(1,1)}.analytics-ndc-subject-container .docs-material-labeled-text-field:not(.docs-material-labeled-text-field-focused) .docs-material-labeled-text-field-input{border-bottom-color:transparent}.analytics-ndc-subject-container .docs-material-labeled-text-field-input{border-bottom:0}.analytics-ndc-message-container{background-color:#fff;margin-top:16px;max-height:108px}.analytics-ndc-message-container .docs-material-text-area{border:1px solid #dadce0;border-radius:4px;box-sizing:border-box;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;max-height:108px;min-height:108px;overflow-y:auto!important;padding:7px 9px}.analytics-ndc-message-container .docs-material-text-area:hover{border:1px solid #bdc1c6;box-sizing:border-box}.analytics-ndc-message-container .docs-material-text-area:focus{border:2px solid #1a73e8;box-sizing:border-box;margin:-1px 0 0 -1px}.analytics-ndc-document-info-container{-webkit-align-items:center;align-items:center;background-color:#fff;display:flex;-ms-flex:0 0 auto;-webkit-flex:0 0 auto;flex:0 0 auto;flex-direction:row;margin-top:16px;max-width:100%;outline:none}.analytics-ndc-document-info{-webkit-align-items:center;align-items:center;border-radius:100px;display:flex;flex-direction:row}.analytics-ndc-document-icon-container{outline:none;margin:0 0 0 4px}.analytics-ndc-document-title{color:rgb(60,64,67);display:block;flex-direction:column;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;line-height:16px;overflow:hidden;padding:0 8px;text-overflow:ellipsis;overflow:hidden;text-overflow:ellipsis;-webkit-box-orient:vertical;-webkit-line-clamp:3;display:-webkit-box;max-height:45px}.analytics-ndc-document-title a{color:#4285f4!important}.analytics-ndc-send-to-myself-container{-webkit-align-items:center;align-items:center;display:flex;flex-direction:row;box-pack:justify;-ms-flex-pack:justify;-webkit-box-pack:justify;-webkit-justify-content:flex-start;justify-content:flex-start;margin-left:-1px;margin-top:12px}.analytics-ndc-send-to-myself-container .docs-material-gm-labeled-checkbox{cursor:pointer}.analytics-ndc-send-to-myself-container .docs-material-gm-labeled-checkbox-label{color:#5f6368;cursor:pointer;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:400}.analytics-ndc-buttons{-webkit-align-items:start;align-items:start;bottom:0;display:flex;flex-direction:row;box-pack:justify;-ms-flex-pack:justify;-webkit-box-pack:justify;-webkit-justify-content:flex-end;justify-content:flex-end;min-height:60px;width:100%}.analytics-ndc-cancel-button{margin:0 8px}.analytics-ndc-send-email-button{margin:0 32px 0 8px}.analytics-ndc-chip-button{-webkit-align-items:center;align-items:center;border:1px solid #dadce0;border-radius:100px;cursor:pointer;display:flex;line-height:normal;margin-right:0;padding:8px}.analytics-ndc-chip-button.jfk-button-focused{background-color:rgba(60,64,67,0.06);border:1px solid #dadce0!important}.analytics-ndc-chip-button.jfk-button-hover{background-color:rgba(60,64,67,0.04)}.analytics-ndc-chip-button.jfk-button-hover.jfk-button-focused{background-color:rgba(60,64,67,0.06)}.analytics-ndc-chip-button.jfk-button-active{background-color:rgba(60,64,67,0.06);box-shadow:0 2px 6px 2px rgba(60,64,67,.15)}.analytics-ndc-toast.docs-ui-toast{border:1px inset;border-color:rgba(255,255,255,0.2) rgba(255,255,255,0.1) rgba(255,255,255,0) rgba(255,255,255,0);box-shadow:0 6px 6px rgba(0,0,0,0.15);padding:14px 24px;z-index:1003}.analytics-ndc-toast.docs-ui-toast .docs-ui-toast-content{color:#fff;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:400}.analytics-vhc-nudgeselectdropdown-container .analytics-ndsd{-webkit-align-items:center;align-items:center;display:flex;margin:auto 0;padding-left:2px;visibility:hidden}.analytics-vhc-nudgeselectdropdown-container .goog-menu{position:fixed}.analytics-vhc-checkboxes-visible .analytics-ndsd{visibility:visible}.docs-analytics-hc-ie .analytics-ndsd{-ms-high-contrast-adjust:none;background-color:white}.analytics-ndsd-icon-container{height:24px;opacity:0.56;width:24px}.analytics-od{width:384px}.analytics-od,.analytics-od-content{border-radius:8px}.analytics-od-title{display:none}.analytics-od-picture{border-top-left-radius:8px;border-top-right-radius:8px;height:216px}.analytics-od-header{color:rgba(0,0,0,0.87);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:18px;font-weight:500;margin:26px 24px 18px 24px}.analytics-od-body{color:rgba(0,0,0,0.7);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;font-weight:400;margin:0 24px 0 24px}.analytics-od-paragraph{line-height:20px;margin:0 0 18px 0}.analytics-od-learnmorebutton,.analytics-od-learnmorebutton:active,.analytics-od-learnmorebutton:hover,.analytics-od-learnmorebutton:link,.analytics-od-learnmorebutton:visited{align-self:left;color:#4285f4;cursor:pointer;text-decoration:none}.analytics-od-settingsbutton,.analytics-od-settingsbutton:focus,.analytics-od-settingsbutton:hover,.analytics-od-okbutton,.analytics-od-okbutton:focus,.analytics-od-okbutton:hover{margin:4px;white-space:normal}.analytics-od-buttons{display:flex;flex-direction:row;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-moz-flex-wrap:wrap;-ms-flex-wrap:wrap;-webkit-flex-wrap:wrap;flex-wrap:wrap;box-pack:justify;-ms-flex-pack:justify;-webkit-box-pack:justify;-webkit-justify-content:center;justify-content:center;margin:18px 24px 24px 24px}.analytics-od-okbutton{min-width:155px;width:auto;width:unset}.analytics-profile-image{-webkit-border-radius:50%;-moz-border-radius:50%;border-radius:50%;height:32px;max-height:36px;max-width:36px;width:32px}.analytics-rec-buttons{-webkit-align-items:center;align-items:center;display:flex;flex-direction:row;height:48px}.analytics-vhc-rowcard-root{width:100%}.analytics-vhc-rowcard-row,.analytics-vhc-rowcard-row-button{-webkit-align-items:center;align-items:center;display:flex;flex-direction:row;height:48px;text-align:left;width:100%}.analytics-vhc-rowcard-row{position:relative}.analytics-vhc-rowcard-row::after{border-bottom:1px solid #e0e0e0;bottom:0;content:'';display:block;height:0;left:72px;position:absolute;width:calc(100% - 72px)}.analytics-vhc-groupcard-members .analytics-vhc-rowcard-row::after{left:48px;width:calc(100% - 48px)}.analytics-vhc-rowcard-root:last-child>.analytics-vhc-rowcard-row::after{display:none}.analytics-vhc-rowcard-profile{-webkit-align-items:center;align-items:center;display:flex;flex-direction:row;-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1}.analytics-vhc-rowcard-name{color:#202124;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;margin-right:24px;white-space:normal}.analytics-vhc-rowcard-time{color:#202124;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;margin-right:36px;width:110px}.analytics-vhc-rowcard-row-button>.analytics-vhc-rowcard-time{width:108px}.analytics-vhc-rowcard-time-container{-webkit-align-items:center;align-items:center;display:flex;flex-direction:row}.analytics-vhc-rowcard-timenever .analytics-vhc-rowcard-time{font-style:italic}.analytics-vhc-rowcard-timeabsent .analytics-vhc-rowcard-time,.analytics-vhc-rowcard-iconabsent .analytics-vhc-rowcard-tooltip-icon{visibility:hidden}.analytics-vhc-rowcard-tooltip-icon{opacity:0.56;padding:5px 0 5px 0}.analytics-vhc-rowcard-checkbox-container{display:none;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.analytics-vhc-checkboxes-visible .analytics-vhc-rowcard-checkboxvisible .analytics-vhc-rowcard-checkbox-container,.analytics-vhc-checkboxes-visible .analytics-vhc-rowcard-checkboxinvisible .analytics-vhc-rowcard-checkbox-container{display:inherit;margin:7px 32px 7px 30px;padding:1px}.analytics-vhc-rowcard-checkboxinvisible .analytics-vhc-rowcard-checkbox-container{visibility:hidden}.analytics-vhc-rowcard-spacing{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.analytics-selector{height:30px;min-width:140px}.docs-analytics-hc-ie .analytics-selector .docs-material-select-dropdown{-ms-high-contrast-adjust:none;background-color:white}.analytics-selector-menu.goog-menu .goog-menuitem{font-size:14px;padding-right:30px}.analytics-sc,.analytics-sc-settings{-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1}.analytics-sc-settings{overflow-y:auto}.analytics-sc-settings-loading{visibility:hidden}.analytics-sc-disabled-by-admin-explanation,.analytics-sc-view-visibility-explanation{color:rgba(0,0,0,0.87);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;line-height:18px;margin:24px 24px 0 24px;padding:0 100px 0 0}.analytics-sc-view-visibility-explanation{border-bottom:1px solid rgba(0,0,0,0.4);padding-bottom:24px}.analytics-sc-disabled-by-admin-explanation-link,.analytics-sc-disabled-by-admin-explanation-link:active,.analytics-sc-disabled-by-admin-explanation-link:hover,.analytics-sc-disabled-by-admin-explanation-link:link,.analytics-sc-disabled-by-admin-explanation-link:visited{color:#4285f4;cursor:pointer;text-decoration:none}.analytics-sc-account-setting,.analytics-sc-document-setting{margin:0 0 0 32px;padding:24px 0}.analytics-sc-document-setting{border-top:1px solid #e0e0e0}.analytics-sc-account-itemlabel,.analytics-sc-document-itemlabel{color:#202124;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:18px;line-height:24px}.analytics-sc-section-label{color:#3c4043;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;line-height:20px}.analytics-sc-section{-webkit-align-items:center;align-items:center;display:flex;flex-direction:row;justify-content:space-between;margin:16px 32px 0 0}.analytics-sc .analytics-sc-account-show-setting-button{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;color:#188038;cursor:pointer;margin-right:0;max-width:200px;white-space:normal;word-wrap:break-word}.analytics-sc-account-show-setting-button.jfk-button-hover{background-color:#f8fcf9}.analytics-sc-account-show-setting-button.jfk-button-focused{background-color:#e7f5eb}.analytics-sc-account-show-setting-button.jfk-button-focused.jfk-button-hover{background-color:#dff2e4}.analytics-sc-account-show-setting-button.jfk-button-focused.jfk-button-active{background-color:#dff2e4;box-shadow:0 1px 3px 1px rgba(60,64,67,.15)}.analytics-sc-account-switch,.analytics-sc-document-switch{margin-left:5px}.analytics-sc-account-explanation,.analytics-sc-document-explanation{color:#25272b;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;line-height:20px;margin:11px 110px 0 0;width:auto}.analytics-sc-account-explanation a:link,.analytics-sc-account-explanation a:visited{color:#4285f4;text-decoration:none}.analytics-sc-buttons{-webkit-align-items:center;align-items:center;bottom:0;display:flex;flex-direction:row;height:84px;box-pack:justify;-ms-flex-pack:justify;-webkit-box-pack:justify;-webkit-justify-content:flex-end;justify-content:flex-end;width:100%}.analytics-sc-cancel-button{margin:0 8px}.analytics-sc-done-button,.analytics-sc-save-button{margin:0 32px 0 8px}.analytics-sc-section .apps-ui-material-slide-toggle-container{cursor:pointer;margin-right:2px}.analytics-sc-section .apps-ui-material-slide-toggle-container.apps-ui-material-slide-toggle-container-disabled{cursor:default}.analytics-sc-section .apps-ui-material-slide-toggle-container-checked .apps-ui-material-slide-toggle-track{background-color:#ceead6;opacity:1}.analytics-sc-section .apps-ui-material-slide-toggle-container-checked .apps-ui-material-slide-toggle-thumb{background-color:#188038}.analytics-sc-section .apps-ui-material-slide-toggle-container-checked.apps-ui-material-slide-toggle-container-disabled .apps-ui-material-slide-toggle-track{opacity:0.07}.analytics-sc-section .apps-ui-material-slide-toggle-container-checked.apps-ui-material-slide-toggle-container-disabled .apps-ui-material-slide-toggle-thumb{opacity:0.26}.analytics-sc-section .apps-ui-material-slide-toggle-thumb{opacity:1.0}.analytics-sc-section .apps-ui-material-slide-toggle-container-focused .apps-ui-material-slide-toggle-thumb{box-shadow:0 0 6px rgba(0,0,0,.16),0 6px 12px rgba(0,0,0,.32);opacity:1.0}.analytics-sc-section .apps-ui-material-slide-toggle-container-hover .apps-ui-material-slide-toggle-thumb{opacity:1.0}.analytics-sc .analytics-ec-container{margin-bottom:72px;margin-top:56px}.analytics-sfc-card{-webkit-align-items:center;align-items:center;background-color:#eeeeee;border-bottom:1px solid #e0e0e0;display:flex;flex-direction:row;height:48px}.analytics-sfc-label{color:#dd4330;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;font-weight:400;margin:0 24px 0 24px}.analytics-sic{background-color:#fff;box-shadow:0 1px 0 0 #dadce0;display:flex;-ms-flex:1;-webkit-flex:1;flex:1;flex-direction:column;-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1}.analytics-sic-content{-webkit-align-items:center;align-items:center;color:#414549;display:flex;-ms-flex:1;-webkit-flex:1;flex:1;-webkit-flex-basis:auto;-ms-flex-basis:auto;flex-basis:auto;flex-direction:row;-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;box-pack:justify;-ms-flex-pack:justify;-webkit-box-pack:justify;-webkit-justify-content:flex-start;justify-content:flex-start;line-height:18px;margin:10px 0;min-height:38px}.analytics-sic-icon{height:20px;margin:0 10px 0 30px;min-width:20px;width:20px}.analytics-sic-text{margin-right:32px}.analytics-shc{overflow:hidden}.analytics-shc .activity-deck{display:flex;-ms-flex:1;-webkit-flex:1;flex:1;min-height:0;position:relative}.analytics-shc .activity-deck-events-view,.analytics-shc .activity-deck-empty-view{display:flex;-ms-flex:1;-webkit-flex:1;flex:1;height:auto;min-height:0;overflow:hidden;width:100%}.analytics-shc .activity-deck-empty-view{-webkit-align-items:center;align-items:center;box-pack:center;-ms-flex-pack:center;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center}.analytics-shc .activity-list{-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;height:auto;width:100%}.analytics-shc .activity-event-target-list{display:none}.analytics-shc .activity-event-header{-webkit-align-items:center;align-items:center;display:flex;height:40px}.analytics-shc .activity-event-scopes-list{margin-top:0;padding-left:72px}.analytics-shc .activity-event>div:first-child{padding-bottom:0}.analytics-shc .activity-event-scopes-container{padding:8px 0}.analytics-shc .activity-event-scope-change-detail{padding-top:8px}.analytics-shc .activity-event-scope-change-detail.activity-event-scope-change-detail-first{padding-top:2px}.analytics-ssc{-webkit-align-items:center;align-items:center;border-bottom:1px solid #e0e0e0;color:#5f6368;display:flex;flex-direction:row;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;justify-content:space-between;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:500;overflow:hidden;padding:8px 12px 8px 16px}.analytics-ssc-summary{margin-right:12px}.analytics-ssc-manage-settings-button.analytics-btn-text.jfk-button{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;font-size:13px}.analytics-ssc-summary{-webkit-align-items:center;align-items:center;display:flex;flex-direction:row}.analytics-ssc-icon{margin-right:8px}.analytics-trc{-webkit-align-items:center;align-items:center;color:rgba(0,0,0,0.87);display:flex;-ms-flex:none;-webkit-flex:none;flex:none;flex-direction:row;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:16px;font-weight:500;margin:24px 24px 18px 24px}.analytics-tb-container{-webkit-align-items:center;align-items:center;display:flex;flex-direction:row;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;height:72px;box-pack:justify;-ms-flex-pack:justify;-webkit-box-pack:justify;-webkit-justify-content:space-between;justify-content:space-between}.analytics-tb-title-text{color:rgba(0,0,0,0.87);font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:22px;margin:0 0 0 24px}.analytics-tb-close{border:0!important;border-radius:20px;cursor:pointer;display:inline-flex;height:auto;margin:0;opacity:0.54;padding:8px;position:absolute;right:11px;top:16px;z-index:2}.analytics-tb-close.jfk-button-hover{background-color:#f1f3f4;border:0}.analytics-tb-close.jfk-button-focused{background-color:#e8eaed;border:0}.analytics-ttmw{line-height:13px}.analytics-tt-content{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:11px;font-weight:500}.analytics-appbar-tt-content{line-height:15px;max-width:320px;padding:0;word-break:normal}.analytics-tpec-total-unique-viewers,.analytics-tpec-explanation{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:400;padding:0 128px}.analytics-tpec-total-unique-viewers{color:#212121;font-size:16px;line-height:24px;padding-bottom:8px}.analytics-tpec-explanation{color:#757575;font-size:13px}.analytics-tpec-container{-webkit-align-items:center;align-items:center;display:flex;-ms-flex:1;-webkit-flex:1;flex:1;flex-direction:column;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;min-height:132px;text-align:center;width:100%}.analytics-tpec-heading{color:#25272b;font-size:28px;height:36px}.analytics-tpec-paragraph{color:#414549;font-size:16px;margin:8px 0 16px 0;width:400px}.analytics-tpec-viewer-trend-button.jfk-button{-webkit-align-items:center;align-items:center;font-weight:500}.analytics-tc{-webkit-align-items:center;align-items:center;color:rgba(0,0,0,0.87);display:flex;-ms-flex:1 1 auto;-webkit-flex:1 1 auto;flex:1 1 auto;flex-direction:row;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;font-weight:400;min-height:30px}.analytics-tc-message{display:inline}.analytics-tc-comments-count{display:inline;font-weight:500}.analytics-tc-tooltip-icon{margin:0 24px 0 6px;opacity:0.56}.analytics-tuvc{-webkit-align-items:center;align-items:center;color:rgba(0,0,0,0.87);display:flex;-ms-flex:1 1 auto;-webkit-flex:1 1 auto;flex:1 1 auto;flex-direction:row;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;font-weight:400;min-height:30px}.analytics-tuvc-message{display:inline}.analytics-tuvc-viewers-count{display:inline;font-weight:500}.analytics-tuvc-tooltip-icon{margin:0 24px 0 6px;opacity:0.56}.analytics-tcc,.analytics-tcc-chart-container,.analytics-tcc-chart{display:flex;flex-direction:column;-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;min-height:120px;overflow:hidden}.analytics-tcc-chart .google-visualization-tooltip{pointer-events:none}.analytics-tcc-data-table{position:absolute;overflow:hidden;height:1px;left:-10000px;top:auto;width:1px}.analytics-trend-sparkline-graph{-ms-flex:0 0 auto;-webkit-flex:0 0 auto;flex:0 0 auto;height:60px;position:relative}.analytics-trend-sparkline-chart{height:32px;left:24px;position:absolute;right:24px;top:8px;z-index:3}.analytics-trend-sparkline-chart.analytics-trend-sparkline-dragging{cursor:col-resize}.analytics-trend-sparkline-slider{left:14.5px;position:absolute;right:14.5px;top:8px;z-index:4}.analytics-trend-sparkline-left-bg,.analytics-trend-sparkline-right-bg{border-color:#979797;border-width:1px;position:absolute;bottom:20px;top:8px;background-color:#efefef;z-index:1}.analytics-trend-previous-active-bg{z-index:2}.analytics-trend-bg-selected.analytics-trend-sparkline-left-bg,.analytics-trend-bg-selected.analytics-trend-sparkline-right-bg{border-color:#185abc;border-width:2px}.analytics-trend-sparkline-left-bg{border-style:none dashed none none;left:24px}.analytics-trend-sparkline-right-bg{border-style:none none none dashed;right:24px}.analytics-trend-bg-selected.analytics-trend-sparkline-left-bg{left:23.5px}.analytics-trend-bg-selected.analytics-trend-sparkline-right-bg{right:23.5px}.analytics-slider-thumbimpl{background-color:transparent;cursor:col-resize;height:32px;width:20px}.analytics-trend-sparkline-graph .analytics-twothumbslider{height:32px}.analytics-twothumbslider:focus,.analytics-twothumbslider .goog-twothumbslider-value-thumb:focus,.analytics-twothumbslider .goog-twothumbslider-extent-thumb:focus{outline:none}.analytics-twothumbslider.goog-slider-dragging{cursor:col-resize}.analytics-trend-sparkline-graph .analytics-twothumbslider .goog-twothumbslider-rangehighlight{height:0}.analytics-trend-sparkline-graph .analytics-twothumbslider .goog-twothumbslider-value-thumb,.analytics-trend-sparkline-graph .analytics-twothumbslider .goog-twothumbslider-extent-thumb{height:32px;position:absolute;width:20px;z-index:1}.analytics-trend-sparkline-graph .analytics-twothumbslider .analytics-previous-active-thumb{z-index:2}.analytics-tst{background-color:#8f8f8f;border:0;border-radius:2px;height:10px;padding:4px 5px;position:absolute}.analytics-tst-content{color:#fff;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:9px;font-weight:400;white-space:nowrap}.analytics-tst-arrow{position:absolute}.analytics-tst-arrowup{top:-5px}.analytics-tst-arrowimplbefore,.analytics-tst-arrowimplafter{display:block;height:0;position:absolute;width:0}.analytics-tst-arrowimplbefore{border:5px solid;border-color:#8f8f8f transparent;border-top-width:0;left:-5px}.analytics-tst-arrowimplafter{border:4px solid;border-color:#8f8f8f transparent;border-top-width:0;left:-4px;top:1px}.analytics-vhc-viewcardlist{width:100%}.analytics-vhc-viewcardlist-scrollable{overflow-y:auto}.analytics-vc-root,.analytics-vc-content,.analytics-vc-low-data-content{display:flex;flex-direction:column;-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;min-height:1px;position:relative;z-index:1}.analytics-vc-spinner .docs-quantum-spinner{left:0;margin-left:0}.analytics-vc-spinner .docs-spinner{height:28px}.analytics-vc-spinner{height:28px;left:50%;position:absolute;top:50%;-webkit-transform:translate(-50%,-50%);-moz-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);-o-transform:translate(-50%,-50%);transform:translate(-50%,-50%);width:28px}.analytics-lowdatatreatment{display:flex;flex-direction:column;text-align:center;width:100%}.analytics-vc-low-data-content{align-items:center;justify-content:center}.analytics-vhc-rowcard-root .analytics-profile-image{margin:0 16px 0 24px;vertical-align:middle}.analytics-votc{display:flex;flex-direction:column;-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;margin-bottom:24px;overflow-x:hidden;overflow-y:auto}.analytics-votc-header{-webkit-align-items:center;align-items:center;display:flex;-ms-flex:0 0 auto;-webkit-flex:0 0 auto;flex:0 0 auto;flex-direction:row;justify-content:space-between;margin:18px 24px 0 24px;overflow:hidden}.analytics-votc-threshold-legend{-webkit-align-items:center;align-items:center;color:#25272b;display:flex;flex-direction:row;font-size:12px;margin:16px 24px 0 45px;text-align:center}.analytics-votc-threshold-legend-box{border-top:1px solid #669df6;height:1px;margin-right:12px;width:20px}.analytics-votc-threshold-tooltip-icon{margin-left:8px;opacity:0.56}.analytics-vhc-container{display:flex;-ms-flex:1;-webkit-flex:1;flex:1;flex-direction:column;-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;min-height:0}.analytics-vhc-viewhistory{display:flex;-ms-flex:1;-webkit-flex:1;flex:1;flex-direction:column;-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;min-height:0}.analytics-vhc-button-container{-webkit-align-items:flex-start;align-items:flex-start;display:flex;flex-direction:row;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;height:58px;box-pack:justify;-ms-flex-pack:justify;-webkit-box-pack:justify;-webkit-justify-content:space-between;justify-content:space-between}.analytics-vhc-listsortbutton-container{display:flex;flex-direction:row;-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;box-pack:justify;-ms-flex-pack:justify;-webkit-box-pack:justify;-webkit-justify-content:space-between;justify-content:space-between;margin-top:28px}.analytics-vhc-nudgeselectdropdown-container{-webkit-align-items:center;align-items:center;display:flex;margin-right:13px;margin-top:22px;width:60px}.analytics-vhc-nudgeselectdropdown-container .goog-menuitem{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif}.analytics-vhc-nudgeselectdropdown-container .goog-menuitem.goog-menuitem-highlight{padding-bottom:6px;padding-top:6px}.analytics-vhc-tabbarholder{border-bottom:1px solid #e0e0e0;box-shadow:0 2px 12px 2px rgba(60,64,67,.15)}.analytics-vhc-tabbarholder .docs-tabbar{background-color:#fff;max-width:100%}.analytics-vhc-tabbarholder .docs-tabbar-tab{border-bottom:4px solid transparent;border-top:4px solid transparent}.analytics-vhc-tabbarholder .docs-tabbar-tab-selected{border-bottom:4px solid #2196f3}.analytics-vhc-tabbarholder .docs-tabbar-focused .docs-tabbar-tab-selected{background:#fff}.analytics-vhc-tabbarholder .docs-tabbar-mouseactive .docs-tabbar-tab{background:transparent}.analytics-vhc-tabbarholder .docs-tabbar .docs-tabbar-tab-active{background:transparent}.analytics-vhc-tabbarholder .docs-tabbar-tablabel{color:rgba(0,0,0,0.54);font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;font-weight:500}.analytics-vhc-tabbarholder .docs-tabbar-tab-selected .docs-tabbar-tablabel{color:rgba(0,0,0,0.87)}.analytics-vhc-tabbarholder .docs-tabbar .docs-tabbar-tab{align-items:flex-end;height:48px;padding:0 16px;position:relative;max-width:300px;border:0}.analytics-vhc-tabbarholder .docs-tabbar .docs-tabbar-tab:first-child{margin-left:8px}.analytics-vhc-tabbarholder .docs-tabbar-tab .docs-tabbar-tablabel{color:#5f6368;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;text-transform:none;margin-bottom:8px;text-transform:none}.analytics-vhc-tabbarholder .docs-tabbar-tab-hover .docs-tabbar-tablabel{color:#3c4043}.analytics-vhc-tabbarholder .docs-tabbar-focused .docs-tabbar-tab-hover .docs-tabbar-tablabel{color:#202124}.analytics-vhc-tabbarholder .docs-tabbar-mouseactive .docs-tabbar-tab-hover .docs-tabbar-tablabel{color:#188038}.analytics-vhc-tabbarholder .docs-tabbar-tab-selected .docs-tabbar-tablabel{color:#188038}.analytics-vhc-tabbarholder .docs-tabbar-tab-selected.docs-tabbar-tab-hover .docs-tabbar-tablabel{color:#188038}.analytics-vhc-tabbarholder .docs-tabbar-focused .docs-tabbar-tab-selected.docs-tabbar-tab-hover .docs-tabbar-tablabel{color:#137333}.analytics-vhc-tabbarholder .docs-tabbar-mouseactive .docs-tabbar-tab-selected.docs-tabbar-tab-hover .docs-tabbar-tablabel{color:#137333}.analytics-vhc-tabbarholder .docs-tabbar-tab-selected::before{border-bottom:3px solid #188038;border-radius:3px 3px 0 0;bottom:0;content:'';display:block;height:0;left:12px;position:absolute;width:calc(100% + -24px)}.analytics-vhc-tabbarholder .docs-tabbar-tab-selected.docs-tabbar-tab-hover::before{border-bottom-color:#188038}.analytics-vhc-tabbarholder .docs-tabbar-focused .docs-tabbar-tab-selected.docs-tabbar-tab-hover::before{border-bottom-color:#137333}.analytics-vhc-tabbarholder .docs-tabbar .docs-tabbar-tab-active{background:transparent}.analytics-vhc-tabbarholder .analytics-vhc .analytics-vc-spinner{top:325px}.analytics-vhc-tablabel-domain-name{font-weight:400;text-transform:none}.driveLockingUnlockcontent-text{color:#616161;display:block;font-family:Roboto,Arial,sans-serif;font-size:1rem;font-weight:400;letter-spacing:0.00625em;line-height:1.5rem}.driveLockingUnlockdetails-link{margin-left:4px}#docs-approvals-toast-unlock{cursor:pointer}#docs-approvals-toast-unlock.jfk-button-disabled{display:none}.docs-blameview{display:block;background:#ffffff;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;outline:none;overflow:hidden;width:240px}.docs-blameview-title-container{align-items:center;background:#f8f8f8;display:flex;flex-direction:row;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;justify-content:space-between}.docs-blameview-title{display:block;background:#f8f8f8;color:#3c4043;font-weight:500;font-size:14px;padding:16px;white-space:nowrap}.docs-blameview-nav-container{margin:2px 8px 0 8px}.docs-blameview-previous-edit-button,.docs-blameview-next-edit-button{cursor:pointer;background:transparent;border-radius:2px;height:24px;outline:none}.docs-blameview-nav-container .docs-blameview-previous-edit-button .docs-blameview-button-icon .docs-icon-img:before,.docs-blameview-nav-container .docs-blameview-next-edit-button .docs-blameview-button-icon .docs-icon-img:before,.docs-blameview-nav-container .docs-blameview-previous-edit-button .docs-blameview-button-icon .docs-icon-img,.docs-blameview-nav-container .docs-blameview-next-edit-button .docs-blameview-button-icon .docs-icon-img{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_green.svg)}.docs-blameview-previous-edit-button.jfk-button-hover,.docs-blameview-next-edit-button.jfk-button-hover,.docs-blameview-previous-edit-button.jfk-button-focused,.docs-blameview-next-edit-button.jfk-button-focused{cursor:pointer;background:#f1f3f4;border-color:transparent}.docs-blameview-previous-edit-button.jfk-button-active,.docs-blameview-next-edit-button.jfk-button-active{cursor:pointer;background:#e6f4ea}.docs-blameview-previous-edit-button.jfk-button-disabled,.docs-blameview-next-edit-button.jfk-button-disabled{cursor:default}.docs-blameview-nav-container .docs-blameview-previous-edit-button.jfk-button-disabled .docs-icon-img:before,.docs-blameview-nav-container .docs-blameview-next-edit-button.jfk-button-disabled .docs-icon-img:before,.docs-blameview-nav-container .docs-blameview-previous-edit-button.jfk-button-disabled .docs-icon-img,.docs-blameview-nav-container .docs-blameview-next-edit-button.jfk-button-disabled .docs-icon-img{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_grey_dark.svg);opacity:.38}.docs-blameview-button-icon{overflow:hidden;position:relative}.docs-blameview-message{background:#fff;border-bottom-left-radius:4px;border-bottom-right-radius:4px;color:#3c4043;display:block;font-size:14px;line-height:20px;overflow:hidden;overflow-wrap:break-word;padding:13px 16px 13px 16px;text-overflow:ellipsis;white-space:normal}.docs-blameview-header{background:#f8f8f8;display:flex;flex-direction:row;padding:0 16px 10px 16px;white-space:nowrap}.docs-blameview-avatar-holder{display:inline-block;max-width:32px}.docs-blameview-avatar{border-radius:50%;height:32px;width:32px}.docs-blameview-authortimestamp{color:#3c4043;display:inline-block;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;overflow:hidden;padding:0 10px;text-overflow:ellipsis;white-space:nowrap;-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1}.docs-blameview-timestamp{display:block;font-size:12px;margin:0}.docs-blameview-author{display:block;font-size:14px;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;height:18px;margin-bottom:1px;max-width:167px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.docs-blameview-valuecontainer{background:#ffffff;display:flex;flex:1 1 auto;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;justify-content:space-between;line-height:20px;max-height:160px;overflow:hidden;overflow-wrap:break-word;white-space:normal;width:100%}.docs-blame-bold-text{font-style:normal;font-weight:500}.docs-blameview-value-content{color:#3c4043;display:inline;font-style:italic;overflow-x:hidden;overflow-y:auto;overflow-wrap:break-word;padding:10px 16px;word-wrap:break-word}.docs-blameview-value-content-indirect-edit{margin-right:0}.overlay-container-rtl .docs-blameview-value-content-indirect-edit{margin-left:0}.docs-blameview-spinner{background:#fff;overflow:hidden;padding:30px 16px 13px 16px}.docs-blameview-spinner-holder{float:left;height:32px;margin:0 0 0 16px;position:relative}.overlay-container-rtl .docs-blameview-spinner-holder{float:right;margin:0 16px 0 0}.docs-blameview-icon:before{content:url(//ssl.gstatic.com/docs/common/menu_feature_sprite7.svg)}.docs-blameview-icon{height:4332px;position:absolute;width:72px}.docs-blameview-footer{border-top:1px solid #dadce0;display:flex;flex-direction:column;padding:12px 16px 0 16px}.docs-blameview-warning,.docs-blameview-indirect-edit{color:#3c4043;display:block;font-size:12px;line-height:16px;padding-bottom:12px;white-space:normal}a.docs-blameview-warning-info,.docs-blameview-indirect-edit-learnmore a{color:#1a73e8;text-decoration:underline}.docs-blameview-feedback{align-items:center;background:#ffffff;border-top:1px solid #dadce0;display:block;padding-left:16px;padding-right:9px;padding-top:10px;line-height:20px}.docs-blameview-short-feedback{display:none}.docs-blameview-useful-text{color:#3c4043;float:left;font-size:14px;font-style:italic}.docs-blameview-give-thumbs-up{float:right;padding-right:12px}.docs-blameview-thumbs-up-button{float:left;opacity:0.6;padding-right:10px;width:18px}.docs-blameview-thumbs-down-button{float:right;opacity:0.6;width:18px}.docs-blameview-thumbs-up-button:hover,.docs-blameview-thumbs-down-button:hover{cursor:pointer;opacity:1}.docs-blameview-long-feedback{display:none;font-size:14px;font-style:italic}.docs-blameview-long-feedback a,.docs-blameview-long-feedback a:link,.docs-blameview-long-feedback a:visited{color:#1a73e8}.docs-blameview-long-feedback-text{color:#3c4043}.docs-blameview-nav-container .docs-hc-edge.docs-blameview-previous-edit-button .docs-icon-img,.docs-blameview-nav-container .docs-hc-edge.docs-blameview-next-edit-button .docs-icon-img,.docs-blameview-nav-container .docs-hc-gecko.docs-blameview-previous-edit-button .docs-icon-img,.docs-blameview-nav-container .docs-hc-gecko.docs-blameview-next-edit-button .docs-icon-img{filter:brightness(1.5)}.docs-blameview-nav-container .docs-hc-edge.docs-blameview-previous-edit-button.jfk-button-disabled .docs-icon-img,.docs-blameview-nav-container .docs-hc-edge.docs-blameview-next-edit-button.jfk-button-disabled .docs-icon-img,.docs-blameview-nav-container .docs-hc-gecko.docs-blameview-previous-edit-button.jfk-button-disabled .docs-icon-img,.docs-blameview-nav-container .docs-hc-gecko.docs-blameview-next-edit-button.jfk-button-disabled .docs-icon-img{filter:brightness(10);opacity:1}.docs-blameview-nav-container .docs-hc-ie.docs-blameview-previous-edit-button .docs-icon-img,.docs-blameview-nav-container .docs-hc-ie.docs-blameview-next-edit-button .docs-icon-img{-ms-high-contrast-adjust:none;background-color:white}.jfk-butterBar.docs-autopurge-butter,.docs-gm .jfk-butterBar.docs-autopurge-butter{background-color:#e6f4ea;box-shadow:0 4px 8px rgba(60,64,67,0.15),0 1px 3px rgba(60,64,67,0.3),0 6px 11px rgba(128,134,139,0.06),0 -3px 11px rgba(128,134,139,0.09);display:table;left:162px;padding-right:0;position:absolute;top:17px}.docs-autopurge-butter-link{margin-left:24px;padding-right:6px;white-space:nowrap}.docs-butterbar-dismiss.docs-autopurge-butter-dismiss,.docs-gm .docs-butterbar-dismiss.docs-autopurge-butter-dismiss{display:table-cell;padding:0 12px;vertical-align:middle}.docs-butterbar-link.docs-autopurge-butter-link,.docs-butterbar-dismiss.docs-autopurge-butter-dismiss,.docs-gm .docs-butterbar-link.docs-autopurge-butter-link,.docs-gm .docs-butterbar-dismiss.docs-autopurge-butter-dismiss{color:#188038;font-size:14px;letter-spacing:0.25px;text-decoration:none}.docs-butterbar-link.docs-autopurge-butter-link:hover,.docs-gm .docs-butterbar-link.docs-autopurge-butter-link:hover{border:1px solid #4d90fe;border-radius:4px;color:#0d652d;margin-left:23px;margin-right:-1px}.docs-butterbar-dismiss.docs-autopurge-butter-dismiss:hover,.docs-gm .docs-butterbar-dismiss.docs-autopurge-butter-dismiss:hover{border:1px solid rgb(77,144,254);border-radius:4px;color:#0d652d;padding:11px}.docs-autopurge-butter-text{color:#188038;font-family:Roboto;letter-spacing:0.2px}.docs-autopurge-butter-text-span{display:table-cell;padding:12px 12px 12px 0;text-align:left}.docs-gm .docs-gm-sidebar-icon{display:flex;align-items:center;margin-right:12px;height:24px;width:24px}.docs-gm .docs-gm-sidebar-icon .docs-gm-sidebar-icon-24{height:24px;margin:0;width:24px}.docs-gm .docs-gm-sidebar-icon-path{fill:#188038}.docs-sidebar-titlebar-icon-button{cursor:pointer;position:absolute;right:10px}.docs-sidebar-gm-titlebar-icon-button{background-color:transparent;border:none!important;border-radius:50%;cursor:pointer;height:26px;margin-left:auto;margin-right:0;padding:6px 0 0 0;position:relative;right:-5px;text-align:center;top:0;width:32px}.docs-sidebar-gm-titlebar-icon-button:hover{background-color:#f1f3f4}.docs-sidebar-gm-titlebar-icon-button:focus{background-color:#e8eaed;outline:none}.docs-clipboard-clearall{font-weight:500}.docs-clipboard-preview{position:absolute;background-color:#fff;color:black;visibility:hidden;width:260px;height:195px;overflow:hidden;font-size:80%;border:1px solid #888;outline:0;padding:2px;top:0;z-index:9999}.docs-clipboard-preview iframe{border:0;padding:0;margin:0;width:100%;height:100%;vertical-align:top}.docs-textcolormenubutton .goog-toolbar-menu-button-outer-box .goog-toolbar-menu-button-inner-box .goog-toolbar-menu-button-caption .goog-color-menu-button-indicator{height:20px;width:22px;bottom:1px}.docs-text-color-state-change-button{margin-right:0;padding:0 18px}.jfk-button-standard.docs-c-u-colormenutogglebutton-base.docs-c-u-colormenutogglebutton-extra-visible-border.jfk-button-hover,.jfk-button-standard.docs-c-u-colormenutogglebutton-base.docs-c-u-colormenutogglebutton-extra-visible-border.jfk-button-hover.jfk-button-checked{border:1px solid #000}.docs-text-color-omnibox-icon{float:left;width:16px;height:16px;margin:2px}.docs-docos-activitybox{background:#fff;border:solid 1px #cbcbcb;-moz-box-shadow:-1px 1px 1px rgba(0,0,0,.2);-webkit-box-shadow:0 2px 4px rgba(0,0,0,.2);box-shadow:0 2px 4px rgba(0,0,0,.2);padding:12px 0;position:absolute;outline:none;right:20px;top:46px;z-index:900}.docos-streampanesize{height:420px;width:385px}.docos-streampanesize-legacy{height:550px;width:434px}.docs-docos-activitybox-inner{height:100%;overflow:auto}.docs-docos-activitybox.docos-enable-new-header{padding:0!important;height:auto!important}.docs-docos-activitybox.docos-enable-new-header>.docs-docos-activitybox-inner{overflow:visible!important}.docs-docos-caret-inner,.docs-docos-caret-outer{border:9px solid;border-top-width:0;display:block;height:0;margin:0 auto;position:relative;width:0;z-index:901}.docs-docos-caret-inner{border-color:#fff transparent;top:1px}.docs-docos-caret-outer{border-color:#cbcbcb transparent;top:9px}.docos-enable-new-header>.docs-docos-caret-inner{border-color:#f1f1f1 transparent!important}.docos-shelly-icon{background-image:url(//ssl.gstatic.com/docs/common/d-icons30.png);background-repeat:no-repeat;height:14px;width:14px}.docos-icon-close-pane{background-position:0 -21px}.docos-icon-close-pane:hover{background-position:-38px -45px}.docos-icon-grippy{background-position:-38px -94px;width:16px;height:4px}.docos-icon-discussion-button{background-position:-22px -66px;width:14px;height:15px;vertical-align:text-bottom;margin-right:5px}.post-limit-error-dialog{max-width:512px;box-sizing:border-box}.post-limit-error-dialog .docs-material-gm-dialog-content{color:#3c4043;font-size:14px}#docs-docos-subscriptionbutton .jfk-button,#docs-docos-subscriptionbutton .jfk-freestanding-menu-button{background-image:none;border:1px solid transparent;border-radius:4px;box-shadow:none;box-sizing:border-box;cursor:pointer;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;height:36px;letter-spacing:0.25px;line-height:calc(36px - 1px);outline:none;padding:9px 12px 10px 12px;text-align:center;text-transform:capitalize}#docs-docos-subscriptionbutton .goog-menu{text-align:left;transform:translateX(12px)}#docs-docos-subscriptionbutton .goog-menuitem{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;padding-left:15px}#docs-docos-subscriptionbutton .jfk-button.jfk-button-disabled,#docs-docos-subscriptionbutton .jfk-freestanding-menu-button.jfk-freestanding-menu-button-disabled{background-color:#f1f3f4;color:#3c4043;cursor:inherit;opacity:0.38}#docs-docos-subscriptionbutton .jfk-button.jfk-button-disabled{border-right-color:#dadce0}#docs-docos-subscriptionbutton .jfk-freestanding-menu-button.jfk-freestanding-menu-button-disabled .docs-docos-sb-menu-icon{border-bottom-color:#3c4043;border-top-color:#3c4043}#docs-docos-subscriptionbutton.docs-docos-sb-muted .jfk-button:not(.jfk-button-disabled),#docs-docos-subscriptionbutton.docs-docos-sb-muted .jfk-freestanding-menu-button:not(.jfk-freestanding-menu-button-disabled){background-color:white;border-color:#9aa0a6;color:#9aa0a6}#docs-docos-subscriptionbutton.docs-docos-sb-muted .jfk-freestanding-menu-button:not(.jfk-freestanding-menu-button-disabled) .docs-docos-sb-menu-icon{border-bottom-color:#9aa0a6;border-top-color:#9aa0a6}#docs-docos-subscriptionbutton.docs-docos-sb-muted .jfk-button.jfk-button-hover,#docs-docos-subscriptionbutton.docs-docos-sb-muted .jfk-button.jfk-button-hover+.jfk-freestanding-menu-button,#docs-docos-subscriptionbutton.docs-docos-sb-muted .jfk-button.jfk-button-focused,#docs-docos-subscriptionbutton.docs-docos-sb-muted .jfk-button.jfk-button-focused+.jfk-freestanding-menu-button,#docs-docos-subscriptionbutton.docs-docos-sb-muted .jfk-freestanding-menu-button.jfk-freestanding-menu-button-hover,#docs-docos-subscriptionbutton.docs-docos-sb-muted .jfk-freestanding-menu-button.jfk-freestanding-menu-button-focused{background-color:#f1f3f4}#docs-docos-subscriptionbutton.docs-docos-sb-follow .jfk-button:not(.jfk-button-disabled),#docs-docos-subscriptionbutton.docs-docos-sb-follow .jfk-freestanding-menu-button:not(.jfk-freestanding-menu-button-disabled){background-color:white;border-color:#669df6;color:#1a73e8}#docs-docos-subscriptionbutton.docs-docos-sb-follow .jfk-freestanding-menu-button:not(.jfk-freestanding-menu-button-disabled) .docs-docos-sb-menu-icon{border-bottom-color:#1a73e8;border-top-color:#1a73e8}#docs-docos-subscriptionbutton.docs-docos-sb-follow .jfk-button.jfk-button-hover,#docs-docos-subscriptionbutton.docs-docos-sb-follow .jfk-button.jfk-button-hover+.jfk-freestanding-menu-button,#docs-docos-subscriptionbutton.docs-docos-sb-follow .jfk-button.jfk-button-focused,#docs-docos-subscriptionbutton.docs-docos-sb-follow .jfk-button.jfk-button-focused+.jfk-freestanding-menu-button,#docs-docos-subscriptionbutton.docs-docos-sb-follow .jfk-freestanding-menu-button.jfk-freestanding-menu-button-hover,#docs-docos-subscriptionbutton.docs-docos-sb-follow .jfk-freestanding-menu-button.jfk-freestanding-menu-button-focused{background-color:#e8f0fe}#docs-docos-subscriptionbutton.docs-docos-sb-following .jfk-button:not(.jfk-button-disabled),#docs-docos-subscriptionbutton.docs-docos-sb-following .jfk-freestanding-menu-button:not(.jfk-freestanding-menu-button-disabled){background-color:#1a73e8;border-color:#1a73e8;color:white}#docs-docos-subscriptionbutton.docs-docos-sb-following .jfk-freestanding-menu-button:not(.jfk-freestanding-menu-button-disabled) .docs-docos-sb-menu-icon{border-bottom-color:white;border-top-color:white}#docs-docos-subscriptionbutton.docs-docos-sb-following .jfk-button.jfk-button-focused,#docs-docos-subscriptionbutton.docs-docos-sb-following .jfk-button.jfk-button-focused+.jfk-freestanding-menu-button,#docs-docos-subscriptionbutton.docs-docos-sb-following .jfk-freestanding-menu-button.jfk-freestanding-menu-button-hover,#docs-docos-subscriptionbutton.docs-docos-sb-following .jfk-freestanding-menu-button.jfk-freestanding-menu-button-focused{background-color:#185abc;border-color:#185abc}#docs-docos-subscriptionbutton.docs-docos-sb-following .jfk-button.jfk-button-hover,#docs-docos-subscriptionbutton.docs-docos-sb-following .jfk-button.jfk-button-hover+.jfk-freestanding-menu-button{background-color:#ea4335;border-color:#ea4335}#docs-docos-subscriptionbutton.docs-docos-sb-following .jfk-button:not(.jfk-button-disabled){border-right-color:white}#docs-docos-subscriptionbutton .docs-docos-sb-main.jfk-button{border-bottom-right-radius:0;border-top-right-radius:0;margin-right:0;-webkit-tap-highlight-color:transparent}.docs-docos-sb-muted-text,.docs-docos-sb-muted-hover-text,.docs-docos-sb-follow-text,.docs-docos-sb-following-text,.docs-docos-sb-following-hover-text{bottom:0;left:0;position:absolute;right:0;text-align:center;top:0}.docs-docos-sb-muted-text,.docs-docos-sb-muted-hover-text,.docs-docos-sb-muted-measuring-text,.docs-docos-sb-follow-text,.docs-docos-sb-follow-measuring-text,.docs-docos-sb-following-text,.docs-docos-sb-following-hover-text,.docs-docos-sb-following-measuring-text{display:none}.docs-docos-sb-muted .docs-docos-sb-muted-text,.docs-docos-sb-follow .docs-docos-sb-follow-text,.docs-docos-sb-following .docs-docos-sb-following-text{display:inline}.docs-docos-sb-muted .docs-docos-sb-muted-measuring-text,.docs-docos-sb-follow .docs-docos-sb-follow-measuring-text,.docs-docos-sb-following .docs-docos-sb-following-measuring-text{display:inline-block;visibility:hidden;height:0;overflow:hidden;white-space:nowrap}.docs-docos-sb-muted .jfk-button.jfk-button-hover .docs-docos-sb-muted-text,.docs-docos-sb-following .jfk-button.jfk-button-hover .docs-docos-sb-following-text{display:none}.docs-docos-sb-muted .jfk-button.jfk-button-hover .docs-docos-sb-muted-hover-text,.docs-docos-sb-following .jfk-button.jfk-button-hover .docs-docos-sb-following-hover-text{display:inline}#docs-docos-subscriptionbutton .jfk-freestanding-menu-button{-webkit-align-items:center;align-items:center;border-bottom-left-radius:0;border-left:none!important;border-top-left-radius:0;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;-webkit-justify-content:center;justify-content:center;margin-right:12px;width:19px}.docs-docos-sb-menu-icon{border-left-color:transparent;border-right-color:transparent;border-style:solid;border-width:4px 4px 0;height:0;width:0}.instant-button{height:24px;width:24px;outline:none;padding:8px}.instant-button:hover{background:#f1f3f4}.multi-button .first-button{padding-top:15px}.multi-button .last-button{padding-bottom:15px}.superfab-icon-container{position:absolute;transition:opacity .15s ease-in-out}.docs-material .docs-icon.superfab-icon-size{height:24px;width:24px}.superfab-icon{display:inline-block;opacity:0.9;transition:opacity .15s ease-in-out}#docs-instant-bubble:hover .superfab-icon,#docs-instant-bubble .superfab-icon:hover{opacity:1}.send-to-email-toast.docs-ui-toast{max-width:323px;padding:14px 16px 14px 16px!important}.send-to-email-toast.docs-ui-toast .docs-ui-toast-content{color:#8ab4f8;font-family:"Google Sans";font-size:14px;min-width:323px;line-height:20px;align-items:center;letter-spacing:0.25px;margin:0 8px}.office-editing-export-error-bubble-close-button{float:right}.office-editing-export-error-bubble{background-color:#fff;border:1px solid transparent;border-radius:8px;box-shadow:0 4px 8px 3px rgba(60,64,67,.15);position:absolute;z-index:1003;color:#5f6368;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;outline:none;padding:24px;white-space:pre-line;width:400px}.office-editing-export-error-bubble-title{color:#202124;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:22px;font-weight:400;line-height:28px;font-size:16px;line-height:24px}.office-editing-export-error-bubble-description{line-height:20px;margin-top:16px}.office-editing-export-error-bubble-retry-text{font-size:12px;line-height:16px;margin-top:12px}.office-editing-export-error-bubble-learn-more,.office-editing-export-error-bubble-learn-more:visited{color:#1a73e8;margin-left:8px}.office-editing-onboarding-promo-bubble-dotted-progressbar-dot{background:#ceead6;border-radius:50%;display:inline-block;height:8px;margin-right:8px;width:8px}.office-editing-onboarding-promo-bubble-dotted-progressbar-dot-highlighted{background:#188038}.office-editing-onboarding-dialog{width:480px}.office-editing-onboarding-dialog-logo{height:256px;width:480px;content:url("//ssl.gstatic.com/docs/common/promo/ritz_shadow_docs_promo_ltr.gif");border-top-left-radius:8px;border-top-right-radius:8px}.office-editing-onboarding-dialog-heading{color:#202124;font-size:24px;line-height:32px;padding-top:24px;padding-bottom:12px;padding-left:24px;padding-right:24px}.office-editing-onboarding-dialog-description{color:#5f6368;font-size:18px;line-height:28px;text-align:center;padding-left:24px;padding-right:24px}.office-editing-onboarding-dialog-logo-container,.office-editing-onboarding-dialog-heading,.office-editing-onboarding-dialog-description,.office-editing-onboarding-dialog .docs-material-gm-dialog-buttons{display:flex;justify-content:center}.office-editing-onboarding-dialog .docs-material-gm-dialog-title{padding:0}.office-editing-onboarding-dialog .docs-material-gm-dialog-title-close{cursor:pointer;top:18px;right:18px}.office-editing-onboarding-dialog .docs-material-gm-dialog-content{padding-left:0;padding-right:0;padding-bottom:16px}.office-editing-onboarding-dialog .docs-material-gm-dialog-buttons{padding-top:0}.office-editing-onboarding-promo-bubble{padding:16px 16px 16px 20px;width:324px}.office-editing-onboarding-promo-bubble-title{color:#202124;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:18px;line-height:24px;padding-bottom:8px}.office-editing-onboarding-promo-bubble-description{color:#3c4043;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;padding-right:24px}.office-editing-onboarding-promo-bubble .docs-material-promo-walkthrough-bubble-buttons{display:block;padding:24px 0 0 0;justify-content:normal}.office-editing-onboarding-promo-bubble .docs-material-promo-walkthrough-bubble-buttons .docs-material-button-fill-primary.docs-material-button{display:inline-block;float:right;height:24px;padding:3px 18px 3px}.office-editing-onboarding-promo-bubble .office-editing-promo-bubble-dotted-progressbar{display:inline-block;float:left}.docs-material .docs-icon,.docs-material .goog-color-menu-button-indicator .docs-icon,.docs-material .sketchy-toolbar-color-menu-button .goog-toolbar-menu-button-caption .docs-icon{height:18px;width:18px;margin:1px 2px 2px 1px}.docs-material .docs-icon-img:before{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222.svg)}.docs-gm .docs-material .docs-icon-img:before{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_grey_medium.svg)}.docs-material .docs-icon-img{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222.svg)}.docs-gm .docs-material .docs-icon-img{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_grey_medium.svg)}.docs-material .docs-icon-img-container{height:6179px;position:absolute;width:74px}.docs-material .goog-menuitem-icon .docs-icon-img-container{opacity:0.54}.docs-gm .docs-material .goog-menuitem-icon .docs-icon-img-container{opacity:1}.docs-material .goog-menuitem-icon .docs-icon-document,.docs-material .goog-menuitem-icon .docs-icon-punch,.docs-material .goog-menuitem-icon .docs-icon-presentation,.docs-material .goog-menuitem-icon .docs-icon-spreadsheet,.docs-material .goog-menuitem-icon .docs-icon-form,.docs-material .goog-menuitem-icon .docs-icon-drawing,.docs-material .goog-menuitem-icon .docs-icon-script,.docs-material .goog-menuitem-icon .docs-icon-site{opacity:1}.docs-material .goog-toolbar-button-inner-box .docs-icon,.docs-material .goog-toolbar-menu-button-caption .docs-icon,.docs-material .goog-toolbar-menu-button-caption .goog-color-menu-button-indicator .docs-icon{margin-top:0px}.docs-gm .docs-material .goog-toolbar-button-active .docs-icon-img:before,.docs-gm .docs-material .goog-toolbar-button-checked .docs-icon-img:before,.docs-gm .docs-material .goog-toolbar-button-selected .docs-icon-img:before,.docs-gm .docs-material .goog-toolbar-combo-button-open .docs-icon-img:before,.docs-gm .docs-material .goog-toolbar-menu-button-open .docs-icon-img:before,.docs-gm .docs-material .docs-toolbar-split-create-button.goog-toolbar-button-active .docs-icon-img:before,.docs-gm .docs-material .docs-toolbar-split-create-button.goog-toolbar-menu-button-active .docs-icon-img:before,.docs-gm .docs-material .docs-toolbar-split-create-button.goog-toolbar-menu-button-open .docs-icon-img:before,.docs-gm .docs-material .docs-appbar-circle-button.jfk-button-active .docs-icon-img:before,.docs-gm .docs-material .docs-appbar-circle-button.jfk-button-checked .docs-icon-img:before,.docs-gm .docs-material .docs-analytics-sidebar-tab-selected .docs-icon-img:before,.docs-gm .docs-material.docs-sheet-active-tab .docs-icon-img:before,.docs-gm .docs-material .docs-sheet-button-active .docs-icon-img:before,.docs-gm .docs-material .docs-sheet-button-open .docs-icon-img:before,.docs-gm .docs-material .punch-start-presentation-container .docs-icon-img:before,.docs-gm .docs-material .waffle-named-ranges-promo-title .docs-icon-img:before,.docs-gm .docs-material.goog-flat-menu-button-open .docs-icon-img:before,.docs-gm .docs-material.trix-palette .goog-palette-cell-selected .docs-icon-img:before,.docs-bubble .docs-bubble-button.jfk-button:hover:active .docs-icon-img:before,.docs-material .docs-save-indicator-popup-icon .docs-icon-img:before,.docs-material .docs-titlebar-badge:active .docs-icon-img:before,.docs-material .docs-titlebar-badge.docs-titlebar-badge-selected .docs-icon-img:before{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_green.svg)}.docs-gm .docs-material .goog-toolbar-button-active .docs-icon-img,.docs-gm .docs-material .goog-toolbar-button-checked .docs-icon-img,.docs-gm .docs-material .goog-toolbar-button-selected .docs-icon-img,.docs-gm .docs-material .goog-toolbar-combo-button-open .docs-icon-img,.docs-gm .docs-material .goog-toolbar-menu-button-open .docs-icon-img,.docs-gm .docs-material .docs-toolbar-split-create-button.goog-toolbar-button-active .docs-icon-img,.docs-gm .docs-material .docs-toolbar-split-create-button.goog-toolbar-menu-button-active .docs-icon-img,.docs-gm .docs-material .docs-toolbar-split-create-button.goog-toolbar-menu-button-open .docs-icon-img,.docs-gm .docs-material .docs-appbar-circle-button.jfk-button-active .docs-icon-img,.docs-gm .docs-material .docs-appbar-circle-button.jfk-button-checked .docs-icon-img,.docs-gm .docs-material .docs-analytics-sidebar-tab-selected .docs-icon-img,.docs-gm .docs-material.docs-sheet-active-tab .docs-icon-img,.docs-gm .docs-material .docs-sheet-button-active .docs-icon-img,.docs-gm .docs-material .docs-sheet-button-open .docs-icon-img,.docs-gm .docs-material .punch-start-presentation-container .docs-icon-img,.docs-gm .docs-material .waffle-named-ranges-promo-title .docs-icon-img,.docs-gm .docs-material.goog-flat-menu-button-open .docs-icon-img,.docs-gm .docs-material.trix-palette .goog-palette-cell-selected .docs-icon-img,.docs-bubble .docs-bubble-button.jfk-button:hover:active .docs-icon-img,.docs-material .docs-save-indicator-popup-icon .docs-icon-img,.docs-material .docs-titlebar-badge:active .docs-icon-img,.docs-material .docs-titlebar-badge.docs-titlebar-badge-selected .docs-icon-img{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_green.svg)}.docs-material.clean-palette .docs-icon{margin:4px}.docs-material .docs-omnibox-row-icon .shape-icon{margin:-1px 0 0 -1px}.docs-material .docs-icon-save{left:-20px;top:-534px}.docs-material .docs-icon-print{left:0;top:-4424px}.docs-material .docs-icon-undo,.docs-material .docs-icon-redo-rtl{left:-20px;top:-2072px}.docs-material .docs-icon-redo,.docs-material .docs-icon-undo-rtl{left:0;top:-2978px}.docs-material .docs-icon-copy{left:0;top:-2898px}.docs-material .docs-icon-cut{left:-20px;top:-3990px}.docs-material .docs-icon-paste{left:0;top:-2878px}.docs-material .docs-icon-document{left:-20px;top:-3498px}.docs-material .docs-icon-presentation,.docs-material .docs-icon-punch{left:-40px;top:-3638px}.docs-material .docs-icon-presentation-grey900{left:-42px;top:-1736px}.docs-material .docs-icon-spreadsheet{left:-20px;top:-5899px}.docs-material .docs-icon-form{left:0;top:-5085px}.docs-material .docs-icon-form-black{left:0;top:-2252px}.docs-material .docs-icon-drawing{left:-40px;top:-2032px}.docs-material .docs-icon-site{left:-40px;top:-1972px}.docs-material .docs-icon-drawing-black{left:-52px;top:-3104px}.docs-material .docs-icon-excel{left:0;top:-5313px}.docs-material .docs-icon-powerpoint{left:0;top:-3350px}.docs-material .docs-icon-word{left:0;top:-5559px}.docs-material .docs-icon-script{left:-46px;top:-66px}.docs-material .docs-icon-insert-script{left:-40px;top:-3950px}.docs-material .docs-icon-gadget{left:0;top:-614px}.docs-material .docs-icon-image{left:-20px;top:-3418px}.docs-material .docs-icon-clipboard{left:0;top:-940px}.docs-material .docs-icon-bold{left:-40px;top:-4150px}.docs-material .docs-icon-italic{left:0;top:-352px}.docs-material .docs-icon-text-color{left:-40px;top:-1992px}.docs-material .docs-icon-align-left{left:-40px;top:-474px}.docs-material .docs-icon-align-center{left:0;top:-3498px}.docs-material .docs-icon-align-right{left:-20px;top:-3764px}.docs-material .docs-icon-align-justify{left:0;top:-4192px}.docs-material .docs-icon-align-shapes-left{left:0;top:-3024px}.docs-material .docs-icon-align-shapes-center{left:-46px;top:-1122px}.docs-material .docs-icon-align-shapes-right{left:0;top:-2938px}.docs-material .docs-icon-align-shapes-top{left:0;top:-1890px}.docs-material .docs-icon-align-shapes-middle{left:-26px;top:-3898px}.docs-material .docs-icon-align-shapes-bottom{left:0;top:-2858px}.docs-material .docs-icon-distribute-shapes-horizontally{left:0;top:-5455px}.docs-material .docs-icon-distribute-shapes-vertically{left:-20px;top:-2858px}.docs-material .docs-icon-valign-top{left:-40px;top:-2232px}.docs-material .docs-icon-valign-middle{left:0;top:-2626px}.docs-material .docs-icon-valign-bottom{left:-46px;top:-5231px}.docs-material .docs-icon-list-number{left:0;top:-4813px}.docs-material .docs-icon-list-bullet{left:-26px;top:-5211px}.docs-material .docs-icon-indent{left:0;top:-1062px}.docs-material .docs-icon-outdent{left:-20px;top:-814px}.docs-material .docs-icon-line-spacing{left:-20px;top:-2032px}.docs-material .docs-icon-columns{left:0;top:-5645px}.docs-material .docs-icon-underline{left:0;top:-3418px}.docs-material .docs-icon-text-bgcolor{left:-26px;top:-86px}.docs-material .docs-icon-textbox{left:-20px;top:-3598px}.docs-material .docs-icon-shapes{left:-22px;top:-1736px}.docs-material .docs-icon-line-width{left:-20px;top:-5105px}.docs-material .docs-icon-add-trendline{left:-20px;top:-5271px}.docs-material .docs-icon-data-label{left:0;top:-252px}.docs-material .docs-icon-next{left:0;top:-634px}.docs-material .docs-icon-previous{left:-20px;top:-1636px}.docs-material .docs-icon-no-color{left:0;top:-5859px}.docs-material .docs-icon-fill-color{left:-40px;top:-494px}.docs-material .docs-icon-line-color{left:0;top:-5333px}.docs-material .docs-icon-line-type{left:-52px;top:-5665px}.docs-material .docs-icon-table{left:-40px;top:-1248px}.docs-material .docs-icon-comment{left:-20px;top:-732px}.docs-material .docs-icon-comment-blank{left:0;top:-4681px}.docs-material .docs-icon-comment-blank-highlighted{left:-40px;top:-2626px}.docs-material .docs-icon-comment-blank-grey600{left:-20px;top:-5619px}.docs-material .docs-icon-insert-comment{left:-20px;top:-2192px}.docs-material .docs-icon-insert-comment-24{left:0;top:-2686px}.docs-material .docs-icon-trending-up-24{left:-46px;top:-3244px}.docs-material .docs-icon-trending-up-18{left:-20px;top:-3224px}.docs-material .docs-icon-trending-down-18{left:-40px;top:-206px}.docs-material .docs-icon-chart{left:0;top:-5727px}.docs-material .docs-icon-list-number-rtl{left:-20px;top:-1890px}.docs-material .docs-icon-list-bullet-rtl{left:-20px;top:-3578px}.docs-material .docs-icon-indent-rtl{left:-40px;top:-2878px}.docs-material .docs-icon-outdent-rtl{left:0;top:-1000px}.docs-material .docs-icon-line-spacing-rtl{left:-52px;top:-5685px}.docs-material .docs-icon-text-ltr{left:-40px;top:-5085px}.docs-material .docs-icon-text-rtl{left:0;top:-4010px}.docs-material .docs-icon-sheet-rtl{left:-22px;top:-1756px}.docs-material .docs-icon-share{left:-52px;top:-4278px}.docs-material .docs-icon-subscript{left:-20px;top:-3538px}.docs-material .docs-icon-superscript{left:-40px;top:-5999px}.docs-material .docs-icon-strikethrough{left:-46px;top:-4871px}.docs-material .docs-icon-clear-formatting{left:0;top:-1040px}.docs-material .docs-icon-link{left:0;top:-1268px}.docs-material .docs-icon-special-character{left:0;top:-6019px}.docs-material .docs-icon-close-white{left:0;top:-2192px}.docs-material .docs-icon-close-small{left:-20px;top:-4232px}.docs-material .docs-icon-close-thin{left:-20px;top:-514px}.docs-material .docs-icon-paint-format{left:-20px;top:-1082px}.docs-material .docs-icon-video{left:0;top:-166px}.docs-material .docs-icon-reload{left:-26px;top:-4767px}.docs-material .docs-icon-reload-rtl{left:0;top:-2092px}.docs-material .docs-icon-insert-page-break{left:-20px;top:-2898px}.docs-material .docs-icon-close{left:-40px;top:-5191px}.docs-material .docs-icon-check{left:-40px;top:-614px}.docs-material .docs-icon-up{left:-26px;top:-1168px}.docs-material .docs-icon-down{left:-20px;top:-186px}.docs-material .docs-icon-add-page{left:0;top:-3004px}.docs-material .docs-icon-email{left:0;top:-3878px}.docs-material .docs-icon-insert-equation{left:-20px;top:-712px}.docs-material .docs-icon-insert-horizontal-line{left:0;top:-672px}.docs-material .docs-icon-tabstop-center-blue500{left:-42px;top:-6103px}.docs-material .docs-icon-tabstop-center-bottom-blue500{left:-20px;top:-454px}.docs-material .docs-icon-tabstop-left-blue500{left:0;top:-554px}.docs-material .docs-icon-tabstop-right-blue500{left:0;top:-106px}.docs-material .docs-icon-ruler-first-indent-drag-blue500{left:-20px;top:-5959px}.docs-material .docs-icon-border-all{left:-40px;top:-4192px}.docs-material .docs-icon-border-right{left:-26px;top:-2132px}.docs-material .docs-icon-border-left{left:0;top:-692px}.docs-material .docs-icon-border-top{left:0;top:-2646px}.docs-material .docs-icon-border-bottom{left:-20px;top:-5333px}.docs-material .docs-icon-border-outside{left:-40px;top:-5859px}.docs-material .docs-icon-border-inside{left:-40px;top:-2792px}.docs-material .docs-icon-border-none{left:0;top:-6039px}.docs-material .docs-icon-border-horizontal{left:-40px;top:-3438px}.docs-material .docs-icon-border-vertical{left:-42px;top:-1288px}.docs-material .docs-icon-merge{left:-52px;top:-3920px}.docs-material .docs-icon-wrap{left:-20px;top:-146px}.docs-material .docs-icon-autofilter{left:0;top:-5475px}.docs-material .docs-icon-autofilter-filled{left:0;top:-3990px}.docs-material .docs-icon-insert-function{left:0;top:-2172px}.docs-material .docs-icon-insert-formula{left:-20px;top:-1452px}.docs-material .docs-icon-folder-shared{left:0;top:-1142px}.docs-material .docs-icon-folder-shared-outline{left:0;top:-146px}.docs-material .docs-icon-folder-outline{left:0;top:-4965px}.docs-material .docs-icon-folder-outline-hover{left:-20px;top:-2052px}.docs-material .docs-icon-folder-outline-pressed{left:0;top:-2072px}.docs-material .docs-icon-folder-solid{left:-46px;top:-4721px}.docs-material .docs-icon-drive{left:0;top:-3224px}.docs-material .docs-icon-drive-hover{left:-40px;top:-854px}.docs-material .docs-icon-drive-pressed{left:-26px;top:-4905px}.docs-material .docs-icon-drive-large{left:-26px;top:-4807px}.docs-material .docs-icon-drive-large-wrapper{width:36px;height:36px}.docs-material .docs-icon-back{left:0;top:-5395px}.docs-material .docs-icon-back-rtl{left:-40px;top:-834px}.docs-material .docs-icon-arrow-more{left:0;top:-186px}.docs-material .docs-icon-arrow-more-rtl{left:0;top:-1952px}.docs-material .docs-icon-search-this-document{left:0;top:-3478px}.docs-material .docs-icon-arrow-dropdown{left:-40px;top:-732px}.docs-material .docs-icon-arrow-dropdown-grey600{left:-52px;top:-3064px}.docs-material .docs-icon-expand-all{left:0;top:-3598px}.docs-material .docs-icon-word-art{left:-20px;top:-3558px}.docs-material .docs-icon-delete-x{left:-46px;top:-4701px}.docs-material .docs-icon-settings{left:-20px;top:-2092px}.docs-material .docs-icon-plus{left:-40px;top:-5333px}.docs-material .docs-icon-plus-white{left:0;top:-5579px}.docs-material .docs-icon-alert{left:-26px;top:-3064px}.docs-material .docs-icon-alert-error-24-orange600{left:-20px;top:-554px}.docs-material .docs-icon-trash{left:0;top:-2032px}.docs-material .docs-icon-locked{left:0;top:-4464px}.docs-material .docs-icon-locked-grey600{left:0;top:-5415px}.docs-material .docs-icon-unlocked{left:-26px;top:-4787px}.docs-material .docs-icon-add-fonts{left:0;top:-3638px}.docs-material .docs-icon-enter-compact{left:0;top:-5353px}.docs-material .docs-icon-exit-compact{left:-20px;top:-4424px}.docs-material .docs-icon-mode-edit{left:-20px;top:-1248px}.docs-material .docs-icon-mode-view{left:-20px;top:-5085px}.docs-material .docs-icon-chat{left:0;top:-4444px}.docs-material .docs-icon-chat-bubble-grey900{left:0;top:-3330px}.docs-material .docs-icon-chat-bubble-white{left:0;top:-5435px}.docs-material .docs-icon-chat-person-grey900{left:-40px;top:-1952px}.docs-material .docs-icon-chat-person-wide-grey900{left:0;top:-4859px}.docs-material .docs-icon-person-add-white{left:0;top:-5899px}.docs-material .docs-icon-star{left:-22px;top:-1716px}.docs-material .docs-icon-duplicate{left:-40px;top:-3310px}.docs-material .docs-icon-file{left:-20px;top:-4464px}.docs-material .docs-icon-opacity{left:0;top:-1616px}.docs-material .docs-icon-label-slant{left:-40px;top:-5879px}.docs-material .docs-icon-point-size{left:-42px;top:-6039px}.docs-material .docs-icon-question{left:0;top:-312px}.docs-material .docs-icon-quote{left:-52px;top:-3124px}.docs-material .docs-icon-vertical-gridlines{left:0;top:-3578px}.docs-material .docs-icon-left-axis{left:-40px;top:-3518px}.docs-material .docs-icon-right-axis{left:-26px;top:-5231px}.docs-material .docs-icon-left-axis-gridlines{left:0;top:-894px}.docs-material .docs-icon-right-axis-gridlines{left:0;top:-4793px}.docs-material .docs-icon-reset{left:-40px;top:-2838px}.docs-material .docs-icon-drag-move{left:-20px;top:-4567px}.docs-material .docs-icon-col-dragger{left:-40px;top:-5559px}.docs-material .docs-icon-chrome-store{left:0;top:-514px}.docs-material .docs-icon-fit-area{left:-26px;top:-1102px}.docs-material .docs-icon-zoom-out{left:0;top:-792px}.docs-material .docs-icon-zoom-tool{left:-40px;top:-186px}.docs-material .docs-icon-download{left:0;top:-3458px}.docs-material .docs-icon-fusion-table{left:0;top:-3044px}.docs-material .docs-icon-spreadsheet-sink{left:0;top:-414px}.docs-material .docs-icon-send-responses{left:-46px;top:-5211px}.docs-material .docs-icon-liveform{left:0;top:-5959px}.docs-material .docs-icon-ellipsis{left:0;top:-5517px}.docs-material .docs-icon-html-preview{left:-20px;top:-1676px}.docs-material .docs-icon-grid{left:-20px;top:-3950px}.docs-material .docs-icon-add-animation{left:-26px;top:-2384px}.docs-material .docs-icon-play-filled-24{left:-26px;top:-3924px}.docs-material .docs-icon-play-filled-error-36{left:-20px;top:-634px}.docs-material .docs-icon-playhead{left:-40px;top:-5455px}.docs-material .docs-icon-playhead-rtl{left:-46px;top:-2272px}.docs-material .docs-icon-unsupported{left:0;top:-474px}.docs-material .docs-icon-calendar{left:-40px;top:-594px}.docs-material .docs-icon-calendar-busy-yellow900{left:0;top:-454px}.docs-material .docs-zippy-closed{left:-20px;top:-5025px}.docs-material .docs-zippy-open{left:0;top:-1736px}.docs-material .docs-icon-bookmark{left:-40px;top:-4378px}.docs-material .docs-icon-heading{left:-42px;top:-5599px}.docs-material .docs-icon-file-blue{left:-34px;top:-1310px}.docs-material .docs-icon-web-result{left:0;top:-4378px}.docs-material .docs-icon-mic{left:-20px;top:-5939px}.docs-material .docs-icon-paragraph{left:-26px;top:-4865px}.docs-material .docs-icon-bookmark-black{left:-22px;top:-5537px}.docs-material .docs-icon-web-result-blue{left:0;top:-3970px}.docs-material .docs-icon-popout{left:0;top:-6059px}.docs-material .docs-icon-checkbox{left:-20px;top:-4484px}.docs-material .docs-icon-checkbox-type{left:0;top:-3558px}.docs-material .docs-icon-dropdown-type{left:0;top:-5271px}.docs-material .docs-icon-grid-type{left:-20px;top:-3438px}.docs-material .docs-icon-image-type{left:-40px;top:-672px}.docs-material .docs-icon-radio-type{left:0;top:-2232px}.docs-material .docs-icon-scale-type{left:-20px;top:-1188px}.docs-material .docs-icon-text-type{left:-20px;top:-2918px}.docs-material .docs-icon-time-type{left:-20px;top:-3290px}.docs-material .docs-icon-insert-text-block{left:-42px;top:-1890px}.docs-material .docs-icon-accepting-responses-on{left:0;top:-594px}.docs-material .docs-icon-accepting-responses-off{left:0;top:-40px}.docs-material .docs-icon-decimal-increase{left:-20px;top:-1616px}.docs-material .docs-icon-decimal-decrease{left:-40px;top:-5005px}.docs-material .docs-icon-settings-white{left:-20px;top:-106px}.docs-material .docs-icon-no-symbol{left:-40px;top:-2772px}.docs-material .docs-icon-crop{left:-42px;top:-1910px}.docs-material .docs-icon-green-check{left:0;top:-1756px}.docs-material .docs-icon-font-size{left:0;top:-494px}.docs-material .docs-icon-reset-image{left:-42px;top:-1716px}.docs-material .docs-icon-r-squared{left:0;top:-4316px}.docs-material .docs-icon-graph-legend{left:0;top:-1228px}.docs-material .docs-icon-cast{left:-46px;top:-1102px}.docs-material .docs-icon-wrap-overflow{left:0;top:-4899px}.docs-material .docs-icon-wrap-wrap{left:-26px;top:-3244px}.docs-material .docs-icon-wrap-clip{left:-22px;top:-1288px}.docs-material .docs-icon-highlights{left:-40px;top:-3290px}.docs-material .docs-icon-green-back{left:0;top:-4747px}.docs-material .docs-icon-arrow-back-white{left:0;top:-4833px}.docs-material .docs-icon-arrow-back-white-rtl{left:-46px;top:-5145px}.docs-material .docs-icon-help{left:0;top:-2838px}.docs-material .docs-icon-highlight-green{left:0;top:-772px}.docs-material .docs-icon-equalizer{left:-26px;top:-3678px}.docs-material .docs-icon-explore-24{left:-46px;top:-894px}.docs-material .docs-icon-explore-black{left:-46px;top:-5125px}.docs-material .docs-icon-explore-black-padded{left:-40px;top:-2606px}.docs-material .docs-icon-explore-green{left:-40px;top:-4661px}.docs-material .docs-icon-explore-white{left:0;top:-1572px}.docs-material .docs-icon-insert-autovis-chart{left:-20px;top:-414px}.docs-material .docs-icon-insert-autovis-chart-white{left:-20px;top:-672px}.docs-material .docs-icon-zoom-in{left:-20px;top:-5979px}.docs-material .docs-icon-thumb-up{left:0;top:-752px}.docs-material .docs-icon-thumb-down{left:-26px;top:-3744px}.docs-material .docs-icon-dlp-warning{left:-40px;top:-3330px}.docs-material .docs-icon-dogfood{left:-26px;top:-3084px}.docs-material .docs-icon-add-to-drive{left:0;top:-1248px}.docs-material .docs-icon-add-shortcut-to-drive{left:0;top:-4985px}.docs-material .docs-icon-paste-without-formatting{left:-20px;top:-3638px}.docs-material .docs-icon-qanda{left:-20px;top:-5999px}.docs-material .docs-icon-update-chart{left:-46px;top:-3458px}.docs-material .docs-icon-arrow-back-dark{left:-20px;top:-3458px}.docs-material .docs-icon-arrow-back-dark-rtl{left:0;top:-3186px}.docs-material .docs-icon-open-in-external{left:-20px;top:-20px}.docs-material .docs-icon-close-20{left:0;top:-5537px}.docs-material .docs-icon-close-24{left:-46px;top:-3678px}.docs-material .docs-icon-unlink{left:-40px;top:-2858px}.docs-material .docs-icon-bar-chart{left:-20px;top:-4444px}.docs-material .docs-icon-column-chart{left:0;top:-3310px}.docs-material .docs-icon-line-chart{left:0;top:-5879px}.docs-material .docs-icon-pie-chart{left:-46px;top:-2338px}.docs-material .docs-icon-pie-chart-outline{height:18px;left:-46px;top:-86px;width:18px}.docs-material .docs-icon-named-range{left:0;top:-372px}.docs-material .docs-icon-clock{left:-20px;top:-3310px}.docs-material .docs-icon-cancel{left:0;top:-3658px}.docs-material .docs-icon-cancel-24{left:-46px;top:-3370px}.docs-material .docs-icon-arrow-line-tool{left:-26px;top:-3724px}.docs-material .docs-icon-arrow-tilted{left:0;top:-2138px}.docs-material .docs-icon-unsupported-black{left:-20px;top:-2272px}.docs-material .docs-icon-text-rotation-up{left:-20px;top:-5455px}.docs-material .docs-icon-text-rotation-down{left:0;top:-4484px}.docs-material .docs-icon-text-rotation-angleup{left:-20px;top:-166px}.docs-material .docs-icon-text-rotation-angledown{left:0;top:-3678px}.docs-material .docs-icon-text-rotation-vertical{left:-46px;top:-3724px}.docs-material .docs-icon-text-rotation-none{left:-26px;top:-4741px}.docs-material .docs-icon-keep-lightbulb{left:-40px;top:-2092px}.docs-material .docs-icon-update-table{left:-40px;top:-4212px}.docs-material .docs-icon-update-slide{left:-40px;top:-5045px}.docs-material .docs-icon-overflow-three-dots{left:-40px;top:-2212px}.docs-material .docs-icon-restore{left:-20px;top:-5313px}.docs-material .docs-icon-paragraph-border-between{left:-26px;top:-2686px}.docs-material .docs-icon-paragraph-border-bottom{left:-26px;top:-3390px}.docs-material .docs-icon-paragraph-border-left{left:0;top:-4252px}.docs-material .docs-icon-paragraph-border-right{left:0;top:-332px}.docs-material .docs-icon-paragraph-border-top{left:-26px;top:-286px}.docs-material .docs-icon-diagram-white{left:-20px;top:-352px}.docs-material .docs-icon-drive-black{left:-40px;top:-3270px}.docs-material .docs-icon-file-upload{left:0;top:-226px}.docs-material .docs-icon-photos{left:-40px;top:-5919px}.docs-material .docs-icon-keyboard{left:0;top:-2778px}.docs-material .docs-icon-dogfood-white{left:0;top:-6121px}.docs-material .docs-icon-hierarchy{left:0;top:-4939px}.docs-material .docs-icon-transition{left:-26px;top:-4925px}.docs-material .docs-icon-mask{left:0;top:-5211px}.docs-material .docs-icon-visibility-off{left:0;top:-1796px}.docs-material .docs-icon-volume-up{left:-52px;top:-1164px}.docs-material .docs-icon-volume-up-filled-36{left:0;top:-6141px}.docs-material .docs-icon-camera{left:0;top:-834px}.docs-material .docs-icon-pivot-table{left:-20px;top:-5435px}.docs-material .docs-icon-insert-pivot-table{left:-26px;top:-4885px}.docs-material .docs-icon-avatar-anonymous-white-32{left:-40px;top:-3598px}.docs-material .docs-icon-code{left:-40px;top:-2752px}.docs-material .docs-icon-play{left:0;top:-1716px}.docs-material .docs-icon-record{left:-40px;top:-5105px}.docs-material .docs-icon-flip-horizontal{left:0;top:-1102px}.docs-material .docs-icon-flip-vertical{left:-46px;top:-40px}.docs-material .docs-icon-rotate-cw{left:0;top:-3244px}.docs-material .docs-icon-database{left:0;top:-2726px}.docs-material .docs-icon-database-grey600{left:0;top:-2404px}.docs-material .docs-icon-plx{left:0;top:-2666px}.docs-material .docs-icon-bigquery{left:-20px;top:-614px}.docs-material .docs-icon-insert-dashboard{left:0;top:-20px}.docs-material .docs-icon-filter-control{left:-40px;top:-3538px}.docs-material .docs-icon-drag-handle-20{left:-20px;top:-5639px}.docs-material .docs-icon-drag-handle-24{left:0;top:-3898px}.docs-material .docs-icon-comment-outline-20{left:-52px;top:-3898px}.docs-material .docs-icon-comment-outline-24{left:0;top:-4278px}.docs-material .docs-icon-edit-outline-20{left:-26px;top:-2358px}.docs-material .docs-icon-edit-outline-24{left:-42px;top:-6123px}.docs-material .docs-icon-error-outline-20{left:0;top:-1836px}.docs-material .docs-icon-error-filled-24-red600{left:-46px;top:-2138px}.docs-material .docs-icon-settings-outline-20{left:-46px;top:-3396px}.docs-material .docs-icon-settings-outline-24{left:-46px;top:-4845px}.docs-material .docs-icon-share-outline-20{left:-40px;top:-372px}.docs-material .docs-icon-share-outline-24{left:-20px;top:-2292px}.docs-material .docs-icon-time-outline-20{left:0;top:-1288px}.docs-material .docs-icon-trend-outline-20{left:0;top:-4545px}.docs-material .docs-icon-accessibility{left:0;top:-5939px}.docs-material .docs-icon-people-24{left:0;top:-5125px}.docs-material .docs-icon-reload-white{left:-20px;top:-4150px}.docs-material .docs-icon-present{left:0;top:-574px}.docs-material .docs-icon-present-to-all{left:-26px;top:-5251px}.docs-material .docs-icon-present-to-all-24{left:0;top:-3718px}.docs-material .docs-icon-present-to-all-24-white{left:-40px;top:-4050px}.docs-material .docs-icon-chevron-left-24{left:0;top:-2338px}.docs-material .docs-icon-chevron-right-24{left:-40px;top:-1188px}.docs-material .docs-icon-chevron-down-24{left:-46px;top:-2112px}.docs-material .docs-icon-delete-grey600-24{left:0;top:-286px}.docs-material .docs-icon-palette{left:0;top:-4661px}.docs-material .docs-icon-sheets-table-24{left:0;top:-3390px}.docs-material .docs-icon-notifications-24{left:0;top:-4398px}.docs-material .docs-icon-notifications-20{left:-52px;top:-1142px}.docs-material .docs-icon-spellcheck{left:0;top:-1310px}.docs-material .docs-icon-add-item{left:0;top:-1532px}.docs-material .docs-icon-info-outline-grey{left:-20px;top:-2626px}.docs-material .docs-icon-datasheet-24-grey800{left:-20px;top:-226px}.docs-material .docs-icon-undo-autocorrect{left:-40px;top:-312px}.docs-material .docs-icon-spellbubble-feedback-16{left:0;top:-5841px}.docs-material .docs-icon-spellbubble-ignore-16{left:-52px;top:-1370px}.docs-material .docs-icon-spellbubble-overflow-three-dots-16{left:-52px;top:-4298px}.docs-material .docs-icon-list-24{left:0;top:-2752px}.docs-material .docs-icon-audio{left:-20px;top:-394px}.docs-material .docs-icon-drive-folder{left:-20px;top:-2212px}.docs-material .docs-icon-loading-circle-grey200{left:0;top:-1082px}.docs-material .docs-icon-pdf{left:-20px;top:-692px}.docs-material .docs-icon-web{left:-46px;top:-2292px}.docs-material .docs-icon-offline-pin-20{left:0;top:-5291px}.docs-material .docs-icon-sync-20{left:-20px;top:-4170px}.docs-material .docs-icon-sync-problem-20{left:0;top:-1858px}.docs-material .docs-icon-acl-view-only{left:-26px;top:-4845px}.docs-material .docs-icon-acl-view-only-on-brand-color-background{left:-20px;top:-1952px}.docs-material .docs-icon-acl-comment-only{left:0;top:-3618px}.docs-material .docs-icon-acl-comment-only-on-brand-color-background{left:-40px;top:-126px}.docs-material .docs-icon-approvals-lock{left:0;top:-814px}.docs-material .docs-icon-approvals-lock-open{left:0;top:-5065px}.docs-material .docs-icon-approvals-stamp{left:-20px;top:-5005px}.docs-material .docs-icon-recall-24{left:0;top:-4519px}.docs-material .docs-icon-feedback{left:-20px;top:-4050px}.docs-material .docs-icon-offline-cloud-24{left:-20px;top:-40px}.docs-material .docs-icon-arrow-down{left:0;top:-712px}.docs-material .docs-icon-arrow-up{left:-40px;top:-1676px}.docs-material .docs-icon-avatar-grey600{left:0;top:-4567px}.docs-material .docs-icon-description-grey600{left:0;top:-3518px}.docs-material .docs-icon-popout-below{left:0;top:-126px}.docs-material .docs-icon-group{left:-26px;top:-3044px}.docs-material .docs-icon-revisions-grey600{left:0;top:-2492px}.docs-material .docs-icon-popout-viewer-24-white{left:-40px;top:-394px}.docs-material .docs-icon-maximize-viewer{left:-40px;top:-2192px}.docs-material .docs-icon-maximize-viewer-24-white{left:-22px;top:-1776px}.docs-material .docs-icon-open-in-external-24-white{left:-46px;top:-1330px}.docs-material .docs-icon-copy-24-white{left:-26px;top:-4278px}.docs-material .docs-icon-sync{left:0;top:-3290px}.docs-material .docs-icon-search-insights{left:0;top:-1972px}.docs-material .docs-icon-logo-docs-40px{left:0;top:-6079px}.docs-material .docs-icon-logo-sheets-40px{left:0;top:-1910px}.docs-material .docs-icon-logo-slides-40px{left:-20px;top:-5475px}.docs-material .docs-icon-text-wrapping-wrap-72{left:0;top:-2512px}.docs-material .docs-icon-text-wrapping-break-72{left:0;top:-3784px}.docs-material .docs-icon-text-wrapping-inline-72{left:0;top:-4587px}.docs-material .docs-icon-text-wrapping-above-72{left:0;top:-5747px}.docs-material .docs-icon-text-wrapping-behind-72{left:0;top:-4076px}.docs-material .docs-icon-text-wrapping-wrap-text{left:-26px;top:-4504px}.docs-material .goog-toolbar-button-checked .docs-icon-text-wrapping-wrap-text{left:0;top:-4212px}.docs-material .docs-icon-text-wrapping-break-text{left:-20px;top:-854px}.docs-material .goog-toolbar-button-checked .docs-icon-text-wrapping-break-text{left:-46px;top:-554px}.docs-material .docs-icon-text-wrapping-inline-with-text{left:0;top:-4150px}.docs-material .goog-toolbar-button-checked .docs-icon-text-wrapping-inline-with-text{left:0;top:-5821px}.docs-material .docs-icon-text-wrapping-above-text{left:-40px;top:-2586px}.docs-material .goog-toolbar-button-checked .docs-icon-text-wrapping-above-text{left:-22px;top:-5291px}.docs-material .docs-icon-text-wrapping-behind-text{left:-20px;top:-5191px}.docs-material .goog-toolbar-button-checked .docs-icon-text-wrapping-behind-text{left:-26px;top:-4945px}.docs-material .docs-icon-quick-layout-top-left-50{left:-20px;top:-1000px}.docs-material .docs-icon-quick-layout-top-center-50{left:-20px;top:-1472px}.docs-material .docs-icon-quick-layout-top-right-50{left:0;top:-5665px}.docs-material .docs-icon-quick-layout-center-left-50{left:0;top:-1370px}.docs-material .docs-icon-quick-layout-center-50{left:0;top:-3104px}.docs-material .docs-icon-quick-layout-center-right-50{left:-20px;top:-1534px}.docs-material .docs-icon-quick-layout-bottom-left-50{left:-20px;top:-2404px}.docs-material .docs-icon-quick-layout-bottom-center-50{left:-20px;top:-752px}.docs-material .docs-icon-quick-layout-bottom-right-50{left:-22px;top:-1802px}.docs-material .docs-icon-encryption-shield{left:-40px;top:-5979px}.docs-material .docs-icon-cloud-check{left:-26px;top:-2706px}.docs-material .docs-icon-sync-no-connection{left:-40px;top:-4464px}.docs-material .docs-icon-sync-problem-red500{left:0;top:-1636px}.docs-material .docs-icon-sync-saved-locally{left:-20px;top:-5599px}.docs-material .docs-icon-sync-disabled{left:-40px;top:-3558px}.docs-material .docs-icon-sync-disabled-red600{left:-20px;top:-3350px}.docs-material .docs-icon-cloud-check-24{left:-40px;top:-2812px}.docs-material .docs-icon-sync-no-connection-24{left:-20px;top:-4252px}.docs-material .docs-icon-sync-problem-24-red500{left:-46px;top:-4741px}.docs-material .docs-icon-sync-saved-locally-24{left:-20px;top:-2978px}.docs-material .docs-icon-sync-disabled-24{left:-46px;top:-2978px}.docs-material .docs-icon-sync-disabled-24-red600{left:0;top:-1162px}.docs-material .docs-icon-auto-awesome{left:0;top:-1020px}.docs-material .docs-icon-warning-24{left:-40px;top:-1636px}.docs-material .docs-icon-info{left:-46px;top:-4252px}.docs-material .docs-icon-search-24{left:0;top:-4767px}.docs-material .docs-icon-sync-24{left:0;top:-4721px}.docs-material .docs-icon-add{left:-20px;top:-4212px}.docs-material .docs-icon-folder{left:-20px;top:-4661px}.docs-material .docs-icon-star-border{left:-20px;top:-6039px}.docs-material .docs-icon-star-filled{left:0;top:-4701px}.docs-material .docs-icon-link-24{left:-48px;top:-2358px}.docs-material .docs-icon-link-no-24{left:-22px;top:-1864px}.docs-material .docs-icon-paste-source-24{left:0;top:-3924px}.docs-material .docs-icon-paste-destination-24{left:0;top:-66px}.docs-material .docs-preview{left:0;top:-2586px}.docs-material .docs-icon-increase-22{left:-40px;top:-4418px}.docs-material .docs-icon-decrease-22{left:-42px;top:-6079px}.docs-material .docs-icon-gear-grey400-13{left:0;top:-4504px}.docs-material .docs-icon-gear-grey700-13{left:-40px;top:-5271px}.docs-material .docs-icon-gmail{left:-46px;top:-3990px}.docs-material .docs-icon-folder-move{left:-40px;top:-5395px}.docs-material .docs-icon-drag-top-left{left:0;top:-1356px}.docs-material .docs-icon-drag-top-right{left:-20px;top:-1310px}.docs-material .docs-icon-sync-pending{left:0;top:-4356px}.docs-material .docs-icon-sync-pending-24{left:-20px;top:-894px}.docs-material .docs-icon-check-24{left:-20px;top:-1330px}.docs-material .docs-icon-check-24-white{left:0;top:-5231px}.docs-material .docs-icon-instant-comment-24{left:-20px;top:-2726px}.docs-material .docs-icon-instant-comment-blue600-24{left:0;top:-2466px}.docs-material .docs-icon-instant-suggest-24{left:0;top:-3064px}.docs-material .docs-icon-instant-suggest-green600-24{left:-40px;top:-2466px}.docs-material .docs-icon-docos-continue-the-conversation-24{left:0;top:-2112px}.docs-material .docs-icon-locked-white{left:-46px;top:-4905px}.docs-material .docs-icon-youtube-red{left:-26px;top:-4524px}.docs-material .docs-icon-unarchive-24{left:-26px;top:-1142px}.docs-material .docs-icon-paintbrush{left:-26px;top:-2338px}.docs-material .docs-icon-videocam{left:-26px;top:-66px}.docs-material .docs-icon-send-to-email-24-red600{left:-20px;top:-4010px}.docs-material .docs-icon-sort_az{left:0;top:-534px}.docs-material .docs-icon-sort_za{left:-20px;top:-474px}.docs-material .docs-icon-insights{left:0;top:-1676px}.docs-material .docs-icon-appsheet{left:0;top:-1816px}.docs-material .docs-icon-tv{left:0;top:-5979px}.docs-material .docs-icon-laptop{left:-20px;top:-4192px}.docs-material .docs-icon-autofit-none{left:-20px;top:-434px}.docs-material .docs-icon-autofit-resize-shape{left:0;top:-394px}.docs-material .docs-icon-autofit-shrink-text{left:-20px;top:-834px}.docs-material .docs-icon-avatar{left:-40px;top:-4398px}.docs-material .docs-icon-sheets-ia-accessibility-person{left:-42px;top:-1930px}.docs-material .docs-icon-sheets-ia-add-box{left:0;top:-3950px}.docs-material .docs-icon-sheets-ia-add-comment{left:0;top:-2606px}.docs-material .docs-icon-sheets-ia-add-file-note{left:-52px;top:-3144px}.docs-material .docs-icon-sheets-ia-add-ons{left:-20px;top:-2606px}.docs-material .docs-icon-sheets-ia-add-person{left:-20px;top:-3878px}.docs-material .docs-icon-sheets-ia-add-shortcut-to-drive{left:0;top:-980px}.docs-material .docs-icon-sheets-ia-align-bottom{left:-46px;top:-266px}.docs-material .docs-icon-sheets-ia-align-center{left:0;top:-1552px}.docs-material .docs-icon-sheets-ia-align-left{left:0;top:-3764px}.docs-material .docs-icon-sheets-ia-align-middle{left:-20px;top:-6121px}.docs-material .docs-icon-sheets-ia-align-right{left:-46px;top:-2686px}.docs-material .docs-icon-sheets-ia-align-top{left:-26px;top:-2152px}.docs-material .docs-icon-sheets-ia-antenna-update{left:0;top:-854px}.docs-material .docs-icon-sheets-ia-approvals-stamp{left:-20px;top:-1696px}.docs-material .docs-icon-sheets-ia-apps-script{left:0;top:-2444px}.docs-material .docs-icon-sheets-ia-article-document{left:-40px;top:-3878px}.docs-material .docs-icon-sheets-ia-auto-complete-draw{left:0;top:-3698px}.docs-material .docs-icon-sheets-ia-auto-fix-wand{left:0;top:-3370px}.docs-material .docs-icon-sheets-ia-bigquery{left:-46px;top:-286px}.docs-material .docs-icon-sheets-ia-bold{left:-52px;top:-3204px}.docs-material .docs-icon-sheets-ia-chart{left:-46px;top:-4504px}.docs-material .docs-icon-sheets-ia-checkbox{left:-20px;top:-3618px}.docs-material .docs-icon-sheets-ia-clear-format{left:0;top:-5999px}.docs-material .docs-icon-sheets-ia-cloud-check-green{left:0;top:-1452px}.docs-material .docs-icon-sheets-ia-comment-feedback-warning{left:0;top:-434px}.docs-material .docs-icon-sheets-ia-comment-lines{left:-40px;top:-1616px}.docs-material .docs-icon-sheets-ia-conditional-format-gradient{left:-26px;top:-3186px}.docs-material .docs-icon-sheets-ia-content-copy{left:-40px;top:-3498px}.docs-material .docs-icon-sheets-ia-cut{left:0;top:-4232px}.docs-material .docs-icon-sheets-ia-database{left:-42px;top:-5537px}.docs-material .docs-icon-sheets-ia-delete-trash{left:-40px;top:-2252px}.docs-material .docs-icon-sheets-ia-dollar{left:-42px;top:-6149px}.docs-material .docs-icon-sheets-ia-download{left:-20px;top:-594px}.docs-material .docs-icon-sheets-ia-drag-move{left:0;top:-3270px}.docs-material .docs-icon-sheets-ia-drawings{left:-46px;top:-2726px}.docs-material .docs-icon-sheets-ia-dropdown-arrow-in-circle{left:0;top:-1656px}.docs-material .docs-icon-sheets-ia-ear-hear{left:-40px;top:-434px}.docs-material .docs-icon-sheets-ia-edit-pen{left:0;top:-5105px}.docs-material .docs-icon-sheets-ia-extract-sheet-copy{left:0;top:-5171px}.docs-material .docs-icon-sheets-ia-file{left:0;top:-1512px}.docs-material .docs-icon-sheets-ia-file-copy{left:-42px;top:-6059px}.docs-material .docs-icon-sheets-ia-filter-bars{left:-20px;top:-5171px}.docs-material .docs-icon-sheets-ia-filter-funnel{left:-20px;top:-4681px}.docs-material .docs-icon-sheets-ia-filter-table-view{left:-52px;top:-3184px}.docs-material .docs-icon-sheets-ia-find-replace{left:-46px;top:-3478px}.docs-material .docs-icon-sheets-ia-folder{left:-52px;top:-3044px}.docs-material .docs-icon-sheets-ia-folder-move{left:0;top:-2424px}.docs-material .docs-icon-sheets-ia-font-text-size{left:-40px;top:-814px}.docs-material .docs-icon-sheets-ia-fullscreen{left:0;top:-5045px}.docs-material .docs-icon-sheets-ia-fullscreen-exit{left:0;top:-3538px}.docs-material .docs-icon-sheets-ia-globe{left:-20px;top:-1268px}.docs-material .docs-icon-sheets-ia-gmail{left:0;top:-2958px}.docs-material .docs-icon-sheets-ia-grid-range{left:-20px;top:-2798px}.docs-material .docs-icon-sheets-ia-help{left:-26px;top:-2112px}.docs-material .docs-icon-sheets-ia-history-restore{left:-20px;top:-4316px}.docs-material .docs-icon-sheets-ia-horizontal-rows{left:-40px;top:-2052px}.docs-material .docs-icon-sheets-ia-info{left:-40px;top:-1696px}.docs-material .docs-icon-sheets-ia-italic{left:-46px;top:-3704px}.docs-material .docs-icon-sheets-ia-keyboard{left:-40px;top:-534px}.docs-material .docs-icon-sheets-ia-label{left:0;top:-2918px}.docs-material .docs-icon-sheets-ia-lightbulb{left:0;top:-1330px}.docs-material .docs-icon-sheets-ia-line-graph{left:-20px;top:-2818px}.docs-material .docs-icon-sheets-ia-link{left:-20px;top:-5517px}.docs-material .docs-icon-sheets-ia-link-off{left:0;top:-1492px}.docs-material .docs-icon-sheets-ia-lock-close{left:0;top:-1208px}.docs-material .docs-icon-sheets-ia-lock-open{left:-40px;top:-3418px}.docs-material .docs-icon-sheets-ia-logo-forms{left:0;top:-5619px}.docs-material .docs-icon-sheets-ia-logo-sheets{left:0;top:-3166px}.docs-material .docs-icon-sheets-ia-minus{left:0;top:-4170px}.docs-material .docs-icon-sheets-ia-minus-box{left:-20px;top:-5395px}.docs-material .docs-icon-sheets-ia-notification-bell{left:-40px;top:-5517px}.docs-material .docs-icon-sheets-ia-numbers-123{left:-20px;top:-2232px}.docs-material .docs-icon-sheets-ia-offline-pin{left:-40px;top:-4965px}.docs-material .docs-icon-sheets-ia-offline-pin-green{left:0;top:-3858px}.docs-material .docs-icon-sheets-ia-open-new-window{left:0;top:-2318px}.docs-material .docs-icon-sheets-ia-paint-palette-theme{left:-40px;top:-20px}.docs-material .docs-icon-sheets-ia-paintbrush{left:0;top:-960px}.docs-material .docs-icon-sheets-ia-paper-airplane-blue{left:-52px;top:-1388px}.docs-material .docs-icon-sheets-ia-paperclip{left:-52px;top:-3164px}.docs-material .docs-icon-sheets-ia-paragraph-right-to-left{left:0;top:-1472px}.docs-material .docs-icon-sheets-ia-paste{left:0;top:-2212px}.docs-material .docs-icon-sheets-ia-photo-image{left:0;top:-1432px}.docs-material .docs-icon-sheets-ia-pivot-table{left:0;top:-2818px}.docs-material .docs-icon-sheets-ia-play-circle{left:-20px;top:-5879px}.docs-material .docs-icon-sheets-ia-plus{left:-20px;top:-5579px}.docs-material .docs-icon-sheets-ia-plx{left:0;top:-2364px}.docs-material .docs-icon-sheets-ia-print{left:0;top:-2292px}.docs-material .docs-icon-sheets-ia-redo{left:0;top:-4050px}.docs-material .docs-icon-sheets-ia-refresh{left:-20px;top:-2012px}.docs-material .docs-icon-sheets-ia-rename{left:-40px;top:-1452px}.docs-material .docs-icon-sheets-ia-resize-horizontal{left:0;top:-5025px}.docs-material .docs-icon-sheets-ia-rotate-box{left:0;top:-2798px}.docs-material .docs-icon-sheets-ia-school-graduation{left:0;top:-5005px}.docs-material .docs-icon-sheets-ia-settings-gear{left:-20px;top:-5559px}.docs-material .docs-icon-sheets-ia-sheets-tab{left:-20px;top:-1208px}.docs-material .docs-icon-sheets-ia-shuffle-swap{left:-20px;top:-2318px}.docs-material .docs-icon-sheets-ia-sigma-function{left:0;top:-4879px}.docs-material .docs-icon-sheets-ia-sort{left:0;top:-1776px}.docs-material .docs-icon-sheets-ia-spellcheck{left:-40px;top:-4567px}.docs-material .docs-icon-sheets-ia-spreadsheet-black{left:-42px;top:-5619px}.docs-material .docs-icon-sheets-ia-spreadsheet-green{left:-46px;top:-3004px}.docs-material .docs-icon-sheets-ia-square-box-selection{left:0;top:-2052px}.docs-material .docs-icon-sheets-ia-square-rounded{left:-20px;top:-5645px}.docs-material .docs-icon-sheets-ia-strikethrough{left:0;top:-3744px}.docs-material .docs-icon-sheets-ia-sync{left:-26px;top:-3166px}.docs-material .docs-icon-sheets-ia-sync-problem{left:-40px;top:-4316px}.docs-material .docs-icon-sheets-ia-table{left:0;top:-1696px}.docs-material .docs-icon-sheets-ia-table-check{left:0;top:-2272px}.docs-material .docs-icon-sheets-ia-table-tab{left:0;top:-5599px}.docs-material .docs-icon-sheets-ia-text-rotate-angle-down{left:-54px;top:-1310px}.docs-material .docs-icon-sheets-ia-text-rotate-angle-up{left:-20px;top:-1992px}.docs-material .docs-icon-sheets-ia-text-rotate-down{left:0;top:-3438px}.docs-material .docs-icon-sheets-ia-text-rotate-none{left:-20px;top:-5919px}.docs-material .docs-icon-sheets-ia-text-rotate-up{left:0;top:-5495px}.docs-material .docs-icon-sheets-ia-text-rotate-vertical-stack{left:-20px;top:-5859px}.docs-material .docs-icon-sheets-ia-text-wrap{left:0;top:-874px}.docs-material .docs-icon-sheets-ia-trending-up-arrow{left:0;top:-920px}.docs-material .docs-icon-sheets-ia-triangle-problem-warning{left:-46px;top:-246px}.docs-material .docs-icon-sheets-ia-underline{left:0;top:-4336px}.docs-material .docs-icon-sheets-ia-undo{left:-20px;top:-2172px}.docs-material .docs-icon-sheets-ia-user-edit-history{left:-52px;top:-3084px}.docs-material .docs-icon-sheets-ia-user-preference-settings{left:-20px;top:-940px}.docs-material .docs-icon-sheets-ia-vertical-columns{left:-26px;top:-4701px}.docs-material .docs-icon-sheets-ia-view-show{left:-26px;top:-5125px}.docs-material .docs-icon-sheets-ia-zoom-in{left:0;top:-1596px}.docs-gm .docs-circle-promo-base{height:210px;width:210px;background-color:#188038!important;border-color:#188038!important}.docs-circle-promo-base{border-style:solid;border-width:400px;border-radius:800px;font-size:16px;height:136px;position:absolute;width:136px;z-index:9000}.docs-gm .docs-circle-promo-content{color:white;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:16px;line-height:22px;margin-left:80px;position:relative;width:350px}.docs-circle-promo-content{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;width:280px}.docs-gm .docs-circle-promo-header{font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:20px;font-size:var(--docs-material-font-size-22,20px)}.docs-circle-promo-header{font-size:20px;line-height:27px;margin-bottom:16px}.docs-circle-promo-buttons{margin-top:16px}.docs-circle-promo-button{cursor:pointer;font-size:14px;font-weight:500;text-transform:uppercase}.docs-circle-promo-button:hover,.docs-circle-promo-button:focus{opacity:0.87}.docs-circle-promo-continue-button{margin-right:20px}.docs-material-promo-walkthrough-bubble{background-color:#fff;border:1px solid transparent;border-radius:8px;box-shadow:0 4px 8px 3px rgba(60,64,67,.15);position:absolute;z-index:1003}.docs-material-promo-walkthrough-bubble:focus{outline:none}.docs-material-promo-walkthrough-bubble .jfk-bubble-content{min-width:312px;padding:0px 24px 24px}.docs-material-promo-walkthrough-bubble-buttons{display:flex;justify-content:flex-end;padding:24px}.docs-material-promo-walkthrough-bubble .docs-material-button-fill-primary.docs-material-button{margin-left:12px;text-transform:none}.docs-material-promo-walkthrough-bubble-close-button{background-color:transparent;border:none;border-radius:50%;cursor:pointer;margin:0px;outline:0;padding:7px;position:absolute;right:8px;top:8px}.docs-material-promo-walkthrough-bubble-close-button.goog-flat-button-hover{background-color:#f1f3f4}.docs-material-promo-walkthrough-bubble-close-button.goog-flat-button-focused{background-color:#e8eaed;outline:none}.docs-material-promo-walkthrough-bubble .jfk-bubble-arrowdown .jfk-bubble-arrowimplbefore,.docs-material-promo-walkthrough-bubble .jfk-bubble-arrowup .jfk-bubble-arrowimplbefore{border-color:rgba(60,64,67,0.1) transparent}.docs-material-promo-walkthrough-bubble .jfk-bubble-arrowleft .jfk-bubble-arrowimplbefore,.docs-material-promo-walkthrough-bubble .jfk-bubble-arrowright .jfk-bubble-arrowimplbefore{border-color:transparent rgba(60,64,67,0.1)}.docs-binaryupsavewarning{width:512px}.docs-binaryupsavewarning-content-text{color:#5f6368;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:16px}a.docs-binaryupsavewarning-learn-more,a.docs-binaryupsavewarning-learn-more:visited{align-self:center;color:#188038;font-family:var(--docs-material-header-font-family,Roboto,RobotoDraft,Helvetica,Arial,sans-serif);font-size:14px;font-weight:var(--docs-material-font-weight-bold,700);margin-right:auto}.office-editing-survey-feedback{background-color:#188038;border-radius:4px;color:#fff;display:inline-block;height:40px;left:0;margin:0 auto;position:absolute;right:0;top:16px;width:348px;z-index:1}.office-editing-survey-feedback-title{float:left;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;line-height:40px;padding:0 32px 0 24px}.office-editing-survey-feedback-take-survey-button{color:#fff;cursor:pointer;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:40px;line-height:40px}.office-editing-survey-feedback-close-button{cursor:pointer;float:right;height:40px;line-height:40px;margin-right:12px;opacity:0.5}.docs-unsupportedofficefeatureswarning{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;width:512px}.docs-unsupportedofficefeatureswarning-content-restorefiletext{border-bottom:1px solid #bdc1c6;color:#5f6368;font-size:16px;line-height:24px;margin-bottom:23px;margin-top:-8px;padding-bottom:16px}.docs-unsupportedofficefeatureswarning-content-features-list{font-size:14px;max-height:128px;overflow-y:auto}.docs-unsupportedofficefeatureswarning-content-feature{color:#3c4043;margin-bottom:12px}a.docs-unsupportedofficefeatureswarning-learn-more,a.docs-unsupportedofficefeatureswarning-learn-more:visited{align-self:center;color:#188038;font-family:var(--docs-material-header-font-family,Roboto,RobotoDraft,Helvetica,Arial,sans-serif);font-size:14px;font-weight:var(--docs-material-font-weight-bold,700);margin-right:auto}.docs-image-picker-upload{font-family:Roboto,Arial,sans-serif}.docs-image-picker-upload.modal-dialog{padding:0}.docs-image-picker-upload .modal-dialog-title{padding:17px 20px 0}.docs-image-picker-upload .modal-dialog-title-text{font-size:20px}.docs-image-picker-upload .modal-dialog-content{line-height:normal;padding:0 20px}.docs-image-picker-upload .modal-dialog-buttons{border-top:1px solid #e5e5e5;margin-top:20px;padding:17px 20px}.docs-image-picker-upload-container{min-height:300px;min-width:450px}.docs-image-picker-upload-msg-bar{color:#ccc;font-size:16px;font-style:italic;padding:0 0 10px}.docs-image-picker-upload-dropzone-parent{height:100%;width:100%}.docs-image-picker-upload-dropzone-cell{border:#ddd 4px dashed;border-radius:2px;height:100%}.docs-image-picker-upload-dropzone-cell .jfk-button{margin:0}.docs-image-picker-upload-dropzone{height:100%;text-align:center;width:100%}.docs-image-picker-upload-drop-here{color:#ccc;font-size:20pt;padding:0 10px}.docs-image-picker-upload-drop-alt{color:#ccc;font-size:13px;font-weight:500;padding:15px 0 5px}.docs-image-picker-upload-warning{color:#aaa;display:inline-block;font-size:13px;padding:0 20px 0 30px;vertical-align:middle}.docs-odp-sidebar{overflow:hidden;box-shadow:-3px 0px 6px -3px rgba(60,64,67,.15),3px 0px 6px -3px rgba(60,64,67,.15);border-top:1px solid #dadce0;display:flex;flex-direction:column;position:absolute;right:0;top:0;width:300px}.docs-odp-iframe{flex:1 0;border:0}.pub-dialog-disabled-text{color:#afafaf}.pub-dialog-wrap{font-size:13px;font-size:var(--docs-material-font-size-normal,13px);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;width:500px}.pub-dialog-content-div{padding:0 0 10px 30px}.pub-dialog-input-div{padding-bottom:15px}.pub-dialog-option-vspacer{height:5px}.pub-dialog-info{color:#999;font-size:11px;padding-bottom:2px}.docs-gm .pub-dialog-info{color:#80868b}.docs-gm .pub-dialog-state-published.pub-dialog-info{color:#1a73e8}.pub-dialog-tab{font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif}.goog-tab-bar.pub-dialog-tab-bar{background:none;border-bottom-color:silver!important;margin-top:20px;padding-left:0!important}.docs-gm .goog-tab-bar.pub-dialog-tab-bar{margin-top:21px;padding-top:0}.goog-tab-bar.pub-dialog-tab-bar .goog-tab.pub-dialog-tab{color:#bdbdbd;cursor:pointer;font-weight:500;margin:1px 15px 0 0;padding:4px 8px;text-decoration:none;top:1px}.docs-gm .goog-tab-bar.pub-dialog-tab-bar .goog-tab.pub-dialog-tab{color:#5f6368;font-size:14px;text-align:center;width:120px}.goog-tab-bar.pub-dialog-tab-bar .goog-tab.pub-dialog-tab.goog-tab-selected,.goog-tab-bar.pub-dialog-tab-bar .goog-tab.pub-dialog-tab.goog-tab-hover{background:none;border-bottom:3px solid #4d90fe;border-left:none;border-right:none;border-top:none;color:black}.docs-gm .goog-tab-bar.pub-dialog-tab-bar .goog-tab.pub-dialog-tab.goog-tab-selected,.docs-gm .goog-tab-bar.pub-dialog-tab-bar .goog-tab.pub-dialog-tab.goog-tab-hover{border-bottom:2px solid #1a73e8}.pub-dialog-document-link,.pub-dialog-embed-code{margin-top:20px;width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.pub-dialog-link-content-div{margin-top:10px}.docs-gm .pub-dialog-link-options-container{display:flex}.pub-dialog-embed-code{font-size:13px;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;height:65px}.docs-gm .pub-dialog-embed-code{height:82px!important}.docs-gm .pub-dialog-link-options-document-part-menu-button{margin-right:15px}.pub-dialog-sep-div{padding:20px 0}#pub-dialog-publish-link-button{margin-top:20px}#pub-dialog-dom-signin-req-dropdown-container{margin-left:30px}.pub-dialog-sep{border-top-color:#e1e1e1;border-top-style:solid;border-width:1px 0 0 0;color:#bfbfbf;height:0}.goog-zippy-header.pub-dialog-zippy-header{cursor:pointer;display:inline-block;margin:0}.docs-gm .goog-zippy-header.pub-dialog-zippy-header{color:#3c4043}.pub-dialog-zippy-content{margin-left:22px}.docs-gm #pub-dialog-publish-button{color:#5f6368}.goog-zippy-collapsed .pub-dialog-settings-zippy-icon{-webkit-transform:rotate(0);-moz-transform:rotate(0);-ms-transform:rotate(0);-o-transform:rotate(0);transform:rotate(0)}.goog-zippy-expanded .pub-dialog-settings-zippy-icon{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}#pub-dialog-publish-button{margin-top:10px}.pub-dialog-checkbox-container{line-height:22px;margin-top:10px}.docs-link-infilelinksuggestiongroup-cb .docs-link-infilelinksuggestiongroup-cb-openarrow{display:none}.docs-link-infilelinksuggestiongroup-cb.docs-link-infilelinksuggestiongroup-cb-open .docs-link-infilelinksuggestiongroup-cb-openarrow{display:inline-block}.docs-link-infilelinksuggestiongroup-cb.docs-link-infilelinksuggestiongroup-cb-closearrow{display:inline-block}.docs-link-infilelinksuggestiongroup-cb.docs-link-infilelinksuggestiongroup-cb-open .docs-link-infilelinksuggestiongroup-cb-closearrow{display:none}.docs-link-infilelinksuggestiongroup-cb .docs-icon{margin:0 6px}.docs-link-infilelinksuggestiongroup-cb-title{display:inline-block;padding:8px 0}.docs-link-infilelinksuggestiongroup-cb{margin:6px 0;outline:none}.docs-link-infilelinksuggestiongroup-cb:hover,.docs-link-infilelinksuggestiongroup-cb-keyboardfocus{background-color:#eee;cursor:default;outline:none}.goog-zippy-content .docs-link-linksuggestion{padding-left:27px}.docs-linkbubble-link-preview .docs-link-bubble-mime-icon .docs-icon{vertical-align:baseline;width:18px;height:18px;margin:0px}.docs-linkbubble-link-preview #docs-linkbubble-link-text{font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;opacity:1;padding-left:6px;padding-right:6px;text-decoration:none!important;vertical-align:baseline;width:180px}.docs-linkbubble-link-preview .link-previews-broken-link#docs-linkbubble-link-text{color:#80868b!important;cursor:default;font-style:italic;pointer-events:none}.link-previews-before-transition{opacity:.5!important}.link-previews-animate-on-display{animation:fade .15s}@keyframes fade{from{opacity:.5}}.link-previews-fadeable{transition:opacity .15s!important}.docs-linkbubble-link-preview.docs-linkbubble-bubble{border:0;padding:6px 0}.docs-linkbubble-link-preview .link-bubble-header{align-items:center;display:flex;padding:0 6px}.docs-gm .docs-linkbubble-bubble,.docs-gm .docs-multi-linkbubble-bubble{background-color:#fff;border-color:#dadce0;border-radius:8px;box-shadow:0 1px 3px 1px rgba(60,64,67,.15);color:#3c4043;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px}.docs-linkbubble-link-preview .docs-link-bubble-mime-icon{height:18px;padding:6px;vertical-align:baseline;width:18px;opacity:1}.docs-linkbubble-link-preview .docs-link-bubble-card-component.docs-link-bubble-action-card-component,.docs-linkbubble-link-preview .docs-link-bubble-card-component.docs-link-bubble-warning-card-component{margin-top:4px;padding:10px 12px 4px}.docs-linkbubble-link-preview .docs-link-bubble-card-component.docs-link-bubble-action-card-component,.docs-linkbubble-link-preview .docs-link-bubble-action-card-component:before{background-color:#1a73e8}.docs-linkbubble-link-preview .docs-link-bubble-card-component.docs-link-bubble-warning-card-component,.docs-linkbubble-link-preview .docs-link-bubble-warning-card-component:before{background-color:#fef7e0}.docs-linkbubble-link-preview .docs-link-bubble-text-card-component.docs-link-bubble-warning-card-component span{color:#202124!important}.docs-linkbubble-link-preview .docs-link-bubble-favicon{border-radius:2px;height:18px;opacity:1;padding:6px;vertical-align:baseline;width:18px}.docs-linkbubble-link-preview .docs-link-bubble-favicon img{border-radius:2px;height:18px;width:18px}.docs-linkbubble-link-preview .docs-link-bubble-action-card-component:before,.docs-linkbubble-link-preview .docs-link-bubble-warning-card-component:before{content:'';height:7px;left:0;bottom:0;position:absolute;width:100%;border-radius:0 0 8px 8px;z-index:-1}.docs-linkbubble-link-preview .docs-link-bubble-card-component .docs-link-bubble-mime-icon{padding:0px}.docs-linkbubble-link-preview .docs-link-bubble-card-component{align-items:center;display:flex;padding:6px 12px}.linkbubble-card-collapsed .docs-link-bubble-card-component{display:none!important}.linkbubble-card-collapsed .docs-link-bubble-card-component.linkbubble-card-non-collapsible{display:flex}.docs-linkbubble-link-preview .docs-link-bubble-title-card-component a{color:#202124!important;flex-grow:1;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;height:18px;overflow:hidden;padding-left:12px;text-overflow:ellipsis;white-space:nowrap;width:0}.docs-linkbubble-link-preview .docs-link-bubble-title-card-component a:hover{text-decoration:none!important}.docs-linkbubble-link-preview .docs-link-bubble-text-card-component span,.docs-linkbubble-link-preview .docs-link-bubble-action-card-component span,.docs-linkbubble-link-preview .docs-link-bubble-warning-card-component span{flex-direction:column;flex-grow:1;font-size:12px;justify-content:center;line-height:1.3;overflow-wrap:break-word;white-space:normal;width:0;word-wrap:break-word}.docs-linkbubble-link-preview .docs-link-bubble-text-card-component span{color:#80868b!important;cursor:text}.docs-linkbubble-link-preview .docs-link-bubble-action-card-component span{color:#fff!important}.docs-linkbubble-link-preview .docs-link-bubble-thumbnail-container{background-color:#e8eaed;border-radius:4px;display:flex;flex-grow:1;height:141px;overflow:hidden;position:relative;width:0}.docs-linkbubble-link-preview .docs-link-bubble-thumbnail-container a{display:flex;flex-direction:column;flex-grow:1;justify-content:center;align-items:center}.docs-linkbubble-link-preview .drive-image-thumbnail-component .docs-link-bubble-thumbnail-container a{display:block!important}.drive-image-thumbnail-component .docs-link-bubble-thumbnail-container{border:1px solid #e8eaed}#link-bubble-thumbnail-image{background-position:center;background-repeat:no-repeat;height:100%;width:100%}.default-image-card-component #link-bubble-thumbnail-image,.vertical-image-card-component #link-bubble-thumbnail-image{background-size:contain}.horizontal-image-card-component #link-bubble-thumbnail-image{background-size:cover}.vertical-image-card-component img.link-bubble-drive-thumbnail-image{display:block;height:100%;margin:auto}.default-image-card-component img.link-bubble-drive-thumbnail-image,.horizontal-image-card-component img.link-bubble-drive-thumbnail-image{width:100%}.docs-link-bubble-high-contrast .docs-link-bubble-thumbnail-container a{height:120%;transform:translateY(-10%)}#high-contrast-link-bubble-thumbnail-image{height:100%}.framed-image-card-component img.link-bubble-drive-thumbnail-image{box-shadow:0 0 6px 0 rgba(0,0,0,0.12);margin:6% 7% 0 7%;width:86%}.docs-link-bubble-thumbnail-card-component .link-bubble-youtube-preview-video{position:absolute;transition:opacity .75s cubic-bezier(.4,0,.2,1);width:100%}.link-bubble-youtube-preview-video.preview-video-transparent{opacity:0}.link-bubble-youtube-preview-video.preview-video-hidden{display:none}.link-bubble-youtube-preview-video.preview-video-opaque{opacity:1}.link-bubble-youtube-preview-video.preview-video-visible{display:block}.docs-link-bubble-thumbnail-card-component #link-bubble-youtube-video-duration-indicator{-webkit-align-items:center;align-items:center;background-color:rgba(0,0,0,0.8);border-radius:2px;bottom:8px;color:#fff;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;font-size:12px;font-weight:500;height:16px;-webkit-justify-content:center;justify-content:center;opacity:1;padding:0 4px;position:absolute;right:8px;transition:opacity .1s ease-in-out}.link-bubble-hovered .docs-link-bubble-youtube-thumbnail-container.link-bubble-thumbnail-can-open-in-mole #link-bubble-youtube-video-duration-indicator{opacity:0}.docs-linkbubble-link-preview .docs-link-bubble-card-component .docs-link-bubble-text-with-icon{padding-left:12px}.docs-linkbubble-link-preview .docs-link-bubble-text-card-component.indented-card-component .text-card-component-text{padding-left:30px}.docs-linkbubble-link-preview .docs-link-bubble-card-component.shrink-vertical-padding-card-component{padding-top:0px}.docs-linkbubble-link-preview .docs-link-bubble-text-card-component.single-line-text-card-component .text-card-component-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.docs-linkbubble-link-preview .docs-link-bubble-separator{background-color:#e8eaed;height:1px;margin:6px}.docs-linkbubble-link-preview.docs-hc-gecko,.docs-linkbubble-link-preview.docs-hc-ie,.docs-hc-gecko .doc-previews-indicator-container,.docs-hc-ie .doc-previews-indicator-container,.docs-hc-gecko .doc-previews-indicator-popover,.docs-hc-ie .doc-previews-indicator-popover{border:1px solid transparent}.docs-hc-gecko .doc-previews-indicator-popover .docs-link-bubble-mime-icon{filter:invert(100%)}.docs-hc-gecko .docs-link-bubble-separator,.docs-hc-ie .docs-link-bubble-separator{height:0px;border:1px solid transparent}.docs-link-bubble-action-container .goog-menuitem{white-space:nowrap}.docs-linkbubble-bubble .goog-menu .goog-option-selected{background-position:8px 50%}.docs-link-bubble-request-access-card-component.docs-link-bubble-card-component{display:flex;flex-direction:column}.docs-link-bubble-request-access-card-component .link-bubble-text-button{display:flex;padding-top:6px;width:100%}.docs-link-bubble-request-access-card-component .link-bubble-text-button .link-bubble-text-button-container{align-items:center;display:flex;flex-grow:1;justify-content:flex-end;white-space:normal;word-break:break-word;width:0}.docs-link-bubble-request-access-card-component .link-bubble-text-button .link-bubble-text-button-info-icon{display:flex;padding:4px}.docs-link-bubble-request-access-card-component .link-bubble-text-button .link-bubble-text-button-info-icon:hover{background-color:rgba(0,0,0,.06);border-radius:50%}.docs-link-bubble-request-access-card-component .request-access-header{display:flex;justify-content:flex-start;width:100%}.docs-link-bubble-request-access-card-component .request-access-header span{color:#80868b;display:flex;flex-grow:1;font-size:12px;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;white-space:normal;width:0}.docs-link-bubble-request-access-card-component .requested-access-text{display:flex;width:100%}.docs-link-bubble-request-access-card-component .requested-access-text span{color:#80868b;display:flex;flex-grow:1;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-style:italic;justify-content:flex-end;padding-top:6px;white-space:normal;width:0}.docs-link-bubble-acl-fixer-card-component{justify-content:space-between;transition:all .2s cubic-bezier(.4,0,.2,1)}.docs-link-bubble-acl-fixer-card-component.link-bubble-acl-fixer-hidden,.docs-link-bubble-card-component.docs-link-bubble-action-card-component.link-bubble-acl-fixer-hidden{visibility:hidden;height:0;padding-top:0;padding-bottom:0;opacity:0}.docs-link-bubble-acl-fixer-card-component #acl-fixer-descriptor{color:#80868b;flex-grow:1;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;overflow-wrap:break-word;white-space:normal;width:0;word-wrap:break-word}.docs-link-bubble-card-component .link-bubble-text-button-text{color:#188038;cursor:pointer;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px!important;font-weight:500;margin-left:4px;padding:4px 8px}.docs-link-bubble-card-component.docs-link-bubble-action-card-component.link-bubble-acl-fixer-ui-variant{transition:all .2s cubic-bezier(.4,0,.2,1)}.docs-link-bubble-acl-fixer-card-component .link-bubble-text-button-text.link-bubble-text-button-text-disabled,.docs-link-bubble-action-card-component.link-bubble-acl-fixer-ui-variant .link-bubble-text-button-text.link-bubble-text-button-text-disabled{color:#80868b;cursor:default;outline:none}.docs-link-bubble-card-component .link-bubble-text-button-text:hover{background-color:#e6f4ea;border-radius:4px}.docs-link-bubble-acl-fixer-card-component .link-bubble-text-button-text.link-bubble-text-button-text-disabled:hover{background-color:transparent}.docs-link-bubble-card-component.docs-link-bubble-action-card-component .link-bubble-text-button-text{color:#fff!important}.docs-link-bubble-card-component.docs-link-bubble-action-card-component .link-bubble-text-button-text:hover{background-color:#1967d2!important}.doc-previews-indicator-container{align-items:flex-end;display:flex;height:100%;justify-content:flex-end;left:0;pointer-events:none;position:absolute;transition:background-color .1s cubic-bezier(.4,0,.2,1);width:100%}.docs-link-bubble-youtube-thumbnail-container .doc-previews-indicator-container{opacity:0}.link-bubble-hovered .docs-link-bubble-youtube-thumbnail-container .doc-previews-indicator-container{opacity:1}.docs-hc-gecko .doc-previews-indicator-container.hovered-card-component,.docs-hc-ie .doc-previews-indicator-container.hovered-card-component{background-color:transparent}.docs-link-bubble-thumbnail-container:not(.docs-link-bubble-youtube-thumbnail-container) .doc-previews-indicator-container.hovered-card-component{background-color:rgba(32,33,36,0.1)}.doc-previews-indicator-text{color:#fff;display:inline-block;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;max-width:0;opacity:0;overflow:hidden;padding:0;transition:all .2s cubic-bezier(.4,0,.2,1)}.link-bubble-hovered .doc-previews-indicator-text{max-width:4000px;opacity:1;padding-left:8px;padding-right:4px}.doc-previews-indicator-popover{align-items:center;background-color:rgba(32,33,36,.6);border-radius:16px;display:flex;margin-bottom:12px;margin-right:12px;padding:6px}.docs-linkbubble-link-preview .docs-link-bubble-card-component .doc-previews-indicator-popover .docs-link-bubble-mime-icon{transition:all .3s cubic-bezier(.4,0,.2,1)}.docs-linkbubble-link-preview.link-bubble-hovered .docs-link-bubble-card-component .doc-previews-indicator-popover .docs-link-bubble-mime-icon{padding-left:4px}.jfk-bubble.jfk-bubble-promo.docs-promo-bubble.docs-link-previews-details-promo .jfk-bubble-arrowleft .jfk-bubble-arrowimplafter,.jfk-bubble.jfk-bubble-promo.docs-promo-bubble.docs-link-previews-details-promo .jfk-bubble-arrowright .jfk-bubble-arrowimplafter{border-color:transparent #1a73e8}.jfk-bubble.docs-promo-bubble.docs-link-previews-details-promo .docs-promo-text-container{width:auto}.jfk-bubble.docs-promo-bubble.docs-link-previews-details-promo .docs-promo-body{color:#f1f3f4;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;letter-spacing:.2px;padding:4px 0}.jfk-bubble.docs-promo-bubble.docs-link-previews-details-promo .docs-promo-action-container{color:#fff;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;margin:12px 0 0 20px;text-transform:none}.jfk-bubble.docs-promo-bubble.docs-link-previews-details-promo .docs-promo-header{color:#fff;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:16px;font-weight:500;opacity:1}.jfk-bubble.docs-promo-bubble.docs-link-previews-details-promo .docs-promo-action-row{display:flex;flex-direction:row-reverse;padding:0}.jfk-bubble.docs-promo-bubble.docs-link-previews-details-promo .docs-promo-container{padding:16px}.jfk-bubble.docs-promo-bubble.docs-link-previews-details-promo{box-shadow:0px 2px 6px 2px rgba(26,115,232,0.15);background-color:#1a73e8;border-radius:8px;width:251px}.docs-gm .docs-linkbubble-link-preview .docs-link-bubble-mime-icon .docs-icon .docs-icon-grid{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_green.svg)}.docs-gm .docs-multi-linkbubble-bubble{padding:8px 4px}.docs-multi-linkbubble-bubble .docs-linkbubble-bubble{border:0;border-radius:0;box-shadow:none;padding:0px;position:relative}.docs-gm .docs-linkbubble-multi-link-scrollable-container{background-color:#fff;border-color:#dadce0;color:#3c4043;display:flex;flex-direction:column;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;height:auto;max-height:150px;overflow-y:auto}.docs-link-insertlinkbubble{margin:-1px;min-width:306px;outline:none;padding:1px}.docs-gm .docs-link-insertlinkbubble ::selection{background:#d2e3fc}.docs-link-insertlinkbubble-url-label,.docs-link-insertlinkbubble-text-label{display:block;height:13px;padding:8px 0}.docs-link-insertlinkbubble-text{display:block;width:244px}.docs-gm .docs-material-bubble .docs-link-insertlinkbubble .docs-link-insertlinkbubble-text{box-sizing:content-box;color:#5f6368;height:32px;margin:0;width:294px}.docs-gm .docs-material-bubble .docs-link-insertlinkbubble-text:focus{color:#3c4043}.docs-link-insertlinkbubble-text-label,.docs-link-insertlinkbubble-text{margin-bottom:5px}.docs-gm .docs-link-insertlinkbubble-url-label,.docs-gm .docs-link-insertlinkbubble-text-label{background-color:white;box-shadow:5px 0 0 white,-5px 0 0 white;color:#5f6368;display:inline;font-size:12px;left:12px;margin-bottom:0;max-width:300px;padding:0;position:absolute;top:-8px;word-wrap:break-word}.docs-link-insertlinkbubble-urlholder{float:left;outline:none}.docs-link-insertlinkbubble-suggestionholder{background-color:white;border:1px solid #e5e5e5;border-top:none;-webkit-box-shadow:0 2px 4px rgba(0,0,0,0.2);-moz-box-shadow:0 2px 4px rgba(0,0,0,.2);box-shadow:0 2px 4px rgba(0,0,0,0.2);max-height:207px;overflow-x:hidden;outline:none;position:absolute;width:260px;z-index:1}.docs-gm .docs-link-insertlinkbubble-suggestionholder{border-radius:0 0 8px 8px;color:#3c4043;margin:1px 0px;width:310px}.docs-link-insertlinkbubble-linkchip{width:312px}.docs-link-insertlinkbubble-buttonbar .jfk-button{margin-right:0}.docs-gm .docs-link-insertlinkbubble-buttonbar .jfk-button{margin-left:12px;min-width:87px}.docs-link-insertlinkbubble-error{color:#c5221f;padding:12px 0 0 0}@media print{.docs-link-insertlinkbubble{display:none!important}}.jfk-bubble.docs-calloutbubble-bubble.docs-linkbubble-bubble{z-index:503!important}.docs-gm .docs-link-insertlinkbubble-toppane,.docs-gm .docs-link-insertlinkbubble-bottompane{margin:24px}.docs-gm .docs-link-insertlinkbubble-bottompane{display:flex}.docs-gm .docs-link-insertlinkbubble-toppane,.docs-gm .docs-link-insertlinkbubble-urlcomponent{position:relative}.docs-link-linksuggestion:last-child{margin-bottom:6px}.docs-link-linksuggestion:first-child{margin-top:6px}.docs-link-linksuggestion,.docs-link-chipselectedlinksuggestion{border:none;border-collapse:separate;border-spacing:0 6px;display:table;font-size:90%;height:26px;max-height:26px;outline:none;width:100%}.docs-link-linksuggestion:hover,.docs-link-linksuggestion:focus{background-color:#f1f3f4}.docs-link-linksuggestion-icon{display:table-cell;height:21px;padding:0 6px;vertical-align:middle;width:21px}.docs-link-linksuggestion-url,.docs-link-linksuggestion-title{cursor:default;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:190px}.docs-link-linksuggestion-title:last-child{margin-top:2px}.docs-link-linksuggestion-url{color:#093;font-size:11px}.docs-link-linksuggestiongroup{border-color:#efefef;border-style:solid;border-width:0 0 1px}.docs-link-linksuggestion-testlink,.docs-link-chipselectedlinksuggestion-hide{display:table-cell;height:21px;vertical-align:middle;width:21px}.docs-link-linksuggestion-testlink{opacity:0}.docs-link-chipselectedlinksuggestion-hide{opacity:0.7}.docs-link-chipselectedlinksuggestion-hide:hover{opacity:1}.docs-link-linksuggestion:hover .docs-link-linksuggestion-testlink,.docs-link-linksuggestion:focus .docs-link-linksuggestion-testlink,.docs-link-linksuggestion-testlink:focus{opacity:1}.docs-link-linksuggestion-text{display:table-cell}.docs-link-linksuggestion-link-text{font-size:90%}.docs-link-linksuggestion-action-text{font-size:100%}.docs-link-linksuggestion.docs-link-chipselectedlinksuggestion{background-color:#fff;border-spacing:0 4px;margin:0}.docs-link-linksuggestioncontentbox-statusmessage{color:#222;margin-left:33px;padding:5px 0}.docs-link-linksuggestioncontentbox-explore{color:#333;font-size:90%;margin:6px 0;padding:6px}.docs-link-linksuggestioncontentbox-explore:hover,.docs-link-linksuggestioncontentbox-explore:focus{background-color:#eee;cursor:default;outline:none}.docs-link-linksuggestioncontentbox-exploretext{display:inline-block;overflow:hidden;padding-left:5px;text-overflow:ellipsis;vertical-align:middle;white-space:nowrap;width:196px}.docs-link-linksuggestioncontentbox-statusbar{border-bottom:1px solid #f5f5f5;padding:10px 0;position:relative}.docs-link-linksuggestioncontentbox-statusindicator{bottom:12px;float:left;left:17px;position:relative}.docs-link-linksuggestioncontentbox-offlinenotice{font-style:italic;margin-left:5px;padding:5px 0}.docs-link-urlinput-url{background:transparent!important;border:none!important;box-sizing:border-box;box-shadow:none;display:inline-block;flex-grow:1;height:27px;margin:0;outline:none!important;padding:1px 8px!important}.docs-gm .docs-link-urlinput-url{border-color:#dadce0;border-radius:4px;color:#5f6368;display:block;font-size:14px;height:34px;width:312px}.docs-gm .docs-link-urlinput-url:focus{height:32px;padding:0px 7px!important}.docs-gm .docs-link-urlinput-url::placeholder{color:#9aa0a6}.docs-link-urlinput-action-icon-container{float:right;overflow:hidden;padding:0 0 0 8px;text-align:right;width:21px}.docs-link-urlinput-action-icon{background:transparent!important;border:transparent!important;cursor:pointer;margin:0 0 0 -13px;opacity:.70;white-space:nowrap}.docs-link-urlinput-action-icon:hover,.docs-link-urlinput-action-icon:focus{opacity:0.9}.docs-link-urlinput-url-container{background:#fff;border:1px solid #d9d9d9;border-top:1px solid #c0c0c0;min-width:20px;width:260px;display:flex}.docs-gm .docs-link-urlinput-url-container{border-color:#dadce0;border-radius:4px;box-sizing:border-box;width:312px}.docs-link-urlinput-url-container-focus{border:1px solid #4d90fe!important;box-shadow:inset 0 1px 2px rgba(0,0,0,0.3);outline:none}.docs-gm .docs-link-urlinput-url-container-focus{border:2px solid #4d90fe!important;box-shadow:none;color:#3c4043;padding:0}.docs-link-urlinput-url-error,.docs-link-urlinput-url-error:focus{border-color:#dd4b39}.MEET_IN_EDITORS_PIP_FRAME{border:none;border-radius:8px;pointer-events:none;position:absolute;visibility:hidden;z-index:1008}.MEET_IN_EDITORS_DIALOG_FRAME{border:none;height:100vh;left:0;overflow:auto;position:absolute;top:0;width:100vw;z-index:1009}.MEET_IN_EDITORS_MENU_FRAME{border:none;height:375px;width:330px}#docs-meet-in-editors-entrypointbutton{background:#fff;border-radius:33px;box-sizing:border-box;cursor:pointer;height:36px;margin-right:12px;width:54px}#docs-meet-in-editors-entrypointbutton.goog-flat-menu-button-disabled{cursor:default}#docs-meet-in-editors-entrypointbutton.goog-flat-menu-button-hover,#docs-meet-in-editors-entrypointbutton.goog-flat-menu-button-focused,#docs-meet-in-editors-entrypointbutton.goog-flat-menu-button-open{-webkit-box-shadow:none}#docs-meet-in-editors-entrypointbutton.goog-flat-menu-button-hover,#docs-meet-in-editors-entrypointbutton.goog-flat-menu-button-focused{background:#f1f3f4;border-color:#f1f3f4}#docs-meet-in-editors-entrypointbutton.goog-flat-menu-button-open{background:#e8f0fe;border-color:#e8f0fe}#docs-meet-in-editors-entrypointbutton.goog-flat-menu-button .docs-icon{height:24px;width:24px;margin:5px 4px 0 4px}#docs-meet-in-editors-entrypointbutton.goog-flat-menu-button .docs-icon-present-to-all-24{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_blue.svg)}#docs-meet-in-editors-entrypointbutton.goog-flat-menu-button-disabled .docs-icon-present-to-all-24{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_grey_medium.svg)}#docs-meet-in-editors-entrypointbutton.goog-flat-menu-button .goog-flat-menu-button-dropdown{border-color:#1a73e8 transparent;right:6px;top:15px}#docs-meet-in-editors-entrypointbutton.goog-flat-menu-button-disabled .goog-flat-menu-button-dropdown{border-color:#202124 transparent}#docs-meet-in-editors-entrypointbutton.docs-meet-in-editors-active-call.goog-flat-menu-button{background:#1a73e8;border-color:#1a73e8}#docs-meet-in-editors-entrypointbutton.docs-meet-in-editors-active-call .goog-flat-menu-button-dropdown{border-color:#fff transparent}.goog-menu.docs-meet-in-editors-menu{background:#fff;border-radius:8px;border:0;box-shadow:0px 1px 3px 0px rgba(60,64,67,.30),0px 4px 8px 3px rgba(60,64,67,.15);padding:0;width:330px}#docs-meet-in-editors-loading.hidden{display:none}#docs-meet-in-editors-loading{height:270px;display:flex;align-items:center;justify-content:center}#docs-meet-in-editors-loading .docs-spinner{align-items:center;display:flex;overflow:visible}#docs-meet-in-editors-loading .docs-quantum-spinner{top:auto}#docs-meet-in-editors-error{color:#5f6368;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;line-height:18px;padding:16px;text-align:center}#docs-meet-in-editors-error>svg{display:block;margin-left:auto;margin-right:auto}#docs-meet-in-editors-error>div{margin:22px 34px 22px}.picker-frame{width:100%;height:100%;border:0;overflow:hidden}.picker.modal-dialog-bg{position:absolute;top:0;left:0;background-color:#fff}.picker.modal-dialog{position:absolute;top:0;left:0;background-color:#fff;border:1px solid #acacac;width:auto;padding:0;z-index:1001;overflow:auto;-moz-box-shadow:rgba(0,0,0,.2) 0 4px 16px;-webkit-box-shadow:rgba(0,0,0,.2) 0 4px 16px;box-shadow:rgba(0,0,0,.2) 0 4px 16px;-webkit-transition:top .5s ease-in-out;-moz-transition:top .5s ease-in-out;-o-transition:top .5s ease-in-out;transition:top .5s ease-in-out}.picker-min{position:absolute;z-index:1002}.picker.modal-dialog-content{font-size:0;padding:0}.picker.modal-dialog-title{height:0;margin:0}.picker.modal-dialog-title-text{display:none}.picker.modal-dialog-buttons{display:none}.picker.modal-dialog{z-index:1201}div.docs-spell-content-box{overflow:auto;width:425px;height:130px;background-color:#e6e6e6;border:none;padding:5px;cursor:default}.docs-spell-content-message{color:#666}.docs-spell-error{border-bottom:1px solid red;cursor:pointer}.docs-spell-error-fixed{border-bottom:1px dotted green;cursor:pointer}.docs-spell-button-set{width:435px;height:30px;margin:20px 0 0 0}div.docs-spell-buttons-left{float:left}div.docs-spell-buttons-right{float:right}div.docs-spell-right-button{margin-right:0}.docs-spell-content-box::-webkit-scrollbar-thumb{border:solid #e6e6e6}#docs-spellcheckslidingdialog-button-change-menu{box-shadow:none;background-color:#4d90fe;background-image:-webkit-linear-gradient(top,#4d90fe,#4787ed);background-image:-moz-linear-gradient(top,#4d90fe,#4787ed);background-image:-ms-linear-gradient(top,#4d90fe,#4787ed);background-image:-o-linear-gradient(top,#4d90fe,#4787ed);background-image:linear-gradient(top,#4d90fe,#4787ed);border:1px solid #3079ed;color:#fff}#docs-spellcheckslidingdialog-button-change-menu:hover{background-color:#357ae8;background-color:#357ae8;background-image:-webkit-linear-gradient(top,#4d90fe,#357ae8);background-image:-moz-linear-gradient(top,#4d90fe,#357ae8);background-image:-ms-linear-gradient(top,#4d90fe,#357ae8);background-image:-o-linear-gradient(top,#4d90fe,#357ae8);background-image:linear-gradient(top,#4d90fe,#357ae8);border:1px solid #2f5bb7;border-bottom-color:#2f5bb7}#docs-spellcheckslidingdialog-button-change-menu.goog-flat-menu-button-focused{-webkit-box-shadow:inset 0 0 0 1px #fff;-moz-box-shadow:inset 0 0 0 1px #fff;box-shadow:inset 0 0 0 1px #fff;border:1px solid #fff;border:rgba(0,0,0,0) solid 1px;outline:1px solid #4d90fe;outline:rgba(0,0,0,0) 0}#docs-spellcheckslidingdialog-button-change-menu .goog-flat-menu-button-dropdown{border-color:white transparent;color:white}#docs-spellcheckslidingdialog-button-change-menu.goog-flat-menu-button-open{box-shadow:inset 0 1px 2px rgba(0,0,0,0.3);background:#357ae8;border:1px solid #2f5bb7;border-top:1px solid #2f5bb7}#docs-spellcheckslidingdialog-button-change-menu.goog-flat-menu-button-disabled{background:#4d90fe;filter:alpha(opacity=50);opacity:0.5}#docs-spellcheckslidingdialog-button-ignore-all{margin-left:10px}.docs-spellcheckslidingdialog-buttons-white-menu.goog-flat-menu-button-disabled,.docs-spellcheckslidingdialog-buttons-white-menu.goog-flat-menu-button-disabled:hover{background:#fff;border:1px solid #dcdcdc!important;filter:alpha(opacity=50);opacity:0.5}.docs-spellcheckslidingdialog-buttons-white-menu.goog-flat-menu-button-focus,.docs-spellcheckslidingdialog-buttons-white-menu:hover{border:1px solid #c6c6c6}.docs-spellcheckslidingdialog-buttons-white-menu:focus{z-index:2}#docs-spellcheckslidingdialog-button-ignore,#docs-spellcheckslidingdialog-button-ignore-menu{margin-bottom:1px}#docs-spellcheckslidingdialog-button-dictionary,#docs-spellcheckslidingdialog-button-dictionary-menu{margin-top:7px}.docs-spellcheckslidingdialog-buttons-action{margin-left:9px;overflow:hidden;text-overflow:ellipsis;width:110px}.docs-spellcheckslidingdialog-count{color:#6a6a6a;padding-left:4px}.goog-menuitem-disabled .docs-spellcheckslidingdialog-count{color:#ccc}#docs-spellcheckslidingdialog-id .docs-slidingdialog-close-container{position:absolute;right:14px;top:10px}#docs-spellcheckslidingdialog-ignore-buttons{padding-top:7px;vertical-align:top}.docs-spellcheckslidingdialog-replacement-input,.docs-spellcheckslidingdialog-replacement-input:focus{background:transparent;border:none;box-shadow:none;font-size:13px;height:25px;margin:0;outline:none;padding:1px 0px;width:100%}.docs-spellcheckslidingdialog-replacement-input-container{background:#fff;border:1px solid #d9d9d9;border-top:1px solid #c0c0c0;min-width:20px;padding:0 8px}.docs-spellcheckslidingdialog-replacement-input-container-focus{border:1px solid #4d90fe;box-shadow:inset 0 1px 2px rgba(0,0,0,0.3);outline:none}.docs-spellcheckslidingdialog-title-text{margin-top:2px;margin-bottom:10px;color:#222;cursor:default}#docs-spellcheckslidingdialog-original-word{font-weight:500}.docs-spellcheckslidingdialog-title-text.docs-spellcheckslidingdialog-no-misspellings{margin-bottom:0;padding-right:33px}#docs-spellcheckslidingdialog-no-misspellings:focus{outline:none}#docs-spellcheckslidingdialog-suggestion-list{box-shadow:none;margin-left:-1px;margin-top:-1px;height:91px;overflow-y:auto;position:relative;width:100%}.docs-spellcheckslidingdialog-container .goog-flat-menu-button{margin:0;height:27px}.docs-spellcheckslidingdialog-container .goog-flat-menu-button-collapse-left{margin-left:-1px}.docs-spellcheckslidingdialog-container .goog-flat-menu-button-collapse-right{min-width:0px;padding-left:0;margin-left:0px;border-radius:0 2px 2px 0}#docs-spellcheckslidingdialog-suggestion-list .goog-menuitem{padding-left:8px}#docs-spellcheckslidingdialog-suggestion-list .goog-menuitem-checkbox{position:inherit}.docs-spellcheckslidingdialog-container table{width:100%}.docs-spellcheckslidingdialog .docs-slidingdialog-holder{min-width:250px}.docs-spellcheckslidingdialog-loading-spinner,.docs-spellcheckslidingdialog-loading-text{display:inline-block;position:relative;transition:left 300ms ease-out;transition:width 300ms ease-out;vertical-align:middle}.docs-gm #docs-spellcheckslidingdialog-id .docs-slidingdialog{padding:16px}.docs-gm #docs-spellcheckslidingdialog-id td{padding:0;vertical-align:top}.docs-gm .docs-spellcheckslidingdialog-title-text{font-size:14px;height:24px;margin:0 0 16px 0;line-height:24px;vertical-align:middle}.docs-gm #docs-spellcheckslidingdialog-button-change,.docs-gm #docs-spellcheckslidingdialog-button-change-menu{background:#188038;background-image:none;border:1px solid transparent;border-radius:4px;box-shadow:none;box-sizing:border-box;color:#fff;font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;height:36px;letter-spacing:0.25px;line-height:16px}.docs-gm #docs-spellcheckslidingdialog-button-change.jfk-button-hover,.docs-gm #docs-spellcheckslidingdialog-button-change-menu.goog-flat-menu-button-hover{background:#2a8947;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15)}.docs-gm #docs-spellcheckslidingdialog-button-change.jfk-button-focused,.docs-gm #docs-spellcheckslidingdialog-button-change-menu.goog-flat-menu-button-focused{background:#4f9e67;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15)}.docs-gm #docs-spellcheckslidingdialog-button-change.jfk-button-focused.jfk-button-hover,.docs-gm #docs-spellcheckslidingdialog-button-change-menu.goog-flat-menu-button-focused.goog-flat-menu-button-hover{background:#62a877;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15)}.docs-gm #docs-spellcheckslidingdialog-button-change.jfk-button-active,.docs-gm #docs-spellcheckslidingdialog-button-change-menu.goog-flat-menu-button-active{background:#62a877;box-shadow:0 2px 6px 2px rgba(52,168,83,0.15)}.docs-gm #docs-spellcheckslidingdialog-button-change.jfk-button-disabled,.docs-gm #docs-spellcheckslidingdialog-button-change-menu.goog-flat-menu-button-disabled{background:#f1f3f4;color:#3c4043;opacity:0.38}.docs-gm #docs-spellcheckslidingdialog-button-ignore,.docs-gm #docs-spellcheckslidingdialog-button-ignore-menu,.docs-gm #docs-spellcheckslidingdialog-button-dictionary,.docs-gm #docs-spellcheckslidingdialog-button-dictionary-menu{background:#fff;background-image:none;border:1px solid #dadce0;border-radius:4px;box-shadow:none;box-sizing:border-box;color:#188038;font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;height:36px;letter-spacing:0.25px;line-height:16px;margin-bottom:0;margin-top:8px}.docs-gm #docs-spellcheckslidingdialog-button-ignore.jfk-button-hover,.docs-gm #docs-spellcheckslidingdialog-button-ignore-menu.goog-flat-menu-button-hover,.docs-gm #docs-spellcheckslidingdialog-button-dictionary.jfk-button-hover,.docs-gm #docs-spellcheckslidingdialog-button-dictionary-menu.goog-flat-menu-button-hover{background:#f8fcf9;border:1px solid #c8e7d1}.docs-gm #docs-spellcheckslidingdialog-button-ignore.jfk-button-focused,.docs-gm #docs-spellcheckslidingdialog-button-ignore-menu.goog-flat-menu-button-focused,.docs-gm #docs-spellcheckslidingdialog-button-dictionary.jfk-button-focused,.docs-gm #docs-spellcheckslidingdialog-button-dictionary-menu.goog-flat-menu-button-focused{background:#e7f5eb;border:1px solid #bbe2c6}.docs-gm #docs-spellcheckslidingdialog-button-ignore.jfk-button-focused.jfk-button-hover,.docs-gm #docs-spellcheckslidingdialog-button-ignore-menu.goog-flat-menu-button-focused.goog-flat-menu-button-hover,.docs-gm #docs-spellcheckslidingdialog-button-dictionary.jfk-button-focused.jfk-button-hover,.docs-gm #docs-spellcheckslidingdialog-button-dictionary-menu.goog-flat-menu-button-focused.goog-flat-menu-button-hover{background:#dff2e4;border:1px solid #b5e0c1}.docs-gm #docs-spellcheckslidingdialog-button-ignore.jfk-button-active,.docs-gm #docs-spellcheckslidingdialog-button-ignore-menu.goog-flat-menu-button-active,.docs-gm #docs-spellcheckslidingdialog-button-dictionary.jfk-button-active,.docs-gm #docs-spellcheckslidingdialog-button-dictionary-menu.goog-flat-menu-button-active{background:#dff2e4;border:1px solid transparent;box-shadow:0 2px 6px 2px rgba(60,64,67,.15)}.docs-gm #docs-spellcheckslidingdialog-button-ignore.jfk-button-disabled,.docs-gm #docs-spellcheckslidingdialog-button-ignore-menu.goog-flat-menu-button-disabled,.docs-gm #docs-spellcheckslidingdialog-button-dictionary.jfk-button-disabled,.docs-gm #docs-spellcheckslidingdialog-button-dictionary-menu.goog-flat-menu-button-disabled{background:#fff;border:1px solid #f1f3f4;color:#3c4043;opacity:0.38}.docs-gm #docs-spellcheckslidingdialog-button-change,.docs-gm #docs-spellcheckslidingdialog-button-ignore,.docs-gm #docs-spellcheckslidingdialog-button-dictionary{border-radius:4px 0 0 4px;margin-left:16px;padding:9px 8px 11px 8px;width:156px}.docs-gm #docs-spellcheckslidingdialog-button-change,.docs-gm #docs-spellcheckslidingdialog-button-change.jfk-button-focused,.docs-gm #docs-spellcheckslidingdialog-button-change.jfk-button-hover,.docs-gm #docs-spellcheckslidingdialog-button-change.jfk-button-hover.jfk-button-focused,.docs-gm #docs-spellcheckslidingdialog-button-change.jfk-button-active,.docs-gm #docs-spellcheckslidingdialog-button-change.jfk-button-disabled{border-right:1px solid #ceead6}.docs-gm #docs-spellcheckslidingdialog-button-change-menu,.docs-gm #docs-spellcheckslidingdialog-button-change-menu.goog-flat-menu-button-focused,.docs-gm #docs-spellcheckslidingdialog-button-change-menu.goog-flat-menu-button-hover,.docs-gm #docs-spellcheckslidingdialog-button-change-menu.goog-flat-menu-button-hover.goog-flat-menu-button-focused,.docs-gm #docs-spellcheckslidingdialog-button-change-menu.goog-flat-menu-button-active,.docs-gm #docs-spellcheckslidingdialog-button-change-menu.goog-flat-menu-button-disabled{border-left:1px solid #ceead6}.docs-gm #docs-spellcheckslidingdialog-button-change-menu,.docs-gm #docs-spellcheckslidingdialog-button-ignore-menu,.docs-gm #docs-spellcheckslidingdialog-button-dictionary-menu{border-radius:0 4px 4px 0;padding:8px;width:41px}.docs-gm #docs-spellcheckslidingdialog-button-change-menu .goog-flat-menu-button-dropdown,.docs-gm #docs-spellcheckslidingdialog-button-ignore-menu .goog-flat-menu-button-dropdown,.docs-gm #docs-spellcheckslidingdialog-button-dictionary-menu .goog-flat-menu-button-dropdown{right:15px;top:15px}.docs-gm #docs-spellcheckslidingdialog-replacement-input{border:1px solid #dadce0;border-radius:4px;box-sizing:border-box;color:#3c4043;padding:1px 8px;font-size:14px;height:36px;margin:8px 0;margin:0}.docs-gm #docs-spellcheckslidingdialog-replacement-input:focus{border:2px solid #1a73e8;box-shadow:none;padding:0px 7px}.docs-gm .docs-spellcheckslidingdialog-replacement-input-container{background:transparent;border:none;padding:0;width:156px}.docs-gm .docs-spellcheckslidingdialog-replacement-input-container-focus{border:none;box-shadow:none;outline:none}.docs-gm #docs-spellcheckslidingdialog-suggestion-list{box-shadow:0 1px 3px 1px rgba(60,64,67,.15);height:auto;margin:0;width:156px}.docs-gm #docs-spellcheckslidingdialog-id .docs-slidingdialog-close-container{height:24px;right:16px;top:16px;width:24px}.docs-gm #docs-spellcheckslidingdialog-id .docs-slidingdialog-button-close{opacity:0.54}.docs-gm #docs-spellcheckslidingdialog-id .docs-slidingdialog-button-close.goog-flat-button-hover,.docs-gm #docs-spellcheckslidingdialog-id .docs-slidingdialog-button-close.goog-flat-button-focused,.docs-gm #docs-spellcheckslidingdialog-id .docs-slidingdialog-button-close.goog-flat-button-active{opacity:0.87}.docs-gm #docs-spellcheckslidingdialog-id .docs-slidingdialog-button-close.goog-flat-button-focused{outline:none}.docs-gm #docs-spellcheckslidingdialog-no-misspellings-footer .jfk-button{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff}.docs-gm #docs-spellcheckslidingdialog-no-misspellings-footer .jfk-button:last-child{margin-right:0}.docs-gm #docs-spellcheckslidingdialog-no-misspellings-footer .jfk-button.jfk-button-hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#2a8947;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15)}.docs-gm #docs-spellcheckslidingdialog-no-misspellings-footer .jfk-button.jfk-button-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#4f9e67;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15)}.docs-gm #docs-spellcheckslidingdialog-no-misspellings-footer .jfk-button.jfk-button-focused.jfk-button-hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#62a877;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15)}.docs-gm #docs-spellcheckslidingdialog-no-misspellings-footer .jfk-button.jfk-button-active,.docs-gm #docs-spellcheckslidingdialog-no-misspellings-footer .jfk-button.jfk-button-active.jfk-button-focused.jfk-button-hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#62a877;box-shadow:0 2px 6px 2px rgba(52,168,83,0.15)}.docs-userdictionary-butterbar-item{font-weight:normal}.docs-userdictionarydialog-button-add{margin-left:0px;margin-right:0px;padding:0px;width:100%}.docs-userdictionarydialog-list-container{background-color:#fff;border:1px solid #ececec;height:415px;margin-top:16px;overflow-y:auto;position:relative;width:315px}.docs-gm .docs-userdictionarydialog-list-container{height:232px;min-width:464px;width:auto;width:unset}.docs-userdictionarydialog-list-container:focus{outline:none}.docs-userdictionarydialog-button-add-container{border-left:30px solid white;max-width:125px}.docs-gm .docs-userdictionarydialog-button-add-container{border-left:0;margin-left:16px}.docs-userdictionarydialog-input{margin-left:0px;margin-right:19px!important;vertical-align:middle;width:100%}.docs-gm .docs-userdictionarydialog-input{width:364px}.docs-userdictionarydialog-row-container{border-bottom:1px solid #ececec;padding:10px;min-width:275px}.docs-gm .docs-userdictionarydialog-row-container{border-bottom:1px solid #dadce0;padding:10px 16px;width:432px}.docs-gm .docs-userdictionarydialog-list-container-ie .docs-userdictionarydialog-row-container{padding-left:20px;padding-right:20px;width:424px}.docs-userdictionarydialog-row-container-hover{background-color:#eee}.docs-gm .docs-userdictionarydialog-row-container-hover{background-color:#f1f3f4}.docs-userdictionarydialog-row-content{display:inline-block;width:250px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:middle}.docs-gm .docs-userdictionarydialog-row-content{color:#3c4043}.docs-userdictionarydialog-list-remove-button{background-color:transparent;border:none;margin:0;padding:0;position:absolute;right:3px}.docs-gm .docs-userdictionarydialog-list-remove-button{left:424px}.docs-gm .docs-userdictionarydialog-list-container-ie .docs-userdictionarydialog-list-remove-button{left:420px}.docs-gm .docs-material.docs-userdictionarydialog-list-remove-button .docs-icon{height:24px;margin:0;width:24px}.docs-userdictionarydialog-top-container{border-collapse:separate;display:table;width:100%}.docs-userdictionarydialog-top-container>div{display:table-cell}.docs-templatestoast.docs-ui-toast{z-index:1003}.docs-calloutbubble-anchor{position:absolute}.docs-calloutbubble-bubble.jfk-bubble{padding:0px;z-index:99!important}@media print{.docs-calloutbubble-anchor{display:none!important}}.docs-dismissible-bar{margin-top:0;position:absolute;width:500px}.docs-dismissible-bar .docs-dismissible-bar-content{background:rgba(0,0,0,0.8);-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;color:#fff;left:-50%;overflow:hidden;position:relative;z-index:1001}.docs-dismissible-bar .docs-dismissible-bar-header{border-bottom:1px solid #000;float:left;width:100%}.docs-dismissible-bar .docs-dismissible-bar-title{float:left;font-size:15px;font-weight:500;margin:16px 15px}.docs-dismissible-bar .docs-dismissible-bar-description{border-top:1px solid #444;box-sizing:border-box;color:#bbb;float:left;padding:10px 15px 15px;text-align:left;width:100%}.docs-dismissible-bar .docs-dismissible-bar-dismiss-button{float:right;margin:10px 10px 10px 0}.docs-dismissible-bar .docs-dismissible-bar-black-button{background-color:#454545;background-repeat:repeat-x;border:solid 1px #111;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;box-shadow:0px 1px 1px 0px rgba(0,0,0,0.05),inset 0px 1px 0px 0px rgba(255,255,255,0.2);color:#ddd;cursor:pointer;background-color:#4b4b4b;background-image:-webkit-linear-gradient(top,#4b4b4b,#3b3b3b);background-image:-moz-linear-gradient(top,#4b4b4b,#3b3b3b);background-image:-ms-linear-gradient(top,#4b4b4b,#3b3b3b);background-image:-o-linear-gradient(top,#4b4b4b,#3b3b3b);background-image:linear-gradient(top,#4b4b4b,#3b3b3b);text-shadow:0 1px 0 rgba(0,0,0,0.8)}.docs-dismissible-bar .docs-dismissible-bar-black-button.jfk-button-hover{background:rgba(255,255,255,0.1);border:1px solid #141414;box-shadow:0 0 0 transparent inset;color:#fff}.docs-dismissible-bar .docs-dismissible-bar-black-button.jfk-button-active,.docs-dismissible-bar .docs-dismissible-bar-black-button.jfk-button-focused{border-color:#fff}.docs-indeterminate-loading-bar{background:#c6dafc;height:100%;position:relative;width:100%}.docs-indeterminate-loading-bar>div{-webkit-animation:docs-indeterminate-loading-animation 2s linear infinite;-moz-animation:docs-indeterminate-loading-animation 2s linear infinite;-o-animation:docs-indeterminate-loading-animation 2s linear infinite;animation:docs-indeterminate-loading-animation 2s linear infinite;background:#4285f4;height:100%;position:absolute;transition:width .2s cubic-bezier(.4,0,.2,1)}@keyframes docs-indeterminate-loading-animation{0%{left:0%;width:0}50%{left:25%;width:75%}75%{left:100%;width:0%}}.docs-loading-indicator{height:48px;left:50%;margin:-24px 0 0 -24px;position:absolute;top:50%;width:48px}.docs-loading-indicator-small{height:20px;left:50%;margin:-10px 0 0 -10px;position:absolute;top:50%;width:20px}.docs-sidebar-toggle-tabs-jfk .jfk-button.docs-sidebar-toggle-tab{width:50%;border:none;color:#646464;cursor:pointer;font-size:13px;height:40px;line-height:42px;margin:0;text-align:center}.docs-sidebar-toggle-tabs-jfk .jfk-button.docs-sidebar-toggle-tab-inactive{font-weight:normal}.docs-sidebar-toggle-tabs-jfk .jfk-button.docs-sidebar-toggle-tab-active{font-weight:500;border-bottom:3px solid #3367d6}.docs-sidebar-toggle-tabs-jfk .jfk-button-focused.docs-sidebar-toggle-tab-inactive{border-bottom:3px solid #4d90fe}.docs-sidebar-toggle-tabs-material .jfk-button.docs-sidebar-toggle-tab{width:50%;border:none;cursor:pointer;font-size:13px;font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;text-transform:uppercase;height:41px;line-height:43px;margin:0;text-align:center}.docs-sidebar-toggle-tabs-material .jfk-button.docs-sidebar-toggle-tab-inactive{color:rgba(0,0,0,0.54)}.docs-sidebar-toggle-tabs-material .jfk-button.docs-sidebar-toggle-tab-active{color:rgba(0,0,0,0.87);border-bottom:2px solid #4285f4}.docs-sidebar-toggle-tabs-material .jfk-button-focused.docs-sidebar-toggle-tab-inactive{border-bottom:2px dotted #4285f4}.docs-sidebar-toggle-tabs-material .jfk-button-active.jfk-button-focused.docs-sidebar-toggle-tab-inactive{border-bottom:none}.docs-spinner{height:44px;overflow:hidden;position:relative}.docs-quantum-spinner{height:28px;left:50%;margin-left:-14px;position:absolute;top:0;width:28px}.docs-loading-indicator-small .docs-quantum-spinner{height:20px;margin-left:-10px;top:0;width:20px}.docs-white-circle{background:white;border-radius:50%;box-shadow:0 2px 6px rgba(0,0,0,0.4);-moz-box-shadow:0 2px 6px rgba(0,0,0,0.4);-webkit-box-shadow:0 2px 6px rgba(0,0,0,0.4);height:44px;left:50%;margin-left:-22px;position:absolute;width:44px}.docs-quantum-spinner.active{-webkit-animation:container-rotate 1568ms linear infinite;animation:container-rotate 1568ms linear infinite}@-webkit-keyframes container-rotate{to{-webkit-transform:rotate(360deg)}}@keyframes container-rotate{to{transform:rotate(360deg)}}.spinner-layer{position:absolute;width:100%;height:100%;opacity:0}.spinner-blue{border-color:#4285f4}.spinner-red{border-color:#db4437}.spinner-yellow{border-color:#f4b400}.spinner-green{border-color:#0f9d58}.active .spinner-layer.spinner-blue{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,blue-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,blue-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both}.active .spinner-layer.spinner-red{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,red-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,red-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both}.active .spinner-layer.spinner-yellow{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,yellow-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,yellow-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both}.active .spinner-layer.spinner-green{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,green-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,green-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both}@-webkit-keyframes fill-unfill-rotate{12.5%{-webkit-transform:rotate(135deg)}25%{-webkit-transform:rotate(270deg)}37.5%{-webkit-transform:rotate(405deg)}50%{-webkit-transform:rotate(540deg)}62.5%{-webkit-transform:rotate(675deg)}75%{-webkit-transform:rotate(810deg)}87.5%{-webkit-transform:rotate(945deg)}to{-webkit-transform:rotate(1080deg)}}@keyframes fill-unfill-rotate{12.5%{transform:rotate(135deg)}25%{transform:rotate(270deg)}37.5%{transform:rotate(405deg)}50%{transform:rotate(540deg)}62.5%{transform:rotate(675deg)}75%{transform:rotate(810deg)}87.5%{transform:rotate(945deg)}to{transform:rotate(1080deg)}}@-webkit-keyframes blue-fade-in-out{from{opacity:1}25%{opacity:1}26%{opacity:0}89%{opacity:0}90%{opacity:1}100%{opacity:1}}@keyframes blue-fade-in-out{from{opacity:1}25%{opacity:1}26%{opacity:0}89%{opacity:0}90%{opacity:1}100%{opacity:1}}@-webkit-keyframes red-fade-in-out{from{opacity:0}15%{opacity:0}25%{opacity:1}50%{opacity:1}51%{opacity:0}}@keyframes red-fade-in-out{from{opacity:0}15%{opacity:0}25%{opacity:1}50%{opacity:1}51%{opacity:0}}@-webkit-keyframes yellow-fade-in-out{from{opacity:0}40%{opacity:0}50%{opacity:1}75%{opacity:1}76%{opacity:0}}@keyframes yellow-fade-in-out{from{opacity:0}40%{opacity:0}50%{opacity:1}75%{opacity:1}76%{opacity:0}}@-webkit-keyframes green-fade-in-out{from{opacity:0}65%{opacity:0}75%{opacity:1}90%{opacity:1}100%{opacity:0}}@keyframes green-fade-in-out{from{opacity:0}65%{opacity:0}75%{opacity:1}90%{opacity:1}100%{opacity:0}}.spinner-gap-patch{position:absolute;box-sizing:border-box;top:0;left:45%;width:10%;height:100%;overflow:hidden;border-color:inherit}.spinner-gap-patch .spinner-circle{width:1000%;left:-450%}.spinner-circle-clipper{display:inline-block;position:relative;width:50%;height:100%;overflow:hidden;border-color:inherit}.spinner-circle-clipper .spinner-circle{width:200%}.spinner-circle{box-sizing:border-box;height:100%;border-width:3px;border-style:solid;border-color:inherit;border-bottom-color:transparent!important;border-radius:50%;-webkit-animation:none;animation:none}.spinner-circle-clipper.spinner-left .spinner-circle{border-right-color:transparent!important;-webkit-transform:rotate(129deg);transform:rotate(129deg)}.spinner-circle-clipper.spinner-right .spinner-circle{left:-100%;border-left-color:transparent!important;-webkit-transform:rotate(-129deg);transform:rotate(-129deg)}.active .spinner-circle-clipper.spinner-left .spinner-circle{-webkit-animation:left-spin 1333ms cubic-bezier(0.4,0.0,0.2,1) infinite both;animation:left-spin 1333ms cubic-bezier(0.4,0.0,0.2,1) infinite both}.active .spinner-circle-clipper.spinner-right .spinner-circle{-webkit-animation:right-spin 1333ms cubic-bezier(0.4,0.0,0.2,1) infinite both;animation:right-spin 1333ms cubic-bezier(0.4,0.0,0.2,1) infinite both}@-webkit-keyframes left-spin{from{-webkit-transform:rotate(130deg)}50%{-webkit-transform:rotate(-5deg)}to{-webkit-transform:rotate(130deg)}}@keyframes left-spin{from{transform:rotate(130deg)}50%{transform:rotate(-5deg)}to{transform:rotate(130deg)}}@-webkit-keyframes right-spin{from{-webkit-transform:rotate(-130deg)}50%{-webkit-transform:rotate(5deg)}to{-webkit-transform:rotate(-130deg)}}@keyframes right-spin{from{transform:rotate(-130deg)}50%{transform:rotate(5deg)}to{transform:rotate(-130deg)}}.spinner-fit{position:absolute;top:0;bottom:0;right:0;left:0}.docs-working-bar{color:#222;display:none;font:13px/1.4 arial,sans-serif;margin-top:0;min-width:124px;position:absolute;z-index:1001;transition:218ms ease-in}.docs-working-bar-slideup{-webkit-transform:translateY(-60px);-moz-transform:translateY(-60px);-ms-transform:translateY(-60px);-o-transform:translateY(-60px);transform:translateY(-60px)}.docs-working-bar-display{display:block}.docs-working-bar .message{background:rgba(0,0,0,.8);border-radius:3px;color:#fff;left:-50%;padding:16px;position:relative}.docs-working-bar .message *{vertical-align:middle}.docs-working-bar .message .icon{margin-right:16px}.docs-working-bar .spinner{display:inline-block}.docs-working-bar .label{font-weight:normal}@keyframes script-working-bar-spin{from{transform:rotate(0deg);-ms-transform:rotate(0deg)}to{transform:rotate(360deg);-ms-transform:rotate(360deg)}}@-webkit-keyframes script-working-bar-spin{from{-webkit-transform:rotate(0deg)}to{-webkit-transform:rotate(360deg)}}.docs-working-bar .spinner .icon{animation:script-working-bar-spin 1.5s infinite linear;-webkit-animation:script-working-bar-spin 1.5s infinite linear}.docs-material-colorpalette{outline:none}.docs-material-colorpalette-cell{border-radius:50%}.docs-material-colorpalette-colorswatch{border-radius:50%;box-sizing:border-box;cursor:pointer;height:20px;margin:1px 1px 0 0;width:20px}.docs-material-colorpalette-table{border-spacing:1px;padding:1px 0}.docs-material-colorpalette-cell.docs-material-colorpalette-cell-hover .docs-material-colorpalette-colorswatch{box-shadow:0 0 3px 1px #bdc1c6}.docs-material-colorpalette-colorswatch.docs-material-colorpalette-colorswatch-border{border:1px solid #dadce0}.docs-customcolorpalette-add-custom-color-button:hover{background-color:#e8eaed;border-radius:4px;cursor:pointer}.docs-material-colorpalette-cell.docs-material-colorpalette-cell-selected .docs-material-colorpalette-colorswatch{background:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNnB4IiBoZWlnaHQ9IjE2cHgiIHZpZXdCb3g9IjAgMCA0OCA0OCIgZmlsbD0iIzAwMDAwMCI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMSwgMCwgMCwgMSkiPjxwYXRoIGQ9Ik0wIDBoNDh2NDhIMHoiIGZpbGw9Im5vbmUiLz48cGF0aCBkPSJNMTggMzIuMzRMOS42NiAyNGwtMi44MyAyLjgzTDE4IDM4bDI0LTI0LTIuODMtMi44M3oiLz48L2c+PC9zdmc+);background-position:center;background-repeat:no-repeat}.docs-material-colorpalette-cell.docs-material-colorpalette-cell-selected .docs-material-colorpalette-colorswatch.docs-material-colorpalette-colorswatch-dark{background:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNnB4IiBoZWlnaHQ9IjE2cHgiIHZpZXdCb3g9IjAgMCA0OCA0OCIgZmlsbD0iI0ZGRkZGRiI+PHBhdGggZD0iTTAgMGg0OHY0OEgweiIgZmlsbD0ibm9uZSIvPjxwYXRoIGQ9Ik0xOCAzMi4zNEw5LjY2IDI0bC0yLjgzIDIuODNMMTggMzhsMjQtMjQtMi44My0yLjgzeiIvPjwvc3ZnPg==);background-position:center;background-repeat:no-repeat}.docs-hc-gecko .docs-material-colorpalette-colorswatch,.docs-hc-ie .docs-material-colorpalette-colorswatch{border:1px solid #dadce0}.docs-material-color-picker-dragger{border:2px solid white;border-radius:50%;box-shadow:0 0 3px 1px #bdc1c6;cursor:pointer;position:absolute;z-index:3}.docs-color-picker{color:#3c4043;outline:none;width:100%}.docs-color-picker-outer-box{border:1px solid #dadce0;border-radius:4px;box-sizing:border-box;cursor:pointer;padding:8px 6px 8px 8px;width:100%}.docs-color-picker .docs-color-picker-outer-box{width:auto}.docs-color-picker-hover .docs-color-picker-outer-box{background-color:rgba(60,64,67,0.04);border:1px solid #dadce0}.docs-color-picker-open .docs-color-picker-outer-box{background-color:rgba(60,64,67,0.04);border:1px solid transparent}.docs-material-gm-select-open.docs-material-gm-select-hover .docs-color-picker-outer-box{background-color:rgba(60,64,67,0.06)}.docs-material-gm-select-open.docs-material-gm-select-focused .docs-color-picker-outer-box{background-color:rgba(60,64,67,0.08)}.docs-color-picker-disabled{color:#5f6368;opacity:.38;cursor:default}.docs-color-picker-disabled .docs-color-picker-outer-box{border:1px solid #dadce0;box-shadow:none;cursor:default}.docs-color-picker-inner-box{align-items:center;display:flex;justify-content:space-between;position:relative;width:100%}.docs-color-picker-inner-box{align-items:center;display:flex;justify-content:space-between;position:relative;width:100%}.docs-color-picker-caption{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;color:#202124;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;height:20px;line-height:20px;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;height:22px;width:22px;border-radius:50%;border:1px solid #dadce0;margin:0;outline:none}.docs-color-picker-dropdown{align-items:center;display:flex;height:24px;justify-content:center;width:24px}.docs-color-picker-dropdown-icon{background:no-repeat url(//ssl.gstatic.com/docs/common/material_common_sprite222_grey_medium.svg) -40px -732px;height:18px;width:18px}.docs-color-picker-open .docs-color-picker-dropdown-icon{-moz-transform:rotate(180deg);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.docs-material-color-swatch-wrapper{border-radius:50%;display:inline-block;position:relative;vertical-align:middle}.docs-material-color-swatch-color{box-shadow:0 0 0 1px transparent}.docs-material-color-swatch-element{border-radius:50%;height:100%;position:absolute;width:100%}.docs-material-color-swatch-wrapper-hover{box-shadow:0 0 0 1px #c8e7d1}.docs-material-color-swatch-wrapper-focused{box-shadow:0 0 0 1px #bbe2c6;outline:none}.docs-material-color-swatch-border{box-shadow:0 0 0 1px #e8eaed}.docs-material-color-swatch-checkbox-background{background-image:url(https://ssl.gstatic.com/docs/common/checkboard.png);background-size:10px}.docs-hc-ie .docs-material-color-swatch-color,.docs-hc-gecko .docs-material-color-swatch-color{border:1px solid #dadce0}.docs-gm-labeled-color-picker{color:#3c4043;outline:none;width:100%}.docs-gm-labeled-color-picker-outer-box{border:1px solid #dadce0;border-radius:4px;box-sizing:border-box;cursor:pointer;padding:8px 6px 8px 8px;width:100%}.docs-gm-labeled-color-picker-focused .docs-gm-labeled-color-picker-outer-box{background-color:rgba(60,64,67,0.06);border:1px solid #dadce0}.docs-gm-labeled-color-picker .docs-gm-labeled-color-picker-outer-box{width:auto}.docs-gm-labeled-color-picker-hover .docs-gm-labeled-color-picker-outer-box{background-color:rgba(60,64,67,0.04);border:1px solid #dadce0}.docs-gm-labeled-color-picker-open .docs-gm-labeled-color-picker-outer-box{background-color:rgba(60,64,67,0.04);border:1px solid transparent}.docs-material-gm-select-open.docs-material-gm-select-hover .docs-gm-labeled-color-picker-outer-box{background-color:rgba(60,64,67,0.06)}.docs-material-gm-select-open.docs-material-gm-select-focused .docs-gm-labeled-color-picker-outer-box{background-color:rgba(60,64,67,0.08)}.docs-gm-labeled-color-picker-disabled{color:#5f6368;opacity:.38;cursor:default}.docs-gm-labeled-color-picker-disabled .docs-gm-labeled-color-picker-outer-box{border:1px solid #dadce0;box-shadow:none;cursor:default}.docs-gm-labeled-color-picker-inner-box{align-items:center;display:flex;justify-content:space-between;position:relative;width:100%}.docs-gm-labeled-color-picker-inner-box{align-items:center;display:flex;justify-content:space-between;position:relative;width:100%}.docs-gm-labeled-color-picker-caption{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;color:#202124;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;height:20px;line-height:20px;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;height:22px;width:22px;border-radius:50%;border:1px solid #dadce0;margin:0;outline:none}.docs-gm-labeled-color-picker-dropdown{align-items:center;display:flex;height:24px;justify-content:center;width:24px}.docs-gm-labeled-color-picker-dropdown-icon{background:no-repeat url(//ssl.gstatic.com/docs/common/material_common_sprite222_grey_medium.svg) -40px -732px;height:18px;width:18px}.docs-gm-labeled-color-picker-open .docs-gm-labeled-color-picker-dropdown-icon{-moz-transform:rotate(180deg);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.docs-gm-labeled-color-picker-label{color:#5f6368;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;margin-bottom:8px;display:inline-block}.docs-material-hsv-color-picker{padding-bottom:15px}.docs-material-hsv-color-picker-information{padding:0 0 15px 0;width:100%}.docs-material-hsv-color-picker-input{border:1px solid #dadce0;border-radius:4px;box-sizing:border-box;color:#3c4043;padding:1px 8px;font-size:14px;height:36px;margin:8px 0;width:90px}.docs-material-hsv-color-picker-input:focus{border:2px solid #1a73e8;box-shadow:none;padding:0px 7px}.docs-material-info-element{display:inline-block;margin-right:15px}.docs-material-hsv-color-picker-title{text-transform:uppercase}.docs-material-hsv-color-picker-text{color:#5f6368;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:11px;font-weight:500;padding:10px 0 0 0}.docs-material-hue-slider-background{background:linear-gradient(to right,hsl(0,100%,50%),hsl(60,100%,50%),hsl(120,100%,50%),hsl(180,100%,50%),hsl(240,100%,50%),hsl(300,100%,50%),hsl(360,100%,50%))}.docs-material-opacity-slider-checkbox-background{background-image:url(https://ssl.gstatic.com/docs/common/checkboard.png);background-size:10px}.docs-material-color-picker-saturation-value-background{border:1px solid white;box-sizing:border-box}.docs-material-color-picker-saturation-value{height:150px;outline:none;position:relative;width:100%}.docs-material-color-picker-overlay{border-radius:4px;height:100%;left:0;position:absolute;top:0px;width:100%}.docs-material-color-picker-saturation-overlay{background:linear-gradient(to right,#fff 0%,rgba(255,255,255,0) 100%);z-index:1}.docs-material-color-picker-value-overlay{background:linear-gradient(to bottom,transparent 0%,#000 100%);z-index:2}.docs-material-color-slider{box-sizing:border-box;outline:0;padding:8px 0;position:relative}.docs-material-color-slider-background{border-radius:4px;display:inline-block;height:10px;position:absolute;width:100%}.docs-material-color-slider-wrapper{position:relative;width:100%}.docs-material-color-slider-thumb{height:16px;pointer-events:inherit;top:-5px;width:16px}.docs-material-color-slider-track{left:0;position:absolute;top:0}.docs-material-color-slider-checkbox-background{background-image:url(https://ssl.gstatic.com/docs/common/checkboard.png);background-size:10px}.docs-material-slider{box-sizing:border-box;padding:8px;position:relative;outline:0}.docs-material-slider-horizontal{height:calc(30px + 2*8px);min-width:128px}.docs-material-slider-vertical{width:calc(30px + 2*8px);min-height:128px}.docs-material-slider-wrapper{position:absolute}.docs-material-slider-horizontal .docs-material-slider-wrapper{left:8px;height:2px;right:8px;top:23px}.docs-material-slider-vertical .docs-material-slider-wrapper{bottom:8px;left:23px;top:8px;width:2px}.docs-material-slider-thumb{pointer-events:inherit;position:absolute}.docs-material-slider-horizontal .docs-material-slider-thumb{top:50%;width:calc(2*8px)}.docs-material-slider-vertical .docs-material-slider-thumb{left:50%;height:calc(2*8px)}.docs-material-slider-focus-ring{background-color:rgba(66,133,244,0.38);border-radius:50%;left:calc(-0.5*30px);height:30px;opacity:0;pointer-events:inherit;position:absolute;top:calc(-0.5*30px);transform:scale(0);transition:transform .4s cubic-bezier(.25,.8,.25,1),opacity .4s cubic-bezier(.25,.8,.25,1);width:30px}.docs-material-slider-rtl .docs-material-slider-focus-ring{left:inherit;right:calc(-0.5*30px)}.docs-material-slider-thumb-grabber{background-color:#4285f4;border-color:#4285f4;border-radius:50%;border-style:solid;box-sizing:border-box;cursor:pointer;height:20px;position:absolute;transform:scale(0.7);transition:transform .4s cubic-bezier(.25,.8,.25,1);width:20px}.docs-material-slider-horizontal.docs-material-slider-ltr .docs-material-slider-thumb-grabber{bottom:calc(-0.5*20px);left:calc(-0.5*20px)}.docs-material-slider-horizontal.docs-material-slider-rtl .docs-material-slider-thumb-grabber{bottom:calc(-0.5*20px);right:calc(-0.5*20px)}.docs-material-slider-vertical .docs-material-slider-thumb-grabber{left:calc(-0.5*20px);top:calc(-0.5*20px)}.docs-material-slider-track-wrapper{left:0px;position:absolute;top:0px}.docs-material-slider-horizontal .docs-material-slider-track-wrapper{height:2px;width:100%}.docs-material-slider-vertical .docs-material-slider-track-wrapper{height:100%;width:2px}.docs-material-slider-track{position:absolute}.docs-material-slider-horizontal .docs-material-slider-track{height:2px}.docs-material-slider-vertical .docs-material-slider-track{width:2px}.docs-material-slider.docs-material-slider-horizontal.docs-hc-edge .docs-material-slider-track,.docs-material-slider.docs-material-slider-horizontal.docs-hc-ie .docs-material-slider-track,.docs-material-slider.docs-material-slider-horizontal.docs-hc-gecko .docs-material-slider-track{height:0;outline:solid 2px}.docs-material-slider.docs-material-slider-vertical.docs-hc-edge .docs-material-slider-track,.docs-material-slider.docs-material-slider-vertical.docs-hc-ie .docs-material-slider-track,.docs-material-slider.docs-material-slider-vertical.docs-hc-gecko .docs-material-slider-track{width:0;outline:solid 2px}.docs-material-slider-track-on{background-color:#4285f4}.docs-material-slider-track-off{background-color:#bdbdbd}.docs-material-slider.goog-slider-disabled .docs-material-slider-thumb-grabber,.docs-material-slider.goog-slider-disabled .docs-material-slider-track-on{background-color:#bdbdbd;border-color:#bdbdbd;cursor:default}.docs-material-slider:not(.docs-material-slider-mouse-focused):not(.goog-slider-disabled):focus .docs-material-slider-focus-ring{opacity:1;transform:scale(1)}.docs-material-slider.docs-material-slider-mouse-focused:not(.goog-slider-disabled) .docs-material-slider-thumb-grabber{transform:scale(1)}.docs-material-slider-ltr.docs-material-slider-horizontal .docs-material-slider-track-on,.docs-material-slider-rtl.docs-material-slider-horizontal .docs-material-slider-track-off{left:0px}.docs-material-slider-ltr.docs-material-slider-horizontal .docs-material-slider-track-off,.docs-material-slider-rtl.docs-material-slider-horizontal .docs-material-slider-track-on{right:0px}.docs-material-slider-vertical .docs-material-slider-track-on{bottom:0px}.docs-material-slider-vertical .docs-material-slider-track-off{top:0px}.docs-material-menu-button-flat-primary,.docs-material-menu-button-flat-default,.docs-material-menu-button-raised-primary,.docs-material-menu-button-raised-default{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border-radius:2px;border:1px solid transparent;cursor:pointer;display:inline-block;font:500 13px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;height:32px;line-height:30px;margin:0 4px;text-transform:uppercase;vertical-align:middle}.docs-material-menu-button-raised-primary,.docs-material-menu-button-raised-default{padding:0 6px 0 16px}.docs-material-menu-button-flat-primary,.docs-material-menu-button-flat-default{padding:0 0 0 8px}.docs-material-menu-button-flat-primary{color:#4285f4}.docs-material-menu-button-flat-primary-hover{background-color:rgba(66,133,244,.12)}.docs-material-menu-button-flat-primary-active{background-color:rgba(66,133,244,.32);color:#3387d6}.docs-material-menu-button-flat-primary-focused{border:1px solid #4285f4;outline:none}.docs-material-menu-button-flat-default{background-color:#fff;color:rgba(0,0,0,0.54)}.docs-material-menu-button-flat-default-hover{background-color:rgba(102,102,102,.2)}.docs-material-menu-button-flat-default-active{background-color:rgba(0,0,0,.2);color:rgba(0,0,0,0.87)}.docs-material-menu-button-flat-default-focused{border:1px solid #4285f4;outline:none}.docs-material-menu-button-raised-primary{background-color:#4285f4;color:#fff}.docs-material-menu-button-raised-primary-hover,.docs-material-menu-button-raised-default-hover{box-shadow:0px 2px 2px 0px rgba(0,0,0,0.14),0px 3px 1px -2px rgba(0,0,0,0.12),0px 1px 5px 0px rgba(0,0,0,0.2)}.docs-material-menu-button-raised-primary-active,.docs-material-menu-button-raised-default-active{box-shadow:0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12),0px 2px 4px -1px rgba(0,0,0,0.2)}.docs-material-menu-button-raised-primary-active{background-color:#3387d6}.docs-material-menu-button-raised-primary-focused{background-color:#4285f4;border:1px inset rgba(0,0,0,0.38);outline:none}.docs-material-menu-button-raised-default{background-color:rgba(0,0,0,.04);color:rgba(0,0,0,0.54)}.docs-material-menu-button-raised-default-active{background-color:rgba(0,0,0,0.12);color:rgba(0,0,0,0.87)}.docs-material-menu-button-raised-default-focused{border:1px solid #4285f4;color:rgba(0,0,0,0.54);outline:none}.docs-material-menu-button-flat-primary-disabled,.docs-material-menu-button-flat-default-disabled,.docs-material-menu-button-raised-default-disabled{background-color:#fff;color:rgba(0,0,0,0.26);cursor:auto}.docs-material-menu-button-raised-primary-disabled{background-color:rgba(0,0,0,0.12);color:#fff;cursor:auto}.docs-material-menu-button-flat-primary-disabled,.docs-material-menu-button-flat-default-disabled,.docs-material-menu-button-raised-default-disabled,.docs-material-menu-button-raised-primary-disabled{box-shadow:none}.docs-material-menu-button-flat-default-caption,.docs-material-menu-button-flat-primary-caption,.docs-material-menu-button-raised-default-caption,.docs-material-menu-button-raised-primary-caption{float:left;vertical-align:middle}.docs-material-menu-button-flat-default-dropdown,.docs-material-menu-button-flat-primary-dropdown{height:24px;margin:3px 0 3px 2px}.docs-material-menu-button-raised-default-dropdown,.docs-material-menu-button-raised-primary-dropdown{height:24px;margin:3px 0 3px 8px}.docs-material-menu-button-raised-primary-dropdown-icon{fill:#fff}.docs-material-menu-button-flat-default-dropdown-icon,.docs-material-menu-button-raised-default-dropdown-icon{fill:rgba(0,0,0,0.54)}.docs-material-menu-button-flat-primary-dropdown-icon{fill:#4285f4;opacity:0.54}.docs-material-menu-button-raised-default-disabled .docs-material-menu-button-raised-default-dropdown-icon,.docs-material-menu-button-flat-default-disabled .docs-material-menu-button-flat-default-dropdown-icon,.docs-material-menu-button-flat-primary-disabled .docs-material-menu-button-flat-primary-dropdown-icon{fill:rgba(0,0,0,0.26);opacity:1.0}.addon-sidebar-card{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;border-bottom:1px solid rgba(0,0,0,.12);outline:none;padding:14px 16px 8px 16px}.addon-sidebar-card-header{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;padding-bottom:8px}.addon-sidebar-card-header-content{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;width:100%}.addon-sidebar-card-icon{height:24px;padding-right:16px;padding-top:2px;width:24px}.addon-sidebar-card-icon img{height:24px;width:24px}.addon-sidebar-card-title{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;width:100%}.addon-sidebar-card-title-caption.goog-control-focused{outline:none;text-decoration:underline}.addon-sidebar-card-title-caption.goog-control-hover{text-decoration:underline}.addon-sidebar-card-title-caption{color:rgba(0,0,0,0.87);cursor:pointer;font-size:15px;font-weight:500;line-height:20px;margin-right:9px;max-height:38px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.addon-sidebar-card-two-line-title-caption{display:-webkit-box;visibility:visible;-webkit-line-clamp:2;-webkit-box-orient:vertical;white-space:normal;word-break:break-word;word-wrap:break-word}.addon-sidebar-card-check{color:#455a64;height:18px;margin:1px 0 0 auto;width:18px}.addon-sidebar-card-category{color:rgba(0,0,0,0.54);font-size:13px;font-weight:400;line-height:20px}.addon-sidebar-card-summary{color:rgba(0,0,0,0.54);font-size:13px;font-weight:400;line-height:20px;overflow:hidden;padding:0 0 8px 40px;text-overflow:ellipsis}.addon-sidebar-with-banner .addon-sidebar-card{border-bottom:none;padding-top:16px}.addon-sidebar-with-banner .addon-sidebar-card-header{padding-bottom:16px}.addon-sidebar-with-banner .addon-sidebar-card-title-caption{max-width:194px}.addon-sidebar-with-banner .addon-sidebar-card-icon{height:40px;padding-top:0px;width:40px}.addon-sidebar-with-banner .addon-sidebar-card-icon img{height:40px;width:40px}.addon-sidebar-with-banner .addon-sidebar-card-title{font-size:16px}.addon-sidebar-with-banner .addon-sidebar-card-summary{font-size:14px;padding:0 0 24px 0}.addon-sidebar-card-button.docs-material-button-flat-primary,.addon-sidebar-card-menu-button.docs-material-menu-button-flat-primary{margin-left:32px}.addon-sidebar-card-button.docs-material-button-raised-primary,.addon-sidebar-card-menu-button.docs-material-menu-button-raised-primary{margin-left:0px}.addon-sidebar-card-button.docs-material-button-flat-primary,.addon-sidebar-card-button.docs-material-button-raised-primary{height:32px;line-height:32px}.addon-sidebar-card-button.docs-material-button-flat-primary{padding:0 8px}.addon-sidebar-card-menu-button.docs-material-menu-button-flat-primary,.addon-sidebar-card-menu-button.docs-material-menu-button-raised-primary{height:32px;line-height:32px}.addon-sidebar-card-menu-button.docs-material-menu-button-flat-primary{padding:0 2px 0 8px}.addon-sidebar-card-menu-button .docs-material-menu-button-flat-primary-caption,.addon-sidebar-card-menu-button .docs-material-menu-button-raised-primary-caption{line-height:32px}.addon-sidebar-card-menu-button .docs-material-menu-button-flat-primary-dropdown,.addon-sidebar-card-menu-button .docs-material-menu-button-raised-primary-dropdown{margin-top:3px}.goog-menuitem.addon-sidebar-menu-item-with-flat,.goog-menuitem.addon-sidebar-menu-item-with-raised{padding-right:30px}.addon-sidebar-menu-item-with-flat .goog-menuitem-content{max-width:174px;overflow:hidden;text-overflow:ellipsis}.addon-sidebar-menu-item-with-raised .goog-menuitem-content{max-width:206px;overflow:hidden;text-overflow:ellipsis}.addon-sidebar{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;background:#fff;border-left:1px solid #d9d9d9;color:#222;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;outline:none;position:absolute;right:0;width:300px}.addon-sidebar-header{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;background:#616161;color:#fff;font-size:15px;font-weight:500;padding:10px 16px 9px 16px;position:relative}.addon-sidebar-close{cursor:pointer;height:21px;position:absolute;right:13px;top:7px;width:21px}.addon-sidebar-content{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;height:100%;width:300px;overflow-y:overlay}.addon-sidebar-introduction{border-bottom:1px solid rgba(0,0,0,.12);color:rgba(0,0,0,.54);font-size:11px;font-weight:500;line-height:15px;padding:10px 16px 10px 16px}.addon-sidebar-banner{display:inline-grid;position:relative}.addon-sidebar-banner-image{display:block;height:auto;width:300px}.addon-sidebar-banner-image-overlay{background-image:linear-gradient(-180deg,rgba(0,0,0,0.00) 0%,rgba(0,0,0,0.01) 30%,rgba(0,0,0,0.03) 50%,rgba(0,0,0,0.06) 70%,rgba(0,0,0,0.09) 90%,rgba(0,0,0,0.11) 96%,rgba(0,0,0,0.13) 100%);bottom:0;position:absolute;width:300px;height:80px}.addon-sidebar-spinner{position:fixed;top:50%;width:300px}.addon-sidebar-empty-caption{position:fixed;text-align:center;top:50%;width:300px}.addon-sidebar-empty-title{color:rgba(0,0,0,0.87);font-size:15px;font-weight:700;line-height:18px;padding-bottom:8px}.addon-sidebar-empty-description{color:rgba(0,0,0,0.50);font-size:13px;font-weight:500;line-height:18px}.script-application-sidebar{background:#fff;border-left:1px solid #d9d9d9;color:#222;position:absolute;right:0;width:300px}.script-application-sidebar-header{background:#616161;border:1px solid #616161;color:#fff;font-size:13px;font-weight:bold;height:15px;padding:10px 0 10px 12px;position:relative}.script-application-sidebar-close{cursor:pointer;position:absolute;right:6px;top:8px}.script-application-sidebar-content{bottom:0;position:absolute;top:37px;width:100%}#docs-script-button-bar .jfk-button{margin-right:9px}.docs-script-button-bar-text{color:#777;display:inline-block;margin-left:10px;margin-right:20px;max-width:55px;outline:none;overflow:hidden;text-overflow:ellipsis;vertical-align:text-bottom;white-space:nowrap}.docs-script-button-bar-text:hover{cursor:pointer;text-decoration:underline}.docs-script-button-bar-bubble{width:175px}.docs-script-button-bar-bubble-content{text-align:left;white-space:normal}.script-errorfield{border-color:#dd4b39!important}.script-errormsg{color:#dd4b39!important}.script-promo-menu-item{border:0px;min-height:90px;max-width:354px;padding:0px!important}.script-promo-menu-item-content{vertical-align:middle;padding:10px 20px}.script-promo-menu-item-description{color:#4a4a4a;font-size:13px}.script-promo-menu-item-icon{display:inline-block;height:75px;vertical-align:middle;width:75px}.script-promo-menu-item-text{display:inline-block;max-width:170px;padding-left:10px;vertical-align:middle;white-space:pre-line}.script-promo-menu-item-title{color:#222222;font-weight:bold;font-size:18px}.func-entry{border-top:1px solid #ffffff;border-left:1px solid #ffffff;border-right:1px solid #ffffff;border-bottom:1px solid #e5e5e5;cursor:default;outline:none}.func-entry:focus{border:1px solid #4d90fe!important}.func-entry-checked{border-top:1px solid #ffc;border-left:1px solid #ffc;border-right:1px solid #ffc;border-bottom:1px solid #e5e5e5;background-color:#ffc}.func-entry-func,.func-entry-lib{width:305px;margin-left:5px;padding-top:4px;padding-bottom:4px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.func-entry-rb{float:left;padding-left:8px;width:18px;height:26px}.func-entry-rb{background-image:url(//ssl.gstatic.com/ui/v1/radiobutton/unchecked.png);background-position:center center;background-repeat:no-repeat}.func-entry-checked .func-entry-rb{background-image:url(//ssl.gstatic.com/ui/v1/radiobutton/checked.png)}.modal-dialog.docs-dialog.gsm-widget{border:0;border-radius:0;box-shadow:none;padding:0}.modal-dialog.docs-dialog.gsm-widget .modal-dialog-title{display:none;height:0;margin:0}.gsm-widget .modal-dialog-buttons{display:none}.gsm-widget .modal-dialog-content{background-color:transparent}.script-help-dialog{min-width:392px}.script-help-dialog-content-left{border:1px solid #e5e5e5;height:160px;overflow-y:auto;vertical-align:top;width:254px}.script-help-dialog-content-section{padding:16px}.script-help-dialog-content-left-gsm-onhold{background-color:#fad2cf}.script-help-dialog-content-title{display:flex;font-weight:700;padding-bottom:8px}.script-help-dialog-content-title-caution-icon{padding-right:4px}.script-help-dialog-buttons{min-width:102px;max-width:200px;padding-left:16px;vertical-align:top}.script-help-dialog-buttons .jfk-button{display:block;margin-right:0px;margin-bottom:16px;padding:0px 8px 0px 8px;width:100%}.script-manager-box{border:none;height:450px;width:700px}.script-prompt-contents DIV{min-width:300px;max-width:700px;max-height:350px;overflow:auto}.script-prompt-contents INPUT{width:100%}.script-app-dialog{z-index:1003}.script-app-contents{padding:0px}.script-error-message{display:inline-block;overflow:hidden;text-overflow:ellipsis;vertical-align:text-bottom;white-space:nowrap}.script-error-dialog-content{max-height:400px;max-width:600px;overflow:auto}.script-reportissue-dialog-content{width:456px}.script-reportissue-dialog-description{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;font-family:arial,sans-serif;height:100px;resize:none;vertical-align:top;width:100%}.script-reportissue-dialog-nonanonymous-control{vertical-align:top;width:20px}.script-reportissue-dialog-nonanonymous-label{vertical-align:top;width:436px}.script-reportissue-dialog-nonanonymous-optional-text{color:#777}.script-explorer-contents{height:350px;width:700px;overflow:hidden}.func-header{width:100%;border-top:1px solid #e5e5e5;color:#555;cursor:default;font-weight:bold;text-transform:uppercase}.func-actions{margin-bottom:14px}#func-action-new{margin-right:22px!important}#func-action-reload{position:absolute;right:26px;width:45px}#func-action-reload .docs-icon{opacity:0.7}.func-header-func,.func-header-lib{width:307px;margin-left:5px;padding-top:4px;padding-bottom:4px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.func-header-rb{width:26px}.func-entries{max-height:272px;border-top:1px solid #e5e5e5;overflow-x:hidden;overflow-y:auto}.func-entries:focus{outline:none}.func-none,.func-loading{width:640px;cursor:default;padding-top:4px;padding-bottom:4px}.func-none{margin-left:30px}.func-loading{background:transparent url(//ssl.gstatic.com/docs/script/images/spin-wait.gif) no-repeat 0 4px;padding-left:20px;margin-left:12px}.webstore-widget{padding:0}.webstore-widget .modal-dialog-title{border-bottom:1px solid #acacac;margin:0;padding:16px 12px}.encrypted-create-dialog.modal-dialog{height:242px;width:390px}.encrypted-create-dialog.modal-dialog:focus{outline:0}.encrypted-create-dialog .modal-dialog-content{font-size:14px;height:100px;letter-spacing:0.2px;line-height:20px;width:392px}.encrypted-create-dialog .modal-dialog-title-close{visibility:hidden}.drive-encrypted-create-dialog-bg.modal-dialog-bg{opacity:0.5!important}.encrypted-create-dialog .modal-dialog-buttons{bottom:24px;position:absolute;right:24px}.encrypted-create-dialog .docsshared-cb-wrapper{font-size:14px;line-height:20px;letter-spacing:0.2px;margin-top:15px}.encrypted-create-dialog .docs-encrypted-create-dialog-cb .jfk-checkbox{padding:2px}.encrypted-create-dialog .docs-encrypted-create-dialog-cb .jfk-checkbox-checkmark{left:-1px;top:-1px}.encrypted-create-dialog .docs-encrypted-create-dialog-cb .docsshared-cb-label{padding-left:8px}.encrypted-create-dialog .drive-encrypted-create-dialog-cb .jfk-checkbox-checkmark{top:1px}.encrypted-create-dialog .drive-encrypted-create-dialog-cb .jfk-checkbox{height:19px;width:19px}.active-account-dialog-email{font-weight:500;word-break:break-all}.active-account-dialog .modal-dialog-content{display:flex}.active-account-dialog-display-name{font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;line-height:12px;padding:8px;display:flex;align-items:center}.active-account-dialog-avatar{background-color:#9aa0a6;border-radius:50%;object-fit:cover;height:32px;width:32px}.active-account-dialog .modal-dialog-buttons{margin-top:32px}.modal-dialog.active-account-dialog{display:table;max-width:464px;table-layout:fixed}.goog-checkbox{border:1px solid #1c5180;display:-moz-inline-box;display:inline-block;font-size:1px;height:11px;margin:0 4px 0 1px;vertical-align:text-bottom;width:11px}.goog-checkbox-checked{background:#fff url(//ssl.gstatic.com/closure/check-sprite.gif) no-repeat 2px center}.goog-checkbox-undetermined{background:#bbb url(//ssl.gstatic.com/closure/check-sprite.gif) no-repeat 2px center}.goog-checkbox-unchecked{background:#fff}.goog-checkbox-disabled{border:1px solid lightgray;background-position:-7px}.jfk-checkbox{-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;background-color:rgba(255,255,255,.05);border:1px solid #c6c6c6;border:1px solid rgba(155,155,155,.57);font-size:1px;height:11px;margin:0px 4px 0px 1px;outline:0;vertical-align:text-bottom;width:11px}.jfk-checkbox-undetermined{background-color:#fff;background-color:rgba(255,255,255,.65)}.jfk-checkbox-checked{background-color:#fff;background-color:rgba(255,255,255,.65)}.jfk-checkbox-hover{-webkit-box-shadow:inset 0px 1px 1px rgba(0,0,0,.1);-moz-box-shadow:inset 0px 1px 1px rgba(0,0,0,.1);box-shadow:inset 0px 1px 1px rgba(0,0,0,.1);border:1px solid #b2b2b2}.jfk-checkbox-active{background-color:#ebebeb}.jfk-checkbox-focused{border:1px solid #4d90fe}.jfk-checkbox-clearOutline.jfk-checkbox-focused{border:1px solid #c6c6c6;border:1px solid rgba(155,155,155,.57)}.jfk-checkbox-disabled,.jfk-checkbox-clearOutline.jfk-checkbox-disabled{background-color:#fff;border:1px solid #f1f1f1;cursor:default}.jfk-checkbox-checkmark{height:15px;outline:0;width:15px;left:0;position:relative;top:-3px}.jfk-checkbox-undetermined .jfk-checkbox-checkmark{background:url(//ssl.gstatic.com/ui/v1/menu/checkmark-partial.png) no-repeat -5px -3px;background-image:-webkit-image-set(url(//ssl.gstatic.com/ui/v1/menu/checkmark-partial.png) 1x,url(//ssl.gstatic.com/ui/v1/menu/checkmark-partial_2x.png) 2x)}.jfk-checkbox-checked .jfk-checkbox-checkmark{background:url(//ssl.gstatic.com/ui/v1/menu/checkmark.png) no-repeat -5px -3px;background-image:-webkit-image-set(url(//ssl.gstatic.com/ui/v1/menu/checkmark.png) 1x,url(//ssl.gstatic.com/ui/v1/menu/checkmark_2x.png) 2x)}.jfk-colormenu.goog-menu{padding:0}.jfk-palette{cursor:default;outline:none}.jfk-palette-table{empty-cells:show;margin:16px}.jfk-palette-cell{border:1px solid transparent;cursor:pointer;margin:0;position:relative}.jfk-palette-cell-hover{border:1px solid #000}.jfk-palette-cell-selected{outline:1px solid #000}.jfk-palette-colorswatch{height:16px;width:16px}.jfk-palette-cell-selected>.jfk-palette-colorswatch{background:url(//ssl.gstatic.com/ui/v1/colorpicker/checkmark.png) no-repeat 50% 50%}.jfk-colorwell{border:1px solid #d9d9d9}.jfk-butterBar{-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;-webkit-box-shadow:0px 2px 4px rgba(0,0,0,0.2);-moz-box-shadow:0px 2px 4px rgba(0,0,0,0.2);box-shadow:0px 2px 4px rgba(0,0,0,0.2);-webkit-transition:all 0s linear 1s,opacity 1s;-moz-transition:all 0s linear 1s,opacity 1s;-o-transition:all 0s linear 1s,opacity 1s;transition:all 0s linear 1s,opacity 1s;border-style:solid;border-width:0;font-size:11px;height:0;opacity:0;visibility:hidden;overflow:hidden;padding:0;text-align:center}.jfk-butterBar-info{background-color:#f9edbe;border-color:#f0c36d;color:#333}.jfk-butterBar-error{background-color:#484848;border-color:#202020;color:#fff}.jfk-butterBar-promo{background-color:#d6e9f8;border-color:#4d90f0;color:#333}.jfk-butterBar-warning{background-color:#dd4b39;border-color:#602019;color:#fff}.jfk-butterBar-shown{-webkit-transition:opacity 0.218s;-moz-transition:opacity 0.218s;-o-transition:opacity 0.218s;transition:opacity 0.218s;border-width:1px;min-height:14px;height:auto;opacity:1;visibility:visible;padding:6px 16px}.jfk-butterBar-mini.jfk-butterBar-shown{padding:2px 16px}.goog-link-button{position:relative;color:#15c;text-decoration:underline;cursor:pointer}.goog-link-button-disabled{color:#ccc;text-decoration:none;cursor:default}.goog-toolbar{background:#f5f5f5;border-top:1px solid #e5e5e5;border-bottom:1px solid #ebebeb;outline:0;padding:8px 0 4px 0;position:relative;zoom:1}.jfk-freestanding-menu-button{-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;background:url(//ssl.gstatic.com/ui/v1/disclosure/light-grey-disclosure-arrow-down.png) center no-repeat;border:1px solid #e5e5e5;height:11px;width:11px;cursor:pointer}.jfk-freestanding-menu-button-hover,.jfk-freestanding-menu-button-active,.jfk-freestanding-menu-button-open{background:url(//ssl.gstatic.com/ui/v1/disclosure/dark-grey-disclosure-arrow-down.png) center no-repeat #eee;border-color:#c6c6c6}.jfk-select .goog-flat-menu-button-caption{overflow:hidden;width:100%}.jfk-select .goog-flat-menu-button-dropdown{background:url(//ssl.gstatic.com/ui/v1/disclosure/grey-disclosure-arrow-up-down.png) center no-repeat;border:none;height:11px;margin-top:-4px;width:7px}.jfk-progressStatus{color:#202020}.jfk-progressText{color:#999}.jfk-progressStatus,.jfk-progressText{line-height:18px}.jfk-progressBar-blocking .progress-bar-horizontal,.jfk-progressBar-nonBlocking .progress-bar-horizontal{border:1px solid #999;padding:1px;width:320px}.jfk-progressBar-blocking .progress-bar-thumb{background-color:#6188f5;height:5px}.jfk-progressBar-nonBlocking .progress-bar-thumb{background-color:#ccc;height:5px}.jfk-progressBar-blocking.jfk-progressBar-tall .progress-bar-thumb,.jfk-progressBar-nonBlocking.jfk-progressBar-tall .progress-bar-thumb{height:8px}.jfk-progressBar-blocking .progress-bar-thumb{-webkit-animation:jfk-progressBar-bg 0.8s linear 0s infinite;-moz-animation:jfk-progressBar-bg 0.8s linear 0s infinite;-o-animation:jfk-progressBar-bg 0.8s linear 0s infinite;animation:jfk-progressBar-bg 0.8s linear 0s infinite;background-position:0 0;background-repeat:repeat-x;background-size:16px 8px;background-color:#6188f5;background-image:-webkit-linear-gradient(315deg,transparent,transparent 33%,rgba(0,0,0,.12) 33%,rgba(0,0,0,.12) 66%,transparent 66%,transparent);background-image:-moz-linear-gradient(315deg,transparent,transparent 33%,rgba(0,0,0,.12) 33%,rgba(0,0,0,.12) 66%,transparent 66%,transparent);background-image:-ms-linear-gradient(315deg,transparent,transparent 33%,rgba(0,0,0,.12) 33%,rgba(0,0,0,.12) 66%,transparent 66%,transparent);background-image:-o-linear-gradient(315deg,transparent,transparent 33%,rgba(0,0,0,.12) 33%,rgba(0,0,0,.12) 66%,transparent 66%,transparent);background-image:linear-gradient(315deg,transparent,transparent 33%,rgba(0,0,0,.12) 33%,rgba(0,0,0,.12) 66%,transparent 66%,transparent)}.jfk-progressBar-blocking.jfk-progressBar-tall .progress-bar-thumb{-webkit-animation:jfk-progressBar-bg-tall 0.8s linear 0s infinite;-moz-animation:jfk-progressBar-bg-tall 0.8s linear 0s infinite;-o-animation:jfk-progressBar-bg-tall 0.8s linear 0s infinite;animation:jfk-progressBar-bg-tall 0.8s linear 0s infinite;background-size:20px 10px}@-webkit-keyframes jfk-progressBar-bg{0%{background-position:0 0}100%{background-position:-16px 0}}@-moz-keyframes jfk-progressBar-bg{0%{background-position:0 0}100%{background-position:-16px 0}}@-o-keyframes jfk-progressBar-bg{0%{background-position:0 0}100%{background-position:-16px 0}}@keyframes jfk-progressBar-bg{0%{background-position:0 0}100%{background-position:-16px 0}}@-webkit-keyframes jfk-progressBar-bg-tall{0%{background-position:0 0}100%{background-position:-20px 0}}@-moz-keyframes jfk-progressBar-bg-tall{0%{background-position:0 0}100%{background-position:-20px 0}}@-o-keyframes jfk-progressBar-bg-tall{0%{background-position:0 0}100%{background-position:-20px 0}}@keyframes jfk-progressBar-bg-tall{0%{background-position:0 0}100%{background-position:-20px 0}}.jfk-progressbar .progress-bar-horizontal,.jfk-progressbar .progress-bar-vertical{border-color:#999}.jfk-progressbar .progress-bar-thumb{background-color:#ccc}.jfk-radiobutton{display:inline-block;outline:none;padding:5px 7px;position:relative}.jfk-radiobutton-radio{-webkit-border-radius:50%;-moz-border-radius:50%;border-radius:50%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:url(//ssl.gstatic.com/ui/v1/radiobutton/unchecked.png) -3px -3px;background:rgba(255,255,255,0);border:1px solid rgba(198,198,198,1);height:15px;left:7px;margin:0;outline:none;position:absolute;text-align:left;top:6px;width:15px}.jfk-radiobutton:active .jfk-radiobutton-radio{background:rgba(235,235,235,1);border-color:rgba(182,182,182,1)}.jfk-radiobutton:hover .jfk-radiobutton-radio{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.1);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.1);box-shadow:inset 0 1px 1px rgba(0,0,0,.1);border-color:rgba(182,182,182,1)}.jfk-radiobutton:focus .jfk-radiobutton-radio{border-color:rgba(77,144,254,1)}.jfk-radiobutton-checked .jfk-radiobutton-radio{background:url(//ssl.gstatic.com/ui/v1/radiobutton/checked.png) -3px -3px;background:rgba(255,255,255,0)}.jfk-radiobutton.jfk-radiobutton:focus .jfk-radiobutton-radio{background:url(//ssl.gstatic.com/ui/v1/radiobutton/unchecked_focused.png) -3px -3px;background:rgba(255,255,255,0)}.jfk-radiobutton-checked.jfk-radiobutton:focus .jfk-radiobutton-radio{background:url(//ssl.gstatic.com/ui/v1/radiobutton/checked_focused.png) -3px -3px;background:rgba(255,255,255,0)}.jfk-radiobutton-checked .jfk-radiobutton-radio::after{-webkit-border-radius:50%;-moz-border-radius:50%;border-radius:50%;background:rgba(96,96,96,1);border:2px solid #606060;box-sizing:border-box;content:'';display:block;height:7px;left:3px;position:relative;top:3px;width:7px}.jfk-radiobutton .jfk-radiobutton-label{display:block;cursor:default;margin-left:22px}.jfk-radiobutton-disabled .jfk-radiobutton-radio{background:url(//ssl.gstatic.com/ui/v1/radiobutton/unchecked-disabled.png) -3px -3px;background:rgba(255,255,255,0);border-color:rgba(241,241,241,1)}.jfk-radiobutton-disabled.jfk-radiobutton-checked .jfk-radiobutton-radio{background:url(//ssl.gstatic.com/ui/v1/radiobutton/checked-disabled.png) -3px -3px;background:rgba(255,255,255,0)}.jfk-radiobutton-disabled.jfk-radiobutton-checked .jfk-radiobutton-radio::after{background:rgba(184,184,184,1)}.jfk-radiobutton-disabled .jfk-radiobutton-label{color:rgb(184,184,184)}.jfk-radiobutton-disabled:active .jfk-radiobutton-radio,.jfk-radiobutton-disabled:hover .jfk-radiobutton-radio{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;background:rgba(255,255,255,1);border-color:rgba(241,241,241,1)}::-webkit-scrollbar{height:16px;overflow:visible;width:16px}::-webkit-scrollbar-button{height:0;width:0}::-webkit-scrollbar-track{background-clip:padding-box;border:solid transparent;border-width:0 0 0 4px}::-webkit-scrollbar-track:horizontal{border-width:4px 0 0}::-webkit-scrollbar-track:hover{background-color:rgba(0,0,0,.05);box-shadow:inset 1px 0 0 rgba(0,0,0,.1)}::-webkit-scrollbar-track:horizontal:hover{box-shadow:inset 0 1px 0 rgba(0,0,0,.1)}::-webkit-scrollbar-track:active{background-color:rgba(0,0,0,.05);box-shadow:inset 1px 0 0 rgba(0,0,0,.14),inset -1px 0 0 rgba(0,0,0,.07)}::-webkit-scrollbar-track:horizontal:active{box-shadow:inset 0 1px 0 rgba(0,0,0,.14),inset 0 -1px 0 rgba(0,0,0,.07)}.jfk-scrollbar-dark::-webkit-scrollbar-track:hover{background-color:rgba(255,255,255,.1);box-shadow:inset 1px 0 0 rgba(255,255,255,.2)}.jfk-scrollbar-dark::-webkit-scrollbar-track:horizontal:hover{box-shadow:inset 0 1px 0 rgba(255,255,255,.2)}.jfk-scrollbar-dark::-webkit-scrollbar-track:active{background-color:rgba(255,255,255,.1);box-shadow:inset 1px 0 0 rgba(255,255,255,.25),inset -1px 0 0 rgba(255,255,255,.15)}.jfk-scrollbar-dark::-webkit-scrollbar-track:horizontal:active{box-shadow:inset 0 1px 0 rgba(255,255,255,.25),inset 0 -1px 0 rgba(255,255,255,.15)}::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.2);background-clip:padding-box;border:solid transparent;border-width:1px 1px 1px 6px;min-height:28px;padding:100px 0 0;box-shadow:inset 1px 1px 0 rgba(0,0,0,.1),inset 0 -1px 0 rgba(0,0,0,.07)}::-webkit-scrollbar-thumb:horizontal{border-width:6px 1px 1px;padding:0 0 0 100px;box-shadow:inset 1px 1px 0 rgba(0,0,0,.1),inset -1px 0 0 rgba(0,0,0,.07)}::-webkit-scrollbar-thumb:hover{background-color:rgba(0,0,0,.4);box-shadow:inset 1px 1px 1px rgba(0,0,0,.25)}::-webkit-scrollbar-thumb:active{background-color:rgba(0,0,0,0.5);box-shadow:inset 1px 1px 3px rgba(0,0,0,0.35)}.jfk-scrollbar-dark::-webkit-scrollbar-thumb{background-color:rgba(255,255,255,.3);box-shadow:inset 1px 1px 0 rgba(255,255,255,.15),inset 0 -1px 0 rgba(255,255,255,.1)}.jfk-scrollbar-dark::-webkit-scrollbar-thumb:horizontal{box-shadow:inset 1px 1px 0 rgba(255,255,255,.15),inset -1px 0 0 rgba(255,255,255,.1)}.jfk-scrollbar-dark::-webkit-scrollbar-thumb:hover{background-color:rgba(255,255,255,.6);box-shadow:inset 1px 1px 1px rgba(255,255,255,.37)}.jfk-scrollbar-dark::-webkit-scrollbar-thumb:active{background-color:rgba(255,255,255,.75);box-shadow:inset 1px 1px 3px rgba(255,255,255,.5)}.jfk-scrollbar-borderless::-webkit-scrollbar-track{border-width:0 1px 0 6px}.jfk-scrollbar-borderless::-webkit-scrollbar-track:horizontal{border-width:6px 0 1px}.jfk-scrollbar-borderless::-webkit-scrollbar-track:hover{background-color:rgba(0,0,0,.035);box-shadow:inset 1px 1px 0 rgba(0,0,0,.14),inset -1px -1px 0 rgba(0,0,0,.07)}.jfk-scrollbar-borderless.jfk-scrollbar-dark::-webkit-scrollbar-track:hover{background-color:rgba(255,255,255,.07);box-shadow:inset 1px 1px 0 rgba(255,255,255,.25),inset -1px -1px 0 rgba(255,255,255,.15)}.jfk-scrollbar-borderless::-webkit-scrollbar-thumb{border-width:0 1px 0 6px}.jfk-scrollbar-borderless::-webkit-scrollbar-thumb:horizontal{border-width:6px 0 1px}::-webkit-scrollbar-corner{background:transparent}body::-webkit-scrollbar-track-piece{background-clip:padding-box;background-color:#f5f5f5;border:solid #fff;border-width:0 0 0 3px;box-shadow:inset 1px 0 0 rgba(0,0,0,.14),inset -1px 0 0 rgba(0,0,0,.07)}body::-webkit-scrollbar-track-piece:horizontal{border-width:3px 0 0;box-shadow:inset 0 1px 0 rgba(0,0,0,.14),inset 0 -1px 0 rgba(0,0,0,.07)}body::-webkit-scrollbar-thumb{border-width:1px 1px 1px 5px}body::-webkit-scrollbar-thumb:horizontal{border-width:5px 1px 1px}body::-webkit-scrollbar-corner{background-clip:padding-box;background-color:#f5f5f5;border:solid #fff;border-width:3px 0 0 3px;box-shadow:inset 1px 1px 0 rgba(0,0,0,.14)}.goog-slider{position:relative;outline:0}.goog-slider-horizontal{height:18px}.goog-slider-vertical{width:18px}.goog-slider-thumb{background-color:#f5f5f5;background-image:-webkit-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:-moz-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:-ms-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:-o-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:linear-gradient(top,#f5f5f5,#f1f1f1);-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;-webkit-transition:background-color 0.218s,border-color 0.218s,background-image 0.218s;-moz-transition:background-color 0.218s,border-color 0.218s,background-image 0.218s;-o-transition:background-color 0.218s,border-color 0.218s,background-image 0.218s;transition:background-color 0.218s,border-color 0.218s,background-image 0.218s;border:1px solid #dcdcdc;height:16px;position:absolute;width:16px}.goog-slider-thumb:hover{background-color:#f8f8f8;background-image:-webkit-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-moz-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-ms-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-o-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:linear-gradient(top,#f8f8f8,#f1f1f1);border-color:#c6c6c6}.goog-slider-scale{position:absolute}.goog-slider-horizontal .goog-slider-scale{border-top:1px solid #ccc;top:8px;width:100%}.goog-slider-vertical .goog-slider-scale{border-left:1px solid #ccc;height:100%;left:8px}.jfk-twothumbslider{position:relative;outline:0}.goog-twothumbslider-horizontal{height:18px}.goog-twothumbslider-vertical{width:18px}.goog-twothumbslider-horizontal .goog-twothumbslider-value-thumb,.goog-twothumbslider-horizontal .goog-twothumbslider-extent-thumb{position:absolute;height:0;width:16px}.goog-twothumbslider-vertical .goog-twothumbslider-value-thumb,.goog-twothumbslider-vertical .goog-twothumbslider-extent-thumb{position:absolute;height:16px;width:0}.jfk-slider-thumbimpl{background-color:#999;border:1px solid #999;-webkit-transition:background-color 0.218s,border-color 0.218s,background-image 0.218s;-moz-transition:background-color 0.218s,border-color 0.218s,background-image 0.218s;-o-transition:background-color 0.218s,border-color 0.218s,background-image 0.218s;transition:background-color 0.218s,border-color 0.218s,background-image 0.218s}.jfk-twothumbslider:hover .jfk-slider-thumbimpl,.jfk-twothumbslider.goog-slider-dragging .jfk-slider-thumbimpl{background-color:#fff}.jfk-twothumbslider.goog-slider-dragging .goog-slider-thumb-dragging .jfk-slider-thumbimpl{background-color:#535252;border-color:#535252}.goog-twothumbslider-horizontal .jfk-slider-thumbimpl{height:16px;width:8px}.goog-twothumbslider-horizontal .goog-twothumbslider-value-thumb .jfk-slider-thumbimpl{-webkit-border-radius:8px 0 0 8px;-moz-border-radius:8px 0 0 8px;border-radius:8px 0 0 8px}.goog-twothumbslider-horizontal .goog-twothumbslider-extent-thumb .jfk-slider-thumbimpl{-webkit-border-radius:0 8px 8px 0;-moz-border-radius:0 8px 8px 0;border-radius:0 8px 8px 0;margin-left:8px}.goog-twothumbslider-vertical .jfk-slider-thumbimpl{height:8px;width:16px}.goog-twothumbslider-vertical .goog-twothumbslider-value-thumb .jfk-slider-thumbimpl{margin-top:8px;-webkit-border-radius:0 0 8px 8px;-moz-border-radius:0 0 8px 8px;border-radius:0 0 8px 8px}.goog-twothumbslider-vertical .goog-twothumbslider-extent-thumb .jfk-slider-thumbimpl{-webkit-border-radius:8px 8px 0 0;-moz-border-radius:8px 8px 0 0;border-radius:8px 8px 0 0}.jfk-slider-scale{background-color:#e5e5e5;position:absolute;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.goog-twothumbslider-horizontal .jfk-slider-scale{height:6px;top:6px;width:100%}.goog-twothumbslider-vertical .jfk-slider-scale{height:100%;left:6px;width:6px}.goog-twothumbslider-rangehighlight{background-color:#c6c6c6;position:absolute;-webkit-transition:background-color 0.218s,border-color 0.218s,background-image 0.218s;-moz-transition:background-color 0.218s,border-color 0.218s,background-image 0.218s;-o-transition:background-color 0.218s,border-color 0.218s,background-image 0.218s;transition:background-color 0.218s,border-color 0.218s,background-image 0.218s}.jfk-twothumbslider:hover .goog-twothumbslider-rangehighlight,.jfk-twothumbslider.goog-slider-dragging .goog-twothumbslider-rangehighlight{background-color:#535252}.jfk-twothumbslider.goog-slider-dragging .goog-twothumbslider-rangehighlight{background-image:url(//ssl.gstatic.com/ui/v1/slider/rangehighlight-active-gray.png)}.goog-twothumbslider-horizontal .goog-twothumbslider-rangehighlight{height:6px;top:6px}.goog-twothumbslider-vertical .goog-twothumbslider-rangehighlight{left:6px;width:6px}.jfk-tooltip{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;-webkit-transition:visibility 0,opacity .13s ease-in;-moz-transition:visibility 0,opacity .13s ease-in;-o-transition:visibility 0,opacity .13s ease-in;transition:visibility 0,opacity .13s ease-in;background-color:#2a2a2a;border:1px solid #fff;color:#fff;cursor:default;display:block;font-size:11px;font-weight:bold;margin-left:-1px;opacity:1;padding:7px 9px;position:absolute;visibility:visible;white-space:pre-wrap;word-break:break-all;word-break:break-word}.jfk-tooltip-hide{-webkit-transition:visibility .13s,opacity .13s ease-out,left 0 linear .13s,top 0 linear .13s;-moz-transition:visibility .13s,opacity .13s ease-out,left 0 linear .13s,top 0 linear .13s;-o-transition:visibility .13s,opacity .13s ease-out,left 0 linear .13s,top 0 linear .13s;transition:visibility .13s,opacity .13s ease-out,left 0 linear .13s,top 0 linear .13s;opacity:0;left:20px!important;top:20px!important;visibility:hidden}.jfk-tooltip-data{display:none}.jfk-tooltip-arrow{pointer-events:none;position:absolute}.jfk-tooltip-arrow .jfk-tooltip-arrowimplbefore,.jfk-tooltip-arrow .jfk-tooltip-arrowimplafter{content:'';display:block;height:0;position:absolute;width:0}.jfk-tooltip-arrow .jfk-tooltip-arrowimplbefore{border:6px solid}.jfk-tooltip-arrow .jfk-tooltip-arrowimplafter{border:5px solid}.jfk-tooltip-arrowdown{bottom:0}.jfk-tooltip-arrowup{top:-6px}.jfk-tooltip-arrowleft{left:-6px}.jfk-tooltip-arrowright{right:0}.jfk-tooltip-arrowdown .jfk-tooltip-arrowimplbefore,.jfk-tooltip-arrowup .jfk-tooltip-arrowimplbefore{border-color:#fff transparent;left:-6px}.jfk-tooltip-arrowdown .jfk-tooltip-arrowimplafter,.jfk-tooltip-arrowup .jfk-tooltip-arrowimplafter{border-color:#2a2a2a transparent;left:-5px}.jfk-tooltip-arrowdown .jfk-tooltip-arrowimplbefore{border-bottom-width:0}.jfk-tooltip-arrowdown .jfk-tooltip-arrowimplafter{border-bottom-width:0}.jfk-tooltip-arrowup .jfk-tooltip-arrowimplbefore{border-top-width:0}.jfk-tooltip-arrowup .jfk-tooltip-arrowimplafter{border-top-width:0;top:1px}.jfk-tooltip-arrowleft .jfk-tooltip-arrowimplbefore,.jfk-tooltip-arrowright .jfk-tooltip-arrowimplbefore{border-color:transparent #fff;top:-6px}.jfk-tooltip-arrowleft .jfk-tooltip-arrowimplafter,.jfk-tooltip-arrowright .jfk-tooltip-arrowimplafter{border-color:transparent #2a2a2a;top:-5px}.jfk-tooltip-arrowleft .jfk-tooltip-arrowimplbefore{border-left-width:0}.jfk-tooltip-arrowleft .jfk-tooltip-arrowimplafter{border-left-width:0;left:1px}.jfk-tooltip-arrowright .jfk-tooltip-arrowimplbefore{border-right-width:0}.jfk-tooltip-arrowright .jfk-tooltip-arrowimplafter{border-right-width:0}.docs-butterbar-container{font-weight:500;height:0;position:absolute;text-align:center;top:23px;width:100%;z-index:999}.docs-hub-butterbar{top:57px}.docs-gm .docs-butterbar-container{font-weight:normal;font-weight:var(--docs-material-font-weight-normal,normal)}.docs-butterbar-container.docs-butterbar-container-compact{top:50px}.docs-butterbar-wrap{display:inline-block;padding-bottom:8px}.docs-gm .jfk-butterBar{align-items:center;border-radius:4px;border-style:none;display:flex;flex-wrap:wrap;font-size:13px;font-size:var(--docs-material-font-size-normal,13px);height:fit-content;min-height:40px;padding:0px 24px}.docs-gm .jfk-butterBar-info{background-color:#e6f4ea;color:#202124;white-space:normal}.docs-gm .jfk-butterBar-warning{background-color:#d93025}.docs-gm .jfk-butterBar-error{background-color:#202124;color:#dadce0}.docs-butterbar-dismiss,.docs-butterbar-link,a.docs-butterbar-link:link,a.docs-butterbar-link:visited,.docs-butterbar-link-no-pad,a.docs-butterbar-link-no-pad:link,a.docs-butterbar-link-no-pad:visited{color:#666;cursor:pointer;text-decoration:underline}.docs-butterbar-dismiss,.docs-butterbar-link,a.docs-butterbar-link:link,a.docs-butterbar-link:visited{padding-left:6px}.docs-gm .docs-butterbar-dismiss{font-size:16px;margin-left:80px;padding:0;text-decoration:none;flex:1;text-align:end}.jfk-butterBar-warning .docs-butterbar-dismiss,.jfk-butterBar-warning .docs-butterbar-link,.jfk-butterBar-warning a.docs-butterbar-link:link,.jfk-butterBar-warning a.docs-butterbar-link:visited,.jfk-butterBar-warning .docs-butterbar-link-no-pad,.jfk-butterBar-warning a.docs-butterbar-link-no-pad:link,.jfk-butterBar-warning a.docs-butterbar-link-no-pad:visited{color:#111}.jfk-butterBar-error .docs-butterbar-dismiss,.jfk-butterBar-error .docs-butterbar-link,.jfk-butterBar-error a.docs-butterbar-link:link,.jfk-butterBar-error a.docs-butterbar-link:visited,.jfk-butterBar-error .docs-butterbar-link-no-pad,.jfk-butterBar-error a.docs-butterbar-link-no-pad:link,.jfk-butterBar-error a.docs-butterbar-link-no-pad:visited{color:#add8e6}.docs-gm .docs-butterbar-dismiss,.docs-gm .docs-butterbar-link,.docs-gm a.docs-butterbar-link:link,.docs-gm a.docs-butterbar-link:visited,.docs-gm .docs-butterbar-link-no-pad,.docs-gm a.docs-butterbar-link-no-pad:link,.docs-gm a.docs-butterbar-link-no-pad:visited{font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-family:var(--docs-material-header-font-family,"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif)}.docs-gm .jfk-butterBar-info .docs-butterbar-dismiss,.docs-gm .jfk-butterBar-info .docs-butterbar-link,.docs-gm .jfk-butterBar-info a.docs-butterbar-link:link,.docs-gm .jfk-butterBar-info a.docs-butterbar-link:visited,.docs-gm .jfk-butterBar-info .docs-butterbar-link-no-pad,.docs-gm .jfk-butterBar-info a.docs-butterbar-link-no-pad:link,.docs-gm .jfk-butterBar-info a.docs-butterbar-link-no-pad:visited{color:#188038}.docs-gm .jfk-butterBar-warning .docs-butterbar-dismiss,.docs-gm .jfk-butterBar-warning .docs-butterbar-link,.docs-gm .jfk-butterBar-warning a.docs-butterbar-link:link,.docs-gm .jfk-butterBar-warning a.docs-butterbar-link:visited,.docs-gm .jfk-butterBar-warning .docs-butterbar-link-no-pad,.docs-gm .jfk-butterBar-warning a.docs-butterbar-link-no-pad:link,.docs-gm .jfk-butterBar-warning a.docs-butterbar-link-no-pad:visited{color:#fff}.docs-gm .jfk-butterBar-error .docs-butterbar-dismiss,.docs-gm .jfk-butterBar-error .docs-butterbar-link,.docs-gm .jfk-butterBar-error a.docs-butterbar-link:link,.docs-gm .jfk-butterBar-error a.docs-butterbar-link:visited,.docs-gm .jfk-butterBar-error .docs-butterbar-link-no-pad,.docs-gm .jfk-butterBar-error a.docs-butterbar-link-no-pad:link,.docs-gm .jfk-butterBar-error a.docs-butterbar-link-no-pad:visited{color:#34a853}.docs-gm .jfk-butterBar-info .docs-butterbar-dismiss:hover,.docs-gm .jfk-butterBar-info .docs-butterbar-link:hover,.docs-gm .jfk-butterBar-info .docs-butterbar-link-no-pad:hover{color:#0d652d}.docs-gm .jfk-butterBar-warning .docs-butterbar-dismiss:hover,.docs-gm .jfk-butterBar-warning .docs-butterbar-link:hover,.docs-gm .jfk-butterBar-warning .docs-butterbar-link-no-pad:hover{color:#fad2cf}.docs-gm .jfk-butterBar-error .docs-butterbar-dismiss:hover,.docs-gm .jfk-butterBar-error .docs-butterbar-link:hover,.docs-gm .jfk-butterBar-error .docs-butterbar-link-no-pad:hover{color:#81c995}.docs-ml-noselect{-webkit-touch-callout:none;-webkit-user-drag:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}#docs-chrome{background:white;outline:none}#docs-chrome.docs-hub-chrome{border-bottom:1px solid #d9d9d9;min-height:56px}#docs-header{position:relative;-ms-flex:1 1 auto;-webkit-flex:1 1 auto;flex:1 1 auto}#docs-header.docs-hub-appbar{height:49px}#docs-header.docs-og-minibar{max-height:31px}#docs-header-container{display:flex;-webkit-justify-content:flex-end;justify-content:flex-end}#docs-banner-container{display:flex;-webkit-justify-content:flex-end;justify-content:flex-end}.docs-incompatibility-banner{background-color:#e6f4ea;border:0;color:#188038;display:flex;font-size:13px;height:32px;justify-content:center;white-space:nowrap;width:100%;-ms-flex:1 1;-webkit-flex:1 1;flex:1 1}.docs-hc-ie.docs-incompatibility-banner .docs-incompatibility-banner-view-details-button,.docs-hc-edge.docs-incompatibility-banner .docs-incompatibility-banner-view-details-button,.docs-hc-gecko.docs-incompatibility-banner .docs-incompatibility-banner-view-details-button{border:1px solid transparent}.docs-incompatibility-banner-text{line-height:32px;max-width:calc(100% - 140px);overflow:hidden;text-overflow:ellipsis}.docs-incompatibility-banner-view-details-button{align-self:center;background-color:inherit;border:none;color:#188038;cursor:pointer;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;line-height:24px;margin-left:32px;min-width:42px;overflow:hidden}.docs-full-height-sidebar-placeholder{-ms-flex:0 0 0px;-webkit-flex:0 0 0px;flex:0 0 0px}.docs-full-height-sidebar-placeholder.expanded{-webkit-flex-basis:300px;-ms-flex-basis:300px;flex-basis:300px}.docs-sidebar-header-text{font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;left:20px;position:absolute;font-size:13px;font-size:var(--docs-material-font-size-normal,13px)}#docs-bars{position:relative;overflow:hidden}#docs-titlebar-container{margin-left:40px;position:relative}#docs-branding-container{height:60px;margin-top:26px;position:absolute;width:40px;z-index:1}#docs-branding-container a{display:inline-block;height:60px;width:40px}.docs-og-minibar #docs-branding-container{margin-top:0}#docs-titlebar{clear:both;font-size:18px;height:24px;padding:0;padding-top:7px;width:100%}.docs-hub-appbar #docs-titlebar{font-size:16px}#docs-header.docs-og-minibar #docs-titlebar{height:24px;padding-top:0}#docs-header.docs-og-minibar #docs-titlebar-container{top:-21px}#docs-header.docs-hub-appbar #docs-titlebar-container{height:100%}#docs-header.docs-og-minibar .docs-titlebar-buttons{top:19px}.docs-exp{border-radius:6px;border:1px solid #800;color:#800;float:left;font-size:11px;margin-right:8px;padding:0 5px;text-align:center;white-space:nowrap}#docs-drive-logo{height:60px;position:absolute;width:40px;opacity:0;transition:all 125ms linear}#docs-branding-logo{height:60px;position:absolute;width:40px;transition:all 125ms linear}#docs-branding-container.docs-branding-default{background-color:#d1d1d1}#docs-branding-container.docs-branding-documents{background-color:#4285f4}#docs-branding-container.docs-branding-spreadsheets{background-color:#0f9d58}#docs-branding-container.docs-branding-presentations{background-color:#f4b400}#docs-branding-container.docs-branding-drawings{background-color:#db4437}#docs-branding-container.docs-branding-forms{background-color:#673ab7}#docs-branding-container.docs-branding-scripts{background-color:#4285f4}#docs-branding-container:not(.docs-branding-crossfade-transition-disabled):hover #docs-drive-logo{opacity:1}#docs-branding-container:not(.docs-branding-crossfade-transition-disabled):hover #docs-branding-logo{opacity:0}#docs-branding-container.docs-branding-default:hover #docs-drive-logo{opacity:0}#docs-branding-container.docs-branding-default:hover #docs-branding-logo{opacity:1}.docs-butter{text-align:center}.docs-butter-inner{border-radius:3px;font-size:13px;font-weight:500;margin:0 auto 5px;padding:5px 7px}.docs-butter-info{background:#f6bc5d;color:#222}.docs-butter-info-link{color:#0658b5}.docs-butter-warning{background:#c00;color:#fff}.docs-butter-warning-link{color:#c3d9ff}#docs-chrome-cover-container{width:100%;z-index:990}#docs-chrome-cover{height:60px}#docs-transient-bar-container{left:50%;position:absolute;top:100%;width:0}.docs-fading-toolbar-message{background-color:#fff;border:#999 solid;border-width:0px 0px 1px 0px;color:#999;font-size:28px;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;position:absolute;text-align:center}.docs-title-outer{margin-left:17px;white-space:nowrap}.docs-title-outer.docs-title-inline-rename{margin-left:12px}.docs-title{display:inline-block;outline:none}.docs-title-input{border:1px solid transparent;border-radius:2px!important;color:#fff;font-size:18px;font-variant-ligatures:no-contextual;height:20px;line-height:22px;margin:0;min-width:1px;padding:2px 7px;visibility:hidden}#docs-header.docs-hub-appbar .docs-title-input{font-size:16px}.docs-title-input-label{font-size:18px;font-variant-ligatures:no-contextual;line-height:22px;margin:0;overflow:hidden;padding:2px 8px;pointer-events:none;position:absolute;text-overflow:ellipsis;top:0;white-space:pre;z-index:1}#docs-header.docs-hub-appbar .docs-title-input-label{font-size:16px}.docs-title-input-label-inner{display:inline;line-height:22px}.docs-title-input:hover{border-color:#e5e5e5}.docs-title-input:focus{-webkit-appearance:none;-moz-appearance:none;border:1px solid #4d90fe!important;box-shadow:inset 0px 1px 2px rgba(0,0,0,0.1);color:#000;outline:none}.docs-title-input::-ms-clear{display:none}.docs-title-inner{color:#333;font-size:18px;max-width:600px;margin:2px 4px 1px 3px;overflow:hidden;text-overflow:ellipsis;white-space:pre}.docs-title .docs-title-untitled,.docs-title-input-label.docs-title-untitled{color:#777;font-style:italic}.docs-title-widget{font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;height:27px;width:auto}#docs-header.docs-hub-appbar .docs-title-widget{padding-left:6px}.docs-title-widget-enabled:hover .docs-title{background-color:#eee;cursor:pointer}.docs-title-widget .docs-back-container a{display:none}.docs-title-widget:hover .docs-back-container a{display:inline-block}.docs-back-container{height:21px;opacity:0.6;padding-right:9px;margin-top:1px;vertical-align:top;width:21px}.docs-back-container:hover{opacity:0.9}.docs-titlebar-badges{vertical-align:top}.docs-hub-appbar .docs-titlebar-badges>:not(.docs-save-indicator-container){display:none}.docs-titlebar-badge-container{margin-top:1px;padding:0 3px;vertical-align:top}.docs-titlebar-badge .docs-icon{display:block;height:18px;margin:3px}.docs-titlebar-badge-container .goog-control,.docs-titlebar-badge-container .goog-flat-button{outline:none}.docs-titlebar-badge{align-items:center;border-radius:4px;color:#5f6368;cursor:pointer;display:flex;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;height:24px}.docs-gm .docs-titlebar-badge#docs-encrypted-doc-indicator-badge,.docs-gm .docs-titlebar-badge#docs-encrypted-doc-indicator-badge:hover,.docs-gm .docs-titlebar-badge#docs-encrypted-doc-indicator-badge:active{background-color:transparent;cursor:default;outline:none}.docs-gm .docs-titlebar-badge:hover,.docs-titlebar-badge.goog-flat-button-focused,.docs-titlebar-badge.goog-control-focused,.goog-control-focused .docs-titlebar-badge{background-color:#f1f3f4;outline:none}.docs-gm .docs-titlebar-badge:active,.docs-gm .docs-titlebar-badge.docs-titlebar-badge-selected{background-color:#e6f4ea;color:#188038}.docs-titlebar-badge.goog-control-disabled{cursor:default;opacity:0.38;background:none!important}.docs-titlebar-badge.goog-control-disabled .docs-icon-img{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_grey_medium.svg)!important}.docs-titlebar-badges.docs-badges-hidden-with-width{width:0;overflow:hidden}.docs-parent-collections-container-outer{outline:none;vertical-align:top}.docs-activity-indicator-container{height:29px;margin-top:2px;vertical-align:top;padding-right:2px}.office-editing-file-extension{background-color:#188038;border:1px solid transparent;border-radius:4px;box-sizing:border-box;color:#fff;cursor:default;font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:13px;height:21px;line-height:21px;margin:0 8px 0 0;padding:0 5px 0 4px;text-transform:uppercase;-webkit-font-smoothing:antialiased}.docs-classification-badge{border:1px solid transparent;border-radius:4px;box-sizing:border-box;color:#fff;cursor:pointer;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:500;height:20px;line-height:15px;padding:2px 8px;letter-spacing:0.03em}.docs-templates-badge-container{vertical-align:middle}.docs-templates-badge{background-color:#5a5a5a;border-radius:16px;color:white;font-size:13px;padding:0 11px;height:24px;line-height:24px}#docs-dlp,#docs-activity-indicator,.docs-title-save-label{margin-left:4px;outline:none}#docs-star.docs-titlebar-badge:active{background-color:#e8eaed}#docs-star.docs-titlebar-badge:active .docs-icon-img{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_grey_medium.svg)}#docs-activity-indicator{padding-left:4px;padding-top:2px}#docs-dlp .docs-icon-img{opacity:0.45}#docs-dlp:hover .docs-icon-img{opacity:0.55}#docs-dlp,#docs-star,#docs-folder .docs-icon{vertical-align:baseline}.docs-debug-info,.docs-debug-info a{color:#777!important;font-size:8px}.docs-debug-container{margin-right:6px;margin-top:55px;vertical-align:top;font-size:8px}#docs-header.docs-hub-appbar .docs-debug-container{margin-top:calc(56px - 8px)}.docs-titlebar-buttons{font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;padding:0 44px 0 0;position:absolute;right:0;text-align:right;top:26px;vertical-align:middle;white-space:nowrap;box-sizing:border-box}.docs-debug-container.docs-debug-info{display:flex;position:absolute;right:0;top:0}.docs-titlebar-button{z-index:1}#docs-docos-commentsbutton{margin-right:9px}#docs-titlebar-save{text-align:center}#docs-docos-commentsbutton,#docs-titlebar-share-client-button div{height:24px;padding-bottom:3px;vertical-align:middle}#docs-header.docs-hub-appbar #docs-titlebar-share-client-button div{height:28px;margin-right:8px}#docs-titlebar-share-client-button div.jfk-button{margin-right:0}#docs-docos-commentsbutton{cursor:default}.docs-titlebar-buttons .goog-menu-button-dropdown{position:relative;top:2px;vertical-align:baseline}.docs-menubar{cursor:default;display:inline-block;font-size:13px;font-size:var(--docs-material-font-size-normal,13px);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;height:29px;margin-left:52px;outline:none;position:relative;white-space:nowrap}.docs-menubar .goog-control{padding:3px 7px 5px 7px;margin-top:2px;border:1px solid transparent;outline:none}.docs-menubar .goog-control-hover{background:#eee;border-color:#eee}.docs-menubar .goog-control-open{background:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-bottom:none;-moz-box-shadow:0 2px 4px rgba(0,0,0,0.2);-webkit-box-shadow:0 2px 4px rgba(0,0,0,0.2);box-shadow:0 2px 4px rgba(0,0,0,0.2);color:black;z-index:1003}.docs-menubar .goog-control-disabled{color:#ccc}#docs-menubars{white-space:nowrap}#docs-editor-container{background:#eee;padding:0}#docs-editor{background:#eee;outline:none}#docs-editor.companion-enabled{width:calc(100% - 56px)}.docs-gaia-disabled{color:#999;cursor:text}.docs-hide-label{display:none}.docs-title-save-label{color:#777;display:inline-block;margin-left:14px;max-width:250px;overflow:hidden;vertical-align:text-bottom;white-space:nowrap}.docs-title-save-label-with-icon .docs-title-save-label-text{max-width:calc(100% - 24px)}.docs-title-save-label-text{display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis;vertical-align:text-bottom;white-space:nowrap;font-size:13px;font-size:var(--docs-material-font-size-normal,13px)}.docs-title-save-label-text:hover,.docs-title-save-label-text-focused{cursor:pointer;text-decoration:underline}.docs-title-save-label-disabled>.docs-title-save-label-text:hover{cursor:auto;text-decoration:none}:not(.docs-title-save-label-disabled)>.docs-title-save-label-text-link{text-decoration:underline}.docs-material.docs-title-save-label .docs-title-save-label-icon{cursor:pointer;margin:0 0 -1px 7px;opacity:0.54;vertical-align:text-bottom}.docs-title-save-label-text:empty+.docs-title-save-label-icon{display:none}.docs-title-save-label-unsaved-changes{background-color:#fce4e2;color:#da362c;border-radius:4px;margin-bottom:-5px;margin-left:9px;padding:5px}.docs-title-save-label-unsaved-changes-button{cursor:pointer;display:none;font-weight:bold;margin-left:10px;outline:none}.docs-title-save-label-unsaved-changes .docs-title-save-label-unsaved-changes-button{display:inline-block}.docs-title-save-label-unsaved-changes-button.goog-flat-button-disabled{cursor:default;color:rgba(0,0,0,0.26)}#blob-notice-button{border:none;border-radius:4px;background-color:#fce8e6;color:#c5221f;cursor:pointer;font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;margin:0 0 0 14px;outline:0;padding:4px 8px;white-space:nowrap}.docs-hc-ie#blob-notice-button,.docs-hc-edge#blob-notice-button,.docs-hc-gecko#blob-notice-button{border:1px solid transparent}.docs-rename-dialog,.docs-edit-description-dialog{width:340px}.docs-rename-dialog .modal-dialog-userInput,.docs-edit-description-dialog .modal-dialog-userInput{width:300px}.docs-gm .docs-rename-dialog,.docs-gm .docs-edit-description-dialog{min-width:312px;width:auto;width:unset}.docs-gm .docs-rename-dialog .modal-dialog-content{font-size:12px}.docs-gm .docs-rename-dialog .modal-dialog-userInput{width:100%}#docs-help-anchor{left:30%;position:absolute}#docs-help-anchor-right{right:0;position:absolute}.docs-faux-link{color:#20c;cursor:pointer;text-decoration:underline}.docs-offscreen{position:absolute;left:-10000px;top:-10000px}.docs-offscreen-z-index{position:absolute;left:0px;top:-1px;z-index:-2;opacity:0}.modal-dialog-bg,.goog-modalpopup-bg{z-index:1002}.modal-dialog,.goog-modalpopup{z-index:1003}.goog-menu{z-index:1003}#docs-menu-shield{background-color:#fff;position:absolute;z-index:1004}.docs-menu-hide-mnemonics .goog-menuitem-mnemonic-hint{text-decoration:none}.docs-menu-hide-mnemonics .goog-menuitem-mnemonic-separator{display:none}.goog-menu.goog-menu-noaccel .docs-menuheader{color:#9aa0a6!important;padding-left:12px}.goog-menu.goog-menu-noaccel .apps-menuitem{padding-right:10px}.goog-menu.goog-menu-noicon .goog-menuitem.apps-menuitem{padding-left:16px}.goog-menuitem.apps-menuitem{padding:6px 10px 6px 30px;white-space:normal}.goog-menuitem-highlight.apps-menuitem{border-style:none;padding-bottom:6px;padding-top:6px}.apps-menuitem .goog-menuitem-label{padding-right:6px}.apps-menuitem .goog-menuitem-accel,.docs-gm .goog-menuitem .goog-menuitem-accel{float:right;padding:0px 0px 0px 24px;position:relative}.goog-submenu .goog-menuitem-content{margin-right:42px}.docs-halfhovermenuitem .goog-submenu-arrow,.apps-menuitem .goog-submenu-arrow,.docs-gm .goog-menuitem .goog-submenu-arrow{margin-right:4px}.apps-menuitem.goog-menuitem-ie{padding:3px 10px 20px 30px}.apps-menuitem .goog-menuitem-icon-ie{float:left;top:0em}.apps-menuitem .goog-menuitem-label-ie{float:left}.modal-dialog-content{font-size:13px;font-size:var(--docs-material-font-size-normal,13px)}#docs-hub-open-external-appbarbutton .hub-open-external-icon-container,#docs-hub-close-appbarbutton .hub-close-icon-container,.docs-icon.goog-inline-block.hub-document-icon-container{height:20px;outline:0;width:20px;margin-top:2px}#docs-hub-open-external-appbarbutton .hub-open-external-icon-container,#docs-hub-close-appbarbutton .hub-close-icon-container{position:relative;top:1px;left:1px}#docs-hub-open-external-appbarbutton,#docs-hub-close-appbarbutton{margin:0 0 0 2px;width:32px;height:32px}#docs-hub-open-external-appbarbutton:hover,#docs-hub-open-external-appbarbutton:focus,#docs-hub-close-appbarbutton:hover,#docs-hub-close-appbarbutton:focus{background-color:rgba(0,0,0,.06)}input{font-family:inherit}body{background-color:white;color:black;font-weight:normal;font-size:13px;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;margin:0}.jfk-activityIndicator{display:inline-block;position:relative;direction:ltr}.jfk-activityIndicator,.jfk-activityIndicator-icon,.jfk-activityIndicator-circle,.jfk-activityIndicator-circle-transition{height:19px;width:19px}.jfk-activityIndicator-small.jfk-activityIndicator,.jfk-activityIndicator-small .jfk-activityIndicator-icon,.jfk-activityIndicator-small .jfk-activityIndicator-circle,.jfk-activityIndicator-small .jfk-activityIndicator-circle-transition{height:16px;width:16px}.jfk-activityIndicator-icon{background:url(//ssl.gstatic.com/ui/v1/activityindicator/offline.png) center no-repeat}.jfk-activityIndicator-small .jfk-activityIndicator-icon{background:url(//ssl.gstatic.com/ui/v1/activityindicator/offline_16.png) center no-repeat}.jfk-activityIndicator-icon{-webkit-transition:opacity .218s linear .44s;-moz-transition:opacity .218s linear .44s;-o-transition:opacity .218s linear .44s;transition:opacity .218s linear .44s;top:0;left:0;position:absolute;opacity:0}.jfk-activityIndicator-circle{-webkit-border-radius:50%;-moz-border-radius:50%;border-radius:50%;top:0;left:0;position:absolute}.jfk-activityIndicator-mask{overflow:hidden;position:absolute}.jfk-activityIndicator-circle-transition{position:relative}.jfk-activityIndicator-transition{-webkit-transition:all .22s ease-in;-moz-transition:all .22s ease-in;-o-transition:all .22s ease-in;transition:all .22s ease-in}.jfk-activityIndicator-transition-second{-webkit-transition:all .22s ease-out .22s;-moz-transition:all .22s ease-out .22s;-o-transition:all .22s ease-out .22s;transition:all .22s ease-out .22s}.jfk-bubble.jfk-bubble-promo{background-color:#f9edbe;border:1px solid #f0c36d}.jfk-bubble-promo .jfk-bubble-arrowdown .jfk-bubble-arrowimplbefore,.jfk-bubble-promo .jfk-bubble-arrowup .jfk-bubble-arrowimplbefore{border-color:#f0c36d transparent}.jfk-bubble-promo .jfk-bubble-arrowdown .jfk-bubble-arrowimplafter,.jfk-bubble-promo .jfk-bubble-arrowup .jfk-bubble-arrowimplafter{border-color:#f9edbe transparent}.jfk-bubble-promo .jfk-bubble-arrowleft .jfk-bubble-arrowimplbefore,.jfk-bubble-promo .jfk-bubble-arrowright .jfk-bubble-arrowimplbefore{border-color:transparent #f0c36d}.jfk-bubble-promo .jfk-bubble-arrowleft .jfk-bubble-arrowimplafter,.jfk-bubble-promo .jfk-bubble-arrowright .jfk-bubble-arrowimplafter{border-color:transparent #f9edbe}.jfk-star{display:inline-block;height:19px;text-align:center;width:19px;padding:2px}.jfk-star:before{content:url(//ssl.gstatic.com/ui/v1/star/star4.png);content:-webkit-image-set(url(//ssl.gstatic.com/ui/v1/star/star4.png) 1x,url(//ssl.gstatic.com/ui/v1/star/star4_2x.png) 2x)}.jfk-star-hover:before{content:url(//ssl.gstatic.com/ui/v1/star/star-hover4.png);content:-webkit-image-set(url(//ssl.gstatic.com/ui/v1/star/star-hover4.png) 1x,url(//ssl.gstatic.com/ui/v1/star/star-hover4_2x.png) 2x)}.jfk-star-active:before{content:url(//ssl.gstatic.com/ui/v1/star/star-active4.png);content:-webkit-image-set(url(//ssl.gstatic.com/ui/v1/star/star-active4.png) 1x,url(//ssl.gstatic.com/ui/v1/star/star-active4_2x.png) 2x)}.jfk-star-checked:before{content:url(//ssl.gstatic.com/ui/v1/star/star-lit4.png);content:-webkit-image-set(url(//ssl.gstatic.com/ui/v1/star/star-lit4.png) 1x,url(//ssl.gstatic.com/ui/v1/star/star-lit4_2x.png) 2x)}.jfk-star-checked.jfk-star-hover:before{content:url(//ssl.gstatic.com/ui/v1/star/star-lit-hover4.png);content:-webkit-image-set(url(//ssl.gstatic.com/ui/v1/star/star-lit-hover4.png) 1x,url(//ssl.gstatic.com/ui/v1/star/star-lit-hover4_2x.png) 2x)}.jfk-star-checked.jfk-star-active:before{content:url(//ssl.gstatic.com/ui/v1/star/star-lit-active4.png);content:-webkit-image-set(url(//ssl.gstatic.com/ui/v1/star/star-lit-active4.png) 1x,url(//ssl.gstatic.com/ui/v1/star/star-lit-active4_2x.png) 2x)}.apps-share-sprite{background-image:url(//ssl.gstatic.com/docs/documents/share/images/sprite-22.svg)}.sharing-aria-region{position:absolute;top:-1000px;height:1px;overflow:hidden}.share-butterbar-container{font-family:Roboto,arial,sans-serif;font-size:13px;font-weight:bold;position:fixed;display:inline-block;padding-bottom:5px}.share-client-dialog .share-butterbar-container{font-family:arial,sans-serif}.share-butterbar-container .jfk-butterBar-shown{height:21px}.share-butterbar-top{top:23px}.share-butterbar-zindex{z-index:3021}.share-butter-icon{opacity:.55;display:inline-block;width:21px;height:21px;margin-bottom:1px;margin-top:1px;margin-right:1px;vertical-align:middle}.share-butter-message,.share-butter-link{line-height:21px}.share-butter-link,.share-butter-link:visited{color:#15c;text-decoration:none;cursor:pointer}.share-butter-link:focus{outline:none}.share-butter-link:active{color:#d14836}.share-butter-link:disabled{color:#222;cursor:default}.share-butter-copy-icon{background-position:0 -120px}.share-butter-specific-people-icon{background-position:0 -72px}.share-butter-person-link-icon{background-position:0 -294px}.share-client-dialog{max-height:100%;overflow:auto;width:auto!important;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}* html .share-client-dialog{max-height:none!important;overflow:visible!important}*:first-child+html .share-client-dialog{max-height:none!important;overflow:visible!important}.share-client-dialog .modal-dialog-content{padding:0}.share-client-dialog .modal-dialog-title{padding:0}.share-client-dialog .share-client-dialog-hidden-title{height:0;margin:0;padding:0}.share-client-dialog .modal-dialog-title{font-family:arial,sans-serif;font-weight:normal}.share-client-content-iframe{display:flex;height:100%;width:100%;border:none}.share-client-dialog .modal-dialog-buttons{display:none}.share-client-error-dialog{font-family:arial,sans-serif;font-size:12px;width:400px}.share-client-loading-contents{height:99px;text-align:center;width:454px}.share-client-spinner{background-image:url(//ssl.gstatic.com/docs/documents/share/images/spinner-1.gif);display:inline-block;margin-top:41px;width:16px;height:16px}.inline-share-ui-status{font-size:12pt;font-weight:bold;height:19px;padding:5px 10px;background-color:#f1f4ff}.inline-share-ui-overlay{position:absolute;z-index:150;background-color:#fff;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"}.share-client-panel-dialog-share{height:100%;width:100%}.share-client-panel-dialog-overlay{position:absolute;z-index:150}.share-client-offscreen{position:absolute!important;left:-10000px!important;top:-10000px!important}.share-client-loading-dialog{font-family:arial,sans-serif}.share-client-debug{display:none;position:absolute;bottom:0;right:0;color:#777;font-size:10px}.team-drive-share-client-dialog{border:none;border-radius:2px;box-shadow:0px 24px 38px 3px rgba(0,0,0,0.14),0px 9px 46px 8px rgba(0,0,0,0.12),0px 11px 15px -7px rgba(0,0,0,0.2);padding:0}.full-screen-share-client-dialog{background-color:transparent!important;border:none!important;height:100vh;overflow:hidden;padding:0!important;width:100vw!important}.full-screen-share-client-dialog .modal-dialog-content{background:transparent;height:100%;width:100%}.modal-dialog.share-client-dialog.team-drive-share-client-dialog{padding:0}.full-screen-share-client-dialog .modal-dialog-title,.team-drive-share-client-dialog .modal-dialog-title{display:none}.jfk-tooltip{z-index:30000}.scb-container,.scb-icon{display:inline-block}.scb-button-icon{margin:-3px 2px 0px -5px;vertical-align:middle!important}.scb-tooltip-contents{color:#fff;font-size:13px;max-width:300px}.scb-tooltip-title{font-size:14px;font-weight:bold}.scb-tooltip-text{font-weight:normal}.scb-tooltip-icon-container{width:25px;vertical-align:top}.scb-tooltip-separator{border-top:1px solid #555555;margin:2px 0}.jfk-button-standard .scb-button-icon{opacity:.70}.jfk-button-standard.jfk-button-checked .scb-button-icon,.jfk-button-standard.jfk-button-selected .scb-button-icon,.jfk-button-standard.jfk-button-hover .scb-button-icon{opacity:0.9}.jfk-button-standard.jfk-button-disabled .scb-button-icon{opacity:0.333}.scb-public-icon-white,.scb-unlisted-icon-white,.scb-domain-public-icon-white,.scb-domain-unlisted-icon-white,.scb-privately-shared-icon-white,.scb-private-icon-white,.scb-invalid-icon-white,.scb-dlp-icon{width:21px;height:21px;background-repeat:no-repeat;vertical-align:bottom}.scb-public-icon-white{background-position:0 -802px}.scb-unlisted-icon-white{background-position:0 -48px}.scb-domain-public-icon-white{background-position:0 -243px}.scb-domain-unlisted-icon-white{background-position:0 -599px}.scb-privately-shared-icon-white{background-position:0 -318px}.scb-private-icon-white{background-position:0 -219px}.scb-invalid-icon-white{background-position:0 -623px}.scb-dlp-icon{background-position:0 -898px}.docs-branding-presentations .scb-public-icon-white{background-position:0 -671px}.docs-branding-presentations .scb-unlisted-icon-white{background-position:0 -294px}.docs-branding-presentations .scb-domain-public-icon-white{background-position:0 -850px}.docs-branding-presentations .scb-domain-unlisted-icon-white{background-position:0 -551px}.docs-branding-presentations .scb-privately-shared-icon-white{background-position:0 -72px}.docs-branding-presentations .scb-private-icon-white{background-position:0 -575px}.docs-branding-presentations .scb-invalid-icon-white{background-position:0 -826px}.docs-branding-icon{direction:ltr;text-align:left;height:60px;overflow:hidden;vertical-align:middle;width:40px}.docs-branding-icon-img:before{content:url(//ssl.gstatic.com/docs/common/branding_sprite1.svg)}.docs-branding-icon-img{position:absolute}.docs-branding-icon-drive,.docs-branding-icon-default{left:0;top:0}.docs-branding-icon-documents{left:0;top:-180px}.docs-branding-icon-spreadsheets{left:0;top:-300px}.docs-branding-icon-presentations{left:0;top:-360px}.docs-branding-icon-drawings{left:0;top:-60px}.docs-branding-icon-forms{left:0;top:-120px}.docs-branding-icon-scripts{left:0;top:-240px}.docs-icon{direction:ltr;text-align:left;height:21px;overflow:hidden;vertical-align:middle;width:21px}.docs-icon-img:before{content:url(//ssl.gstatic.com/docs/common/jfk_sprite186.png)}.docs-icon-img{*background:url(//ssl.gstatic.com/docs/common/jfk_sprite186.png)}.docs-icon-img-legacy{background:url(//ssl.gstatic.com/docs/common/jfk_sprite186.png)}.docs-icon-img-container{height:4167px;position:absolute;width:42px}.goog-color-menu-button-indicator .docs-icon{height:19px}.goog-menuitem-icon .docs-icon-img-container{opacity:.70}.goog-menuitem-icon .docs-icon-document,.goog-menuitem-icon .docs-icon-punch,.goog-menuitem-icon .docs-icon-presentation,.goog-menuitem-icon .docs-icon-spreadsheet,.goog-menuitem-icon .docs-icon-form,.goog-menuitem-icon .docs-icon-drawing,.goog-menuitem-icon .docs-icon-script,.goog-menuitem-icon .docs-icon-site{opacity:1}.docs-icon-save{left:0;top:-1077px}.docs-icon-print{left:0;top:-528px}.docs-icon-undo,.docs-icon-redo-rtl{left:0;top:-759px}.docs-icon-redo,.docs-icon-undo-rtl{left:-21px;top:-1434px}.docs-icon-copy{left:0;top:-2694px}.docs-icon-cut{left:0;top:-2085px}.docs-icon-paste{left:-21px;top:-528px}.docs-icon-document{left:-21px;top:-1392px}.docs-icon-presentation{left:-21px;top:-444px}.docs-icon-punch{left:-21px;top:-444px}.docs-icon-spreadsheet{left:-21px;top:-1014px}.docs-icon-form{left:-21px;top:-1140px}.docs-icon-form-black{left:0;top:-1203px}.docs-icon-drawing{left:0;top:-4044px}.docs-icon-site{left:-21px;top:-2442px}.docs-icon-drawing-black{left:-21px;top:-2904px}.docs-icon-excel{left:-21px;top:-2253px}.docs-icon-powerpoint{left:-21px;top:-2043px}.docs-icon-word{left:0;top:-2778px}.docs-icon-script{left:-21px;top:-3393px}.docs-icon-code{left:-21px;top:-3393px}.docs-icon-insert-script{left:-21px;top:-2673px}.docs-icon-gadget{left:0;top:-2295px}.docs-icon-image{left:0;top:-2442px}.docs-icon-clipboard{left:0;top:-864px}.docs-icon-bold{left:0;top:-1035px}.docs-icon-italic{left:0;top:-3540px}.docs-icon-text-color{left:-21px;top:-2148px}.docs-icon-align-left{left:0;top:-3750px}.docs-icon-align-center{left:-21px;top:-1623px}.docs-icon-align-right{left:-21px;top:-2274px}.docs-icon-align-justify{left:0;top:-2253px}.docs-icon-align-shapes-left{left:-21px;top:-591px}.docs-icon-align-shapes-center{left:0;top:-1140px}.docs-icon-align-shapes-right{left:0;top:-4104px}.docs-icon-align-shapes-top{left:0;top:-2463px}.docs-icon-align-shapes-middle{left:0;top:-801px}.docs-icon-align-shapes-bottom{left:0;top:-402px}.docs-icon-distribute-shapes-horizontally{left:-21px;top:-1371px}.docs-icon-distribute-shapes-vertically{left:-21px;top:-3687px}.docs-icon-valign-top{left:0;top:-3771px}.docs-icon-valign-middle{left:0;top:-297px}.docs-icon-valign-bottom{left:-21px;top:-3582px}.docs-icon-list-number{left:0;top:-3624px}.docs-icon-list-bullet{left:0;top:-2232px}.docs-icon-indent{left:0;top:-3876px}.docs-icon-outdent{left:-21px;top:-864px}.docs-icon-line-spacing{left:-21px;top:-1497px}.docs-icon-columns{left:0;top:-1056px}.docs-icon-underline{left:0;top:-675px}.docs-icon-text-bgcolor{left:-21px;top:-192px}.docs-icon-textbox{left:-21px;top:-1329px}.docs-icon-shapes{left:-21px;top:-2127px}.docs-icon-line-width{left:-21px;top:-2358px}.docs-icon-add-trendline{left:-21px;top:-87px}.docs-icon-data-label{left:0;top:-1602px}.docs-icon-next{left:-21px;top:-2988px}.docs-icon-previous{left:0;top:-1434px}.docs-icon-no-color{left:-21px;top:-2106px}.docs-icon-fill-color{left:0;top:-3645px}.docs-icon-line-color{left:-21px;top:-2694px}.docs-icon-line-type{left:0;top:-2967px}.docs-icon-table{left:0;top:-3351px}.docs-icon-comment{left:-21px;top:-66px}.docs-icon-comment-blank{left:0;top:-3393px}.docs-icon-comment-blank-highlighted{left:0;top:-1560px}.docs-icon-insert-comment{left:-21px;top:-66px}.docs-icon-chart{left:0;top:-423px}.docs-icon-list-number-rtl{left:-21px;top:-2064px}.docs-icon-list-bullet-rtl{left:-21px;top:-3918px}.docs-icon-indent-rtl{left:0;top:-1497px}.docs-icon-outdent-rtl{left:0;top:-2820px}.docs-icon-line-spacing-rtl{left:-21px;top:-2085px}.docs-icon-text-ltr{left:0;top:-192px}.docs-icon-text-rtl{left:-21px;top:-2421px}.docs-icon-sheet-rtl{left:-21px;top:-972px}.docs-icon-share{left:0;top:-3201px}.docs-icon-subscript{left:0;top:-3456px}.docs-icon-superscript{left:-21px;top:-3960px}.docs-icon-strikethrough{left:0;top:-486px}.docs-icon-clear-formatting{left:0;top:-1707px}.docs-icon-link{left:-21px;top:-4125px}.docs-icon-special-character{left:-21px;top:-696px}.docs-icon-close-white{left:-21px;top:-2463px}.docs-icon-close-small{left:-21px;top:-3309px}.docs-icon-close-thin{left:-21px;top:-2022px}.docs-icon-paint-format{left:0;top:-591px}.docs-icon-video{left:0;top:-3414px}.docs-icon-reload{left:-21px;top:-4146px}.docs-icon-reload-rtl{left:0;top:-3960px}.docs-icon-insert-page-break{left:-21px;top:-3666px}.docs-icon-close{left:-21px;top:-654px}.docs-icon-check{left:-21px;top:-1791px}.docs-icon-up{left:-21px;top:-3159px}.docs-icon-down{left:-21px;top:-402px}.docs-icon-add-page{left:0;top:-1959px}.docs-icon-email{left:-21px;top:-108px}.docs-icon-insert-equation{left:-21px;top:-2400px}.docs-icon-insert-horizontal-line{left:-21px;top:-3117px}.docs-icon-tabstop-center{left:0;top:-3792px}.docs-icon-tabstop-center-bottom{left:0;top:-339px}.docs-icon-tabstop-left{left:0;top:-255px}.docs-icon-tabstop-right{left:-21px;top:-1707px}.docs-icon-border-all{left:0;top:-1329px}.docs-icon-border-right{left:0;top:-45px}.docs-icon-border-left{left:-21px;top:-1098px}.docs-icon-border-top{left:0;top:-4083px}.docs-icon-border-bottom{left:-21px;top:-45px}.docs-icon-border-outside{left:-21px;top:-213px}.docs-icon-border-inside{left:-21px;top:-2001px}.docs-icon-border-none{left:0;top:-885px}.docs-icon-border-horizontal{left:0;top:-1245px}.docs-icon-border-vertical{left:0;top:-1644px}.docs-icon-merge{left:0;top:-2022px}.docs-icon-wrap{left:-21px;top:-1749px}.docs-icon-autofilter{left:0;top:-4125px}.docs-icon-autofilter-filled{left:-21px;top:-381px}.docs-icon-insert-function{left:0;top:-3477px}.docs-icon-insert-formula{left:0;top:-738px}.docs-icon-folder-shared{left:0;top:-3117px}.docs-icon-folder-outline{left:0;top:-381px}.docs-icon-folder-outline-hover{left:0;top:-2673px}.docs-icon-folder-outline-pressed{left:-21px;top:-171px}.docs-icon-folder-solid{left:0;top:-2568px}.docs-icon-drive{left:-21px;top:-3624px}.docs-icon-drive-grey{left:-21px;top:-1077px}.docs-icon-drive-grey-hover{left:0;top:-2526px}.docs-icon-drive-grey-pressed{left:0;top:-2358px}.docs-icon-drive-hover{left:0;top:-1665px}.docs-icon-drive-pressed{left:-21px;top:-150px}.docs-icon-drive-large{left:0;top:-1266px}.docs-icon-back{left:0;top:-822px}.docs-icon-back-rtl{left:-21px;top:-3834px}.docs-icon-arrow-more{left:0;top:-276px}.docs-icon-arrow-more-rtl{left:0;top:-993px}.docs-icon-search-this-document{left:0;top:-24px}.docs-icon-arrow-dropdown{left:0;top:-3981px}.docs-icon-word-art{left:-21px;top:-4083px}.docs-icon-delete-x{left:0;top:-2904px}.docs-icon-settings{left:0;top:-780px}.docs-icon-drive-large-wrapper{width:42px;height:42px}.docs-icon-plus{left:0;top:-1392px}.docs-icon-plus-white{left:0;top:-3096px}.docs-icon-alert{left:-21px;top:-3180px}.docs-icon-trash{left:0;top:-507px}.docs-icon-locked{left:-21px;top:-3729px}.docs-icon-unlocked{left:0;top:-2589px}.docs-icon-add-fonts{left:-21px;top:-507px}.docs-icon-enter-compact{left:0;top:-2736px}.docs-icon-exit-compact{left:0;top:-1539px}.docs-icon-mode-edit{left:0;top:-213px}.docs-icon-mode-review{left:-21px;top:-318px}.docs-icon-mode-review-white{left:0;top:-3372px}.docs-icon-mode-view{left:0;top:-654px}.docs-icon-mode-view-white{left:0;top:-3330px}.docs-icon-chat{left:-21px;top:-2946px}.docs-icon-star{left:0;top:-1182px}.docs-icon-duplicate{left:-21px;top:-3855px}.docs-icon-file{left:0;top:-2862px}.docs-icon-opacity{left:0;top:-3561px}.docs-icon-label-slant{left:0;top:-2106px}.docs-icon-point-size{left:-21px;top:-549px}.docs-icon-question{left:0;top:-3687px}.docs-icon-vertical-gridlines{left:-21px;top:-2631px}.docs-icon-left-axis{left:-21px;top:-1686px}.docs-icon-right-axis{left:0;top:-3897px}.docs-icon-left-axis-gridlines{left:-21px;top:-3561px}.docs-icon-right-axis-gridlines{left:0;top:-3729px}.docs-icon-reset{left:0;top:-2043px}.docs-icon-drag-move{left:0;top:-3435px}.docs-icon-col-dragger{left:-21px;top:-927px}.docs-icon-chrome-store{left:-21px;top:-3051px}.docs-icon-fit-area{left:0;top:-3603px}.docs-icon-zoom-out{left:-21px;top:-2526px}.docs-icon-zoom-tool{left:0;top:-2610px}.docs-icon-download{left:0;top:-2946px}.docs-icon-fusion-table{left:-21px;top:-2841px}.docs-icon-spreadsheet-sink{left:0;top:-2064px}.docs-icon-send-responses{left:0;top:-234px}.docs-icon-liveform{left:-21px;top:-423px}.docs-icon-ellipsis{left:0;top:-1833px}.docs-icon-html-preview{left:-21px;top:-2505px}.docs-icon-grid{left:-21px;top:-3264px}.docs-icon-add-animation{left:0;top:-150px}.docs-icon-playhead{left:0;top:-444px}.docs-icon-playhead-rtl{left:0;top:-3519px}.docs-icon-unsupported{left:0;top:-906px}.docs-icon-calendar{left:0;top:-2001px}.docs-zippy-closed{left:0;top:-1728px}.docs-zippy-open{left:-21px;top:-2967px}.docs-icon-bookmark{left:-21px;top:-1182px}.docs-icon-heading{left:0;top:-3030px}.docs-icon-file-blue{left:-21px;top:-1350px}.docs-icon-web-result{left:0;top:-1518px}.docs-icon-mic{left:-21px;top:-1917px}.docs-icon-paragraph{left:0;top:-2274px}.docs-icon-bookmark-black{left:0;top:-1770px}.docs-icon-web-result-blue{left:0;top:-465px}.docs-icon-popout{left:-21px;top:-570px}.docs-icon-checkbox{left:-21px;top:-3414px}.docs-icon-checkbox-type{left:-21px;top:-1308px}.docs-icon-dropdown-type{left:-21px;top:-1644px}.docs-icon-grid-type{left:0;top:-3498px}.docs-icon-image-type{left:0;top:-2925px}.docs-icon-radio-type{left:0;top:-2505px}.docs-icon-scale-type{left:-21px;top:-2883px}.docs-icon-text-type{left:-21px;top:-3009px}.docs-icon-time-type{left:0;top:-972px}.docs-icon-insert-text-block{left:0;top:-3834px}.docs-icon-accepting-responses-on{left:-21px;top:-1119px}.docs-icon-accepting-responses-off{left:0;top:-1371px}.docs-icon-decimal-increase{left:0;top:-3918px}.docs-icon-decimal-decrease{left:0;top:-1308px}.docs-icon-settings-white{left:-21px;top:-3498px}.docs-icon-no-symbol{left:0;top:-2757px}.docs-icon-crop{left:0;top:-3708px}.docs-icon-green-check{left:0;top:-3051px}.docs-icon-font-size{left:0;top:-1413px}.docs-icon-reset-image{left:0;top:-2421px}.docs-icon-r-squared{left:0;top:-2169px}.docs-icon-graph-legend{left:0;top:-2883px}.docs-icon-cast{left:0;top:-1917px}.docs-icon-wrap-overflow{left:-21px;top:-24px}.docs-icon-wrap-wrap{left:-21px;top:-1602px}.docs-icon-wrap-clip{left:0;top:-3309px}.docs-icon-highlights{left:-21px;top:-3939px}.docs-icon-green-back{left:0;top:-360px}.docs-icon-arrow-back-white{left:0;top:-3072px}.docs-icon-arrow-back-white-rtl{left:0;top:-630px}.docs-icon-help{left:0;top:-1875px}.docs-icon-highlight-green{left:-21px;top:-3201px}.docs-icon-explore-black{left:-21px;top:-2799px}.docs-icon-explore-black-padded{left:0;top:-3180px}.docs-icon-explore-green{left:0;top:-3813px}.docs-icon-explore-white{left:0;top:-1686px}.docs-icon-insert-autovis-chart{left:-21px;top:-738px}.docs-icon-insert-autovis-chart-white{left:0;top:-1455px}.docs-icon-zoom-in{left:0;top:-2316px}.docs-icon-thumb-up{left:0;top:-1098px}.docs-icon-thumb-down{left:0;top:-2547px}.docs-icon-dlp-warning{left:0;top:-3582px}.docs-icon-dogfood{left:0;top:-4065px}.docs-icon-add-to-drive{left:0;top:-3939px}.docs-icon-paste-without-formatting{left:-21px;top:-1980px}.docs-icon-qanda{left:-21px;top:-2610px}.docs-icon-update-chart{left:0;top:-1161px}.docs-icon-arrow-back-dark{left:0;top:-3285px}.docs-icon-arrow-back-dark-rtl{left:0;top:-948px}.docs-icon-open-in-external{left:-21px;top:-759px}.docs-icon-unlink{left:0;top:-1350px}.docs-icon-bar-chart{left:-21px;top:-2337px}.docs-icon-column-chart{left:0;top:-1014px}.docs-icon-line-chart{left:0;top:-549px}.docs-icon-pie-chart{left:-21px;top:-1413px}.docs-icon-pie-chart-outline{height:24px;left:0;top:0;width:24px}.docs-icon-named-range{left:0;top:-3243px}.docs-icon-clock{left:0;top:-696px}.docs-icon-cancel{left:-21px;top:-255px}.docs-icon-arrow-line-tool{left:0;top:-4002px}.docs-icon-arrow-tilted{left:-21px;top:-2190px}.docs-icon-unsupported-black{left:-21px;top:-3222px}.docs-icon-text-rotation{left:-21px;top:-2379px}.docs-icon-text-rotation-up{left:0;top:-2148px}.docs-icon-text-rotation-down{left:0;top:-3264px}.docs-icon-text-rotation-angleup{left:-21px;top:-3030px}.docs-icon-text-rotation-angledown{left:-21px;top:-3813px}.docs-icon-text-rotation-vertical{left:0;top:-717px}.docs-icon-text-rotation-none{left:-21px;top:-2652px}.docs-icon-keep-lightbulb{left:-21px;top:-717px}.docs-icon-update-table{left:-21px;top:-3540px}.docs-icon-update-slide{left:-21px;top:-1560px}.docs-icon-overflow-three-dots{left:-21px;top:-2232px}.docs-icon-restore{left:-21px;top:-4002px}.docs-icon-paragraph-border-between{left:0;top:-129px}.docs-icon-paragraph-border-bottom{left:0;top:-1854px}.docs-icon-paragraph-border-left{left:-21px;top:-3876px}.docs-icon-paragraph-border-right{left:-21px;top:-2295px}.docs-icon-paragraph-border-top{left:0;top:-3666px}.docs-icon-diagram-white{left:-21px;top:-1875px}.docs-icon-drive-black{left:-21px;top:-1812px}.docs-icon-file-upload{left:0;top:-2379px}.docs-icon-photos{left:-21px;top:-906px}.docs-icon-keyboard{left:0;top:-318px}.docs-icon-dogfood-white{left:0;top:-2715px}.docs-icon-hierarchy{left:-21px;top:-843px}.docs-icon-timeline{left:0;top:-3138px}.docs-icon-process{left:0;top:-2841px}.docs-icon-transition{left:0;top:-612px}.docs-icon-mask{left:0;top:-1224px}.docs-icon-visibility-off{left:0;top:-2337px}.docs-icon-volume-up{left:-21px;top:-3372px}.docs-icon-camera{left:-21px;top:-2484px}.docs-icon-pivot-table{left:0;top:-1623px}.docs-icon-insert-pivot-table{left:0;top:-3159px}@media screen and (-webkit-min-device-pixel-ratio:2){.docs-icon-img{content:url(//ssl.gstatic.com/docs/common/jfk_sprite_hdpi124.png)}.docs-icon-img-container{height:4380px;position:absolute;width:42px}.docs-icon-save{left:0;top:-3870px}.docs-icon-print{left:0;top:-1578px}.docs-icon-undo,.docs-icon-redo-rtl{left:0;top:-3282px}.docs-icon-redo,.docs-icon-undo-rtl{left:-21px;top:-1137px}.docs-icon-copy{left:-21px;top:-3282px}.docs-icon-cut{left:0;top:-360px}.docs-icon-paste{left:-21px;top:-594px}.docs-icon-document{left:0;top:-42px}.docs-icon-presentation{left:-21px;top:-2292px}.docs-icon-punch{left:-21px;top:-2292px}.docs-icon-spreadsheet{left:-21px;top:-510px}.docs-icon-form{left:-21px;top:-990px}.docs-icon-form-black{left:-21px;top:-3660px}.docs-icon-drawing{left:-21px;top:-3828px}.docs-icon-site{left:0;top:-3177px}.docs-icon-drawing-black{left:0;top:-3618px}.docs-icon-excel{left:0;top:-84px}.docs-icon-powerpoint{left:-21px;top:-3492px}.docs-icon-word{left:-21px;top:-864px}.docs-icon-script{left:-21px;top:-2862px}.docs-icon-code{left:-21px;top:-2862px}.docs-icon-insert-script{left:-21px;top:-3261px}.docs-icon-gadget{left:0;top:-2145px}.docs-icon-image{left:0;top:-4146px}.docs-icon-clipboard{left:-21px;top:-1683px}.docs-icon-bold{left:-21px;top:-1200px}.docs-icon-italic{left:-21px;top:-759px}.docs-icon-text-color{left:0;top:-738px}.docs-icon-align-left{left:0;top:-510px}.docs-icon-align-center{left:0;top:-4083px}.docs-icon-align-right{left:-21px;top:-3198px}.docs-icon-align-justify{left:0;top:-2061px}.docs-icon-align-shapes-left{left:-21px;top:-1704px}.docs-icon-align-shapes-center{left:0;top:-2799px}.docs-icon-align-shapes-right{left:0;top:-615px}.docs-icon-align-shapes-top{left:0;top:-1053px}.docs-icon-align-shapes-middle{left:-21px;top:-2355px}.docs-icon-align-shapes-bottom{left:0;top:-3345px}.docs-icon-distribute-shapes-horizontally{left:-21px;top:-105px}.docs-icon-distribute-shapes-vertically{left:0;top:-3093px}.docs-icon-valign-top{left:0;top:-2967px}.docs-icon-valign-middle{left:0;top:-318px}.docs-icon-valign-bottom{left:-21px;top:-2208px}.docs-icon-list-number{left:0;top:-2757px}.docs-icon-list-bullet{left:-21px;top:-3870px}.docs-icon-indent{left:-21px;top:-1431px}.docs-icon-outdent{left:-21px;top:-4104px}.docs-icon-line-spacing{left:-21px;top:-4041px}.docs-icon-columns{left:0;top:-2463px}.docs-icon-underline{left:-21px;top:-1494px}.docs-icon-text-bgcolor{left:-21px;top:-2187px}.docs-icon-textbox{left:0;top:-1557px}.docs-icon-shapes{left:-21px;top:0}.docs-icon-line-width{left:0;top:-2862px}.docs-icon-add-trendline{left:0;top:-3051px}.docs-icon-data-label{left:0;top:-4314px}.docs-icon-next{left:-21px;top:-2271px}.docs-icon-previous{left:0;top:-2208px}.docs-icon-no-color{left:0;top:-1095px}.docs-icon-fill-color{left:0;top:-2355px}.docs-icon-line-color{left:-21px;top:-381px}.docs-icon-line-type{left:0;top:-1116px}.docs-icon-table{left:-21px;top:-1872px}.docs-icon-comment{left:0;top:-1326px}.docs-icon-comment-blank{left:0;top:-4167px}.docs-icon-comment-blank-highlighted{left:0;top:-489px}.docs-icon-insert-comment{left:0;top:-1326px}.docs-icon-chart{left:0;top:-1431px}.docs-icon-list-number-rtl{left:-21px;top:-2988px}.docs-icon-list-bullet-rtl{left:0;top:-1284px}.docs-icon-indent-rtl{left:0;top:-1977px}.docs-icon-outdent-rtl{left:0;top:-63px}.docs-icon-line-spacing-rtl{left:0;top:-1221px}.docs-icon-text-ltr{left:-21px;top:-4188px}.docs-icon-text-rtl{left:0;top:-678px}.docs-icon-sheet-rtl{left:-21px;top:-234px}.docs-icon-share{left:0;top:-105px}.docs-icon-subscript{left:0;top:-2103px}.docs-icon-superscript{left:0;top:-4041px}.docs-icon-strikethrough{left:0;top:-3135px}.docs-icon-clear-formatting{left:0;top:-1389px}.docs-icon-link{left:0;top:-4335px}.docs-icon-special-character{left:-21px;top:-2082px}.docs-icon-close-white{left:-21px;top:-1242px}.docs-icon-close-small{left:0;top:-3996px}.docs-icon-close-thin{left:0;top:-2988px}.docs-icon-paint-format{left:0;top:-2694px}.docs-icon-video{left:-21px;top:-2019px}.docs-icon-reload{left:-21px;top:-3975px}.docs-icon-reload-rtl{left:-21px;top:-1620px}.docs-icon-insert-page-break{left:-21px;top:-3639px}.docs-icon-close{left:0;top:-1137px}.docs-icon-check{left:0;top:-1242px}.docs-icon-up{left:-21px;top:-531px}.docs-icon-down{left:-21px;top:-3723px}.docs-icon-add-page{left:-21px;top:-1788px}.docs-icon-email{left:-21px;top:-3156px}.docs-icon-insert-equation{left:-21px;top:-3072px}.docs-icon-insert-horizontal-line{left:-21px;top:-2418px}.docs-icon-tabstop-center{left:0;top:-1872px}.docs-icon-tabstop-center-bottom{left:-21px;top:-780px}.docs-icon-tabstop-left{left:-21px;top:-2757px}.docs-icon-tabstop-right{left:0;top:-1515px}.docs-icon-border-all{left:0;top:-1179px}.docs-icon-border-right{left:0;top:-1683px}.docs-icon-border-left{left:-21px;top:-678px}.docs-icon-border-top{left:0;top:-2568px}.docs-icon-border-bottom{left:-21px;top:-822px}.docs-icon-border-outside{left:0;top:-3387px}.docs-icon-border-inside{left:-21px;top:-3345px}.docs-icon-border-none{left:-21px;top:-189px}.docs-icon-border-horizontal{left:0;top:-1305px}.docs-icon-border-vertical{left:-21px;top:-1662px}.docs-icon-merge{left:-21px;top:-3534px}.docs-icon-wrap{left:-21px;top:-4146px}.docs-icon-autofilter{left:0;top:-4272px}.docs-icon-autofilter-filled{left:0;top:-3660px}.docs-icon-insert-function{left:0;top:-1368px}.docs-icon-insert-formula{left:0;top:-3681px}.docs-icon-folder-shared{left:-21px;top:-3240px}.docs-icon-folder-outline{left:0;top:-1200px}.docs-icon-folder-outline-hover{left:-21px;top:-1914px}.docs-icon-folder-outline-pressed{left:0;top:-885px}.docs-icon-folder-solid{left:-21px;top:-573px}.docs-icon-drive{left:0;top:-2334px}.docs-icon-drive-grey{left:0;top:-4125px}.docs-icon-drive-grey-hover{left:-18px;top:-3786px}.docs-icon-drive-grey-pressed{left:0;top:-573px}.docs-icon-drive-hover{left:-21px;top:-2334px}.docs-icon-drive-pressed{left:0;top:-3450px}.docs-icon-drive-large{left:0;top:-3576px}.docs-icon-back{left:0;top:-4293px}.docs-icon-back-rtl{left:0;top:-2547px}.docs-icon-arrow-more{left:-21px;top:-3891px}.docs-icon-arrow-more-rtl{left:0;top:-531px}.docs-icon-search-this-document{left:0;top:-423px}.docs-icon-arrow-dropdown{left:-21px;top:-969px}.docs-icon-word-art{left:-21px;top:-297px}.docs-icon-delete-x{left:0;top:-3891px}.docs-icon-settings{left:-21px;top:-4335px}.docs-icon-drive-large-wrapper{width:42px;height:42px}.docs-icon-plus{left:0;top:-1998px}.docs-icon-plus-white{left:0;top:-2082px}.docs-icon-alert{left:-21px;top:-3408px}.docs-icon-trash{left:-21px;top:-3303px}.docs-icon-locked{left:0;top:-1410px}.docs-icon-unlocked{left:0;top:-1704px}.docs-icon-add-fonts{left:-21px;top:-318px}.docs-icon-enter-compact{left:0;top:-126px}.docs-icon-exit-compact{left:-21px;top:-2967px}.docs-icon-mode-edit{left:-21px;top:-3030px}.docs-icon-mode-review{left:0;top:-468px}.docs-icon-mode-review-white{left:0;top:-255px}.docs-icon-mode-view{left:-21px;top:-1998px}.docs-icon-mode-view-white{left:0;top:-1074px}.docs-icon-chat{left:-21px;top:-2040px}.docs-icon-star{left:0;top:-4188px}.docs-icon-duplicate{left:-21px;top:-1452px}.docs-icon-file{left:0;top:-1452px}.docs-icon-opacity{left:-21px;top:-2694px}.docs-icon-label-slant{left:-21px;top:-1116px}.docs-icon-point-size{left:0;top:-2376px}.docs-icon-question{left:-21px;top:-657px}.docs-icon-vertical-gridlines{left:0;top:-1788px}.docs-icon-left-axis{left:-21px;top:-3765px}.docs-icon-right-axis{left:0;top:-1662px}.docs-icon-left-axis-gridlines{left:0;top:-657px}.docs-icon-right-axis-gridlines{left:-21px;top:-4083px}.docs-icon-reset{left:-21px;top:-1032px}.docs-icon-drag-move{left:0;top:-3555px}.docs-icon-col-dragger{left:-21px;top:-1767px}.docs-icon-chrome-store{left:0;top:-3492px}.docs-icon-fit-area{left:0;top:-3975px}.docs-icon-zoom-out{left:0;top:-2589px}.docs-icon-zoom-tool{left:0;top:-3828px}.docs-icon-download{left:-21px;top:-423px}.docs-icon-fusion-table{left:-21px;top:-3954px}.docs-icon-spreadsheet-sink{left:0;top:-3030px}.docs-icon-send-responses{left:-21px;top:-2145px}.docs-icon-liveform{left:0;top:-3912px}.docs-icon-ellipsis{left:0;top:-3471px}.docs-icon-html-preview{left:-21px;top:-3807px}.docs-icon-grid{left:0;top:-990px}.docs-icon-add-animation{left:0;top:-2484px}.docs-icon-playhead{left:0;top:-2229px}.docs-icon-playhead-rtl{left:0;top:-843px}.docs-icon-unsupported{left:0;top:-1011px}.docs-icon-calendar{left:-21px;top:-3912px}.docs-zippy-closed{left:-21px;top:-1347px}.docs-zippy-open{left:0;top:-2673px}.docs-icon-bookmark{left:-21px;top:-2397px}.docs-icon-heading{left:0;top:-3408px}.docs-icon-file-blue{left:0;top:-2418px}.docs-icon-web-result{left:0;top:-3072px}.docs-icon-mic{left:0;top:-4251px}.docs-icon-paragraph{left:0;top:-339px}.docs-icon-bookmark-black{left:0;top:-147px}.docs-icon-web-result-blue{left:-21px;top:-1011px}.docs-icon-popout{left:0;top:-906px}.docs-icon-checkbox{left:-21px;top:-4062px}.docs-icon-checkbox-type{left:0;top:-3429px}.docs-icon-dropdown-type{left:0;top:-189px}.docs-icon-grid-type{left:-21px;top:-2946px}.docs-icon-image-type{left:0;top:-3240px}.docs-icon-radio-type{left:0;top:-3303px}.docs-icon-scale-type{left:0;top:-2715px}.docs-icon-text-type{left:-21px;top:-2736px}.docs-icon-time-type{left:-21px;top:-552px}.docs-icon-insert-text-block{left:-21px;top:-3681px}.docs-icon-accepting-responses-on{left:0;top:-1347px}.docs-icon-accepting-responses-off{left:0;top:-2505px}.docs-icon-decimal-increase{left:-21px;top:-1536px}.docs-icon-decimal-decrease{left:0;top:-2271px}.docs-icon-settings-white{left:0;top:-1893px}.docs-icon-no-symbol{left:0;top:-1956px}.docs-icon-crop{left:0;top:-2778px}.docs-icon-green-check{left:0;top:-3513px}.docs-icon-font-size{left:0;top:-1032px}.docs-icon-reset-image{left:-21px;top:-3366px}.docs-icon-r-squared{left:0;top:-3933px}.docs-icon-graph-legend{left:0;top:-3849px}.docs-icon-cast{left:0;top:-2019px}.docs-icon-wrap-overflow{left:0;top:-948px}.docs-icon-wrap-wrap{left:-21px;top:-2124px}.docs-icon-wrap-clip{left:0;top:-3639px}.docs-icon-highlights{left:0;top:-3744px}.docs-icon-green-back{left:-21px;top:-2715px}.docs-icon-arrow-back-white{left:0;top:-4017px}.docs-icon-arrow-back-white-rtl{left:0;top:-2439px}.docs-icon-help{left:0;top:-1851px}.docs-icon-highlight-green{left:0;top:-1536px}.docs-icon-explore-black{left:0;top:-1473px}.docs-icon-explore-black-padded{left:0;top:-3114px}.docs-icon-explore-green{left:0;top:-381px}.docs-icon-explore-white{left:0;top:-3534px}.docs-icon-insert-autovis-chart{left:0;top:-2610px}.docs-icon-insert-autovis-chart-white{left:0;top:-297px}.docs-icon-zoom-in{left:-21px;top:-1389px}.docs-icon-thumb-up{left:-21px;top:-339px}.docs-icon-thumb-down{left:-21px;top:-4251px}.docs-icon-dlp-warning{left:-21px;top:-255px}.docs-icon-dogfood{left:0;top:-3786px}.docs-icon-add-to-drive{left:0;top:-21px}.docs-icon-paste-without-formatting{left:0;top:-1158px}.docs-icon-qanda{left:0;top:-3198px}.docs-icon-update-chart{left:0;top:-594px}.docs-icon-arrow-back-dark{left:0;top:-210px}.docs-icon-arrow-back-dark-rtl{left:0;top:-444px}.docs-icon-open-in-external{left:0;top:-234px}.docs-icon-unlink{left:0;top:-276px}.docs-icon-bar-chart{left:0;top:0}.docs-icon-column-chart{left:-21px;top:-2568px}.docs-icon-line-chart{left:-21px;top:-927px}.docs-icon-pie-chart{left:0;top:-717px}.docs-icon-pie-chart-outline{height:24px;left:0;top:-4356px;width:24px}.docs-icon-named-range{left:0;top:-3765px}.docs-icon-clock{left:-21px;top:-843px}.docs-icon-cancel{left:0;top:-1767px}.docs-icon-arrow-line-tool{left:0;top:-168px}.docs-icon-arrow-tilted{left:0;top:-864px}.docs-icon-unsupported-black{left:-21px;top:-3471px}.docs-icon-text-rotation{left:0;top:-1830px}.docs-icon-text-rotation-up{left:0;top:-3009px}.docs-icon-text-rotation-down{left:0;top:-822px}.docs-icon-text-rotation-angleup{left:-21px;top:-1557px}.docs-icon-text-rotation-angledown{left:-21px;top:-1095px}.docs-icon-text-rotation-vertical{left:0;top:-2946px}.docs-icon-text-rotation-none{left:0;top:-2904px}.docs-icon-keep-lightbulb{left:-21px;top:-2610px}.docs-icon-update-table{left:-21px;top:-1179px}.docs-icon-update-slide{left:-21px;top:-2652px}.docs-icon-overflow-three-dots{left:0;top:-969px}.docs-icon-restore{left:-21px;top:-2229px}.docs-icon-paragraph-border-between{left:-21px;top:-3429px}.docs-icon-paragraph-border-bottom{left:-21px;top:-1977px}.docs-icon-paragraph-border-left{left:-21px;top:-615px}.docs-icon-paragraph-border-right{left:-21px;top:-1893px}.docs-icon-paragraph-border-top{left:0;top:-2250px}.docs-icon-diagram-white{left:0;top:-2397px}.docs-icon-drive-black{left:0;top:-3324px}.docs-icon-file-upload{left:-21px;top:-1221px}.docs-icon-photos{left:-21px;top:-4230px}.docs-icon-keyboard{left:-21px;top:-3135px}.docs-icon-dogfood-white{left:0;top:-2040px}.docs-icon-hierarchy{left:0;top:-1263px}.docs-icon-timeline{left:0;top:-1809px}.docs-icon-process{left:-21px;top:-2166px}.docs-icon-transition{left:-21px;top:-699px}.docs-icon-mask{left:-21px;top:-21px}.docs-icon-visibility-off{left:0;top:-2883px}.docs-icon-volume-up{left:0;top:-2652px}.docs-icon-camera{left:-21px;top:-2925px}.docs-icon-pivot-table{left:-21px;top:-2841px}.docs-icon-insert-pivot-table{left:0;top:-2313px}}#googlebar-coldstart{height:28px;line-height:28px;background-color:transparent;padding:0 30px;z-index:1003}.googlebar-coldstart-email-container{background-color:#fff;float:right;height:inherit}.googlebar-coldstart-email{color:#999;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:11px;padding:0 15px}.modal-dialog a{color:#15c}.docs-material #docs-branding-container{margin-top:0;width:64px}.docs-material .docs-branding-icon,.docs-material #docs-branding-container a,.docs-material #docs-branding-logo,.docs-material #docs-drive-logo{height:40px;width:40px}.docs-material #docs-branding-container a,.docs-material #docs-branding-container .docs-branding-logo-no-link{border-radius:50%;margin:4px 0 4px 8px;padding:8px}.docs-material #docs-branding-container a:focus{background-color:rgba(0,0,0,.06);outline:none}.docs-material #docs-menubar,.docs-material #docs-titlebar-container{margin-left:64px}.docs-material .docs-title-outer{margin-left:0}.docs-material #docs-folder:not(.docs-titlebar-badge){margin-top:1px}.docs-material #docs-branding-container{background-color:inherit}.docs-material .docs-branding-icon-img:before{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222.svg)}.docs-material .docs-branding-icon-documents{left:0;top:-6079px}.docs-material .docs-branding-icon-drawings{left:-20px;top:-4336px}.docs-material .docs-branding-icon-default,.docs-material .docs-branding-icon-forms,.docs-material .docs-branding-icon-scripts,.docs-material .docs-branding-icon-drive{left:-20px;top:-5353px}.docs-material .docs-branding-icon-spreadsheets{left:0;top:-1910px}.docs-material .docs-branding-icon-presentations{left:-20px;top:-5475px}.docs-material #docs-branding-container:not(.docs-branding-crossfade-transition-disabled):hover #docs-drive-logo{opacity:0}.docs-material #docs-branding-container:not(.docs-branding-crossfade-transition-disabled):hover #docs-branding-logo{opacity:1}.docs-material #docs-activity-indicator{padding-top:3px}.docs-material .docs-titlebar-badges .jfk-activityIndicator{vertical-align:top}.docs-material #docs-header #docs-titlebar{padding-top:9px}.docs-material #docs-header.docs-hub-appbar #docs-titlebar{padding-top:calc((56px - 24px)/2 - 2px)}.docs-material #docs-header #docs-titlebar-container{max-height:33px}.docs-material #docs-header.docs-hub-appbar #docs-titlebar-container{margin-left:0;max-height:none}.docs-material .docs-menubar{height:31px}.docs-material #docs-branding-container,.docs-material #docs-chrome-cover{height:64px}.docs-material .docs-appbar-circle-button.jfk-button{box-shadow:none;background-color:transparent;background-image:none;cursor:pointer;height:40px;width:40px;border-radius:50%;border-width:1px;border-style:solid;border-color:transparent;box-shadow:none;background-clip:padding-box;cursor:pointer;-webkit-tap-highlight-color:transparent;min-width:0;padding:0;margin:0 9px 0 0}.docs-material .docs-appbar-circle-button.jfk-button .docs-icon{height:24px;width:24px;opacity:0.54}.docs-gm .docs-material .docs-appbar-circle-button.jfk-button .docs-icon{opacity:1}.docs-material .docs-appbar-circle-button.jfk-button-hover,.docs-material .docs-appbar-circle-button.jfk-button:focus{background-color:rgba(0,0,0,.06)}.docs-material .docs-appbar-circle-button.jfk-button-active,.docs-material .docs-appbar-circle-button.jfk-button-checked{background-color:rgba(0,0,0,0.12)}.docs-gm .docs-material .docs-appbar-circle-button.jfk-button-active,.docs-gm .docs-material .docs-appbar-circle-button.jfk-button-checked{background-color:#e6f4ea}.docs-material .docs-appbar-circle-button.jfk-button-active .docs-icon,.docs-material .docs-appbar-circle-button.jfk-button-checked .docs-icon{opacity:0.87}.docs-gm .docs-material .docs-appbar-circle-button.jfk-button-active .docs-icon,.docs-gm .docs-material .docs-appbar-circle-button.jfk-button-checked .docs-icon{opacity:1}.docs-material .docs-appbar-circle-button.jfk-button-disabled .docs-icon{opacity:.26}.docs-gm .docs-material .docs-appbar-circle-button.jfk-button-disabled .docs-icon{opacity:.38}.docs-material .docs-appbar-circle-button.jfk-button-disabled{cursor:inherit}.docs-material .docs-chat.jfk-button{display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;transition:background 0.2s 0.1s;background-color:#e8eaed;background-image:none}.docs-gm .docs-material .docs-chat.jfk-button,.docs-gm .docs-material .docs-chat.jfk-button.jfk-button-clear-outline,.docs-gm .docs-material .docs-chat.jfk-button.jfk-button-active.jfk-button-focused{background-color:#fff;border:2px solid #dadce0;box-shadow:0 0 0 2px #fff}.docs-gm .docs-material .docs-chat.jfk-button.jfk-button-focused{background-color:#fff}.docs-material .docs-chat.jfk-button,.docs-material .docs-chat.jfk-button.jfk-button-clear-outline,.docs-material .docs-chat.jfk-button.jfk-button-active.jfk-button-focused{height:32px;width:32px;border-radius:50%;border-width:2px;border-style:solid;border-color:#fff;box-shadow:none;background-clip:padding-box;cursor:pointer;-webkit-tap-highlight-color:transparent;margin:0 0 0 -8px}.docs-material .docs-chat.jfk-button.jfk-button-hover{background-color:#dadce0}.docs-gm .docs-material .docs-chat.jfk-button.jfk-button-hover,.docs-gm .docs-material .docs-chat.jfk-button.jfk-button-hover.jfk-button-clear-outline,.docs-gm .docs-material .docs-chat.jfk-button.jfk-button-hover.jfk-button-focused{background-color:#dadce0}.docs-gm .docs-material .docs-chat.jfk-button.jfk-button-hover.jfk-button-clear-outline.jfk-button-focused.jfk-button-active{margin:0 0 0 -8px}.docs-material .docs-chat.jfk-button.jfk-button-active{background-color:#bdc1c6}.docs-material .docs-chat.jfk-button.jfk-button-focused{border:4px solid rgba(0,0,0,0.12);margin:-2px -2px -2px -10px}.docs-gm .docs-material .docs-chat.jfk-button.jfk-button-focused{border:4px solid rgba(0,0,0,0.12);margin:-2px -2px -2px -10px;box-shadow:none}.docs-material .docs-chat.jfk-button .docs-icon{-webkit-transition-duration:200ms;-moz-transition-duration:200ms;-o-transition-duration:200ms;transition-duration:200ms;-webkit-transition-property:opacity;-moz-transition-property:opacity;-o-transition-property:opacity;transition-property:opacity;-webkit-transition-timing-function:cubic-bezier(0.4,0.0,0.2,1);-moz-transition-timing-function:cubic-bezier(0.4,0.0,0.2,1);-o-transition-timing-function:cubic-bezier(0.4,0.0,0.2,1);transition-timing-function:cubic-bezier(0.4,0.0,0.2,1);opacity:.71;margin:0}.docs-material .docs-chat.jfk-button.jfk-button-active .docs-icon,.docs-material .docs-chat.jfk-button.jfk-button-checked .docs-icon,.docs-material .docs-chat.jfk-button.jfk-button-focused .docs-icon,.docs-material .docs-chat.jfk-button.jfk-button-hover .docs-icon{opacity:.86}.docs-material .docs-chat.jfk-button.jfk-button-disabled .docs-icon{opacity:0.50}.docs-material .docs-chat-badge{border-radius:50%;border:1px solid #fff;right:-3px;top:-3px}.docs-gm .docs-explore-feedback-title,.docs-gm .docs-explore-feedback-button{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px}.docs-gm .docs-explore-sidebar-title-heading,.docs-gm .docs-explore-sidebar-title-heading-button{font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:16px;font-weight:500;line-height:24px;position:relative;left:auto;height:auto;max-width:calc(100% - 64px);padding:0;right:auto;top:auto}.docs-gm .docs-explore-sidebar-title-heading-button{font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:16px}.docs-gm .docs-explore-serp-webresultscard-header-text,.docs-gm .docs-explore-serp-webresultscard-allresults-text{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px}.docs-gm .docs-explore-serp-enterpriseresultscard-allresults-text{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px}.docs-gm .docs-explore-serp-enterpriseresult-embeddeditems-show-more-button{font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500}.docs-gm .docs-explore-serp-enterpriseresult-snippet{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px}.docs-gm .docs-explore-serp-enterpriseresult-title{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px}.docs-gm .docs-explore-searchbar-labelinput{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px}.docs-gm .docs-explore-card-title-heading{color:#3c4043;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;line-height:24px;text-transform:none}.docs-gm .docs-explore-card-more-button{color:#1a73e8;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;line-height:20px}.docs-gm .docs-explore-card-subtitle{color:#80868b;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;line-height:16px}.docs-material.goog-menu.goog-menu-nocheckbox .goog-menuitem,.docs-material.goog-menu.goog-menu-noicon .goog-menuitem{padding-left:16px}.docs-material.goog-menu .goog-menuitem{padding-left:36px}.docs-material.goog-menu .apps-menuitem .goog-menuitem-checkbox,.docs-material.goog-menu .apps-menuitem .goog-menuitem-icon{left:8px}.docs-material.goog-menu .apps-menuitem.goog-option-selected{background-position:left 5px center}.docs-gm .docs-material.goog-menu .apps-menuitem.goog-option-selected{background-image:none}.docs-gm .docs-material.goog-menu .apps-menuitem.goog-option-selected .goog-menuitem-checkbox{background:no-repeat url(//ssl.gstatic.com/docs/common/material_common_sprite222.svg) -40px -614px;height:18px;width:18px;top:50%;margin-top:-9px}.docs-gm .docs-menubar .goog-control{border:1px solid transparent;border-radius:4px;box-shadow:none;color:#202124;cursor:pointer;font-size:14px;letter-spacing:.2px;padding:4px 6px}.docs-gm .docs-menubar .goog-control-hover{background-color:#f1f3f4}.docs-gm .docs-menubar .goog-control-open{background-color:#e6f4ea}.docs-gm .docs-menubar .goog-control-active,.docs-gm .docs-menubar .goog-control:hover:active{background-color:#ceead6}.docs-gm .docs-menubar .goog-control-disabled{color:#9aa0a6;background-color:white;cursor:default}.docs-gm .docs-menubar .docs-menu-button-open-below,.docs-gm .docs-menubar .docs-menu-button-open-above{z-index:1003}.docs-gm .docs-menubar .goog-control.docs-menu-button-open-below{border-bottom-left-radius:0;border-bottom-right-radius:0}.docs-gm .goog-menu.docs-menu-attached-button-above{border-top-left-radius:0}.docs-gm .goog-menu.docs-menu-attached-button-below{border-bottom-left-radius:0}.docs-gm .goog-menu{border:1px solid transparent;border-radius:4px;box-shadow:0 2px 6px 2px rgba(60,64,67,.15);max-height:calc(100vh - 70px);overflow-y:auto}.docs-gm .goog-menu .goog-dimension-picker,.docs-gm .goog-menu.docs-fontmenu{overflow:hidden}.docs-gm .goog-menu.docs-omnibox-parent,.docs-gm .goog-menu.docs-ruler-context-menu{overflow:visible}.docs-gm .docs-fontmenu{max-height:none;max-height:unset}.docs-gm .goog-menuseparator{border-top:1px solid #dadce0;margin:8px 0 8px 36px}.docs-gm .docs-colormenuitems .goog-menuseparator,.docs-gm .waffle-conditionalformat-default-menu .goog-menuseparator{margin-left:0}.docs-gm .goog-menu-noicon .goog-menuseparator{margin-left:13px}.docs-gm .goog-menuitem{color:#202124;font-size:14px;letter-spacing:.2px;line-height:20px}.docs-gm .goog-menu .goog-menuitem{padding:6px 15px 6px 38px}.docs-gm .goog-menu-noicon .goog-menuitem{padding-left:15px}.docs-gm .goog-menu .apps-menuitem .goog-menuitem-checkbox,.docs-gm .goog-menu .apps-menuitem .goog-menuitem-icon{margin:7px 8px 7px 12px;left:0;top:0}.docs-gm .goog-menuitem .goog-menuitem-content{min-height:20px}.docs-gm .goog-menuitem .goog-submenu-arrow{padding-top:0}.docs-gm .goog-menuitem .docs-toolbar-mode-switcher-menu-description,.docs-gm .goog-menuitem .docs-display-density-toolbar-menuitem-description,.docs-gm .goog-menuitem .punch-qanda-presenter-view-menu-item-description{color:#80868b;font-size:12px;line-height:1}.docs-gm .goog-menuitem-highlight{background-color:#f1f3f4}.docs-gm .goog-menuitem.goog-menuitem-highlight{border-color:#f1f3f4;border-style:dotted;border-width:1px 0;padding-top:5px;padding-bottom:5px}.docs-gm .apps-menuitem.goog-menuitem-highlight{border:none;padding-top:6px;padding-bottom:6px}.docs-gm .docs-submenuitem.goog-menuitem{padding-bottom:0;padding-right:10px;padding-top:0}.docs-gm .docs-fontmenu .goog-menuitem{padding-bottom:6px;padding-right:48px;padding-top:6px}.docs-gm .docs-submenuitem.goog-menuitem-highlight{border:none;border-bottom:1px solid #e6e6e6}.docs-gm .docs-fontmenu .goog-menuitem-highlight{border:none}.docs-gm .goog-menuitem-disabled,.docs-gm .goog-menuitem-disabled .goog-menuitem-content{color:#9aa0a6!important}.docs-gm .goog-menuitem-active:hover:active{background-color:#e8eaed}.docs-gm .goog-menuitem-accel,.docs-gm .goog-menuitem-disabled .goog-menuitem-accel{color:#80868b;font-weight:500}.docs-gm .docs-ruler-context-menu-arrow-before{border:0}.docs-gm .docs-omnibox-autocomplete .goog-menuitem-icon{top:auto}.docs-material #docs-presence-container{display:flex;-webkit-align-items:center;align-items:center;height:36px;margin:0 8px 0 0}.docs-material .docs-presence-plus-widget{display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-end;justify-content:flex-end}.docs-material .docs-presence-plus-widget-open .docs-presence-plus-widget-status{display:none}.docs-material .docs-presence-plus-widget-collabs{height:36px}.docs-material .docs-presence-plus-collab-widget-container{margin:0 0 0 -8px;overflow:visible;height:auto;width:auto}.docs-material .docs-presence-plus-collab-widget{display:flex}.docs-material .docs-presence-plus-collab-widget-color-block,.docs-material.docs-presence-plus-widget-overflow-menu .docs-presence-plus-collab-widget-color-block{height:32px;width:32px;border-radius:50%;border-width:2px;border-style:solid;border-color:#fff;box-shadow:none;background-clip:padding-box;cursor:pointer;-webkit-tap-highlight-color:transparent;background-color:#fff;opacity:1;overflow:visible}.docs-material .docs-presence-plus-collab-widget-image-container,.docs-material.docs-presence-plus-widget-overflow-menu .docs-presence-plus-collab-widget-image-container{height:32px;width:32px;border-radius:50%;padding:0;overflow:visible;display:inline-block;opacity:.5;box-shadow:0 0 1px 0 white}.docs-material .docs-presence-plus-collab-widget-active .docs-presence-plus-collab-widget-image-container{opacity:1}.docs-material .docs-presence-plus-collab-widget-image-border,.docs-material.docs-presence-plus-widget-overflow-menu .docs-presence-plus-collab-widget-image-border{height:28px;width:28px;border-radius:50%;margin:2px;border:none}.docs-material .docs-presence-plus-collab-widget-image,.docs-material.docs-presence-plus-widget-overflow-menu .docs-presence-plus-collab-widget-image{height:28px;width:28px;border-radius:50%;padding:0;left:0}.docs-material .docs-presence-plus-collab-widget-focus:focus{outline:none}.docs-material .docs-presence-plus-collab-widget-focus:focus .docs-presence-plus-collab-widget-color-block{border:4px solid rgba(0,0,0,0.12);margin:-2px}.docs-material .docs-presence-plus-widget-overflow-button{height:32px;width:32px;border-radius:50%;border-width:2px;border-style:solid;border-color:#fff;box-shadow:none;background-clip:padding-box;cursor:pointer;-webkit-tap-highlight-color:transparent;margin:0 0 0 -8px;background-color:#e8eaed;background-image:none;color:rgba(32,33,36,.71)}.docs-material .docs-hub-appbar .docs-presence-plus-widget-overflow-button{height:28px;width:28px;border-radius:50%;border-width:2px;border-style:solid;border-color:#fff;box-shadow:none;background-clip:padding-box;cursor:pointer;-webkit-tap-highlight-color:transparent}.docs-material .docs-hub-appbar .docs-presence-plus-widget-overflow-button .goog-flat-menu-button-caption{line-height:28px}.docs-material .docs-presence-plus-widget-overflow-button.goog-flat-menu-button-focused{border:4px solid rgba(0,0,0,0.12);color:rgba(32,33,36,.86);margin:-2px -2px -2px -10px}.docs-material .docs-presence-plus-widget-overflow-button.goog-flat-menu-button-focused.goog-flat-menu-button-open{border:2px solid rgba(255,255,255,1);margin:0 0 0 -8px}.docs-material .docs-presence-plus-widget-overflow-button.goog-flat-menu-button-open{background-color:#e8eaed;z-index:auto}.docs-material .docs-presence-plus-widget-overflow-button.goog-flat-menu-button-hover{box-shadow:none;background-color:#dadce0;color:rgba(32,33,36,.86)}.docs-material .docs-presence-plus-widget-overflow-button.goog-flat-menu-button-active{background-color:#bdc1c6;color:rgba(32,33,36,.86)}.docs-material .docs-presence-plus-widget-overflow-button.goog-flat-menu-button-open .goog-flat-menu-button-caption{-webkit-transition-duration:200ms;-moz-transition-duration:200ms;-o-transition-duration:200ms;transition-duration:200ms;-webkit-transition-property:opacity;-moz-transition-property:opacity;-o-transition-property:opacity;transition-property:opacity;-webkit-transition-timing-function:cubic-bezier(0.4,0.0,0.2,1);-moz-transition-timing-function:cubic-bezier(0.4,0.0,0.2,1);-o-transition-timing-function:cubic-bezier(0.4,0.0,0.2,1);transition-timing-function:cubic-bezier(0.4,0.0,0.2,1);-webkit-transition-delay:100ms;-moz-transition-delay:100ms;-o-transition-delay:100ms;transition-delay:100ms;opacity:0}.docs-material .docs-presence-plus-widget-overflow-button.goog-flat-menu-button-open .goog-flat-menu-button-dropdown{-webkit-transition-duration:200ms;-moz-transition-duration:200ms;-o-transition-duration:200ms;transition-duration:200ms;-webkit-transition-property:opacity;-moz-transition-property:opacity;-o-transition-property:opacity;transition-property:opacity;-webkit-transition-timing-function:cubic-bezier(0.4,0.0,0.2,1);-moz-transition-timing-function:cubic-bezier(0.4,0.0,0.2,1);-o-transition-timing-function:cubic-bezier(0.4,0.0,0.2,1);transition-timing-function:cubic-bezier(0.4,0.0,0.2,1);-webkit-transition-delay:100ms;-moz-transition-delay:100ms;-o-transition-delay:100ms;transition-delay:100ms;opacity:1}.docs-material .docs-presence-plus-widget-overflow-button .goog-flat-menu-button-caption{-webkit-transition-duration:200ms;-moz-transition-duration:200ms;-o-transition-duration:200ms;transition-duration:200ms;-webkit-transition-property:opacity;-moz-transition-property:opacity;-o-transition-property:opacity;transition-property:opacity;-webkit-transition-timing-function:cubic-bezier(0.4,0.0,0.2,1);-moz-transition-timing-function:cubic-bezier(0.4,0.0,0.2,1);-o-transition-timing-function:cubic-bezier(0.4,0.0,0.2,1);transition-timing-function:cubic-bezier(0.4,0.0,0.2,1);left:-2px;line-height:32px;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:500}.docs-material .docs-presence-plus-widget-overflow-button .goog-flat-menu-button-dropdown{-webkit-transition-duration:200ms;-moz-transition-duration:200ms;-o-transition-duration:200ms;transition-duration:200ms;-webkit-transition-property:opacity;-moz-transition-property:opacity;-o-transition-property:opacity;transition-property:opacity;-webkit-transition-timing-function:cubic-bezier(0.4,0.0,0.2,1);-moz-transition-timing-function:cubic-bezier(0.4,0.0,0.2,1);-o-transition-timing-function:cubic-bezier(0.4,0.0,0.2,1);transition-timing-function:cubic-bezier(0.4,0.0,0.2,1);right:10px;opacity:0;border-width:0 6px 6px;border-color:rgba(32,33,36,.71) transparent}.docs-material .docs-presence-plus-widget-overflow-button.goog-flat-menu-button-active .goog-flat-menu-button-dropdown,.docs-material .docs-presence-plus-widget-overflow-button.goog-flat-menu-button-focused .goog-flat-menu-button-dropdown,.docs-material .docs-presence-plus-widget-overflow-button.goog-flat-menu-button-hover .goog-flat-menu-button-dropdown{border-color:rgba(32,33,36,.86) transparent}.docs-material.docs-presence-plus-widget-overflow-menu{max-height:340px;width:256px;padding:4px 0 8px 0;border-radius:2px;box-shadow:0px 2px 2px 0px rgba(0,0,0,0.14),0px 3px 1px -2px rgba(0,0,0,0.12),0px 1px 5px 0px rgba(0,0,0,0.2)}.docs-material.docs-presence-plus-widget-overflow-menu .goog-menuheader{display:flex;-webkit-align-items:center;align-items:center;margin-left:16px;height:40px;color:rgba(0,0,0,0.54);font-weight:500}.docs-material.docs-presence-plus-widget-overflow-menu .docs-presence-plus-collab-widget-container{margin:0;height:48px;width:100%}.docs-material.docs-presence-plus-widget-overflow-menu .docs-presence-plus-collab-widget-color-block{margin:0 16px 0;border:none}.docs-material.docs-presence-plus-widget-overflow-menu .docs-presence-plus-collab-widget{display:flex;-webkit-align-items:center;align-items:center;height:48px}.docs-material.docs-presence-plus-widget-overflow-menu .docs-presence-plus-collab-widget-name{color:rgba(0,0,0,0.87);margin:0}.docs-material.docs-presence-plus-widget-overflow-menu .docs-presence-plus-collab-widget-idle-text{color:rgba(0,0,0,0.54);margin-left:6px;font-size:13px}@keyframes material-collab-join{from{opacity:0}to{opacity:1}}@-webkit-keyframes material-collab-join{from{opacity:0}to{opacity:1}}.docs-material .docs-presence-plus-collab-widget-enter-material{-webkit-animation-name:material-collab-join;-moz-animation-name:material-collab-join;-o-animation-name:material-collab-join;animation-name:material-collab-join;-webkit-animation-timing-function:cubic-bezier(0,0,.2,1);-moz-animation-timing-function:cubic-bezier(0,0,.2,1);-o-animation-timing-function:cubic-bezier(0,0,.2,1);animation-timing-function:cubic-bezier(0,0,.2,1);-webkit-animation-duration:200ms;-moz-animation-duration:200ms;-o-animation-duration:200ms;animation-duration:200ms;-webkit-animation-fill-mode:both;animation-fill-mode:both}.docs-material .docs-presence-plus-collab-widget-exit-material{-webkit-animation-name:material-collab-join;-moz-animation-name:material-collab-join;-o-animation-name:material-collab-join;animation-name:material-collab-join;-webkit-animation-direction:reverse;-moz-animation-direction:reverse;-o-animation-direction:reverse;animation-direction:reverse;-webkit-animation-timing-function:cubic-bezier(.4,0,.2,1);-moz-animation-timing-function:cubic-bezier(.4,0,.2,1);-o-animation-timing-function:cubic-bezier(.4,0,.2,1);animation-timing-function:cubic-bezier(.4,0,.2,1);-webkit-animation-duration:200ms;-moz-animation-duration:200ms;-o-animation-duration:200ms;animation-duration:200ms;-webkit-animation-fill-mode:both;animation-fill-mode:both}.docs-gm .docs-title-input:focus{border:2px solid #1a73e8!important;margin:-1px;box-shadow:none;border-radius:4px!important}.docs-material .docs-titlebar-button{display:inline-flex;align-items:center;justify-content:center}.docs-revisions-sidebar .docs-revisions-sidebar-title{height:64px}.docs-material .docs-debug-container{margin-right:16px}.docs-material #docs-docos-commentsbutton{box-shadow:none;background-color:transparent;background-image:none;cursor:pointer;height:40px;width:40px;border-radius:50%;border-width:1px;border-style:solid;border-color:transparent;box-shadow:none;background-clip:padding-box;cursor:pointer;-webkit-tap-highlight-color:transparent;min-width:0;padding:0;margin:0 9px 0 0}.docs-material #docs-docos-commentsbutton.jfk-button.jfk-button-hover,.docs-material #docs-docos-commentsbutton:focus{background-color:rgba(0,0,0,.06)}.docs-material #docs-docos-commentsbutton.jfk-button.jfk-button-active,.docs-material #docs-docos-commentsbutton.jfk-button.jfk-button-checked{background-color:rgba(0,0,0,0.12)}.docs-gm .docs-material #docs-docos-commentsbutton.jfk-button.jfk-button-active,.docs-gm .docs-material #docs-docos-commentsbutton.jfk-button.jfk-button-checked{background-color:#e6f4ea}.docs-material #docs-docos-commentsbutton .docs-icon{height:24px;width:24px;opacity:0.54}.docs-material #docs-docos-commentsbutton.jfk-button.jfk-button-active .docs-icon,.docs-material #docs-docos-commentsbutton.jfk-button.jfk-button-checked .docs-icon{opacity:0.87}.docs-material #docs-docos-commentsbutton.jfk-button.jfk-button-disabled .docs-icon{opacity:.26}.docs-gm .docs-material #docs-docos-commentsbutton .docs-icon{opacity:1}.docs-gm .docs-material #docs-docos-commentsbutton.jfk-button.jfk-button-active .docs-icon,.docs-gm .docs-material #docs-docos-commentsbutton.jfk-button.jfk-button-checked .docs-icon{opacity:1}.docs-gm .docs-material #docs-docos-commentsbutton.jfk-button.jfk-button-disabled .docs-icon{opacity:.38}.docs-material #docs-docos-commentsbutton.jfk-button.jfk-button-disabled,.docs-material #docs-titlebar-share-client-button .jfk-button.jfk-button-disabled,.docs-material #docs-script-button-bar .jfk-button.jfk-button-disabled{cursor:inherit}.docs-material #docs-docos-commentsbutton .docs-docos-commentsbutton-badge{background-color:#1a73e8;border:1.5px solid white;border-radius:50%;height:10px;left:22px;position:absolute;top:4px;width:10px;z-index:inherit}.docs-material #docs-titlebar-share-client-button .jfk-button{box-shadow:none;background-color:#4285f4;background-image:none;cursor:pointer;border-color:transparent!important;border-radius:2px;border-width:1px;border-style:inset;color:#fff;font-size:13px;height:30px;padding:0 14px;text-transform:uppercase;font-size:var(--docs-material-font-size-normal,13px);margin-right:12px;padding:0 7px;min-width:0}.docs-material #docs-titlebar-share-client-button .jfk-button-disabled{background-color:rgba(0,0,0,0.12);opacity:1}.docs-material #docs-titlebar-share-client-button .jfk-button .scb-button-icon{margin:0 3px 0 -4px}.docs-material #docs-titlebar-share-client-button .jfk-button:focus{border-color:rgba(0,0,0,0.38)!important}.docs-material #docs-titlebar-share-client-button .jfk-button.jfk-button-hover{box-shadow:0px 2px 2px 0px rgba(0,0,0,0.14),0px 3px 1px -2px rgba(0,0,0,0.12),0px 1px 5px 0px rgba(0,0,0,0.2)}.docs-material #docs-header.docs-hub-appbar #docs-titlebar-share-client-button .jfk-button{padding-left:16px;padding-right:16px}.docs-material #docs-header.docs-hub-appbar #docs-titlebar-share-client-button .jfk-button.jfk-button-hover{height:28px}.docs-material #docs-titlebar-share-client-button .jfk-button.jfk-button-active,.docs-material #docs-titlebar-share-client-button .jfk-button.jfk-button-checked{box-shadow:0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12),0px 2px 4px -1px rgba(0,0,0,0.2);background-color:#3367d6}.docs-material #docs-script-button-bar .jfk-button{box-shadow:none;background-color:rgba(0,0,0,.04);background-image:none;cursor:pointer;border-color:transparent!important;border-radius:2px;border-width:1px;border-style:inset;color:rgba(0,0,0,0.54);font-size:13px;height:30px;padding:0 14px;text-transform:uppercase;margin-right:8px}.docs-material #docs-script-button-bar .jfk-button.jfk-button-disabled{background-color:#fff;color:rgba(0,0,0,0.26)}.docs-material #docs-script-button-bar .jfk-button:focus{border-color:#4285f4!important;color:rgba(0,0,0,.60)}.docs-material #docs-script-button-bar .jfk-button.jfk-button-hover{box-shadow:0px 2px 2px 0px rgba(0,0,0,0.14),0px 3px 1px -2px rgba(0,0,0,0.12),0px 1px 5px 0px rgba(0,0,0,0.2);color:rgba(0,0,0,.60)}.docs-material #docs-script-button-bar .jfk-button.jfk-button-active,.docs-material #docs-script-button-bar .jfk-button.jfk-button-checked{box-shadow:0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12),0px 2px 4px -1px rgba(0,0,0,0.2);background-color:rgba(0,0,0,0.12);color:rgba(0,0,0,0.87)}.docs-material #docs-titlebar-share-client-button .jfk-button.jfk-button-clear-outline,.docs-material #docs-script-button-bar .jfk-button.jfk-button-clear-outline{border-color:transparent!important}#docs-docos-caret{display:none}.docs-material .docs-docos-activitybox{top:60px}.docs-material #docs-header .docs-titlebar-buttons{align-items:center;background-color:#fff;display:flex;height:64px;padding:0 12px 0 16px;top:0;z-index:900}.docs-material #docs-header.docs-hub-appbar .docs-titlebar-buttons{background-color:transparent;height:56px}.docs-material #docs-header .docs-titlebar-buttons.docs-titlebar-occluding::before{background:linear-gradient(to right,transparent,rgba(60,64,67,.1) 70%,rgba(60,64,67,.2) 100%);content:'';height:100%;left:-6px;position:absolute;width:6px;top:0}.docs-material #docs-header .docs-titlebar-buttons-rtl.docs-titlebar-occluding::before{background:linear-gradient(to left,transparent,rgba(60,64,67,.1) 70%,rgba(60,64,67,.2) 100%)}.docs-material #docs-header .docs-titlebar-buttons #docs-titlebar-edit-buttons{display:inherit;align-items:inherit}.docs-material .docs-titlebar-buttons .onegoogle-material-minibar{text-align:left}.docs-material #googlebar-coldstart{height:32px;width:32px;border-radius:50%;background-color:#0f9d58;margin:0 8px 0 0;padding:0;z-index:auto}.docs-material #googlebar-coldstart .docs-icon-img{opacity:0.54}.docs-gm .docs-title-untitled{font-style:normal}.docs-gm #docs-titlebar-share-client-button .jfk-button{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;padding:9px 16px 10px 12px;text-transform:capitalize}.docs-gm #docs-titlebar-share-client-button .jfk-button-disabled{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#f1f3f4;color:#3c4043;opacity:0.38;padding:9px 16px 10px 12px}.docs-gm #docs-titlebar-share-client-button .jfk-button .scb-button-icon{margin:0 3px 0 -4px}.docs-gm #docs-titlebar-share-client-button .jfk-button:focus{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#4f9e67;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15);padding:9px 16px 10px 12px;border-color:transparent!important}.docs-gm #docs-titlebar-share-client-button .jfk-button.jfk-button-hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#2a8947;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15);padding:9px 16px 10px 12px}.docs-gm #docs-titlebar-share-client-button .jfk-button.jfk-button-hover:focus{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#62a877;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15);padding:9px 16px 10px 12px}.docs-gm #docs-titlebar-share-client-button .jfk-button.jfk-button-active,.docs-gm #docs-titlebar-share-client-button .jfk-button.jfk-button-checked{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#62a877;box-shadow:0 2px 6px 2px rgba(52,168,83,0.15);padding:9px 16px 10px 12px}.docs-gm #docs-titlebar-share-client-button .decoupled-docs-share-button.docs-titlebar-button.jfk-button{padding:9px 16px 10px 16px}.docs-material #docs-recall-titlebar-search-menu-container{align-self:flex-start;margin:12px 16px 0px 16px}.docs-material .docs-title-bar-find-icon-container{height:24px;width:24px}.goog-toolbar-button,.goog-toolbar-menu-button{-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;background:0;border-color:transparent;border-style:solid;border-width:1px;outline:none;padding:0;height:24px;color:#333;line-height:24px;list-style:none;font-size:11px;font-weight:bold;text-decoration:none;vertical-align:middle;cursor:default}.goog-toolbar-button-outer-box,.goog-toolbar-button-inner-box .goog-toolbar-menu-button-outer-box,.goog-toolbar-menu-button-inner-box{border:0;vertical-align:top}.goog-toolbar-button-outer-box,.goog-toolbar-menu-button-outer-box{margin:0;padding:0}.goog-toolbar-button-inner-box,.goog-toolbar-menu-button-inner-box{padding:0 2px}.goog-toolbar-button-hover,.goog-toolbar-button-active,.goog-toolbar-button-checked,.goog-toolbar-button-selected{color:#222;padding:0}.goog-toolbar-button-hover,.goog-toolbar-menu-button-hover{border-color:#c6c6c6!important;color:#222}.goog-toolbar-menu-button-open{color:#222}.goog-toolbar-button-hover,.goog-toolbar-menu-button-hover{-webkit-box-shadow:0 1px 1px rgba(0,0,0,.1);-moz-box-shadow:0 1px 1px rgba(0,0,0,.1);box-shadow:0 1px 1px rgba(0,0,0,.1);background-color:#f8f8f8;background-image:-webkit-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-moz-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-ms-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-o-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:linear-gradient(top,#f8f8f8,#f1f1f1)}.goog-toolbar-button-active,.goog-toolbar-menu-button-active{-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1);background-color:#f6f6f6;background-image:-webkit-linear-gradient(top,#f6f6f6,#f1f1f1);background-image:-moz-linear-gradient(top,#f6f6f6,#f1f1f1);background-image:-ms-linear-gradient(top,#f6f6f6,#f1f1f1);background-image:-o-linear-gradient(top,#f6f6f6,#f1f1f1);background-image:linear-gradient(top,#f6f6f6,#f1f1f1);border-color:#c6c6c6}.goog-toolbar-button-selected,.goog-toolbar-button-checked,.goog-toolbar-menu-button-open{-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1);background-color:#eee;background-image:-webkit-linear-gradient(top,#eee,#e0e0e0);background-image:-moz-linear-gradient(top,#eee,#e0e0e0);background-image:-ms-linear-gradient(top,#eee,#e0e0e0);background-image:-o-linear-gradient(top,#eee,#e0e0e0);background-image:linear-gradient(top,#eee,#e0e0e0);border-color:#ccc}.goog-toolbar-button-disabled,.goog-toolbar-menu-button-disabled{color:#222!important;opacity:0.3;filter:alpha(opacity=30)}.goog-toolbar-button-collapse-right,.goog-toolbar-button-collapse-right .goog-toolbar-button-outer-box,.goog-toolbar-button-collapse-right .goog-toolbar-button-inner-box{margin-right:0}.goog-toolbar-button-collapse-left,.goog-toolbar-button-collapse-left .goog-toolbar-button-outer-box,.goog-toolbar-button-collapse-left .goog-toolbar-button-inner-box{margin-left:0}.goog-toolbar-menu-button-dropdown{background:url(//ssl.gstatic.com/ui/v1/disclosure/small-grey-disclosure-arrow-down.png) center no-repeat;float:right;margin:10px 2px 0 3px;padding:0;opacity:.8;vertical-align:middle;width:5px;height:7px;*float:none;*position:relative;*top:-3px}.goog-toolbar-separator{border-left:1px solid #ccc;height:17px;line-height:normal;list-style:none;margin:0 2px;outline:none;overflow:hidden;padding:0;text-decoration:none;vertical-align:middle;width:0}.goog-toolbar-select .goog-toolbar-menu-button-dropdown{background:url(//ssl.gstatic.com/ui/v1/disclosure/small-grey-disclosure-arrow-down.png) center no-repeat;height:11px;margin-top:7px;width:7px;-webkit-transform:none;-moz-transform:none;transform:none;filter:none}.goog-toolbar-menu-button-caption{padding:0;margin:0}.docs-material #docs-toolbar-wrapper{border-top:1px solid #e0e0e0;border-bottom:1px solid #e0e0e0;background:#fff;box-shadow:none}.docs-gm #docs-toolbar-wrapper{border-top:1px solid #dadce0;border-bottom:1px solid #dadce0}.docs-material #docs-side-toolbar{margin:0 21px 0 0}.docs-material.companion-enabled #docs-side-toolbar{margin:0 4px 0 0}.docs-material #docs-toolbar-wrapper,.docs-material #docs-equationtoolbar,.docs-material .docs-printpreview-toolbar,.docs-material #docs-header.docs-hub-appbar #docs-titlebar-container{padding:0 21px 0 22px}.docs-material #docs-header.docs-hub-appbar #docs-titlebar-container{padding-left:24px}.docs-material #docs-equationtoolbar,.docs-material .docs-printpreview-toolbar{background:#fff}.docs-material #docs-equationtoolbar{border-top-width:0;border-bottom:1px solid #e0e0e0}.docs-material.companion-enabled #docs-equationtoolbar{padding-right:4px}.docs-gm #docs-equationtoolbar .goog-toolbar-menu-button-inner-box{padding-top:0}.docs-gm #docs-equationtoolbar .goog-toolbar-menu-button-caption{padding-top:2px}#hide-equation-toolbar-button{float:right}.docs-gm #docs-omnibox-toolbar .docs-omnibox-input{height:26px}.docs-gm #docs-omnibox-toolbar .docs-omnibox-autocomplete{margin:6px 4px 6px 1px}.docs-gm .goog-toolbar,.docs-gm #docs-toolbar{min-height:38px}.docs-material .goog-toolbar-button,.docs-material .goog-toolbar-combo-button,.docs-material .goog-toolbar-menu-button{box-shadow:none;background-color:#fff;background-image:none;cursor:pointer;border-color:transparent!important;border-radius:2px;border-width:1px}.docs-material .goog-toolbar-button-hover,.docs-material .goog-toolbar-menu-button-hover,.docs-material .goog-toolbar-combo-button-hover,.docs-material .docs-toolbar-button-split-sympathy-hover,.docs-material .docs-toolbar-split-create-button,.docs-material .docs-toolbar-split-create-button.goog-toolbar-button-hover,.docs-material .docs-toolbar-split-create-button.goog-toolbar-menu-button-hover,.docs-gm .docs-material.trix-palette .goog-palette-cell-hover{box-shadow:none;background-color:rgba(0,0,0,.06);background-image:none;cursor:pointer;border-color:transparent!important;border-radius:2px;border-width:1px;cursor:pointer}.docs-gm .docs-material .goog-toolbar-button-hover,.docs-gm .docs-material .goog-toolbar-menu-button-hover,.docs-gm .docs-material .goog-toolbar-combo-button-hover,.docs-gm .docs-material .docs-toolbar-button-split-sympathy-hover,.docs-gm .docs-material .docs-toolbar-split-create-button,.docs-gm .docs-material .docs-toolbar-split-create-button.goog-toolbar-button-hover,.docs-gm .docs-material .docs-toolbar-split-create-button.goog-toolbar-menu-button-hover .docs-gm .docs-material.trix-palette .goog-palette-cell-hover{background-color:#f1f3f4}.docs-material .goog-toolbar-button-active,.docs-material .goog-toolbar-button-checked,.docs-material .goog-toolbar-button-selected,.docs-material .goog-toolbar-combo-button-open,.docs-material .goog-toolbar-menu-button-open,.docs-material .docs-toolbar-split-create-button.goog-toolbar-button-active,.docs-material .docs-toolbar-split-create-button.goog-toolbar-menu-button-active,.docs-material .docs-toolbar-split-create-button.goog-toolbar-menu-button-open,.docs-gm .docs-material.trix-palette .goog-palette-cell-selected{box-shadow:none;background-color:rgba(0,0,0,0.12);background-image:none;cursor:pointer;border-color:transparent!important;border-radius:2px;border-width:1px}.docs-gm .docs-material .goog-toolbar-button-active,.docs-gm .docs-material .goog-toolbar-button-checked,.docs-gm .docs-material .goog-toolbar-button-selected,.docs-gm .docs-material .goog-toolbar-combo-button-open,.docs-gm .docs-material .goog-toolbar-menu-button-open,.docs-gm .docs-material .docs-toolbar-split-create-button.goog-toolbar-button-active,.docs-gm .docs-material .docs-toolbar-split-create-button.goog-toolbar-menu-button-active,.docs-gm .docs-material .docs-toolbar-split-create-button.goog-toolbar-menu-button-open,.docs-gm .docs-material.trix-palette .goog-palette-cell-selected{background-color:#e6f4ea;color:#188038}.docs-material .goog-toolbar-button,.docs-material .goog-toolbar-menu-button{margin:3px 1px 0;height:26px;line-height:26px;color:rgba(0,0,0,.7)}.docs-material .goog-toolbar-button-inner-box,.docs-material .goog-toolbar-menu-button-inner-box{height:26px;min-width:26px}.docs-material .docs-toolbar-button-split-left .goog-toolbar-button-inner-box{min-width:26px}.docs-material .goog-toolbar-toggle-button.goog-toolbar-button-checked+.goog-toolbar-toggle-button.goog-toolbar-button-checked{border-left-color:#ccc;border-left-style:solid;border-left-width:1px;border-top-left-radius:2px;border-bottom-left-radius:2px;margin-left:1px}.docs-material .goog-toolbar-toggle-button.goog-toolbar-button-checked+.goog-toolbar-toggle-button.goog-toolbar-button-checked .goog-toolbar-button-outer-box .goog-toolbar-button-inner-box,.docs-material .goog-toolbar-toggle-button.goog-toolbar-button-checked+.goog-toolbar-toggle-button.goog-toolbar-button-checked.goog-toolbar-button-hover .goog-toolbar-button-outer-box .goog-toolbar-button-inner-box{margin-left:0}.docs-material .goog-toolbar-button .docs-icon,.docs-material .goog-toolbar-menu-button .docs-icon{opacity:0.54}.docs-gm .docs-material .goog-toolbar-button .docs-icon,.docs-gm .docs-material .goog-toolbar-menu-button .docs-icon,.docs-gm .docs-material .goog-toolbar-combo-button-dropdown,.docs-gm .docs-material .goog-toolbar-menu-button-dropdown{opacity:1}.docs-material .goog-toolbar-button-hover .docs-icon,.docs-material .goog-toolbar-button-selected .docs-icon,.docs-material .goog-toolbar-button-checked .docs-icon,.docs-material .goog-toolbar-button-active .docs-icon,.docs-material .goog-toolbar-menu-button-hover .docs-icon,.docs-material .goog-toolbar-menu-button-selected .docs-icon,.docs-material .goog-toolbar-menu-button-checked .docs-icon,.docs-material .goog-toolbar-menu-button-open .docs-icon{opacity:0.87}.docs-gm .docs-material .goog-toolbar-button-hover .docs-icon,.docs-gm .docs-material .goog-toolbar-button-selected .docs-icon,.docs-gm .docs-material .goog-toolbar-button-checked .docs-icon,.docs-gm .docs-material .goog-toolbar-button-active .docs-icon,.docs-gm .docs-material .goog-toolbar-menu-button-hover .docs-icon,.docs-gm .docs-material .goog-toolbar-menu-button-selected .docs-icon,.docs-gm .docs-material .goog-toolbar-menu-button-checked .docs-icon,.docs-gm .docs-material .goog-toolbar-menu-button-open .docs-icon{opacity:1}.docs-gm .goog-toolbar-button-inner-box,.docs-gm .goog-toolbar-menu-button-inner-box{height:24px;min-width:24px}.docs-gm .goog-toolbar-button .docs-icon{margin:0 0 1px 0}.docs-gm .goog-toolbar-button.docs-icon-toolbar-button-with-text .docs-icon-toolbar-button-with-text-icon-container{margin-right:4px}.docs-gm .goog-toolbar-menu-button.docs-textcolormenubutton .docs-icon{margin-top:1px}.docs-material .goog-toolbar-separator.goog-inline-block{border-left:1px solid #e0e0e0;margin:0 3px}.docs-material .docs-toolbar-small-separator+div.goog-toolbar-button,.docs-material .docs-toolbar-small-separator+div.goog-toolbar-menu-button{margin-left:1px}.docs-gm .goog-toolbar-separator.goog-inline-block{border-left:1px solid #dadce0;margin:9px 4px;height:20px}.docs-material .docs-toolbar-button-split-left,.docs-material .docs-toolbar-button-split-left.goog-inline-block{margin-right:0}.docs-material .docs-toolbar-button-split-right,.docs-material .docs-toolbar-button-split-right.goog-inline-block{margin-left:0}.docs-material .docs-toolbar-button-split-right.goog-toolbar-button-hover,.docs-material .docs-toolbar-button-split-right.goog-toolbar-menu-button-hover,.docs-material .docs-toolbar-button-split-right.docs-toolbar-button-split-sympathy-hover,.docs-material .docs-toolbar-button-split-left+.docs-toolbar-button-split-right.goog-toolbar-menu-button-open,.docs-material .docs-toolbar-split-create-button+.docs-toolbar-button-split-right{border-left-color:rgba(0,0,0,0.12)!important}.docs-gm .docs-material .docs-toolbar-button-split-right.goog-toolbar-button-hover,.docs-gm .docs-material .docs-toolbar-button-split-right.goog-toolbar-menu-button-hover,.docs-gm .docs-material .docs-toolbar-button-split-right.docs-toolbar-button-split-sympathy-hover,.docs-gm .docs-material .docs-toolbar-button-split-left+.docs-toolbar-button-split-right.goog-toolbar-menu-button-open,.docs-gm .docs-material .docs-toolbar-split-create-button+.docs-toolbar-button-split-right{border-left-color:#f1f3f4!important}.docs-material .docs-toolbar-split-create-button.goog-toolbar-menu-button{margin-right:3px}.docs-material .goog-toolbar-menu-button-dropdown,.docs-material .docs-toolbar-split-create-button .goog-toolbar-menu-button-dropdown,.docs-material .goog-toolbar-combo-button-dropdown{margin-top:10px}.docs-gm .docs-gm-arrow .docs-icon{margin:0}.docs-material .goog-toolbar-select .goog-toolbar-menu-button-dropdown{margin-top:8px}.docs-gm .docs-gm-arrow.goog-toolbar-menu-button-dropdown,.docs-gm .docs-toolbar-split-create-button .goog-toolbar-menu-button-dropdown,.docs-gm .docs-gm-arrow.goog-toolbar-combo-button-dropdown{background:none;margin:0 -1px 0 -3px;width:13px}.docs-gm .goog-toolbar-select .goog-toolbar-menu-button-outer-box .goog-toolbar-menu-button-inner-box .goog-toolbar-menu-button-dropdown{margin-right:-1px}.docs-material .goog-toolbar-combo-button{height:26px;line-height:26px;vertical-align:inherit;margin:0 1px}.docs-material .goog-toolbar-combo-button-input{color:rgba(0,0,0,.7)}.docs-material .goog-toolbar-combo-button-hover .goog-toolbar-combo-button-input{border-right-color:rgba(0,0,0,0.12)!important}.docs-material .goog-toolbar-combo-button-input,.docs-material .goog-toolbar-combo-button-input:focus{height:22px!important}.docs-material .goog-toolbar-combo-button-input:focus{border:1px solid #4d90fe!important}.docs-gm .goog-toolbar-button,.docs-gm .goog-toolbar-menu-button,.docs-gm .goog-toolbar-combo-button,.docs-gm #docs-equationtoolbar .goog-toolbar-button,.docs-gm #docs-equationtoolbar .goog-toolbar-menu-button,.docs-gm .trix-palette .goog-palette-cell{height:24px;line-height:24px;margin:6px 1px;top:0}.docs-gm .goog-toolbar-button-disabled,.docs-gm .goog-toolbar-menu-button-disabled,.docs-gm .trix-palette .goog-palette-cell-disabled{color:#5f6368!important;cursor:inherit;opacity:.38}.docs-gm .goog-toolbar-combo-button-input{box-sizing:border-box;height:20px!important;width:48px!important}.docs-gm .goog-toolbar-combo-button-open{background-color:#f1f3f4}.docs-gm .goog-toolbar-combo-button-input::selection{background-color:#e6f4ea}.docs-gm .goog-toolbar-combo-button-input:focus{border:2px solid #1a73e8!important;border-radius:4px;padding:0 7px}.docs-material .goog-color-menu-button-indicator{height:20px;border-bottom-color:transparent}.docs-material .docs-textcolormenubutton .goog-toolbar-menu-button-outer-box .goog-toolbar-menu-button-inner-box .goog-toolbar-menu-button-caption .goog-color-menu-button-indicator{bottom:0}.docs-material.docs-toolbar-more-bubble{border:0;box-shadow:0px 2px 2px 0px rgba(0,0,0,0.14),0px 3px 1px -2px rgba(0,0,0,0.12),0px 1px 5px 0px rgba(0,0,0,0.2);border-radius:2px}.docs-material.docs-toolbar-more-bubble .jfk-bubble-arrowup .jfk-bubble-arrowimplafter,.docs-material.docs-toolbar-more-bubble .jfk-bubble-arrowup .jfk-bubble-arrowimplbefore{border-color:transparent}.docs-material.docs-toolbar-more-toolbar{background:#fff;border-radius:2px;padding:0 4px}.docs-gm .docs-toolbar-more-bubble{border-radius:4px;box-shadow:0 2px 6px 2px rgba(60,64,67,.15)}.docs-gm .docs-toolbar-more-toolbar{border-radius:4px}.docs-gm .jfk-tooltip{}.jfk-button{font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500}.jfk-button-flat{font-weight:normal}.goog-toolbar-button,.goog-toolbar-menu-button{font-weight:500;font-size:11px;font-size:var(--docs-material-font-size-12,11px)}.docs-gm #docs-editor,.docs-gm #docs-editor-container{background:#f8f9fa}.goog-tab{font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500}.goog-flat-menu-button-caption{font-weight:500;font-weight:var(--docs-material-font-weight-normal,500)}.modal-dialog-buttons{font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif}.modal-dialog-buttons button{font-weight:500}.modal-dialog-title{font-size:16px;font-size:var(--docs-material-font-size-22,16px)}.goog-flat-menu-button{font-weight:500}.jfk-countrypicker-countryCurrent,.jfk-countrypicker-countryCurrent:hover{font-weight:500}.jfk-accordion .goog-zippy-expanded{font-weight:500}.jfk-titleLink{font-weight:500}.jfk-countrypicker-countryCurrent,.jfk-countrypicker-countryCurrent:hover{font-weight:500}.jfk-slideToggle{font-weight:500}.jfk-tooltip{font-weight:500;font-size:11px;font-size:var(--docs-material-font-size-12,11px)}.jfk-bubble-arrowdown .jfk-bubble-arrowimplbefore,.jfk-bubble-arrowup .jfk-bubble-arrowimplbefore{border-color:#dadce0 transparent}.apps-shortcutshelpcontentimpl-title-container{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-family:var(--docs-material-header-font-family,Roboto,RobotoDraft,Helvetica,Arial,sans-serif)}.apps-shortcutshelppopup-title-container{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-family:var(--docs-material-header-font-family,Roboto,RobotoDraft,Helvetica,Arial,sans-serif)}.docs-gm .docs-debug-container{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif}.docs-gm .docs-rotationhandle-circle,.docs-gm .docs-rotationhandle-stick,.docs-gm .docs-squarehandleselectionbox-handle,.docs-gm .waffle-obj-drag-component{background-color:#1a73e8}.docs-gm .docs-rotationhandle-outline,.docs-gm .docs-squarehandleselectionbox-border,.docs-gm .docs-roundedcornerselectionbox-border{border-color:#1a73e8}.docs-gm .docs-rotationhandle-stick{height:24px}.docs-gm .punch-animation-sidebar-play.jfk-button,.docs-gm .punch-animation-sidebar-stop.jfk-button,.docs-gm .waffle-filterbox-button-container .jfk-button-action,.docs-gm .docs-suggestiondialog-accept-container .jfk-button,.docs-gm .docs-suggestiondialog-accept-container .goog-flat-menu-button,.docs-gm .docs-offline-optinpromo-buttons .jfk-button-action{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;cursor:pointer}.docs-gm .punch-animation-sidebar-play.jfk-button-hover,.docs-gm .punch-animation-sidebar-stop.jfk-button-hover,.docs-gm .waffle-filterbox-button-container .jfk-button-action.jfk-button-hover,.docs-gm .docs-suggestiondialog-accept-container .jfk-button-hover,.docs-gm .docs-suggestiondialog-accept-container .goog-flat-menu-button-hover,.docs-gm .docs-offline-optinpromo-buttons .jfk-button-action.jfk-button-hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#2a8947;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15)}.docs-gm .punch-animation-sidebar-play.jfk-button-focused,.docs-gm .punch-animation-sidebar-stop.jfk-button-focused,.docs-gm .waffle-filterbox-button-container .jfk-button-action.jfk-button-focused,.docs-gm .docs-suggestiondialog-accept-container .jfk-button-focused,.docs-gm .docs-suggestiondialog-accept-container .goog-flat-menu-button-focused,.docs-gm .docs-offline-optinpromo-buttons .jfk-button-action.jfk-button-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#4f9e67;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15)}.docs-gm .punch-animation-sidebar-play.jfk-button-hover.jfk-button-focused,.docs-gm .punch-animation-sidebar-stop.jfk-button-hover.jfk-button-focused,.docs-gm .waffle-filterbox-button-container .jfk-button-action.jfk-button-hover.jfk-button-focused,.docs-gm .docs-suggestiondialog-accept-container .jfk-button-hover.jfk-button-focused,.docs-gm .docs-suggestiondialog-accept-container .goog-flat-menu-button-hover.goog-flat-menu-button-focused,.docs-gm .docs-offline-optinpromo-buttons .jfk-button-action.jfk-button-hover.jfk-button-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#62a877;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15)}.docs-gm .punch-animation-sidebar-play.jfk-button-pressed,.docs-gm .punch-animation-sidebar-stop.jfk-button-pressed,.docs-gm .waffle-filterbox-button-container .jfk-button-action.jfk-button-pressed,.docs-gm .docs-suggestiondialog-accept-container .jfk-button-pressed,.docs-gm .docs-suggestiondialog-accept-container .goog-flat-menu-button-pressed,.docs-gm .docs-offline-optinpromo-buttons .jfk-button-action.jfk-button-pressed{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#62a877;box-shadow:0 2px 6px 2px rgba(52,168,83,0.15)}.docs-gm .punch-animation-sidebar-play.jfk-button-disabled,.docs-gm .punch-animation-sidebar-stop.jfk-button-disabled,.docs-gm .waffle-filterbox-button-container .jfk-button-action.jfk-button-disabled,.docs-gm .docs-suggestiondialog-accept-container .jfk-button-disabled,.docs-gm .docs-suggestiondialog-accept-container .goog-flat-menu-button-disabled,.docs-gm .docs-offline-optinpromo-buttons .jfk-button-action.jfk-button-disabled{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#f1f3f4;color:#3c4043;opacity:0.38;cursor:default}.docs-gm .docs-image-effect-adjustment-reset-button,.docs-gm .waffle-filterbox-button-container .jfk-button-standard,.docs-gm .docs-suggestiondialog-reject-container .jfk-button,.docs-gm .docs-suggestiondialog-reject-container .goog-flat-menu-button,.motion-ui .punch-animation-sidebar-add.goog-flat-button,.docs-gm .docs-offline-optinpromo-buttons .jfk-button-standard{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:white;border:1px solid #dadce0!important;color:#188038;cursor:pointer}.docs-gm .docs-image-effect-adjustment-reset-button.jfk-button-hover,.docs-gm .waffle-filterbox-button-container .jfk-button-standard.jfk-button-hover,.docs-gm .docs-suggestiondialog-reject-container .jfk-button-hover,.docs-gm .docs-suggestiondialog-reject-container .goog-flat-menu-button-hover,.motion-ui .punch-animation-sidebar-add.goog-flat-button-hover,.docs-gm .docs-offline-optinpromo-buttons .jfk-button-standard.jfk-button-hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#f8fcf9;border:1px solid #c8e7d1!important}.docs-gm .docs-image-effect-adjustment-reset-button.jfk-button-focused,.docs-gm .waffle-filterbox-button-container .jfk-button-standard.jfk-button-focused,.docs-gm .docs-suggestiondialog-reject-container .jfk-button-focused,.docs-gm .docs-suggestiondialog-reject-container .goog-flat-menu-button-focused,.motion-ui .punch-animation-sidebar-add.goog-flat-button-focused,.docs-gm .docs-offline-optinpromo-buttons .jfk-button-standard.jfk-button-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#e7f5eb;border:1px solid #bbe2c6!important}.docs-gm .docs-image-effect-adjustment-reset-button.jfk-button-hover.jfk-button-focused,.docs-gm .waffle-filterbox-button-container .jfk-button-standard.jfk-button-hover.jfk-button-focused,.docs-gm .docs-suggestiondialog-reject-container .jfk-button-hover.jfk-button-focused,.docs-gm .docs-suggestiondialog-reject-container .goog-flat-menu-button-hover.goog-flat-menu-button-focused,.motion-ui .punch-animation-sidebar-add.goog-flat-button-hover.goog-flat-button-focused,.docs-gm .docs-offline-optinpromo-buttons .jfk-button-standard.jfk-button-hover.jfk-button-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#dff2e4;border:1px solid #b5e0c1!important}.docs-gm .docs-image-effect-adjustment-reset-button.jfk-button-pressed,.docs-gm .waffle-filterbox-button-container .jfk-button-standard.jfk-button-pressed,.docs-gm .docs-suggestiondialog-reject-container .jfk-button-pressed,.docs-gm .docs-suggestiondialog-reject-container .goog-flat-menu-button-pressed,.motion-ui .punch-animation-sidebar-add.goog-flat-button-pressed,.docs-gm .docs-offline-optinpromo-buttons .jfk-button-standard.jfk-button-pressed{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#dff2e4;border:1px solid transparent!important;box-shadow:0 2px 6px 2px rgba(60,64,67,.15)}.docs-gm .docs-image-effect-adjustment-reset-button.jfk-button-disabled,.docs-gm .waffle-filterbox-button-container .jfk-button-standard.jfk-button-disabled,.docs-gm .docs-suggestiondialog-reject-container .jfk-button-disabled,.docs-gm .docs-suggestiondialog-reject-container .goog-flat-menu-button-disabled,.motion-ui .punch-animation-sidebar-add.goog-flat-button-disabled,.docs-gm .docs-offline-optinpromo-buttons .jfk-button-standard.jfk-button-disabled{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:white;border:1px solid #f1f3f4!important;color:#3c4043;opacity:0.38;cursor:default}.docs-gm .modal-dialog button,.docs-gm .modal-dialog .jfk-button-standard{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:white;border:1px solid #dadce0!important;color:#188038}.docs-gm .modal-dialog button:hover,.docs-gm .modal-dialog .jfk-button-standard.jfk-button-hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#f8fcf9;border:1px solid #c8e7d1!important}.docs-gm .modal-dialog button:focus,.docs-gm .modal-dialog .jfk-button-standard.jfk-button-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#e7f5eb;border:1px solid #bbe2c6!important}.docs-gm .modal-dialog button:hover:focus,.docs-gm .modal-dialog .jfk-button-standard.jfk-button-hover.jfk-button-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#dff2e4;border:1px solid #b5e0c1!important}.docs-gm .modal-dialog button:active,.docs-gm .modal-dialog button:focus:active,.docs-gm .modal-dialog .jfk-button-standard.jfk-button-active,.docs-gm .modal-dialog .jfk-button-standard.jfk-button-focus.jfk-button-active{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#dff2e4;border:1px solid transparent!important;box-shadow:0 2px 6px 2px rgba(60,64,67,.15)}.docs-gm .modal-dialog button[disabled],.docs-gm .modal-dialog .jfk-button-standard.jfk-button-disabled{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:white;border:1px solid #f1f3f4!important;color:#3c4043;opacity:0.38}.docs-gm .modal-dialog .goog-buttonset-action,.docs-gm .modal-dialog .jfk-button-action,.docs-gm .docs-material-bubble .jfk-button-action{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff}.docs-gm .modal-dialog .goog-buttonset-action:hover,.docs-gm .modal-dialog .jfk-button-action.jfk-button-hover,.docs-gm .docs-material-bubble .jfk-button-action.jfk-button-hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#2a8947;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15)}.docs-gm .modal-dialog .goog-buttonset-action:focus,.docs-gm .modal-dialog .jfk-button-action.jfk-button-focused,.docs-gm .docs-material-bubble .jfk-button-action.jfk-button-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#4f9e67;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15)}.docs-gm .modal-dialog .goog-buttonset-action:hover:focus,.docs-gm .modal-dialog .jfk-button-action.jfk-button-hover.jfk-button-focused,.docs-gm .docs-material-bubble .jfk-button-action.jfk-button-hover.jfk-button-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#62a877;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15)}.docs-gm .modal-dialog .goog-buttonset-action:active,.docs-gm .modal-dialog .goog-buttonset-action:focus:active,.docs-gm .modal-dialog .jfk-button-action.jfk-button-active,.docs-gm .modal-dialog .jfk-button-action.jfk-button-focus.jfk-button-active,.docs-gm .docs-material-bubble .jfk-button-action.jfk-button-active,.docs-gm .docs-material-bubble .jfk-button-action.jfk-button-focus.jfk-button-active{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#62a877;box-shadow:0 2px 6px 2px rgba(52,168,83,0.15)}.docs-gm .modal-dialog .goog-buttonset-action[disabled],.docs-gm .modal-dialog .jfk-button-action.jfk-button-disabled,.docs-gm .docs-material-bubble .jfk-button-action.jfk-button-disabled{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#f1f3f4;color:#3c4043;opacity:0.38}.docs-gm .modal-dialog .goog-flat-button,.docs-gm .modal-dialog button,.docs-gm .modal-dialog .goog-buttonset-action,.docs-gm .modal-dialog .jfk-button-standard,.docs-gm .modal-dialog .jfk-button-action,.docs-gm .docs-material-bubble .jfk-button-standard,.docs-gm .docs-material-bubble .jfk-button-action{cursor:pointer}.docs-gm .modal-dialog .goog-flat-button.goog-flat-button-disabled,.docs-gm .modal-dialog button[disabled],.docs-gm .modal-dialog .goog-buttonset-action[disabled],.docs-gm .modal-dialog .jfk-button-standard.jfk-button-disabled,.docs-gm .modal-dialog .jfk-button-action.jfk-button-disabled,.docs-gm .docs-material-bubble .jfk-button-standard.jfk-button-disabled,.docs-gm .docs-material-bubble .jfk-button-action.jfk-button-disabled{cursor:default}.docs-gm .modal-dialog .jfk-textinput{border:1px solid #dadce0;border-radius:4px;box-sizing:border-box;color:#3c4043;padding:1px 8px;font-size:14px;height:36px;margin:8px 0}.docs-gm .modal-dialog textarea.jfk-textinput{min-height:36px;height:auto;height:unset;padding:7px 8px}.docs-gm.docs-material-gm-dialog textarea.jfk-textinput{min-height:52px;max-height:52px;min-width:100%;height:auto;height:unset;padding:7px 8px}.docs-gm.docs-material-gm-dialog .jfk-textinput,.docs-gm .docs-material-bubble .jfk-textinput{border:1px solid #dadce0;border-radius:4px;box-sizing:border-box;color:#3c4043;padding:1px 8px;font-size:14px;height:36px;margin:8px 0}.docs-gm.docs-material-gm-dialog .jfk-textinput:focus,.docs-gm .docs-material-bubble .jfk-textinput:focus{border:2px solid #1a73e8;box-shadow:none;padding:0px 7px}.docs-gm.docs-material-gm-dialog textarea.jfk-textinput:focus{padding:6px 7px}.docs-material-gm-dialog-title-close:hover{opacity:1}.docs-gm .docs-material-gm-dialog-title-close{background-color:transparent;border-radius:50%;cursor:pointer;line-height:18px;text-align:center}.docs-gm .docs-material-gm-dialog-title-close:hover{background-color:#f1f3f4}.docs-gm .docs-material-gm-dialog-title-close:focus{background-color:#e8eaed;outline:none}.docs-gm .modal-dialog .jfk-textinput.sketchy-guiderow-position{margin:0}.docs-gm .modal-dialog .jfk-textinput:focus{border:2px solid #1a73e8;box-shadow:none;padding:0px 7px}.docs-gm .modal-dialog textarea.jfk-textinput:focus{padding:6px 7px}.docs-gm .modal-dialog,.docs-gm .docs-offline-optinpromo.jfk-bubble,.docs-gm .docs-sync-indicator-popup.jfk-bubble{background-color:#fff;border:1px solid transparent;border-radius:8px;box-shadow:0 4px 8px 3px rgba(60,64,67,.15);position:absolute;z-index:1003;padding:24px}.docs-gm .picker.modal-dialog{padding:0;z-index:1201}.docs-gm .modal-dialog,.docs-gm .modal-dialog-content,.docs-gm #docs-offline-optinpromo-description,.docs-gm #docs-offline-optinpromo-learn-more-container{color:#3c4043}.docs-gm #docs-offline-optinpromo-title{border-bottom:none;padding:24px}.docs-gm .modal-dialog-title-text,.docs-gm .docs-offline-optinpromo-title-text{color:#202124;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:22px;font-weight:400;line-height:28px}.docs-gm .docs-offline-optinpromo-buttons{display:flex;flex-direction:row-reverse}.docs-gm .docs-offline-optinpromo-confirm-buttons{margin-top:24px}.docs-gm .docs-offline-optinpromo-buttons .jfk-button{cursor:pointer;margin-left:16px;margin-right:0}.docs-gm .modal-dialog-buttons,.docs-gm .docs-findandreplacedialog-buttons{display:flex;justify-content:flex-end;margin-top:24px}.docs-gm .modal-dialog-buttons button{margin:0 0 0 12px}.docs-gm .modal-dialog-buttons button:first-child{margin-left:0}.docs-gm .docs-dialog .modal-dialog-title{position:relative}.docs-gm .docs-dialog .modal-dialog-title-text{display:inline-block;max-width:calc(100% - 32px);min-width:200px}.docs-gm .docs-dialog .modal-dialog-title-close{background-color:transparent;border-radius:50%;cursor:pointer;height:18px;line-height:18px;padding:7px;right:0;text-align:center;top:-3px;width:18px}.docs-gm .docs-dialog .modal-dialog-title-close:hover{background-color:#f1f3f4}.docs-gm .docs-dialog .modal-dialog-title-close:focus{background-color:#e8eaed;outline:none}.docs-gm .docs-dialog .modal-dialog-title-close:after{position:relative;right:0;top:0}.docs-gm .modal-dialog .docs-flatcolormenubutton .goog-flat-menu-button-caption,.docs-gm .sketchy-shape-effects-shadow-tile .docs-flatcolormenubutton .goog-flat-menu-button-caption{height:22px;width:22px;border-radius:50%;border:1px solid #dadce0;margin:0;outline:none}.docs-gm .modal-dialog .docs-flatcolormenubutton.goog-flat-menu-button,.docs-gm .sketchy-shape-effects-shadow-tile .docs-flatcolormenubutton.goog-flat-menu-button{padding:6px 0 6px 6px}.docs-gm div.goog-modalpopup-bg,.docs-gm div.modal-dialog-bg{background-color:#000;left:0;position:absolute;top:0;z-index:1002;opacity:.6!important}.docs-gm ::-webkit-scrollbar-track{box-shadow:none;margin:0 4px}.docs-gm ::-webkit-scrollbar-track:hover{box-shadow:none;background:none}.docs-gm ::-webkit-scrollbar-thumb{border-style:solid;border-color:transparent;border-width:4px;background-color:#dadce0;border-radius:8px;box-shadow:none}.docs-gm ::-webkit-scrollbar-thumb:hover{background-color:#80868b}.docs-gm ::-webkit-scrollbar-thumb:active{background-color:#5f6368}.docs-gm .modal-dialog .goog-flat-menu-button,.docs-gm .sketchy-shape-effects-shadow-tile .goog-flat-menu-button{border:1px solid #dadce0;border-radius:4px;box-sizing:border-box;cursor:pointer;padding:8px 6px 8px 8px;width:100%;align-items:center;background:none;color:#3c4043;display:inline-flex;justify-content:space-between;outline:none;position:relative;width:auto;width:unset}.docs-gm .modal-dialog .goog-flat-menu-button-disabled,.docs-gm .sketchy-shape-effects-shadow-tile .goog-flat-menu-button-disabled{color:#5f6368;opacity:.38;cursor:default}.docs-gm .modal-dialog .goog-flat-menu-button:active,.docs-gm .sketchy-shape-effects-shadow-tile .goog-flat-menu-button:active{background-color:#fff;border:1px solid transparent;box-shadow:0 2px 6px 2px rgba(60,64,67,.15)}.docs-gm .modal-dialog .goog-flat-menu-button-hover,.docs-gm .sketchy-shape-effects-shadow-tile .goog-flat-menu-button-hover{background-color:rgba(60,64,67,0.04);border:1px solid #dadce0;box-shadow:none}.docs-gm .modal-dialog .goog-flat-menu-button-focused,.docs-gm .sketchy-shape-effects-shadow-tile .goog-flat-menu-button-focused{background-color:rgba(60,64,67,0.06);border:1px solid #dadce0}.docs-gm .modal-dialog .goog-flat-menu-button-open,.docs-gm .sketchy-shape-effects-shadow-tile .goog-flat-menu-button-open{background-color:rgba(60,64,67,0.04);border:1px solid transparent}.docs-gm .modal-dialog .goog-flat-menu-button-hover.goog-flat-menu-button-open,.docs-gm .sketchy-shape-effects-shadow-tile .goog-flat-menu-button-hover.goog-flat-menu-button-open{background-color:rgba(60,64,67,0.06)}.docs-gm .modal-dialog .goog-flat-menu-button-focused.goog-flat-menu-button-open,.docs-gm .sketchy-shape-effects-shadow-tile .goog-flat-menu-button-focused.goog-flat-menu-button-open{background-color:rgba(60,64,67,0.08)}.docs-gm .modal-dialog .goog-flat-menu-button-disabled,.docs-gm .sketchy-shape-effects-shadow-tile .goog-flat-menu-button-disabled{border:1px solid #dadce0;box-shadow:none;cursor:default}.docs-gm .modal-dialog .goog-flat-menu-button-caption,.docs-gm .sketchy-shape-effects-shadow-tile .goog-flat-menu-button-caption{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;color:#202124;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;height:20px;line-height:20px;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.docs-gm .modal-dialog .goog-flat-menu-button-disabled .goog-flat-menu-button-caption,.docs-gm .sketchy-shape-effects-shadow-tile .goog-flat-menu-button-disabled .goog-flat-menu-button-caption{color:#5f6368;opacity:.38;cursor:default}.docs-gm .modal-dialog .goog-flat-menu-button-dropdown,.docs-gm .sketchy-shape-effects-shadow-tile .goog-flat-menu-button-dropdown{background:no-repeat url(//ssl.gstatic.com/docs/common/material_common_sprite222_grey_medium.svg) -40px -732px;height:18px;width:18px;border:none;margin-top:0;position:relative;right:0;top:0}.docs-gm .modal-dialog .goog-flat-menu-button-disabled .goog-flat-menu-button-dropdown,.docs-gm .sketchy-shape-effects-shadow-tile .goog-flat-menu-button-disabled .goog-flat-menu-button-dropdown{opacity:.38}.docs-gm .modal-dialog .goog-flat-menu-button-disabled.goog-flat-menu-button:active,.docs-gm .sketchy-shape-effects-shadow-tile .goog-flat-menu-button-disabled.goog-flat-menu-button:active{border:1px solid #dadce0;box-shadow:none;cursor:default;box-shadow:none}.docs-gm .modal-dialog .goog-flat-menu-button-open .goog-flat-menu-button-dropdown,.docs-gm .sketchy-shape-effects-shadow-tile .goog-flat-menu-button-open .goog-flat-menu-button-dropdown{-moz-transform:rotate(180deg);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.docs-gm .modal-dialog .jfk-radiobutton-disabled .jfk-radiobutton-label{color:#5f6368;opacity:.38;cursor:default}.docs-gm .share-butterbar-container{font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-family:var(--docs-material-header-font-family,"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif);font-size:13px;font-size:var(--docs-material-font-size-normal,13px);font-weight:normal;font-weight:var(--docs-material-font-weight-normal,normal)}.docs-gm .share-client-dialog .share-butterbar-container{font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-family:var(--docs-material-header-font-family,"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif)}.docs-gm .share-butterbar-container .jfk-butterBar-shown{height:40px;padding:0 16px}.docs-gm .share-butterbar-container .jfk-butterBar-shown>span{display:flex;padding-top:4px}.docs-gm .share-butter-icon{margin-right:8px}.docs-gm .share-butter-link,.docs-gm .share-butter-link:visited{color:#188038;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-family:var(--docs-material-header-font-family,"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif);font-size:16px;margin-left:80px}.docs-gm .share-butter-link:hover,.docs-gm .share-butter-link:active{color:#0d652d}.docs-gm .share-butter-link:disabled{color:#188038}.docs-display-density-comfortable#docs-toolbar-wrapper{min-height:calc(35px + 9px - 2px)}.docs-display-density-comfortable.goog-menu .goog-menuitem:not(.docs-submenuitem){padding-top:9px;padding-bottom:9px}.docs-display-density-comfortable .waffle-function-category-row-description{display:block}.docs-display-density-comfortable .shape-palette .goog-palette-cell{padding:5px}.docs-display-density-comfortable.waffle-function-category-row.waffle-function-category-active{padding:5px 10px}.docs-display-density-comfortable.goog-menu:not(.docs-fontmenu) .goog-menuitem:not(.waffle-colormenuitems-scheme-header-edit-button):not(.docs-submenuitem):not(.apps-menuitem):not(.docs-menuitem-add-fonts).goog-menuitem-highlight{padding-top:calc(9px - 1px);padding-bottom:calc(9px - 1px);border-width:1px 0}.docs-display-density-comfortable.goog-menu .goog-menuitem-icon{top:calc(9px - 1px)}.docs-display-density-comfortable.goog-menu .goog-menuitem-highlight:not(.apps-menuitem):not(.docs-menuitem-add-fonts) .goog-menuitem-icon{top:calc(calc(9px - 1px) - 1px)}.docs-gm .docs-display-density-comfortable.goog-menu .apps-menuitem .goog-menuitem-icon{top:0;margin-top:11px;margin-bottom:11px}.docs-gm .docs-display-density-comfortable.goog-menu .goog-menuitem-highlight:not(.apps-menuitem) .goog-menuitem-icon{top:0;margin-top:10px;margin-bottom:10px}.docs-display-density-comfortable .goog-palette-cell{padding:4px}#t-border-palette.docs-display-density-comfortable .goog-palette-cell{padding:4px 6px 4px 4px}#t-border-palette.docs-display-density-comfortable #t-border-style-menu-button{margin-top:6px}#t-border-palette.docs-display-density-comfortable .goog-toolbar-color-menu-button{padding-top:3px;padding-bottom:3px}.docs-display-density-comfortable.trix-palette .goog-palette-cell{display:inline-block;margin:2px;padding:4px 6px 4px 4px}.docs-display-density-comfortable.trix-palette .goog-palette-table{margin:0}#t-text-rotation-palette td:not(.goog-palette-cell),.docs-display-density-comfortable.trix-palette{padding:0}.docs-display-density-comfortable .goog-inline-block.goog-toolbar-combo-button.waffle-text-rotation-combobox{padding-top:3px;padding-bottom:3px;margin:4px}.docs-display-density-comfortable.waffle-ac-renderer .waffle-function-autocomplete-row-description{display:block}.docs-display-density-comfortable.goog-menu .docs-omnibox-input{padding-top:5px;padding-bottom:5px;height:33px}.docs-display-density-comfortable .docs-material-colorpalette-cell{padding:2px}.docs-display-density-comfortable .docs-material-colorpalette-colorswatch{height:24px;width:24px}.docs-gm .docs-display-density-comfortable.docs-colormenuitems .goog-menuitem.colormenuitems-custom-header-add-button{padding:10px 0}.docs-gm .goog-menu.docs-display-density-comfortable .goog-menuitem.colormenuitems-no-color{padding-top:9px;padding-bottom:9px;border-width:1px 0}.docs-display-density-comfortable.docs-colormenuitems .goog-menuitem.goog-inline-block.waffle-colormenuitems-scheme-header-edit-button{padding:5px}.docs-display-density-comfortable.docs-colormenuitems .goog-menuitem-highlight.waffle-colormenuitems-scheme-header-edit-button{padding-top:4px;padding-bottom:4px;border-width:1px 0}.docs-display-density-comfortable.docs-colormenuitems .goog-menuseparator{margin:10px 0}.docs-display-density-comfortable.goog-menu .docs-omnibox-autocomplete{padding-top:6px;padding-bottom:6px}.docs-display-density-comfortable.goog-menu .docs-omnibox-autocomplete.goog-menuitem-highlight{padding-top:calc(6px - 1px);padding-bottom:calc(6px - 1px)}.docs-display-density-comfortable .goog-toolbar .goog-toolbar-button,.docs-display-density-comfortable .goog-toolbar .goog-toolbar-combo-button,.docs-display-density-comfortable .goog-toolbar .goog-toolbar-menu-button{padding:2px;margin-left:2px;margin-right:2px}.docs-display-density-comfortable .docs-toolbar-more-toolbar{min-height:calc(35px + 2*2px)}.docs-display-density-comfortable .goog-toolbar .goog-toolbar-separator.goog-inline-block{height:calc(35px + 2*2px)}.docs-gm .docs-display-density-comfortable .goog-toolbar .goog-toolbar-separator.goog-inline-block{height:24px}.docs-display-density-comfortable .goog-toolbar .docs-toolbar-button-split-left{margin-right:0}.docs-display-density-comfortable .goog-toolbar .docs-toolbar-button-split-right{margin-left:0}.docs-display-density-comfortable .goog-toolbar .docs-omnibox-input{height:29px}.docs-display-density-comfortable .goog-toolbar .docs-omnibox-autocomplete{margin-right:2px}.docs-display-density-comfortable.docs-colormenuitems .docs-c-u-colormenutogglebutton-base{padding:4px 33px}.docs-display-density-comfortable.docs-colormenuitems .jfk-palette-table{width:100%}.docs-display-density-comfortable.docs-colormenuitems .jfk-palette-row{display:flex;-webkit-justify-content:space-between;justify-content:space-between}.docs-display-density-comfortable.docs-colormenuitems .jfk-palette-colorswatch,.docs-display-density-comfortable.docs-colormenuitems .docs-colormenuitems-custom-palette .jfk-palette-cell{height:22px;width:22px}.docs-display-density-comfortable.goog-menu.docs-fontmenu .docs-menuitem-add-fonts{border-color:#eee}.docs-display-density-comfortable.goog-menu.docs-fontmenu .goog-menuitem.docs-submenuitem{padding-top:9px;padding-bottom:9px;border:0}.docs-display-density-comfortable.goog-menu.docs-fontmenu .goog-menuitem.docs-submenuitem::before{line-height:38px}.docs-display-density-comfortable.goog-menu.docs-fontmenu .docs-submenuitem-splitbutton{height:calc(38px - 2px);line-height:calc(38px - 2px)}body:not(.docs-gm) .docs-display-density-comfortable.goog-menu .goog-menuitem-ie{padding-top:7px;padding-bottom:24px}body:not(.docs-gm) .docs-display-density-comfortable.goog-menu .goog-menuitem-icon-ie{top:4px}.docs-display-density-toolbar-menuitem-label{font-weight:500;padding-bottom:4px}.docs-display-density-toolbar-menuitem-description{font-size:11px;color:#777}.docs-display-density-comfortable .goog-toolbar.chart-toolbar-with-omnibox{display:flex;-ms-flex-align:center;-moz-box-align:center;-webkit-box-align:center;box-align:center;-webkit-align-items:center;align-items:center}.docs-display-density-comfortable .goog-toolbar.chart-toolbar-with-omnibox .sheet-toolbar-button{margin-right:calc(2px*2)}.docs-chat.jfk-button{border-radius:0;height:28px;margin-left:2px;margin-right:0px;min-width:24px;vertical-align:top}.docs-chat.jfk-button .docs-icon{opacity:.70}.docs-chat.jfk-button.jfk-button-checked .docs-icon{opacity:0.9}.docs-chat.jfk-button.jfk-button-disabled .docs-icon{opacity:0.333}.docs-chat-badge{background:#db4437;border-radius:6px;display:none;height:12px;pointer-events:none;position:absolute;right:-4px;top:-4px;width:12px}.docs-chat-badge-visible{display:block}.docs-chat-badge.docs-chat-hc-gecko{filter:url("data:image/svg+xml;utf8,\00003csvg%20xmlns=\000027http://www.w3.org/2000/svg\000027\00003e\00003cfilter%20id=\000027invertColor\000027\00003e\00003cfeColorMatrix%20type=\000027matrix\000027%20values=\000027-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0\000027/\00003e\00003c/filter\00003e\00003c/svg\00003e#invertColor")}.docs-chat-badge.docs-chat-hc-ie{-ms-high-contrast-adjust:none;background-color:white}.docs-chat-message-tooltip-container{-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;box-shadow:0 1px 1px 0 rgba(0,0,0,0.14),0 2px 1px -1px rgba(0,0,0,0.12),0 1px 3px 0 rgba(0,0,0,0.2);background-color:#fafafa;padding:12px;z-index:501}.docs-chat-message-tooltip-container .jfk-bubble-arrowup .jfk-bubble-arrowimplafter{border-color:#fafafa transparent}.docs-chat-message-tooltip-container .jfk-bubble-arrowup .jfk-bubble-arrowimplbefore{border-color:rgba(0,0,0,0.3) transparent}.docs-chat-message-tooltip{font-size:13px;height:32px;line-height:18px;position:relative;text-align:left;width:192px}.docs-chat-message-tooltip-subject{opacity:.87;font-weight:500}.docs-chat-message-tooltip-content{opacity:.54;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-break:break-all;word-wrap:break-word}.docs-chat-pane-container{border-left:1px solid #d9d9d9;outline:none;position:absolute;right:0;top:0;width:300px}.docs-gm .docs-chat-pane-container{overflow:hidden;box-shadow:-3px 0px 6px -3px rgba(60,64,67,.15),3px 0px 6px -3px rgba(60,64,67,.15);border-left:0}.docs-chat-pane{background-color:#fff;font-size:13px;height:100%;overflow:hidden;position:relative;z-index:801}.docs-gm .docs-chat-pane{font-size:14px}.docs-chat-users{background:#f5f5f5;color:#000;margin:0;max-height:33%;outline-style:none;overflow:auto;padding:8px 0 3px 0;text-align:left;vertical-align:top}.docs-chat-users-empty{display:none}.docs-chat-messages{background-color:#fff;box-sizing:border-box;color:rgba(0,0,0,.87);outline-style:none;overflow:auto;padding:16px 24px 0px 16px;position:relative;vertical-align:middle}.docs-gm .docs-chat-messages{color:#3c4043;letter-spacing:.25px;padding:16px 16px 0px 16px}.docs-chat-edit-container{background:#eee;bottom:0;height:96px;margin:0;outline:0;position:absolute;width:100%}.docs-gm .docs-chat-edit-container{background-color:#fff}.docs-chat-edit-box{border:1px solid #5ea0e3;box-sizing:border-box;font-size:100%;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;height:64px;left:16px;outline:0;overflow:auto;padding:8px;position:relative;top:16px;width:268px;resize:none}.docs-gm .docs-chat-edit-box{border:1px solid #dadce0;border-radius:4px;box-sizing:border-box;color:#3c4043;padding:1px 8px;font-size:14px;height:36px;margin:8px 0}.docs-gm .docs-chat-edit-box{height:64px;margin:0;padding:8px}.docs-chat-edit-box::-webkit-input-placeholder,.docs-chat-edit-box::-moz-placeholder,.docs-chat-edit-box:-ms-input-placeholder{color:#5f6368}.docs-chat-edit-box-focus{outline:1px solid #5ea0e3}.docs-gm .docs-chat-edit-box-focus{border:2px solid #1a73e8;box-shadow:none;padding:0px 7px}.docs-gm .docs-chat-edit-box-focus{padding:7px}.docs-chat-roster{width:250px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;word-break:break-all;word-wrap:break-word}.docs-gm .docs-chat-roster{width:240px}.label-input-label{color:#a9a9a9}.docs-chat-status{color:gray;line-height:12px}.docs-chat-name{font-weight:500}.docs-gm .docs-chat-name{font-weight:500}.docs-chat-message.docs-chat-status-message{margin-bottom:0px}.docs-chat-message{line-height:18px;margin-bottom:2px;outline-style:none;word-wrap:break-word;white-space:pre-wrap}.docs-chat-first-series-message{margin-top:10px}.docs-user-roster{margin:0;outline-style:none;padding:0 0 10px 1em;position:relative}.docs-user-roster-name{color:#666;left:2.7em;position:absolute;top:0}.docs-user-roster-bubble{height:13px;margin-right:1px;top:1px;vertical-align:text-bottom;width:13px}.docs-user-roster-bubble-clickable{cursor:pointer}.docs-chat-anon{color:gray;font-size:11px;padding:6px 24px 3px 16px}.docs-chat-title-bar{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;background-color:#616161;border-bottom:1px solid #616161;border-top:1px solid #616161;color:#fff;height:15px;padding:10px 0 10px 12px;position:relative}.docs-gm .docs-chat-title-bar{display:flex;align-items:center;color:#202124;background-color:#fff;height:56px;padding:0 16px;border-bottom:1px solid #dadce0;border-top:1px solid #dadce0;font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:16px;z-index:1;padding-right:56px;letter-spacing:.1px}.docs-chat-title-bar-highlight{background-color:#4285f4;border-bottom-color:#4285f4;border-top-color:#4285f4;color:#fff}.docs-chat-title{font-weight:500}.docs-gm .docs-chat-title-bar.docs-chat-shadow{box-shadow:0 2px 6px 2px rgba(60,64,67,.15)}.docs-gm .docs-chat-edit-container.docs-chat-shadow{box-shadow:0 -2px 6px 2px rgba(60,64,67,.15)}.docs-sidebar-close-button.docs-chat-close-button{float:right;top:8px}.docs-sidebar-gm-close-button.docs-chat-close-button{position:absolute;right:11px;top:12px}.docs-presence-widget{cursor:pointer;height:19px;margin:0 0 5px 0;outline:0;position:absolute;right:44px;top:11px;width:207px}#docs-presence-menubar .docs-presence-widget{top:5px}#docs-presence .docs-presence-widget{display:inline-block;position:relative;right:auto;text-align:left;width:auto}.docs-presence-widget-inner{border:1px solid transparent;height:17px;margin-bottom:8px}#docs-presence .docs-presence-widget-inner{display:inline-block;max-width:190px}.docs-presence-widget-normal .docs-presence-widget-inner{background:#fff;border-color:#fff;color:#666}.docs-presence-widget-hover .docs-presence-widget-inner,.docs-presence-widget-focused .docs-presence-widget-inner{background:#f3f3f3;border-color:#f3f3f3;color:#222!important}.docs-presence-widget-open .docs-presence-widget-inner{background:#f3f3f3;border-color:#e5e5e5;color:#666}.docs-presence-widget-notify .docs-presence-widget-inner{color:#fff}.docs-presence-widget-arrow{position:absolute!important;top:0}.docs-presence-widget-content{font-size:11px;line-height:18px;max-width:98px;overflow:hidden;padding:0 4px;text-overflow:ellipsis;white-space:nowrap}#docs-presence .docs-presence-widget-content{max-width:90px;position:relative;vertical-align:top}.docs-presence-widget-collab{max-width:90px;overflow:hidden;position:absolute;right:4px;top:1px}#docs-presence .docs-presence-widget-collab{display:inline-block;margin-right:4px;position:relative;right:auto;top:auto}.docs-presence-widget-collab .docs-user-roster-bubble{margin:1px;vertical-align:baseline}#docs-presence-container{height:29px;margin-right:10px;vertical-align:middle}#docs-presence{vertical-align:top}.docs-presence-plus-widget{max-width:250px;outline:0;text-align:left}#docs-bars .docs-presence-plus-widget{position:absolute;overflow:hidden;right:0;top:2px}.docs-presence-plus-widget-inner{vertical-align:top}.docs-presence-plus-widget-status{color:#222;display:none;text-align:right;margin:8px 10px 0 0}.docs-presence-plus-widget-open .docs-presence-plus-widget-status{display:block}.docs-presence-plus-widget-collabs{height:30px}.docs-hub-appbar .docs-presence-plus-widget-collabs{display:flex;align-items:center}.docs-presence-plus-widget-open .docs-presence-plus-widget-collabs{display:none}.docs-presence-plus-widget-overflow-button{border-radius:0;height:28px;margin:0 2px 0 -1px;min-width:0;padding:0;width:13px}.docs-presence-plus-widget-overflow-button .goog-flat-menu-button-dropdown{right:3px}.docs-presence-plus-widget-overflow-menu{max-height:300px;outline:none;overflow:auto;padding:7px;text-align:left;white-space:nowrap}.docs-presence-plus-widget-overflow,.docs-presence-plus-collab-widget-container{height:30px;overflow:hidden;vertical-align:top}.docs-presence-plus-collab-widget-color-block{height:30px;overflow:hidden;width:25px}.docs-presence-plus-collab-widget-menuitem,.docs-gm .goog-menu .docs-presence-plus-collab-widget-menuitem.goog-menuitem,.docs-gm .goog-menu .docs-presence-plus-collab-widget-menuitem.goog-menuitem-highlight{border-style:none;padding:0}.docs-presence-plus-collab-widget-container{margin:0 2px;width:25px}.docs-presence-plus-collab-widget-color-block{opacity:.5;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)"}.docs-presence-plus-collab-widget-active .docs-presence-plus-collab-widget-color-block{opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}.docs-presence-plus-collab-widget-exit .docs-presence-plus-collab-widget-color-block{height:0;width:0}.docs-presence-plus-collab-widget-image,.docs-presence-plus-collab-widget-image-container{height:25px;padding-bottom:5px;width:25px}.docs-presence-plus-collab-widget-image-container{overflow:hidden}.docs-hub-appbar .docs-presence-plus-collab-widget-color-block,.docs-hub-appbar .docs-presence-plus-collab-widget-image-container{height:28px;width:28px}.docs-hub-appbar .docs-presence-plus-collab-widget-image{height:24px;width:24px}.docs-presence-plus-collab-widget-image-border{border-bottom:1px solid #fff;height:24px}.docs-presence-plus-collab-widget-idle-text{color:#777;font-size:11px}.docs-presence-plus-collab-widget-active .docs-presence-plus-collab-widget-idle-text{display:none}.docs-presence-plus-widget-overflow-button-collabs{margin:0}@-webkit-keyframes color-join{from{margin-top:25px}to{margin-top:0}}@-moz-keyframes color-join{from{margin-top:25px}to{margin-top:0}}@-ms-keyframes color-join{from{margin-top:25px}to{margin-top:0}}.docs-presence-plus-collab-widget-enter .docs-presence-plus-collab-widget-color-block{-webkit-animation-name:color-join;-moz-animation-name:color-join;-ms-animation-name:color-join;-webkit-animation-duration:.5s;-moz-animation-duration:.5s;-ms-animation-duration:.5s}@-webkit-keyframes image-join{0%{height:0;padding-bottom:0}33%{height:0;padding-bottom:0}100%{height:25px;padding-bottom:5px}}@-moz-keyframes image-join{0%{height:0;padding-bottom:0}33%{height:0;padding-bottom:0}100%{height:25px;padding-bottom:5px}}@-ms-keyframes image-join{0%{height:0;padding-bottom:0}33%{height:0;padding-bottom:0}100%{height:25px;padding-bottom:5px}}.docs-presence-plus-collab-widget-enter .docs-presence-plus-collab-widget-image-container{-webkit-animation-name:image-join;-moz-animation-name:image-join;-ms-animation-name:image-join;-webkit-animation-duration:1.5s;-moz-animation-duration:1.5s;-ms-animation-duration:1.5s;-webkit-animation-timing-function:ease-in;-moz-animation-timing-function:ease-in;-ms-animation-timing-function:ease-in}@-webkit-keyframes collab-exit{0%{height:30px;width:25px;margin:0;opacity:.5}25%{height:30px;width:25px;margin:0;opacity:.5}99%{height:0;width:0;margin:15px 12px}100%{height:0;width:0;margin:0}}@-moz-keyframes collab-exit{0%{height:30px;width:25px;margin:0;opacity:.5}25%{height:30px;width:25px;margin:0;opacity:.5}99%{height:0;width:0;margin:15px 12px}100%{height:0;width:0;margin:0}}@-ms-keyframes collab-exit{0%{height:30px;width:25px;margin:0;opacity:.5}25%{height:30px;width:25px;margin:0;opacity:.5}99%{height:0;width:0;margin:15px 12px}100%{height:0;width:0;margin:0}}.docs-presence-plus-collab-widget-exit .docs-presence-plus-collab-widget-color-block{-webkit-animation-name:collab-exit;-moz-animation-name:collab-exit;-ms-animation-name:collab-exit;-webkit-animation-duration:1s;-moz-animation-duration:1s;-ms-animation-duration:1s}@-webkit-keyframes collab-image-exit{0%{margin:0;padding-bottom:5px}25%{margin:0;padding-bottom:5px}100%{margin-top:-15px;margin-left:-12px}}@-moz-keyframes collab-image-exit{0%{margin:0;padding-bottom:5px}25%{margin:0;padding-bottom:5px}100%{margin-top:-15px;margin-left:-12px}}@-ms-keyframes collab-image-exit{0%{margin:0;padding-bottom:5px}25%{margin:0;padding-bottom:5px}100%{margin-top:-15px;margin-left:-12px}}.docs-presence-plus-collab-widget-exit .docs-presence-plus-collab-widget-image{-webkit-animation-name:collab-image-exit;-moz-animation-name:collab-image-exit;-ms-animation-name:collab-image-exit;-webkit-animation-duration:1s;-moz-animation-duration:1s;-ms-animation-duration:1s}.docs-presence-plus-widget-overflow-menu .docs-presence-plus-collab-widget-container{display:block;height:25px;margin:0 0 5px;width:auto}.docs-presence-plus-widget-overflow-menu .docs-presence-plus-collab-widget-color-block{width:30px}.docs-presence-plus-widget-overflow-menu .docs-presence-plus-collab-widget{height:25px;padding-right:20px}.docs-presence-plus-widget-overflow-menu .docs-presence-plus-collab-widget-image{position:relative;left:-1px}.docs-presence-plus-widget-overflow-menu .docs-presence-plus-collab-widget-image,.docs-presence-plus-widget-overflow-menu .docs-presence-plus-collab-widget-image-container{padding-bottom:0}.docs-presence-plus-widget-overflow-menu .docs-presence-plus-collab-widget-image-container{padding-left:5px}.docs-presence-plus-widget-overflow-menu .docs-presence-plus-collab-widget-image-border{border-bottom:none;border-left:1px solid #fff;height:25px}.docs-presence-plus-widget-overflow-menu .docs-presence-plus-collab-widget-name{color:#222;font-size:13px;margin:4px 0 0 5px;vertical-align:top}.jfk-bubble.jfk-bubble-promo.hub-anchored-bubble{background-color:#ffffff;border-color:#ffffff;border-radius:8px;height:auto;width:226px;word-wrap:break-word;padding:18px 16px;box-shadow:rgba(0,0,0,0.2) 0px 1px 3px 1px}.jfk-bubble.jfk-bubble-promo.hub-anchored-bubble .jfk-bubble-arrowup .jfk-bubble-arrowimplbefore{border-color:#dadce0 transparent;top:-1px}.jfk-bubble.jfk-bubble-promo.hub-anchored-bubble .jfk-bubble-arrowup .jfk-bubble-arrowimplafter{border-color:#ffffff transparent;top:0}.hub-anchored-bubble-body{color:#3c4043;font-family:Roboto;line-height:20px;padding:0 8px}.hub-anchored-bubble-action-row{font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;padding-top:15px;text-align:right}.hub-anchored-bubble-dismiss-container{font-size:14px;color:#1a73e8;cursor:pointer;letter-spacing:0.25px;line-height:16px;outline:none;padding:8px}.talk_roster{display:none}.docs-chat-mole-hidden>div{top:-10000px!important;left:-10000px!important}.talk_chat_widget{z-index:900!important}.docs-gm-promo.jfk-bubble.jfk-bubble-promo.classification-badge-popout{background-color:#fff;border:0;border-radius:8px;height:auto;width:320px;word-wrap:break-word;margin-top:12px}.classification-badge-popout-body{color:#3c4043;font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;line-height:22px;vertical-align:top}.classification-badge-popout-action-row{font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;text-align:right;display:flex;justify-content:flex-end;margin:8px 0 -8px 0}.classification-badge-popout-action-container{color:#188038;cursor:pointer;outline:none;width:auto;padding:12px 10px 12px 10px;border:1px solid transparent;border-radius:4px;border-color:transparent;font-size:14px;font-weight:500;letter-spacing:0.025em;transition:all 0.3s cubic-bezier(0.4,0,0.2,1)}.classification-badge-popout-action-container:hover{background:#f8fcf9;border-radius:4px}.classification-badge-popout-header{font-size:18px;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:400;margin-bottom:8px;line-height:22px}.classification-badge-close-icon.docs-icon{height:24px;width:24px}.classification-badge-close{cursor:pointer;float:right;margin-right:-13px;top:-5px}.classification-badge-open-icon.docs-icon{margin-left:2px}.docs-gm .classification-badge-open-icon .docs-icon-img{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_green.svg)}.classification-badge-popout-container{padding:24px}.docs-gm-promo.jfk-bubble.jfk-bubble-promo.classification-badge-popout .jfk-bubble-arrowup .jfk-bubble-arrowimplbefore,.docs-gm-promo.jfk-bubble.jfk-bubble-promo.classification-badge-popout .jfk-bubble-arrowup .jfk-bubble-arrowimplafter{border-color:#fff transparent}.jfk-bubble.jfk-bubble-promo.classification-badge-popout .jfk-bubble-arrowup .jfk-bubble-arrowimplbefore{background:#fff;border-radius:4px;box-shadow:0 0 3px 0 rgba(32,33,36,0.3);position:absolute;transform:rotate(-48deg);height:13px}.jfk-bubble.jfk-bubble-promo.classification-badge-popout .jfk-bubble-arrowup .jfk-bubble-arrowimplafter{height:24px;top:-14px;left:-15px;transform:scale(1.02) perspective(24px) rotateX(60deg);width:16px}.docs-copydocdialog{width:360px}.docs-copydocdialog-filenameinput{width:250px}.docs-copydocdialog-warning,.docs-copydocdialog-destination-sharewarning{color:#999;font-size:11px}.docs-copydocdialog-checkbox{font-size:14px;letter-spacing:0.2px;padding-top:5px;vertical-align:top}.docs-gm .docs-copydocdialog-checkbox{cursor:pointer;padding-top:8px}.docs-gm .docs-copydocdialog-checkbox .jfk-checkbox{margin-top:-8px;margin-right:8px}.docs-copydocdialog-checkbox.docs-copydocdialog-collaboratorcheckbox{padding-top:0}.docs-gm .docs-copydocdialog{min-width:312px;width:auto;width:unset}.docs-gm .docs-copydocdialog .docs-copydocdialog-filenameinput{width:100%}.docs-gm .docs-copydocdialog .docs-copydocdialog-destination-button{height:34px;width:294px}.docs-gm .docs-copydocdialog-destination-img{top:3px}.docs-gm .docs-copydocdialog-destination-name{vertical-align:sub}.docs-copydocdialog-checkbox-disabled{opacity:.38}.docs-gm .docs-copydocdialog-includeresolvedcommentscheckbox .jfk-checkbox{vertical-align:top;margin-top:-4px}.docs-copydocdialog-checkbox-label{width:285px;display:inline-block}.docs-copydocdialog-destination-button,.docs-copydocdialog-filenameinput{margin-top:4px}.docs-copydocdialog-destination-button{border:1px solid #ddd;margin-right:0;overflow:hidden;position:relative;text-align:left;text-overflow:ellipsis;width:250px}.docs-copydocdialog-destination-button.jfk-button-focused{border:1px solid #4d90fe}.docs-copydocdialog-destination-section{margin-top:16px}.docs-copydocdialog-destination-img{height:10px;margin-right:5px;position:relative;top:2px;width:13px}.docs-copydocdialog-description{font-size:16px;height:72px;letter-spacing:0.15px;line-height:24px;vertical-align:top;width:312px}.docs-gm .docs-copydocdialog-description{height:auto;height:unset;color:#5f6368;max-width:464px;width:100%}.goog-menu.picker-min.docs-copydocdialog-destination-picker{z-index:1003}.modal-dialog.docs-dialog.docs-copy-endangered-dialog{z-index:1007;width:376px}.modal-dialog-bg.docs-copy-endangered-dialog-bg{z-index:1006}.docs-gm .modal-dialog.docs-dialog.docs-copy-endangered-dialog{min-width:464px;width:auto;width:unset}.docs-dialog.docs-hc-gecko .modal-dialog-title-close:after{filter:invert(100%)}.docs-dialog.docs-hc-ie .modal-dialog-title-close:after{-ms-high-contrast-adjust:none;background-color:white}.docs-dialog .modal-dialog-title-close{opacity:0.54}.docs-dialog .modal-dialog-title-close:hover{opacity:0.87}.modal-dialog-title-text{font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:normal}.docs-dialog .modal-dialog-title-close:after{background:none;right:13px;top:14px;content:url(//ssl.gstatic.com/images/icons/material/system/svg/close_18px.svg);height:18px;width:18px}.docs-details-dialog{min-width:200px}.docs-details-error{margin-left:10px;margin-top:40px}.docs-details-loading{background-image:url(//ssl.gstatic.com/docs/common/loading_animation.gif);height:50px;margin:auto;width:50px}.docs-details-table{border-collapse:collapse}.docs-details-field{font-size:13px;font-weight:500;height:27px;width:100px}#docs-details-folder{margin-right:6px;outline:none;vertical-align:bottom}.docs-details-value{height:27px;max-width:200px}.docs-details-value[data-hovercard-id]{text-decoration:underline;text-decoration-style:dotted}.docs-gm .docs-details-dialog{min-width:312px;padding:24px}.docs-gm .docs-details-dialog .modal-dialog-title-text{color:#3c4043;font-size:22px;font-weight:normal;height:28px}.docs-gm .docs-details-field,.docs-gm .docs-details-value{font-size:14px;height:20px;padding:8px 0}.docs-gm .docs-details-field{color:#3c4043;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;min-width:100px;padding-right:20px}.docs-gm .docs-details-value{color:#202124;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif}.picker-iframe.picker-min{-moz-box-shadow:rgba(0,0,0,.2) 0 4px 16px;-webkit-box-shadow:rgba(0,0,0,.2) 0 4px 16px;box-shadow:rgba(0,0,0,.2) 0 4px 16px;color:#000;padding:0;position:absolute;z-index:1002}.picker-iframe.picker-minew .picker-min-frame-up{background-color:#f1f1f1}.picker-iframe.picker-white-callout.picker-minew .picker-min-frame-up{background-color:#fff}.picker-iframe.picker-min.goog-menu{border-color:#ccc;line-height:0;max-height:none;overflow:visible}.picker-iframe.picker-min-top{margin-top:15px}.picker-iframe.picker-minew.picker-min-top{margin-top:9px}.picker-iframe.picker-min-bottom{margin-top:-15px}.picker-iframe.picker-minew.picker-min-bottom{margin-top:-9px}.picker-iframe .picker-min-arrow-up,.picker-iframe .picker-min-arrow-down{position:absolute;width:32px;z-index:0}.picker-iframe .picker-min-arrow-up{top:-15px}.picker-iframe.picker-minew .picker-min-arrow-up{top:-10px;width:20px}.picker-iframe .picker-min-arrow-down{bottom:-16px}.picker-iframe.picker-minew .picker-min-arrow-down{bottom:-10px;width:20px}.picker-iframe .picker-min-arrow-inner,.picker-iframe .picker-min-arrow-border{border:16px solid;height:0;position:absolute;width:0}.picker-iframe.picker-minew .picker-min-arrow-inner,.picker-iframe.picker-minew .picker-min-arrow-border{border:10px solid}.picker-iframe.picker-minew .picker-min-arrow-up .picker-min-arrow-inner{border-color:#f1f1f1 transparent}.picker-iframe.picker-white-callout.picker-minew .picker-min-arrow-up .picker-min-arrow-inner{border-color:#fff transparent}.picker-iframe .picker-min-arrow-up .picker-min-arrow-inner{border-color:#fff transparent;top:1px;z-index:1}.picker-iframe .picker-min-arrow-down .picker-min-arrow-inner{border-color:#fff transparent;bottom:1px;z-index:1}.picker-iframe .picker-min-arrow-up .picker-min-arrow-border,.picker-iframe .picker-min-arrow-down .picker-min-arrow-border{border-color:rgba(0,0,0,0.2) transparent}.picker-iframe .picker-min-arrow-down .picker-min-arrow-border{bottom:0}.picker-iframe .picker-min-arrow-up .picker-min-arrow-inner,.picker-iframe .picker-min-arrow-up .picker-min-arrow-border{border-top-width:0}.picker-iframe .picker-min-arrow-down .picker-min-arrow-inner,.picker-iframe .picker-min-arrow-down .picker-min-arrow-border{border-bottom-width:0}.drive-organize-atd-popup{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;vertical-align:middle}.drive-organize-atd-popup-undo-btn{margin:auto}.drive-organize-popup{position:absolute;z-index:1002;-webkit-box-shadow:rgba(0,0,0,0.2) 0 4px 16px;-moz-box-shadow:rgba(0,0,0,0.2) 0 4px 16px;box-shadow:rgba(0,0,0,0.2) 0 4px 16px;background-color:#f1f1f1;border:1px solid rgba(0,0,0,0.2);color:#6e6e6e;font-size:13px;font-weight:normal;text-align:left;white-space:nowrap}.drive-organize-popup-outline-hidden *:focus{outline:none}.drive-organize-popup-content{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;padding:10px}.drive-organize-popup-message{overflow:hidden;text-overflow:ellipsis;-webkit-box-orient:vertical;-webkit-line-clamp:6;display:-webkit-box;max-height:90px;margin:auto;max-width:160px;padding-right:10px;word-break:break-word}.drive-organize-button{display:inline-block;margin:auto}.drive-organize-popup-link-btn{color:#15c;cursor:pointer;padding:0 7px}.drive-organize-popup-close-btn{cursor:pointer;height:15px;padding:3px;vertical-align:middle}.drive-organize-popup-link-btn.drive-organize-button-hover{text-decoration:underline}.drive-organize-popup-arrow{position:absolute;width:20px}.drive-organize-popup-arrow .drive-organize-popup-triangle-before,.drive-organize-popup-arrow .drive-organize-popup-triangle-after{content:'';display:block;height:0;position:absolute;width:0}.drive-organize-popup-arrow .drive-organize-popup-triangle-before{border:10px solid}.drive-organize-popup-arrow .drive-organize-popup-triangle-after{border:9px solid}.drive-organize-popup-arrowdown{bottom:0}.drive-organize-popup-arrowup{top:-10px}.drive-organize-popup-arrowdown .drive-organize-popup-triangle-before,.drive-organize-popup-arrowup .drive-organize-popup-triangle-before{border-color:rgba(0,0,0,0.2) transparent;left:0}.drive-organize-popup-arrowdown .drive-organize-popup-triangle-after,.drive-organize-popup-arrowup .drive-organize-popup-triangle-after{border-color:#f1f1f1 transparent;left:1px}.drive-organize-popup-arrowdown .drive-organize-popup-triangle-before{border-bottom-width:0}.drive-organize-popup-arrowdown .drive-organize-popup-triangle-after{border-bottom-width:0}.drive-organize-popup-arrowup .drive-organize-popup-triangle-before{border-top-width:0}.drive-organize-popup-arrowup .drive-organize-popup-triangle-after{border-top-width:0;top:2px}.drive-organize-dialog{-webkit-box-shadow:0 4px 16px rgba(0,0,0,.2);-moz-box-shadow:0 4px 16px rgba(0,0,0,.2);box-shadow:0 4px 16px rgba(0,0,0,.2);background:#fff;background-clip:padding-box;color:#000;font-family:inherit;outline:0;padding:24px;position:absolute;width:560px;z-index:2204}.drive-organize-dialog-bg{background:#000;left:0;position:absolute;top:0;z-index:2203}div.drive-organize-dialog-bg{filter:alpha(opacity=50);opacity:.50}.drive-organize-dialog-title{background-color:#fff;color:#000;cursor:default;font-size:20px;font-weight:normal;line-height:24px}.drive-organize-dialog-title-close{height:11px;margin:24px;opacity:0.7;padding:6px;position:absolute;right:0;top:0;width:11px}.drive-organize-dialog-title-close:after{background:url(//ssl.gstatic.com/ui/v1/dialog/close-x.png);content:'';height:11px;position:absolute;width:11px}.drive-organize-dialog-title-close:hover{opacity:1}.drive-organize-dialog-content{background-color:#fff;font-size:16px;line-height:1.4em;padding-top:24px;padding-bottom:24px;word-wrap:break-word}.drive-organize-dialog-buttons{text-align:right}.drive-organize-dialog-buttons .drive-organize-button{-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;background-color:#f5f5f5;background-image:-webkit-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:-moz-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:-ms-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:-o-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:linear-gradient(top,#f5f5f5,#f1f1f1);border:1px solid #dcdcdc;border:1px solid rgba(0,0,0,0.1);color:#444;cursor:default;font-family:inherit;font-size:11px;font-weight:bold;height:29px;line-height:27px;margin:0 0 0 16px;min-width:72px;outline:0;padding:0 8px}.drive-organize-dialog-buttons .drive-organize-button:hover,.drive-organize-dialog-buttons .drive-organize-button:active{-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 1px rgba(0,0,0,0.1);box-shadow:0 1px 1px rgba(0,0,0,0.1);background-color:#f8f8f8;background-image:-webkit-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-moz-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-ms-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-o-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:linear-gradient(top,#f8f8f8,#f1f1f1);border:1px solid #c6c6c6;color:#333}.drive-organize-dialog-buttons .drive-organize-button:active{-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.drive-organize-dialog-buttons .drive-organize-button:focus{border:1px solid #4d90fe}.drive-organize-dialog-buttons .drive-organize-button[disabled]{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;background:#fff;background-image:none;border:1px solid #f3f3f3;border:1px solid rgba(0,0,0,0.5);color:rgba(0,0,0,.26)}.drive-organize-dialog-buttons .goog-buttonset-action{background-color:#4d90fe;background-image:-webkit-linear-gradient(top,#4d90fe,#4787ed);background-image:-moz-linear-gradient(top,#4d90fe,#4787ed);background-image:-ms-linear-gradient(top,#4d90fe,#4787ed);background-image:-o-linear-gradient(top,#4d90fe,#4787ed);background-image:linear-gradient(top,#4d90fe,#4787ed);border:1px solid #3079ed;color:#fff}.drive-organize-dialog-buttons .goog-buttonset-action:hover,.drive-organize-dialog-buttons .goog-buttonset-action:active{background-color:#357ae8;background-image:-webkit-linear-gradient(top,#4d90fe,#357ae8);background-image:-moz-linear-gradient(top,#4d90fe,#357ae8);background-image:-ms-linear-gradient(top,#4d90fe,#357ae8);background-image:-o-linear-gradient(top,#4d90fe,#357ae8);background-image:linear-gradient(top,#4d90fe,#357ae8);border:1px solid #2f5bb7;color:#fff}.drive-organize-dialog-buttons .goog-buttonset-action:active{-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.3);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.3);box-shadow:inset 0 1px 2px rgba(0,0,0,0.3)}.drive-organize-dialog-buttons .goog-buttonset-action:focus{-webkit-box-shadow:inset 0 0 0 1px #fff;-moz-box-shadow:inset 0 0 0 1px #fff;box-shadow:inset 0 0 0 1px #fff;border:1px solid #fff;border:rgba(0,0,0,0) solid 1px;outline:1px solid #4d90fe;outline:rgba(0,0,0,0) 0}.drive-organize-dialog-buttons .goog-buttonset-action[disabled]{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;background:#4d90fe;color:#fff;filter:alpha(opacity=50);opacity:0.5}.drive-organize-dialog .goog-menu{box-shadow:none;margin-bottom:-24px;padding:0;position:relative;z-index:inherit}.drive-organize-dialog .goog-menuitem{color:#000;font-size:13px;height:16px;margin:0;opacity:.87;padding:0 0 24px 16px}.drive-organize-dialog-parent-name{font-weight:bold}.drive-organize-dialog-list-item{display:block;overflow:hidden;text-overflow:ellipsis}.drive-organize-dialog .goog-menuitem-highlight{border-left:0;background-color:inherit}.drive-organize-dialog .goog-menuitem-content{margin:0}.drive-organize-dialog .goog-menuitem-highlight .goog-menuitem-content,.drive-organize-dialog .goog-option-selected .goog-menuitem-content{color:inherit}.drive-organize-dialog .goog-menuitem-active .goog-menuitem-checkbox{background:rgba(235,235,235,1)}.drive-organize-dialog .goog-menuitem-focus .goog-menuitem-checkbox{border-color:rgba(77,144,254,1)}.drive-organize-dialog .goog-option-selected{background:rgba(255,255,255,0)}.drive-organize-dialog .goog-option-selected .goog-menuitem-checkbox::after{-webkit-border-radius:50%;-moz-border-radius:50%;border-radius:50%;background:rgba(96,96,96,1);content:'';display:block}.modal-dialog.docs-endangered-doc-warning-dialog{z-index:1007}.modal-dialog-bg.docs-endangered-doc-warning-dialog-bg{z-index:1006}.docs-gm .modal-dialog.docs-endangered-doc-warning-dialog{min-width:464px;width:auto;width:unset}.fatal-error-dialog-container{display:table;width:374px}.fatal-error-dialog-contents{display:table-row;min-height:100px}.fatal-error-dialog-contents a:hover{cursor:pointer}.fatal-error-message{display:table-cell;vertical-align:middle;width:320px}.fatal-error-debug-text{font-size:85%;height:200px;width:90%}.docs-invite-favicon{height:16px;margin-right:5px;vertical-align:sub;width:16px}.docs-invite-header{height:77px;max-height:77px;width:100%;overflow-x:hidden;overflow-y:hidden;background:#f5f5f5;font-size:12.5px;color:#444;border-bottom:1px solid #d9d9d9}.docs-invite-header>div{display:table;width:100%;height:100%;max-height:inherit}.docs-invite-button{margin-right:25px}.docs-invite-fixedcol{display:table-cell;vertical-align:middle;white-space:nowrap}.docs-invite-flexcol{display:table-cell;width:100%;vertical-align:middle;max-height:inherit}.docs-invite-inviter-img{height:60px;border:1px solid #ccc;margin-left:25px}.docs-invite-heavy{font-weight:500;color:#222}.docs-invite-business-icon{margin-left:40px}.docs-invite-msg{margin:0px 10px 0px 25px;max-height:inherit;line-height:2.0}.docs-invite-business-header{position:absolute;z-index:1}#titlebar-mode-indicator-container{margin-right:10px}#titlebar-mode-indicator-container>div{border-radius:4px;text-transform:none;font-size:14px;font-weight:500;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;height:36px;line-height:calc(36px - 2px)}.docs-hub-appbar #titlebar-mode-indicator-container>div{align-items:center;color:#188038;display:flex;height:28px;letter-spacing:0.25px}.docs-hub-appbar #titlebar-mode-indicator-container>.titlebar-request-access-button{padding-left:16px;padding-right:16px}#titlebar-mode-indicator-container .docs-approval-status-indicator>.docs-icon,#titlebar-mode-indicator-container .docs-approval-lock>.docs-icon{margin-right:8px}.kix-titlebar-mode-switcher.docs-material-menu-button-flat-primary .docs-icon-img.docs-icon-acl-view-only,.kix-titlebar-mode-switcher.docs-material-menu-button-flat-primary .docs-icon-img.docs-icon-acl-view-only:before{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_blue.svg)}.kix-titlebar-mode-switcher .docs-material-menu-button-flat-primary-dropdown{vertical-align:middle}.kix-titlebar-mode-switcher .docs-material-menu-button-flat-primary-dropdown-icon{opacity:1}.docs-hub-appbar #titlebar-mode-indicator-container>.kix-titlebar-approvals-button{float:left}#titlebar-mode-indicator-container>.kix-titlebar-approvals-button.docs-material-menu-button-flat-primary,#titlebar-mode-indicator-container>.kix-titlebar-approvals-button.docs-material-menu-button-flat-primary-hover.docs-material-menu-button-flat-primary-focused{border:none}#titlebar-mode-indicator-container .kix-titlebar-approvals-button.docs-material-menu-button-flat-primary .docs-material-menu-button-flat-primary-dropdown{margin-top:5px}#titlebar-mode-indicator-container>.docs-material-menu-button-flat-primary,.titlebar-request-access-button.docs-material-button,.titlebar-request-access-button.docs-material-button.docs-material-button-focused.docs-material-button-no-focus-border,.kix-titlebar-approvals-button.docs-material-button,.kix-titlebar-approvals-button.docs-material-button.docs-material-button-focused.docs-material-button-no-focus-border{border:1px solid #e8eaed}#titlebar-mode-indicator-container>.docs-material-menu-button-flat-primary-hover,.titlebar-request-access-button.docs-material-button.docs-material-button-hover,.kix-titlebar-approvals-button.docs-material-button.docs-material-button-hover{background:#f8fcf9;border:1px solid #c8e7d1}#titlebar-mode-indicator-container>.docs-material-menu-button-flat-primary-focused,.titlebar-request-access-button.docs-material-button.docs-material-button-focused,.kix-titlebar-approvals-button.docs-material-button.docs-material-button-focused{background:#e7f5eb;border:1px solid #bbe2c6}.titlebar-request-access-button.docs-material-button.docs-material-button-focused,.kix-titlebar-approvals-button.docs-material-button.docs-material-button-focused{line-height:32px;padding:0 8px}#titlebar-mode-indicator-container>.docs-material-menu-button-flat-primary-hover.docs-material-menu-button-flat-primary-focused,.titlebar-request-access-button.docs-material-button.docs-material-button-hover.docs-material-button-focused,.kix-titlebar-approvals-button.docs-material-button.docs-material-button-hover.docs-material-button-focused{background:#dff2e4;border:1px solid #b5e0c1}#titlebar-mode-indicator-container>.docs-material-menu-button-flat-primary-open,.titlebar-request-access-button.docs-material-button.docs-material-button-active,.kix-titlebar-approvals-button.docs-material-button.docs-material-button-active{box-shadow:0 2px 6px 2px rgba(60,64,67,.15)}.titlebar-request-access-button-tooltip{max-width:200px}.docs-parent-collections-container-prefix,.docs-parent-collections-container-text{color:rgba(0,0,0,.54);padding-left:4px}.docs-parent-collections-container-folder-name{color:rgba(0,0,0,.87);font-size:14px;padding-left:4px;bottom:1px}.docs-parent-collections-container{padding:2px 4px 0px 2px}.docs-parent-collections-container:hover,.docs-parent-collections-container:focus{background-color:#eeeeee;border-radius:2px}.docs-parent-collections-container-icon{bottom:2px}.docs-parent-collections-container-icon:not(.docs-parent-collections-container-icon-material){opacity:.54}.request-comment-access-toast-link{text-transform:uppercase;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-weight:500!important}.modal-dialog.docs-dialog.docs-restore-dialog{z-index:1007}.modal-dialog-bg.docs-restore-dialog-bg{z-index:1006}.docs-gm .modal-dialog.docs-dialog.docs-restore-dialog{min-width:464px;width:auto;width:unset}#docs-toolbar-iterator-label{color:rgba(0,0,0,0.87);font-size:13px;line-height:24px;margin-right:10px;margin-top:4px;vertical-align:middle}#docs-toolbar-iterator-previous,#docs-toolbar-iterator-next{margin-left:3px;margin-right:3px}.docs-in-editor-sync-state-icon{float:right;margin:0 0 0 24px;vertical-align:middle}.docs-in-editor-sync-state-icon .docs-icon{height:20px;margin:0;opacity:1;width:20px}.docs-in-editor-animated-sync{-webkit-animation-duration:2s;-moz-animation-duration:2s;-o-animation-duration:2s;animation-duration:2s;-webkit-animation-iteration-count:infinite;-moz-animation-iteration-count:infinite;-o-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:spin;-moz-animation-name:spin;-o-animation-name:spin;animation-name:spin;-webkit-animation-timing-function:linear;-moz-animation-timing-function:linear;-o-animation-timing-function:linear;animation-timing-function:linear;-webkit-transform-origin:center;-moz-transform-origin:center;-ms-transform-origin:center;-o-transform-origin:center;transform-origin:center}@keyframes spin{0%{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-ms-transform:rotate(360deg);-o-transform:rotate(360deg);transform:rotate(360deg)}100%{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);-o-transform:rotate(0deg);transform:rotate(0deg)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-ms-transform:rotate(360deg);-o-transform:rotate(360deg);transform:rotate(360deg)}100%{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);-o-transform:rotate(0deg);transform:rotate(0deg)}}.docs-offline-optindialog-short-disclaimer{margin-top:20px}.docs-offline-optindialog-disclaimer-link{cursor:pointer}#docs-offline-optindialog-disclaimer-link.docs-offline-optindialog-disclaimer-link-disabled{color:#ccc;pointer-events:none;text-decoration:none}.docs-offline-optindialog-disclaimer{margin-top:20px;max-width:400px}.docs-offline-optinpromo.jfk-bubble{font-size:13px;max-width:500px;outline:none;padding-left:24px;padding-top:11px;position:fixed;right:15px;top:113px}.docs-offline-optinpromo .jfk-bubble-arrow{display:none}#docs-offline-optinpromo-title{font-size:19px;font-weight:500;margin:12px 0}.docs-offline-optinpromo-notice{color:#767676;font-size:11px;margin:14px 0}.docs-offline-optinpromo-notice a{text-decoration:none}.docs-offline-optinpromo hr{border-top-color:#e1e1e1;border-top-style:solid;border-width:1px 0 0 0}.docs-offline-optinpromo-confirm-buttons{margin-top:15px}.docs-offline-welcomepromo{width:400px}.docs-offline-welcomepromo .modal-dialog-content{padding-right:80px;position:relative}.doc-offline-welcomepromo-img{position:absolute;right:0;top:-25px}.docs-gm #docs-offline-optinpromo-title,.docs-gm .docs-offline-optinpromo-buttons{padding:0}.docs-labelinputmenuitem{outline:none;padding-right:30px;padding-left:30px}#docs-omnibox-toolbar .docs-omnibox-autocomplete{margin-right:4px}.docs-omnibox-autocomplete{margin-top:4px}.docs-omnibox-input{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:100%;min-width:178px}.docs-omnibox-input::-webkit-input-placeholder{color:#777;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:11px;font-weight:500;opacity:1;padding-top:2px}.docs-omnibox-input::-moz-placeholder{color:#777;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:11px;font-weight:500;opacity:1}.docs-omnibox-input:-ms-input-placeholder{color:#777;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:11px;font-weight:500;opacity:1}.docs-gm .docs-omnibox-input.jfk-textinput{border:1px solid #dadce0;border-radius:4px;box-sizing:border-box;color:#3c4043;padding:1px 8px;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;line-height:16px;height:20px}.docs-gm .docs-omnibox-input.jfk-textinput::placeholder{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;line-height:16px}.docs-gm .docs-omnibox-input.jfk-textinput:focus{border:2px solid #1a73e8;box-shadow:none;padding:0px 7px}.docs-omnibox-autocomplete .ac-renderer{box-shadow:0 2px 4px rgba(0,0,0,0.2);border:1px solid #ccc;background-color:#fff;min-width:250px;outline:medium none;position:fixed;width:auto;z-index:1003}.docs-omnibox-autocomplete .ac-highlighted{font-weight:500}.docs-omnibox-autocomplete .ac-active{background-color:#eee}.docs-omnibox-row-content{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif}.docs-promo-title-prefix{color:#d25342;font-weight:500}.docs-promo-title{color:#333;font-weight:500}.docs-promo-content{color:#666;cursor:pointer}.docs-promo-dismiss-link{color:#15c;cursor:pointer}.jfk-bubble.jfk-bubble-promo.docs-promo-bubble .jfk-bubble-arrowdown .jfk-bubble-arrowimplbefore,.jfk-bubble.jfk-bubble-promo.docs-promo-bubble .jfk-bubble-arrowup .jfk-bubble-arrowimplbefore{border-color:rgba(0,0,0,.1) transparent}.jfk-bubble.jfk-bubble-promo.docs-promo-bubble .jfk-bubble-arrowleft .jfk-bubble-arrowimplbefore,.jfk-bubble.jfk-bubble-promo.docs-promo-bubble .jfk-bubble-arrowright .jfk-bubble-arrowimplbefore{border-color:transparent rgba(0,0,0,.1)}.jfk-bubble.jfk-bubble-promo.docs-promo-bubble .jfk-bubble-arrowdown .jfk-bubble-arrowimplafter{border:10px solid;border-bottom-width:0;border-color:#fafafa transparent}.jfk-bubble.jfk-bubble-promo.docs-promo-bubble .jfk-bubble-arrowup .jfk-bubble-arrowimplafter{border:10px solid;border-top-width:0;border-color:#fafafa transparent}.jfk-bubble.jfk-bubble-promo.docs-promo-bubble .jfk-bubble-arrowleft .jfk-bubble-arrowimplafter{border:10px solid;border-left-width:0;border-color:transparent #fafafa}.jfk-bubble.jfk-bubble-promo.docs-promo-bubble .jfk-bubble-arrowright .jfk-bubble-arrowimplafter{border:10px solid;border-right-width:0;border-color:transparent #fafafa}.jfk-bubble.docs-promo-bubble{background-color:#fafafa;border:none;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;box-shadow:rgba(255,255,255,.9) 0 1px 0 inset,rgba(0,0,0,.03) 0 -1px 0 inset,rgba(0,0,0,.15) 0 15px 10px,rgba(0,0,0,.3) 0 8px 36px;padding:0}.docs-gm-promo.jfk-bubble.docs-promo-bubble{background-color:#188038;border-radius:8px;box-shadow:0 2px 6px 2px rgba(60,64,67,.15);margin-top:4px}.docs-gm-promo.jfk-bubble.jfk-bubble-promo.docs-promo-bubble .jfk-bubble-arrowimplbefore{border-color:transparent}.docs-gm-promo.jfk-bubble.jfk-bubble-promo.docs-promo-bubble .jfk-bubble-arrowimplafter{border-color:#188038 transparent}.docs-promo-text-container{width:363px;word-wrap:break-word}.docs-promo-text-container-ltr{float:right}.docs-promo-container{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:24px 16px 0 16px}.docs-gm-promo .docs-promo-container{padding:16px}.docs-promo-icon-container{width:48px;height:48px;margin-right:16px;float:left}.docs-promo-header{color:#000;opacity:0.87;font-size:15px;font-weight:500}.docs-gm-promo .docs-promo-header{color:#fff;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:16px;font-weight:500;opacity:1}.docs-promo-header-prefix{color:#d25342}.docs-promo-body{color:#666;font-size:13px;line-height:20px;padding-top:20px}.docs-gm-promo .docs-promo-body{color:#fff;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;padding:4px 0}.docs-promo-action-row{font-weight:500;padding-top:20px;padding-right:8px;padding-bottom:24px;position:relative;text-align:right}.docs-gm-promo .docs-promo-action-row{padding:0}.docs-promo-action-row a,.docs-promo-action-row a:link,.docs-promo-action-row a:active,.docs-promo-action-row a:hover,.docs-promo-action-row a:visited{text-decoration:none}.docs-promo-action-row a,.docs-promo-action-row a:link,.docs-promo-action-row a:active,.docs-promo-action-row a:hover,.docs-promo-action-row a:visited{color:#4285f4}.docs-promo-action-container{color:#4285f4;cursor:pointer;text-transform:uppercase}.docs-gm-promo .docs-promo-action-container{color:#fff;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;margin:0 0 0 20px;text-transform:none}.docs-gm-promo .docs-promo-action-container:focus{outline-color:#fff}.docs-promo-action-button-right{margin-left:12.5px;float:right}.docs-promo-action-button-left{margin-right:12.5px}.docs-promo-two-buttons .docs-promo-action-button-right{max-width:125px;text-align:center}.docs-promo-two-buttons .docs-promo-action-button-left{max-width:61px;text-align:center}.docs-revisions-chromecover-titlebar{-ms-flex-align:center;-moz-box-align:center;-webkit-box-align:center;box-align:center;-webkit-align-items:center;align-items:center;display:flex;flex-direction:row;-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;box-pack:start;-ms-flex-pack:start;-webkit-box-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;font-size:16px;max-width:50vw}.docs-gm .docs-revisions-chromecover-titlebar{font-size:18px;line-height:24px}.docs-revisions-chromecover-titlebar-name-label{font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:normal;font-weight:var(--docs-material-font-weight-bold,normal);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.docs-gm .docs-revisions-chromecover-titlebar-name-label{font-weight:400}.docs-revisions-chromecover-titlebar[class*="docs-hc"] .docs-revisions-chromecover-titlebar-button-action{border:1px solid #fff}.docs-revisions-chromecover-titlebar-button-back-container{height:100%;min-width:58px}.docs-revisions-chromecover-titlebar-button-back{background-color:transparent;border:0;cursor:pointer;left:18px;margin:0;outline:0;padding:0}.docs-revisions-chromecover-titlebar-button-back.docs-material .docs-icon{height:21px;width:21px;margin:0;padding-bottom:3px}.docs-revisions-chromecover-titlebar-button-action{-ms-flex-align:center;-moz-box-align:center;-webkit-box-align:center;box-align:center;-webkit-align-items:center;align-items:center;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;display:flex;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-tap-highlight-color:transparent;background-color:#0f9d58;border:none;color:#fff;cursor:pointer;font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;height:36px;margin:0 0 0 24px;outline:none;padding:0 16px;text-transform:uppercase;white-space:nowrap;will-change:box-shadow,filter,background-color,color}.docs-gm .docs-revisions-chromecover-titlebar-button-action{padding:0 24px;text-transform:none}.docs-revisions-chromecover-titlebar-button-action,.docs-revisions-chromecover-titlebar-button-action.goog-flat-button-active,.docs-revisions-chromecover-titlebar-button-action.goog-flat-button-hover{-webkit-transition-duration:0.28s;-moz-transition-duration:0.28s;-o-transition-duration:0.28s;transition-duration:0.28s;-webkit-transition-property:box-shadow,filter,background-color,color;-moz-transition-property:box-shadow,filter,background-color,color;-o-transition-property:box-shadow,filter,background-color,color;transition-property:box-shadow,filter,background-color,color;-webkit-transition-timing-function:cubic-bezier(0.4,0.0,0.2,1);-moz-transition-timing-function:cubic-bezier(0.4,0.0,0.2,1);-o-transition-timing-function:cubic-bezier(0.4,0.0,0.2,1);transition-timing-function:cubic-bezier(0.4,0.0,0.2,1)}.docs-revisions-chromecover-titlebar-button-action.goog-flat-button-active,.docs-revisions-chromecover-titlebar-button-action.goog-flat-button-focused{filter:brightness(88%)}.docs-revisions-chromecover-titlebar-button-action.goog-flat-button-active{box-shadow:0 6px 10px 0 rgba(0,0,0,0.14),0 1px 18px 0 rgba(0,0,0,0.12),0 3px 5px -1px rgba(0,0,0,0.2)}.docs-revisions-chromecover-titlebar-button-action.goog-flat-button-hover:not(.goog-flat-button-active){box-shadow:0 2px 2px 0 rgba(0,0,0,0.14),0 3px 1px -2px rgba(0,0,0,0.12),0 1px 5px 0 rgba(0,0,0,0.2)}.docs-revisions-chromecover-content{-ms-flex-align:center;-moz-box-align:center;-webkit-box-align:center;box-align:center;-webkit-align-items:center;align-items:center;display:flex;flex-direction:row;box-pack:start;-ms-flex-pack:start;-webkit-box-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start;height:inherit}.docs-revisions-chromecover-content-exclude-sidebar-width{width:calc(100% - 250px)}.docs-gm .docs-revisions-chromecover-content-exclude-sidebar-width{width:calc(100% - 300px)}.docs-revisions-chromecover-content-color-default{background-color:#424242;color:#fff}.docs-gm .docs-revisions-chromecover-content-color-default{background-color:#fff;color:#202124}.docs-revisions-icon{cursor:pointer;direction:ltr;height:24px;min-height:24px;min-width:24px;outline:none;position:relative;text-align:left;vertical-align:middle;width:24px}.docs-hc-gecko .docs-revisions-icon{filter:invert(100%)}.docs-hc-ie .docs-revisions-icon{-ms-high-contrast-adjust:none;background-color:#fff}.docs-revisions-icon-rtl{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.docs-revisions-icon-focused:before{-webkit-transform:scale(1.375);-moz-transform:scale(1.375);-ms-transform:scale(1.375);-o-transform:scale(1.375);transform:scale(1.375);-webkit-border-radius:50%;-moz-border-radius:50%;border-radius:50%;background-color:#000;content:'';display:block;height:inherit;opacity:.12;position:absolute;width:inherit}.docs-revisions-icon-img-mask{height:inherit;overflow:hidden;position:absolute;width:inherit}.docs-revisions-icon-img:before{content:url(//ssl.gstatic.com/docs/common/revisions_sprite1.svg)}.docs-revisions-icon-img{height:72px;position:absolute;width:24px}.docs-revisions-icon-open .docs-revisions-icon-arrow{left:0;top:-48px}.docs-revisions-icon-arrow{left:0;top:0}.docs-revisions-icon-overflow{left:0;top:-24px}.docs-revisions-sidebar{display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;background-color:#fff;height:100%;outline-style:none;position:absolute;right:0;width:250px;z-index:2}.docs-gm .docs-revisions-sidebar{overflow:hidden;box-shadow:-3px 0px 6px -3px rgba(60,64,67,.15),3px 0px 6px -3px rgba(60,64,67,.15);width:300px}.docs-revisions-sidebar-header{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.docs-gm .docs-revisions-sidebar-header{background-color:#fff;color:#202124}.docs-revisions-sidebar[class*="docs-hc"]{border-left:1px solid #fff}.docs-revisions-sidebar[class*="docs-hc"]>.docs-revisions-sidebar-header{border-bottom:1px solid #fff}.docs-revisions-sidebar-header-bg-color-brand{background-color:#0f9d58}.docs-revisions-sidebar-header-text-color-brand{color:#fff}.docs-revisions-sidebar-title{-ms-flex-align:center;-moz-box-align:center;-webkit-box-align:center;box-align:center;-webkit-align-items:center;align-items:center;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:flex;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:16px;height:60px;padding:18px;width:100%}.docs-gm .docs-revisions-sidebar-title{font-size:16px;line-height:24px;padding:20px 16px}.docs-revisions-sidebar-name-filter-switch-container{-ms-flex-align:center;-moz-box-align:center;-webkit-box-align:center;box-align:center;-webkit-align-items:center;align-items:center;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:flex;border-top:1px solid rgba(255,255,255,0.2);height:47px;justify-content:space-between;padding:14px 14px 14px 18px;width:100%}.docs-gm .docs-revisions-sidebar-name-filter-switch-container{border-bottom:1px solid #dadce0;border-top:1px solid #dadce0;padding:12px 16px;height:40px}.docs-revisions-sidebar-name-filter-switch-container label{color:#fff;cursor:pointer;font-size:12px;font-weight:normal;opacity:0.87;word-break:break-word}.docs-gm .docs-revisions-sidebar-name-filter-switch-container label{color:#3c4043;line-height:16px}.docs-revisions-sidebar-revisions-list{position:relative;overflow:auto;overflow-x:hidden}.docs-revisions-sidebar-revisions-list:focus{outline-style:none}.docs-revisions-sidebar-revisions-list:focus-visible,.docs-revisions-sidebar-revisions-list:moz-focusring{outline-style:auto}body:not(.docs-gm) .docs-revisions-sidebar-revisions-list::-webkit-scrollbar{width:11px}body:not(.docs-gm) .docs-revisions-sidebar-revisions-list::-webkit-scrollbar-thumb{border-width:1px}body:not(.docs-gm) .docs-revisions-sidebar-revisions-list::-webkit-scrollbar-track{border-width:0}.docs-revisions-sidebar-actions{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;border-top:1px solid #cfcfcf;padding:9px 14px}.docs-revisions-sidebar-detail-button,#docs-revisions-sidebar-iw-button{margin-top:9px}.docs-revisions-sidebar-date-group{-ms-flex-align:center;-moz-box-align:center;-webkit-box-align:center;box-align:center;-webkit-align-items:center;align-items:center;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:flex;background-color:#f5f5f5;border-bottom:1px solid #eee;color:#616161;font-size:13px;font-weight:500;height:35px;padding-left:18px}.docs-gm .docs-revisions-sidebar-date-group{color:#3c4043;background-color:#fff;font-size:11px;font-weight:500;line-height:21px;text-transform:uppercase}.docs-revisions-sidebar-revisions-list-container{overflow:auto}.docs-revisions-sidebar-revisions-empty-container{display:flex;-ms-flex-align:center;-moz-box-align:center;-webkit-box-align:center;box-align:center;-webkit-align-items:center;align-items:center;-ms-flex:1 0 auto;-webkit-flex:1 0 auto;flex:1 0 auto}.docs-revisions-sidebar-revisions-empty{color:#616161;margin:0 18px;text-align:center}.docs-gm .docs-revisions-sidebar-revisions-empty-details{color:#80868b;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;line-height:20px}.docs-revisions-sidebar-revisions-empty-title{font-size:15px;font-weight:500}.docs-gm .docs-revisions-sidebar-revisions-empty-title{color:#3c4043;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:16px;font-weight:500;line-height:24px}.docs-revisions-sidebar-revisions-empty-details,.docs-revisions-sidebar-revisions-empty-title{margin-bottom:8px}a.docs-revisions-sidebar-revisions-empty-learn-more{color:#4285f4}.docs-gm a.docs-revisions-sidebar-revisions-empty-learn-more{color:#1a73e8;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;line-height:20px}.docs-ui-toast.docs-revisions-snack{z-index:1001}.docs-revisions-snack .docs-ui-toast-control{font-weight:500;text-transform:uppercase}.docs-revisions-snapshot-prompt .jfk-textinput{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;height:29px;margin-top:16px;width:100%}.docs-revisions-snapshot-prompt-loading-indicator,.docs-revisions-snapshot-prompt-loading-indicator .docs-spinner{-ms-flex-align:center;-moz-box-align:center;-webkit-box-align:center;box-align:center;-webkit-align-items:center;align-items:center;display:flex;box-pack:center;-ms-flex-pack:center;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center}.docs-revisions-snapshot-prompt-loading-indicator{min-height:96px;min-width:300px}.docs-revisions-snapshot-prompt-loading-indicator .docs-spinner{height:32px;width:32px}.docs-revisions-snapshot-prompt-loading-indicator .docs-quantum-spinner{margin:0;position:initial}.docs-revisions-switch{cursor:pointer;margin-left:14px}.docs-revisions-switch[class*="docs-hc"]>.apps-ui-material-slide-toggle-thumb,.docs-revisions-switch[class*="docs-hc"]>.apps-ui-material-slide-toggle-track{border:1px solid #fff;will-change:border-style}.docs-revisions-switch .apps-ui-material-slide-toggle-thumb{background-color:#bdbdbd}.docs-gm .docs-revisions-switch .apps-ui-material-slide-toggle-thumb{background-color:#fff}.docs-revisions-switch .apps-ui-material-slide-toggle-track{background-color:#fff;opacity:.3}.docs-gm .docs-revisions-switch .apps-ui-material-slide-toggle-track{background-color:#9aa0a6;opacity:1}.docs-revisions-switch.apps-ui-material-slide-toggle-container-checked .apps-ui-material-slide-toggle-thumb{background-color:#fafafa}.docs-gm .docs-revisions-switch.apps-ui-material-slide-toggle-container-checked .apps-ui-material-slide-toggle-thumb{background-color:#0f9d58}.docs-revisions-switch.apps-ui-material-slide-toggle-container-checked .apps-ui-material-slide-toggle-track{background-color:#000;opacity:.38}.docs-gm .docs-revisions-switch.apps-ui-material-slide-toggle-container-checked .apps-ui-material-slide-toggle-track{background-color:#0f9d58}.docs-revisions-tile{contain:content;outline:none;position:relative}.docs-revisions-tile-content-wrapper{padding-bottom:12px;border-bottom:1px solid #eee}.docs-revisions-tile-selected{background-color:#e2f3eb}.docs-revisions-tile-hover:not(.docs-revisions-tile-selected){background-color:#f5f5f5}.docs-revisions-tile-header{display:flex;flex-direction:column;font-size:13px;font-size:var(--docs-material-font-size-normal,13px);padding:12px 18px 3px 36px;position:relative}.docs-revisions-tile-actions,.docs-revisions-tile-collaborator-list{margin:0 18px 0 36px}.docs-gm .docs-revisions-tile-actions{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;line-height:16px;padding-top:3px}.docs-revisions-tile-collaborator{display:flex;flex-direction:column;font-size:12px}.docs-revisions-tile-collaborator-name{-ms-flex-align:center;-moz-box-align:center;-webkit-box-align:center;box-align:center;-webkit-align-items:center;align-items:center;display:flex;color:#585858}.docs-gm .docs-revisions-tile-collaborator{line-height:16px}.docs-gm .docs-revisions-tile-collaborator-name{color:#3c4043;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif}.docs-revisions-tile-collaborator-link{line-height:1;margin-top:3px}.docs-gm .docs-revisions-tile-collaborator-link{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;line-height:16px;margin-top:3px}.docs-revisions-tile-indented{margin-left:50px}.docs-revisions-tile-indented .docs-revisions-tile-header{padding-left:0}.docs-revisions-tile-indented .docs-revisions-tile-actions,.docs-revisions-tile-indented .docs-revisions-tile-collaborator-list{margin-left:0}.docs-revisions-tile-caption-v0{color:#808080;font-size:11px}.docs-revisions-tile-show-v0{color:#4275d6;font-size:11px}.docs-revisions-tile-show-v0-link{cursor:pointer;font-weight:500}.docs-revisions-tile-swatch{width:8px;height:8px;margin-right:5px}.docs-gm .docs-revisions-tile-swatch{border-radius:50%}.docs-revisions-tile-arrow-button,.docs-revisions-tile-menu-button{position:absolute}.docs-revisions-tile-arrow-button{left:9px;top:10px}.docs-revisions-tile-menu-button{right:9px;top:10px}.docs-revisions-tile-shade{border-bottom:1px solid #eee;cursor:progress;height:100%;position:absolute;width:100%;z-index:1}.docs-revisions-tile-shade:before{background-color:#fff;content:'';display:block;height:inherit;opacity:0.95;width:inherit}.docs-revisions-tile-shade .docs-spinner{-ms-flex-align:center;-moz-box-align:center;-webkit-box-align:center;box-align:center;-webkit-align-items:center;align-items:center;display:flex;box-pack:center;-ms-flex-pack:center;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-transform:scale(0.5);-moz-transform:scale(0.5);-ms-transform:scale(0.5);-o-transform:scale(0.5);transform:scale(0.5);height:48px;left:50%;margin:-24px 0 0 -24px;position:absolute;top:50%;width:48px}.docs-revisions-tile-shade .docs-quantum-spinner{margin:0;position:initial}.docs-revisions-tile-descriptor{color:#000;font-size:14px}.docs-gm .docs-revisions-tile-descriptor{font-style:italic}.docs-revisions-tile-selected .docs-revisions-tile-descriptor{font-weight:500}.docs-gm .docs-revisions-tile-selected .docs-revisions-tile-descriptor,.docs-gm .docs-revisions-tile-selected .docs-revisions-tile-text-box~.docs-revisions-tile-descriptor{color:#188038}.docs-revisions-tile-text-box~.docs-revisions-tile-descriptor{color:#585858;font-size:12px;font-weight:normal;margin-top:3px}.docs-gm .docs-revisions-tile-descriptor,.docs-gm .docs-revisions-tile-text-box~.docs-revisions-tile-descriptor{color:#3c4043;font-size:12px;font-weight:400;line-height:16px}.docs-revisions-tile-text-box{-webkit-transition-duration:0.28s;-moz-transition-duration:0.28s;-o-transition-duration:0.28s;transition-duration:0.28s;-webkit-transition-property:border-color;-moz-transition-property:border-color;-o-transition-property:border-color;transition-property:border-color;-webkit-transition-timing-function:cubic-bezier(0.4,0.0,0.2,1);-moz-transition-timing-function:cubic-bezier(0.4,0.0,0.2,1);-o-transition-timing-function:cubic-bezier(0.4,0.0,0.2,1);transition-timing-function:cubic-bezier(0.4,0.0,0.2,1);background:transparent;border-radius:2px;border:1px solid transparent;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;margin:-3px;margin-right:18px;outline:0;padding:2px;resize:none;will-change:border-color}.docs-revisions-tile-text-box:hover:enabled{border-color:#9e9e9e}.docs-revisions-tile-text-box:focus:enabled{border-color:#498dff}.docs-revisions-tile-text-box:disabled{color:#000;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.docs-revisions-tile-selected .docs-revisions-tile-text-box{font-weight:500}.docs-gm .docs-revisions-tile-text-box{font-weight:400;line-height:20px}.docs-gm .docs-revisions-tile-selected .docs-revisions-tile-text-box{color:#188038;font-weight:700}.docs-gm docs-revisions-tile-text-box:disabled{color:#3c4043}.alt-text-dialog-content textarea{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif}#alt-text-dialog-title,#alt-text-dialog-description{width:400px}#alt-text-dialog-description{height:100px;padding-top:6px;padding-left:9px}.alt-text-dialog-content td{padding-top:10px;vertical-align:top}.alt-text-dialog-content tr{margin:5px 0}.alt-text-dialog-content label{font-weight:500;padding-right:30px;position:relative;top:5px}.alt-text-dialog-intro{max-width:500px;padding:5px 0}.docs-bubble{background-color:#fff;border-radius:2px;border:1px solid;border-color:#bbb #bbb #a8a8a8;-moz-box-shadow:0 1px 3px rgba(0,0,0,.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,.2);-ms-box-shadow:0 1px 3px rgba(0,0,0,.2);box-shadow:0 1px 3px rgba(0,0,0,.2);color:#666;cursor:default;padding:12px 20px;position:absolute;z-index:502;white-space:nowrap}.docs-bubble.docs-linkbubble-bubble{z-index:503}.docs-bubble-link,.docs-bubble a{color:#15c!important;cursor:pointer;text-decoration:none!important}.docs-bubble a{display:inline-block;max-width:400px;text-overflow:ellipsis;overflow:hidden;vertical-align:bottom}.docs-bubble-link:hover,.docs-bubble a:hover{text-decoration:underline!important}.docs-bubble-label{font-weight:500}a.docs-bubble-link-disabled{color:#ccc!important;text-decoration:none!important}.docs-bubble .docs-bubble-button .docs-icon{vertical-align:baseline;width:18px;height:18px;margin:0px}.docs-bubble .docs-bubble-button{box-shadow:none;background-color:transparent;background-image:none;cursor:pointer;height:18px;width:18px;border-radius:50%;border-width:0px;border-style:solid;border-color:transparent;box-shadow:none;background-clip:padding-box;cursor:pointer;-webkit-tap-highlight-color:transparent;min-width:auto;min-width:unset;margin-right:0px;padding:6px}.docs-bubble .docs-bubble-button.jfk-button:hover,.docs-bubble .docs-bubble-button.jfk-button:focus{background-color:rgba(0,0,0,.06)}.docs-bubble .docs-bubble-button.jfk-button:hover:active,.docs-bubble .docs-bubble-button.jfk-button.goog-toolbar-button-checked{background-color:#e6f4ea}.docs-hc-gecko .docs-bubble-button,.docs-hc-ie .docs-bubble-button{border:1px solid transparent}.docs-clipboardshortcutsdialog{color:#666}.docs-clipboardshortcutsdialog-shortcut{padding-right:40px}.docs-clipboardshortcutsdialog-mac .docs-clipboardshortcutsdialog-shortcut{padding-right:95px}.docs-clipboardshortcutsdialog-shortcut-command{padding-bottom:5px}.docs-clipboardshortcutsdialog-shortcuts{padding:15px 0}.docs-clipboardshortcutsdialog-shortcut-command{line-height:1.0;font-size:36px;font-weight:500}.modal-dialog.color-dialog{padding:10px}.color-dialog>.modal-dialog-title{display:none}.color-dialog>.modal-dialog-buttons{margin-top:8px;padding-left:18px}.docs-colormenuitems-header{padding-left:5px}.docs-colormenuitems-custom-header{margin-left:-23px}.docs-gm .colormenuitems-custom-header-add-button .docs-colormenuitems-custom-header,.docs-gm .docs-colormenuitems-scheme-header{margin-left:5px}.docs-gm .docs-colormenuitems .goog-menuitem.colormenuitems-custom-header-add-button{border-radius:4px;border-width:1px 0;font-size:13px;padding:2px 0}.docs-gm .goog-menuitem.colormenuitems-custom-header-add-button.goog-menuitem-highlight{border-width:0}.docs-gm .docs-colormenuitems-scheme-header{padding:4px 0 4px 5px}.docs-gm .goog-menu .goog-menuitem.colormenuitems-no-color{border-color:transparent;border-style:dotted;border-width:1px;padding:5px 15px 5px 38px}.docs-gm .docs-colormenuitems .docs-colormenuitems-scheme-header,.docs-gm .docs-colormenuitems .docs-colormenuitems-custom-header{color:#3c4043;font-size:11px;font-weight:500;letter-spacing:.8px;padding-left:0px;text-transform:uppercase}.docs-gm .docs-colormenuitems .docs-text-color-state-change-button.jfk-button{background-color:#fff;background-image:none;border:none;box-shadow:none;color:#5f6368;cursor:pointer;font-size:14px}.docs-gm .docs-colormenuitems .docs-text-color-state-change-button.jfk-button-checked{border-bottom:2px solid #0f9d58;color:#202124}.docs-colormenuitems.goog-menu{padding:10px}.docs-colormenuitems .jfk-palette-table{margin:0;padding:3px}.docs-colormenuitems .jfk-palette-cell-hover{border:1px solid #fff;outline:1px solid #000}.docs-colormenuitems-theme-header{padding-top:5px}.docs-colormenuitems-custom-palette .jfk-palette-cell{border-color:#ccc;height:16px;width:16px}.docs-colormenuitems-custom-palette .jfk-palette-cell-selected{border-color:black;outline:none}.goog-color-menu-button.goog-menu-button{background-color:#f5f5f5;background-image:-webkit-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:-moz-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:-ms-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:-o-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:linear-gradient(top,#f5f5f5,#f1f1f1)}.goog-color-menu-button .goog-menu-button-outer-box,.goog-color-menu-button .goog-menu-button-inner-box{border-color:rgba(0,0,0,0.1)}.goog-color-menu-button.goog-menu-button-focused .goog-menu-button-outer-box,.goog-color-menu-button.goog-menu-button-focused .goog-menu-button-inner-box{border-color:#4d90fe}.goog-color-menu-button.goog-menu-button-open .goog-menu-button-outer-box,.goog-color-menu-button.goog-menu-button-open .goog-menu-button-inner-box{border-color:rgba(0,0,0,0.1)}.goog-color-menu-button.goog-menu-button-hover .goog-menu-button-outer-box,.goog-color-menu-button.goog-menu-button-hover .goog-menu-button-inner-box{border-color:rgba(0,0,0,0.1)!important}.goog-color-menu-button.goog-menu-button-hover .goog-menu-button-outer-box{box-shadow:0 1px 1px rgba(0,0,0,.1)}.docs-flatcolormenubutton.goog-flat-menu-button{min-width:0px}.docs-flatcolormenubutton .goog-flat-menu-button-caption{display:inline-block;height:14px;outline:1px solid #bbb;vertical-align:middle;width:14px}.docs-copy-link{width:500px}.copy-link-dialog{color:black;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;white-space:normal}.copy-link-butter-holder{position:absolute;top:0px;padding-top:16px;left:220px}.docs-chromeextensioninstalldialog-image{vertical-align:top}.docs-chromeextensioninstalldialog-textpart{width:360px;padding:0 0 15px 25px;color:#333}.docs-chromeextensioninstalldialog-note{padding:25px 0 0 0;color:#666}.docs-chromeextensioninstalldialog-noteV2{color:#666;padding:10px 0 0 0}.docs-chromeextensioninstalldialog-shortcuts{color:#666}.docs-findbar-input{width:170px;height:19px}.docs-gm .docs-findbar-content,.docs-gm .docs-gotobar-content{height:36px}.docs-slidingdialog .docs-findbar-text{border:1px solid #aaa;font-size:11px;height:16px;margin-right:4px;padding:2px;width:172px}.docs-slidingdialog #docs-findbar-spinner{display:inline-block;position:relative;transition:left 300ms ease-out;transition:width 300ms ease-out;vertical-align:middle}.docs-gm .docs-slidingdialog #docs-findbar-button-previous,.docs-gm .docs-slidingdialog #waffle-gotobar-button-go{margin-left:8px;margin-right:8px}.docs-slidingdialog #docs-findbar-button-next{margin-right:8px}.docs-gm .docs-slidingdialog .goog-toolbar-separator{height:24px;width:2px;margin:0 8 0 0px;position:center;vertical-align:middle}.docs-slidingdialog #docs-findbar-button-more-options{margin-right:8px}.docs-findbar-button-previous-rtl{margin-left:-1px}.docs-findbar-content .jfk-button-disabled{background-color:#f5f5f5;border-color:rgba(0,0,0,0.1);border-color:#dcdcdc}.docs-gm .docs-findbar-content .jfk-button-disabled,.docs-gm .docs-gotobar-content .jfk-button-disabled{opacity:.38}.docs-gm .docs-findbar-content .jfk-button,.docs-gm .docs-gotobar-content .jfk-button{background-image:none;background-color:transparent;border-color:transparent;margin:0 8px 0 0;min-width:24px;vertical-align:middle}.docs-gm .docs-findbar-content .jfk-button-hover,.docs-gm .docs-gotobar-content .jfk-button-hover{box-shadow:none;background-color:rgba(0,0,0,.06);background-image:none;cursor:pointer;border-color:transparent!important;border-radius:2px;border-width:1px}.docs-gm .docs-findbar-content .jfk-button-active,.docs-gm .docs-gotobar-content .jfk-button-active{box-shadow:none;background-color:rgba(0,0,0,0.12);background-image:none;cursor:pointer;border-color:transparent!important;border-radius:2px;border-width:1px}.docs-findinput-container{background:#fff;border:1px solid #d9d9d9;border-top:1px solid #c0c0c0;min-width:20px;padding:0 8px;width:100%}.docs-findinput-container-focus{border:1px solid #4d90fe;box-shadow:inset 0 1px 2px rgba(0,0,0,0.3);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.3);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.3);outline:none}.docs-gm .docs-findinput-container,.docs-gm .docs-gotoinput-container{border:1px solid #dadce0;border-radius:4px;box-sizing:border-box;color:#3c4043;padding:1px 8px;font-size:14px;height:36px;margin:8px 0;margin:0}.docs-gm .docs-findinput-container-focus,.docs-gm .docs-gotoinput-container:focus{border:2px solid #1a73e8;box-shadow:none;padding:0px 7px}.docs-findinput-input,.docs-findinput-input:focus{background:transparent!important;border:none!important;box-shadow:none!important;-moz-box-shadow:none!important;-webkit-box-shadow:none!important;font-size:13px;height:25px;margin:0;outline:none!important;padding:1px 0px!important;width:100%}.docs-findinput-count-container{max-width:120px;overflow:hidden;padding:0 8px 0 4px;text-align:right}.docs-findinput-count{color:#ccc;white-space:nowrap}#fontSizeSelect .goog-toolbar-menu-button-caption,#docs-font-size .goog-toolbar-menu-button-caption{overflow:hidden;text-overflow:ellipsis;width:20px;white-space:nowrap}#fontSizeSelect .goog-toolbar-combo-button-caption,#docs-font-size .goog-toolbar-combo-button-caption{width:48px!important}#fontSizeSelect .goog-toolbar-combo-button-input,#docs-font-size .goog-toolbar-combo-button-input{width:28px}#fontSizeSelect.docs-font-size-inc-dec-combobox{border-color:#dadce0!important;border-radius:0;vertical-align:middle;width:39px}.goog-toolbar[role="toolbar"] .docs-font-size-inc-dec-action-button.goog-toolbar-button{border-color:#dadce0!important}#fontSizeDecrement.docs-font-size-inc-dec-action-button.goog-toolbar-button{border-radius:2px 0 0 2px;border-right:0!important;margin-left:5px;margin-right:0}.goog-toolbar[role="toolbar"] .docs-font-size-inc-dec-action-button.goog-toolbar-button,.docs-font-size-inc-dec-action-button.goog-toolbar-button .goog-toolbar-button-outer-box,.docs-font-size-inc-dec-action-button.goog-toolbar-button .goog-toolbar-button-inner-box{height:22px;min-width:23px;width:23px}#fontSizeIncrement.docs-font-size-inc-dec-action-button.goog-toolbar-button{border-left:0!important;border-radius:0 2px 2px 0;margin-left:0;margin-right:5px}#fontSizeSelect.docs-font-size-inc-dec-combobox,#fontSizeSelect.docs-font-size-inc-dec-combobox .goog-toolbar-combo-button-caption,#fontSizeSelect.docs-font-size-inc-dec-combobox .goog-toolbar-combo-button-inner-box{height:22px;margin-left:0;margin-right:0}#fontSizeSelect.docs-font-size-inc-dec-combobox .goog-toolbar-combo-button-input{height:24px!important;margin:-1px;text-align:center;width:41px!important;padding:0}#fontSizeSelect.docs-font-size-inc-dec-combobox .goog-toolbar-combo-button-caption{width:41px!important}#fontSizeSelect.docs-font-size-inc-dec-combobox .goog-toolbar-combo-button-inner-box{padding:0}.docs-font-size-inc-dec-combobox.goog-toolbar-combo-button-hover:not(.goog-toolbar-combo-button-open) .goog-toolbar-combo-button-input{border-right-color:transparent!important}.goog-toolbar[role="toolbar"] .docs-font-size-inc-dec-action-button.goog-toolbar-button .docs-icon{height:22px;margin:0;vertical-align:baseline;width:22px}.docs-gm .goog-menu.goog-menu-noicon.docs-font-size-inc-dec-menu .goog-menuitem{min-width:39px;padding-right:0;padding-left:0;text-align:center}.hsv,.hsva{position:relative;width:182px;height:185px}.hsv label span,.hsva label span{display:none}.hsv-hs-backdrop,.hsv-hs-image,.hsva-hs-backdrop,.hsva-hs-image{position:absolute;top:45px;left:10px;width:128px;height:128px;border:1px solid #999}.hsv-hs-backdrop,.hsva-hs-backdrop{background-color:#000}.hsv-hs-image,.hsv-v-image,.hsv-hs-handle,.hsv-v-handle,.hsva-hs-image,.hsva-v-image,.hsva-a-image,.hsva-hs-handle,.hsva-v-handle,.hsva-a-handle,.hsva-swatch-backdrop{background-image:url(//ssl.gstatic.com/docs/drawings/images/hsva-sprite-sm.png)}.hsv-noalpha .hsv-hs-image,.hsv-noalpha .hsv-v-image,.hsv-noalpha .hsv-hs-handle,.hsv-noalpha .hsv-v-handle,.hsva-noalpha .hsva-hs-image,.hsva-noalpha .hsva-v-image,.hsva-noalpha .hsva-a-image,.hsva-noalpha .hsva-hs-handle,.hsva-noalpha .hsva-v-handle,.hsva-noalpha .hsva-a-handle,.hsva-noalpha .hsva-swatch-backdrop{background-image:url(//ssl.gstatic.com/docs/drawings/images/hsva-sprite-sm.gif)}.hsv-hs-image,.hsva-hs-image{background-position:0 0}.hsv-hs-handle,.hsva-hs-handle{position:absolute;left:5px;top:40px;width:11px;height:11px;overflow:hidden;background-position:0 -128px}.hsv-v-image,.hsva-v-image,.hsva-a-image{position:absolute;top:45px;left:155px;width:9px;height:128px;border:1px solid #999;background-color:#fff;background-position:-128px 0}.hsv-v-handle,.hsva-v-handle,.hsva-a-handle{position:absolute;top:40px;left:148px;width:25px;height:11px;background-position:-11px -128px;overflow:hidden}.hsv-swatch,.hsva-swatch,.hsva-swatch-backdrop{position:absolute;top:10px;right:auto;left:10px;width:30px;height:22px;border:1px solid #999;background-color:#fff}.hsv-input,.hsva-input{position:absolute;top:10px;right:auto;left:50px;width:75px}.hsva{width:205px}.hsva-a-image{left:182px;background-position:-137px 0}.hsva-a-handle{left:175px}.hsva-swatch,.hsva-swatch-backdrop{background-position:-36px -128px}.hsva-swatch{z-index:5}.hsva-swatch-backdrop{z-index:1}.docs-loading-animation{width:28px;height:6px;position:absolute;margin:auto;bottom:0;left:0;right:0;top:0}.docs-loading-animation-dot-1,.docs-loading-animation-dot-2,.docs-loading-animation-dot-3{background-color:rgba(0,0,0,.2);border-radius:6px;display:inline-block;height:6px;position:absolute;width:6px}.docs-loading-animation-dot-1{-webkit-animation:docs-loading-animation-pulse 1s ease-in-out infinite 0s;-moz-animation:docs-loading-animation-pulse 1s ease-in-out infinite 0s;-o-animation:docs-loading-animation-pulse 1s ease-in-out infinite 0s;animation:docs-loading-animation-pulse 1s ease-in-out infinite 0s;left:0}.docs-loading-animation-dot-2{-webkit-animation:docs-loading-animation-pulse 1s ease-in-out infinite .33s;-moz-animation:docs-loading-animation-pulse 1s ease-in-out infinite .33s;-o-animation:docs-loading-animation-pulse 1s ease-in-out infinite .33s;animation:docs-loading-animation-pulse 1s ease-in-out infinite .33s;left:50%;margin-left:-3px}.docs-loading-animation-dot-3{-webkit-animation:docs-loading-animation-pulse 1s ease-in-out infinite .66s;-moz-animation:docs-loading-animation-pulse 1s ease-in-out infinite .66s;-o-animation:docs-loading-animation-pulse 1s ease-in-out infinite .66s;animation:docs-loading-animation-pulse 1s ease-in-out infinite .66s;right:0}@-webkit-keyframes docs-loading-animation-pulse{0%,40%,100%{background-color:rgba(0,0,0,.2);-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}15%{background-color:rgba(0,0,0,1);-webkit-transform:scale(1.2);-moz-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2)}}@keyframes docs-loading-animation-pulse{0%,40%,100%{background-color:rgba(0,0,0,.2);-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}15%{background-color:rgba(0,0,0,1);-webkit-transform:scale(1.2);-moz-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2)}}.mobile-apps-promo-base{border-radius:8px!important;bottom:48px!important;height:248px;left:auto!important;right:48px!important;top:auto!important;width:656px}.mobile-apps-promo-base .docs-promo-icon-container{height:200px;margin-left:16px;width:100px}.mobile-apps-promo-base .docs-promo-text-container{height:168px;margin-top:5px;margin-right:8px;width:458px}.mobile-apps-promo-base .docs-promo-header{color:#202124;font-family:'Google Sans';font-size:24px;font-weight:400;max-height:50px}.mobile-apps-promo-base .docs-promo-body{color:#5f6368;font-family:Roboto;font-size:18px;font-weight:100;line-height:24px;max-height:56px;padding-top:16px}.mobile-apps-promo-base .docs-promo-action-row{display:flex;flex-direction:row-reverse;padding-top:35px}.mobile-apps-promo-base .docs-promo-action-container{font-family:'Google Sans';font-size:14px;font-weight:100;letter-spacing:0.25px;line-height:16px;text-transform:none}.mobile-apps-promo-base .docs-promo-action-row .docs-promo-action-button-left{align-items:center;background-color:white;border:1.2px solid #dadce0;border-radius:4px;color:#202124;display:flex;justify-content:center;margin-right:0;max-height:40px;padding:10px 22px 11px 22px;width:58px}.mobile-apps-promo-base .docs-promo-action-row .docs-promo-action-button-right{align-items:center;background:#188038;border:1.2px solid #188038;border-radius:4px;color:#fff;display:flex;justify-content:center;margin-left:0;margin-right:16px;max-height:40px;padding:9px 22.5px 9.5px 23px;width:112px}.mobile-apps-promo-base .docs-promo-action-row .docs-promo-action-button-right:hover{background:#2a8947}.mobile-apps-promo-base .docs-promo-action-row .docs-promo-action-button-left:hover{background:#f1f3f4}.docs-slidingdialog-button-close:focus{outline:1px solid #4d90fe}.docs-gm .docs-slidingdialog-close-container{padding-top:3px;vertical-align:middle}.docs-gm .docs-slidingdialog-close-container .goog-flat-button{cursor:pointer}.docs-gm .docs-slidingdialog .docs-icon-close{opacity:1}.docs-slidingdialog{background-color:#fff;border-bottom:1px solid #d9d9d9;border-top:none;border-left:1px solid #d9d9d9;border-right:1px solid #d9d9d9;margin-top:-1px;padding:10px 12px;outline:none}.docs-gm .docs-slidingdialog{border-bottom-right-radius:8px;border-bottom-left-radius:8px;padding:16px 12px}.docs-slidingdialog .jfk-textinput{border-top-color:#d9d9d9;margin-right:0}.docs-slidingdialog .jfk-textinput:focus{border-top-color:#4d90fe}.docs-slidingdialog .goog-custom-button-inner-box{padding:1px 2px 0 2px}.docs-slidingdialog .goog-custom-button{margin:-2px 0 0 0}.docs-slidingdialog .docs-icon-up,.docs-slidingdialog .docs-icon-down,.docs-slidingdialog .docs-icon-close,.docs-slidingdialog .docs-icon-ellipsis,.docs-slidingdialog .docs-icon-overflow-three-dots{opacity:.40}.docs-gm .docs-slidingdialog .docs-icon-img{opacity:1}.docs-slidingdialog .jfk-button{vertical-align:top}.docs-slidingdialog .goog-flat-button{background-color:transparent;border:0;cursor:default;margin:0;padding:0}.docs-slidingdialog .goog-flat-button-hover{background-color:transparent}.docs-slidingdialog-holder{margin-top:-1px;overflow:hidden;position:absolute;right:44px;z-index:507;min-width:300px}.docs-slidingdialog-wrapper{left:0;position:relative;width:100%}.jfk-button.docs-submenuitem-splitbutton{background-color:#eee;border-top:1px solid #f2f2f2;border-bottom:1px solid #f2f2f2;border-bottom-right-radius:0;border-radius:0;border-right:none!important;border-top-right-radius:0;color:#6e6e6e;cursor:pointer;font-size:70%;font-weight:normal;height:57px;left:auto;line-height:59px;margin:0;min-height:26px;min-width:0;padding:0;position:absolute;right:0;top:0;width:34px;-moz-border-radius-topright:0;-moz-border-radius-bottomright:0;-webkit-border-top-right-radius:0;-webkit-border-bottom-right-radius:0}.goog-menuitem.docs-submenuitem{border:none;border-bottom:1px solid #e6e6e6;height:59px;padding-top:0;padding-bottom:0}.goog-menuitem.docs-submenuitem .goog-menuitem-content{height:59px;line-height:59px}.goog-menuitem.docs-submenuitem .goog-menuitem-checkbox{height:59px;top:0}.docs-squarehandleselectionbox-border{position:absolute;border:1px solid #0096fd;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;z-index:30;background-color:rgba(0,0,0,0)}.docs-squarehandleselectionbox-handle{position:absolute;border:1px solid #fff;background-color:#0096fd;width:7px;height:7px;font-size:0;z-index:40}.docs-ui-toast{align-items:center;border-radius:2px;display:flex;flex-direction:row;background-color:#323232;bottom:24px;color:white;font-size:14px;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;left:24px;line-height:20px;min-width:288px;max-width:568px;outline:none;padding:17px 24px;position:absolute;z-index:999}.docs-gm .docs-ui-toast{background-color:#202124;border-radius:4px;box-shadow:0 4px 8px 3px rgba(60,64,67,.15);color:#dadce0;padding:16px 24px}.docs-ui-toast-content{flex-grow:1;flex-shrink:1;display:inline-block}.docs-ui-toast-control-bar{flex-grow:0;flex-shrink:0;color:#a1c2fa;cursor:pointer;display:inline-block;margin-left:24px}.docs-gm .docs-ui-toast-control-bar{color:#34a853}.docs-ui-toast-control{display:inline-block;outline:none;padding-left:10px;font-weight:500}.docs-gm .docs-ui-toast-control{font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:16px;font-weight:500;text-transform:none}.docs-ui-toast-close-bar{cursor:pointer;display:inline-block;margin-left:24px}.docs-ui-toast-close{display:inline-block;background-color:transparent;border:0}.goog-toolbar-combo-button{-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;background:0;border-color:transparent;border-style:solid;border-width:1px;outline:none;padding:0;height:24px;color:#333;line-height:24px;list-style:none;font-size:11px;font-weight:500;text-decoration:none;vertical-align:middle;cursor:default;top:2px}.goog-toolbar-combo-button-outer-box,.goog-toolbar-combo-button-inner-box{border:0;vertical-align:top}.goog-toolbar-combo-button-outer-box{margin:0;padding:0}.goog-toolbar-combo-button-inner-box{padding:0 2px;margin:0 1px}.goog-toolbar-combo-button-hover{box-shadow:0 1px 1px rgba(0,0,0,.1);background-color:#f8f8f8;background-image:-webkit-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-moz-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-ms-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-o-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:linear-gradient(top,#f8f8f8,#f1f1f1);border-color:#c6c6c6!important;color:#222}.goog-toolbar-combo-button-active{box-shadow:inset 0 1px 2px rgba(0,0,0,.1);background-color:#f6f6f6;background-image:-webkit-linear-gradient(top,#f6f6f6,#f1f1f1);background-image:-moz-linear-gradient(top,#f6f6f6,#f1f1f1);background-image:-ms-linear-gradient(top,#f6f6f6,#f1f1f1);background-image:-o-linear-gradient(top,#f6f6f6,#f1f1f1);background-image:linear-gradient(top,#f6f6f6,#f1f1f1);border-color:#c6c6c6}.goog-toolbar-combo-button-open{box-shadow:inset 0 1px 2px rgba(0,0,0,.1);background-color:#eee;background-image:-webkit-linear-gradient(top,#eee,#e0e0e0);background-image:-moz-linear-gradient(top,#eee,#e0e0e0);background-image:-ms-linear-gradient(top,#eee,#e0e0e0);background-image:-o-linear-gradient(top,#eee,#e0e0e0);background-image:linear-gradient(top,#eee,#e0e0e0);border-color:#ccc;color:#222}.goog-toolbar-combo-button-disabled{color:#222!important;opacity:0.3;filter:alpha(opacity=30)}.goog-toolbar-combo-button-dropdown{background:url(//ssl.gstatic.com/ui/v1/disclosure/small-grey-disclosure-arrow-down.png) center no-repeat;float:right;margin:9px 0 0 0px;padding:0 0 0 1px;min-width:7px;opacity:.8;vertical-align:middle;width:5px;height:7px;*float:none;*position:relative;*top:-3px}.goog-toolbar-combo-button-caption{padding:0;margin:0 0 0 -3px}.docs-toolbar-small-separator+div.goog-toolbar-combo-button{margin:4px 1px 0 -1px}.goog-toolbar-combo-button-input{background:transparent;border:1px solid transparent!important;color:#333;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif!important;font-size:12px!important;font-weight:500!important;height:20px!important;overflow:hidden!important}.goog-toolbar-combo-button-hover .goog-toolbar-combo-button-input{border-right:1px solid #d9d9d9!important}.goog-toolbar-combo-button-open .goog-toolbar-combo-button-input{background:transparent;border-right:1px solid transparent!important}.goog-toolbar-combo-button-input:focus{box-shadow:inset 0 1px 2px rgba(0,0,0,0.3);-webkit-user-select:text!important;-moz-user-select:text!important;background:#fff;border:1px solid #4d90fe!important;height:20px;outline:none}.docs-toolbar-zoom-combobox .goog-toolbar-menu-button-caption{overflow:hidden;text-overflow:ellipsis;width:20px;white-space:nowrap}.docs-toolbar-zoom-combobox .goog-toolbar-combo-button-caption{width:48px!important}.docs-toolbar-zoom-combobox .goog-toolbar-combo-button-input{width:28px}.docs-material-dialog{background:#fff;border-radius:2px;border:none;box-shadow:0px 16px 24px 2px rgba(0,0,0,0.14),0px 6px 30px 5px rgba(0,0,0,0.12),0px 8px 10px -5px rgba(0,0,0,0.2);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;position:absolute;z-index:1003}.docs-material-dialog-bg{background-color:#000;left:0;position:absolute;top:0;z-index:1002}.docs-material-dialog:focus{outline:none}.docs-material-dialog-title{border-bottom:1px solid rgba(0,0,0,0.12);padding:24px 24px 20px 24px}.docs-material-dialog-title-draggable{cursor:move}.docs-material-dialog-title-text{font:500 21px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;padding-right:38px}.docs-material-dialog-title-close{border:1px solid transparent;border-radius:2px;box-sizing:border-box;cursor:pointer;display:block;height:20px;opacity:0.54;position:absolute;right:24px;top:26px;width:20px}.docs-material-dialog-title-close:focus{border-color:#4285f4;opacity:1.0;outline:none}.docs-material-dialog-title-close:hover{opacity:1.0}.docs-material-dialog-content{padding:24px}.docs-material-dialog-buttons{float:right;padding:8px 4px 14px 4px}.docs-material-dialog-buttons:after{clear:both;content:"";display:block;height:0;width:0}.docs-material-gm-dialog{background-color:#fff;border:1px solid transparent;border-radius:8px;box-shadow:0 4px 8px 3px rgba(60,64,67,.15);position:absolute;z-index:1003}.docs-material-gm-dialog-bg{background-color:#000;left:0;position:absolute;top:0;z-index:1002}.docs-material-gm-dialog:focus{outline:none}.docs-material-gm-dialog-title{border-bottom:none;padding:24px}.docs-material-gm-dialog-title-text{color:#202124;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:22px;font-weight:400;line-height:28px}.docs-material-gm-dialog-title-close{height:24px;position:absolute;right:24px;top:26px;width:24px}.docs-material-gm-dialog-content{min-width:312px;padding:0px 24px 24px}.docs-material-gm-dialog-buttons{display:flex;justify-content:flex-end;padding:24px}.docs-material-gm-dialog .docs-material-button-fill-primary.docs-material-button{margin-left:12px;text-transform:none}.docs-material-gm-dialog .docs-material-button-hairline-default.docs-material-button{text-transform:none}.docs-charts-editor-material-color-picker{color:rgba(0,0,0,0.87);cursor:pointer;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;line-height:21px;outline:none;width:100%}.docs-charts-editor-material-color-picker-disabled{color:rgba(0,0,0,0.12);cursor:default}.docs-charts-editor-material-color-picker-outer-box{transition:border-color 0.3s ease;border-bottom:1px solid rgba(0,0,0,0.12);margin-bottom:1px;padding-bottom:5px;width:100%}.docs-charts-editor-material-color-picker-hover .docs-charts-editor-material-color-picker-outer-box,.docs-charts-editor-material-color-picker-focused .docs-charts-editor-material-color-picker-outer-box{border-bottom-color:rgba(0,0,0,0.38)}.docs-charts-editor-material-color-picker-open .docs-charts-editor-material-color-picker-outer-box{border-bottom-width:2px;border-bottom-color:#4285f4;margin-bottom:0px}.docs-charts-editor-material-color-picker-inner-box{width:100%}.docs-charts-editor-material-color-picker-disabled .docs-charts-editor-material-color-picker-outer-box{border-bottom:1px dotted rgba(0,0,0,0.12)}.docs-charts-editor-material-color-picker-indicator{border:1px solid rgba(0,0,0,0.12);border-radius:2px;float:left;height:20px;margin-top:6px;position:relative;top:1px;width:20px}.docs-charts-editor-material-color-picker-text{overflow:hidden;padding-left:4px;padding-right:28px;position:relative;text-overflow:ellipsis;top:10px;vertical-align:middle;white-space:nowrap}.docs-charts-editor-material-color-picker-dropdown{position:absolute;right:8px;top:0px}.docs-charts-editor-material-color-picker-dropdown-icon{transition:opacity 0.3s ease;background:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI1IiBoZWlnaHQ9IjMiPjxwb2x5Z29uIHBvaW50cz0iMCwwIDUsMCAyLjUsMyIgZmlsbD0iIzAwMCIvPjwvc3ZnPg==") no-repeat;background-size:contain;height:8px;opacity:0.38;position:relative;top:19px;width:8px}.docs-gm .docs-charts-editor-material-color-picker-dropdown-icon{opacity:1}.docs-charts-editor-material-color-picker-hover .docs-charts-editor-material-color-picker-dropdown-icon,.docs-charts-editor-material-color-picker-focused .docs-charts-editor-material-color-picker-dropdown-icon{opacity:0.54}.docs-gm .docs-charts-editor-material-color-picker-hover .docs-charts-editor-material-color-picker-dropdown-icon,.docs-gm .docs-charts-editor-material-color-picker-focused .docs-charts-editor-material-color-picker-dropdown-icon{opacity:1}.docs-charts-editor-material-color-picker-disabled .docs-charts-editor-material-color-picker-dropdown-icon{opacity:0.12}.docs-gm .docs-charts-editor-material-color-picker-disabled .docs-gm .docs-charts-editor-material-color-picker-dropdown-icon{opacity:.38}.docs-charts-editor-material-combo-box{height:26px;line-height:26px;outline:0;width:100%}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-combo-box{height:42px;line-height:42px}.docs-charts-editor-material-combo-box-disabled{cursor:default}.docs-charts-editor-material-combo-box .docs-charts-editor-material-combo-box-outer-box{transition:border-color 0.3s ease;border-bottom:1px solid rgba(0,0,0,0.12);height:26px;line-height:26px;margin-bottom:1px;width:100%}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-combo-box .docs-charts-editor-material-combo-box-outer-box{border:1px solid #dadce0;border-radius:4px;box-sizing:border-box;cursor:pointer;padding:8px 6px 8px 8px;width:100%;height:42px;line-height:42px;padding:8px}.docs-charts-editor-material-combo-box-hover .docs-charts-editor-material-combo-box-outer-box,.docs-charts-editor-material-combo-box-focused .docs-charts-editor-material-combo-box-outer-box{border-bottom-color:rgba(0,0,0,0.38)}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-combo-box-hover .docs-charts-editor-material-combo-box-outer-box{background-color:rgba(60,64,67,0.04);border:1px solid #dadce0}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-combo-box-focused .docs-charts-editor-material-combo-box-outer-box{background-color:rgba(60,64,67,0.06);border:1px solid #dadce0}.docs-charts-editor-material-combo-box-open .docs-charts-editor-material-combo-box-outer-box{border-bottom-width:2px;border-bottom-color:#4285f4;margin-bottom:0px}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-combo-box-open .docs-charts-editor-material-combo-box-outer-box{background-color:rgba(60,64,67,0.04);border:1px solid transparent}.docs-charts-editor-material-combo-box-disabled .docs-charts-editor-material-combo-box-outer-box{border-bottom:1px dotted rgba(0,0,0,0.12)}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-combo-box-disabled .docs-charts-editor-material-combo-box-outer-box{border:1px solid #dadce0;box-shadow:none;cursor:default}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-combo-box-inner-box{align-items:center;display:flex;justify-content:space-between;position:relative;width:100%;height:100%}.docs-charts-editor-material-combo-box-inner-box{width:100%}.docs-charts-editor-material-combo-box-caption{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding-right:28px;width:100%}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-combo-box-caption{padding-right:0}.docs-charts-editor-material-combo-box-input,.docs-charts-editor-material-combo-box-input:focus{background:none;border:none;box-shadow:none;color:rgba(0,0,0,0.87);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;height:26px;line-height:26px;padding:0;width:100%}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-combo-box-caption .docs-charts-editor-material-combo-box-input,.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-combo-box-caption .docs-charts-editor-material-combo-box-input:focus{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;color:#202124;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;height:20px;line-height:20px;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border:none;padding:0}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-combo-box-disabled .docs-charts-editor-material-combo-box-input{color:rgba(0,0,0,0.26)}.docs-charts-editor-material-combo-box-disabled .docs-charts-editor-material-combo-box-input{background:none;color:rgba(0,0,0,0.12);cursor:default}.docs-charts-editor-material-combo-box-dropdown{position:absolute;right:8px;top:10px}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-combo-box-dropdown{align-items:center;display:flex;height:24px;justify-content:center;width:24px;position:static}.docs-charts-editor-material-combo-box-dropdown-icon{transition:opacity 0.3s ease;background:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI1IiBoZWlnaHQ9IjMiPjxwb2x5Z29uIHBvaW50cz0iMCwwIDUsMCAyLjUsMyIgZmlsbD0iIzAwMCIvPjwvc3ZnPg==") no-repeat;background-size:contain;cursor:pointer;height:8px;opacity:0.38;width:8px}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-combo-box-dropdown-icon{background:no-repeat url(//ssl.gstatic.com/docs/common/material_common_sprite222_grey_medium.svg) -40px -732px;height:18px;width:18px;opacity:1}.docs-charts-editor-material-combo-box-hover .docs-charts-editor-material-combo-box-dropdown-icon,.docs-charts-editor-material-combo-box-focused .docs-charts-editor-material-combo-box-dropdown-icon{opacity:0.54}.docs-charts-editor-material-combo-box-disabled .docs-charts-editor-material-combo-box-dropdown-icon{opacity:0.12}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-combo-box-disabled .docs-charts-editor-material-combo-box-dropdown-icon{opacity:.26}.docs-charts-editor-material-icon-menu-button{cursor:pointer;height:26px;margin:0;min-width:40px;outline:none;user-select:none}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-icon-menu-button{height:auto;min-width:34px}.docs-charts-editor-material-icon-menu-button-disabled{cursor:default}.docs-charts-editor-material-icon-menu-button .docs-icon-img{transition:opacity 200ms cubic-bezier(0.4,0.0,0.2,1);opacity:0.54}.docs-gm .docs-charts-editor-material-icon-menu-button .docs-icon-img{opacity:1.0}.docs-charts-editor-material-icon-menu-button-disabled .docs-icon-img{opacity:0.12}.docs-gm .docs-charts-editor-material-icon-menu-button-disabled .docs-icon-img{opacity:.38}.docs-charts-editor-material-icon-menu-button-outer-box{transition:background 250ms cubic-bezier(0.4,0.0,0.2,1);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:rgba(0,0,0,0.04);border-radius:1px;height:26px;line-height:26px;margin-right:4px;padding:0px 4px;width:100%}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-icon-menu-button-outer-box{background:#fff;border:2px solid #fff;border-radius:4px;height:100%;line-height:34px;margin-right:0;padding:0}.docs-charts-editor-material-icon-menu-button-open .docs-charts-editor-material-icon-menu-button-outer-box{background:rgba(0,0,0,0.12)}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-icon-menu-button-open .docs-charts-editor-material-icon-menu-button-outer-box{background:#e6f4ea}.docs-charts-editor-material-icon-menu-button-inner-box{width:100%}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-icon-menu-button-caption{margin-left:2px}.docs-charts-editor-material-icon-menu-button-dropdown{position:absolute;right:0;top:0}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-icon-menu-button-dropdown{left:15px}.docs-charts-editor-material-icon-menu-button-dropdown-icon{transition:opacity 250ms cubic-bezier(0.4,0.0,0.2,1);background:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI1IiBoZWlnaHQ9IjMiPjxwb2x5Z29uIHBvaW50cz0iMCwwIDUsMCAyLjUsMyIgZmlsbD0iIzAwMCIvPjwvc3ZnPg==") no-repeat;background-size:contain;height:8px;opacity:0.54;position:relative;top:9px;width:8px}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-icon-menu-button-dropdown-icon{background:no-repeat url(//ssl.gstatic.com/docs/common/material_common_sprite222_grey_medium.svg) -40px -732px;height:18px;opacity:1;width:18px}.docs-charts-editor-material-icon-menu-button-focused .docs-charts-editor-material-icon-menu-button-dropdown-icon,.docs-charts-editor-material-icon-menu-button-open .docs-charts-editor-material-icon-menu-button-dropdown-icon{opacity:0.87}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-icon-menu-button-open .docs-icon-img{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_green.svg)}.docs-gm .docs-charts-editor-material-icon-menu-button-focused .docs-gm .docs-charts-editor-material-icon-menu-button-dropdown-icon,.docs-gm .docs-charts-editor-material-icon-menu-button-open .docs-gm .docs-charts-editor-material-icon-menu-button-dropdown-icon{opacity:1}.docs-charts-editor-material-icon-menu-button-disabled .docs-charts-editor-material-icon-menu-button-dropdown-icon{opacity:0.12}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-icon-menu-button-disabled .docs-charts-editor-material-icon-menu-button-dropdown-icon{opacity:.26}.docs-gm .docs-charts-editor-material-icon-menu-button-disabled .docs-gm .docs-charts-editor-material-icon-menu-button-dropdown-icon{opacity:.38}.docs-charts-editor-material-menu-button{color:rgba(0,0,0,0.87);cursor:pointer;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;height:26px;line-height:26px;outline:0;width:100%}.docs-charts-editor-material-menu-button-disabled{color:rgba(0,0,0,0.12);cursor:default}.docs-charts-editor-material-menu-button-outer-box{transition:border-color 0.3s ease;border-bottom:1px solid rgba(0,0,0,0.12);height:26px;line-height:26px;margin-bottom:1px;width:100%}.docs-charts-editor-material-menu-button-hover .docs-charts-editor-material-menu-button-outer-box,.docs-charts-editor-material-menu-button-focused .docs-charts-editor-material-menu-button-outer-box{border-bottom-color:rgba(0,0,0,0.38)}.docs-charts-editor-material-menu-button-open .docs-charts-editor-material-menu-button-outer-box{border-bottom-width:2px;border-bottom-color:#4285f4;margin-bottom:0px}.docs-charts-editor-material-menu-button-disabled .docs-charts-editor-material-menu-button-outer-box{border-bottom:1px dotted rgba(0,0,0,0.12)}.docs-charts-editor-material-menu-button-inner-box{display:flex;width:100%}.docs-charts-editor-material-menu-button-caption{display:inline-block;line-height:26px;overflow:hidden;padding-right:28px;position:relative;text-overflow:ellipsis;white-space:nowrap;-ms-flex:1;-webkit-flex:1;flex:1}.docs-charts-editor-material-menu-button-dropdown{position:absolute;right:8px;top:10px;white-space:nowrap}.docs-charts-editor-material-menu-button-dropdown-icon{transition:opacity 0.3s ease;background:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI1IiBoZWlnaHQ9IjMiPjxwb2x5Z29uIHBvaW50cz0iMCwwIDUsMCAyLjUsMyIgZmlsbD0iIzAwMCIvPjwvc3ZnPg==") no-repeat;background-size:contain;height:8px;opacity:0.38;width:8px}.docs-charts-editor-material-menu-button-hover .docs-charts-editor-material-menu-button-dropdown-icon,.docs-charts-editor-material-menu-button-focused .docs-charts-editor-material-menu-button-dropdown-icon{opacity:0.54}.docs-gm .docs-charts-editor-material-menu-button-hover .docs-charts-editor-material-menu-button-dropdown-icon,.docs-gm .docs-charts-editor-material-menu-button-focused .docs-charts-editor-material-menu-button-dropdown-icon{opacity:1}.docs-charts-editor-material-menu-button-disabled .docs-charts-editor-material-menu-button-dropdown-icon{opacity:0.12}.docs-gm .docs-charts-editor-material-menu-button-disabled .docs-gm .docs-charts-editor-material-menu-button-dropdown-icon{opacity:.38}.docs-charts-editor-material-text-area textarea{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;transition:border-bottom-color 0.3s ease;background:none;border:none;border-bottom:1px solid rgba(0,0,0,0.12);color:rgba(0,0,0,0.87);font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;height:26px;line-height:26px;min-height:26px;outline:none;padding:0;width:100%;resize:none;white-space:pre;overflow-wrap:normal;overflow-y:scroll;overflow-x:hidden}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-text-area textarea{transition:border-color 0.3s ease;color:#3c4043;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;height:42px;line-height:36px;min-height:42px}.docs-charts-editor-material-text-area textarea::placeholder{color:rgba(0,0,0,0.38)}.docs-charts-editor-material-text-area textarea::-webkit-input-placeholder{color:rgba(0,0,0,0.38)}.docs-charts-editor-material-text-area textarea::-moz-placeholder{color:rgba(0,0,0,0.38)}.docs-charts-editor-material-text-area textarea:-ms-input-placeholder{color:rgba(0,0,0,0.38)}.docs-charts-editor-material-text-area textarea::-ms-input-placeholder{color:rgba(0,0,0,0.38)}.docs-charts-editor-material-text-area textarea:hover,.docs-charts-editor-material-text-area-hover textarea{border-bottom-color:rgba(0,0,0,0.38)}.docs-charts-editor-material-text-area textarea:focus,.docs-charts-editor-material-text-area-focus textarea{box-shadow:none;border:none;border-bottom:2px solid #4285f4}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-text-area textarea:focus,.docs-charts-editor-material-text-area-focus textarea{border:2px solid #4285f4}.docs-charts-editor-material-text-area textarea:disabled,.docs-charts-editor-material-text-area-disabled textarea{background:none;border-bottom:1px dotted rgba(0,0,0,0.12);color:rgba(0,0,0,0.12)}.docs-charts-editor-material-textbutton{transition:background 200ms cubic-bezier(0.4,0.0,0.2,1);background:rgba(0,0,0,0.04);border-radius:2px;cursor:pointer;height:26px;margin-right:4px;outline:none;padding:4px;text-align:center}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-textbutton{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:white;border:1px solid #dadce0!important;color:#188038;height:24px;padding:3px 12px 5px;margin-right:0}.docs-charts-editor-material-textbutton-label{color:#2196f3;font-size:12px;text-transform:uppercase}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-textbutton-label{color:#188038;font-size:14px;letter-spacing:.25px;line-height:14px;text-transform:none}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-textbutton-disabled .docs-charts-editor-material-textbutton-label{color:#3c4043;opacity:.38}.docs-charts-editor-material-textbutton-outer-box{vertical-align:-webkit-baseline-middle}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-textbutton-outer-box{vertical-align:baseline}.docs-charts-editor-material-textbutton-hover,.docs-charts-editor-material-textbutton-focused{}.docs-charts-editor-material-textbutton-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#e7f5eb;border:1px solid #bbe2c6!important;height:24px;padding:3px 12px 5px}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-textbutton-hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#f8fcf9;border:1px solid #c8e7d1!important;height:24px;padding:3px 12px 5px}.docs-charts-editor-material-textbutton-checked{background:rgba(0,0,0,0.12)}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-textbutton-checked{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#dff2e4;border:1px solid transparent!important;box-shadow:0 2px 6px 2px rgba(60,64,67,.15);height:24px;padding:3px 12px 5px}.docs-charts-editor-material-textbutton-disabled{cursor:default}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-textbutton-disabled{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:white;border:1px solid #f1f3f4!important;height:24px;padding:3px 12px 5px}.docs-charts-editor-material-textbutton .docs-icon-img{transition:opacity 200ms cubic-bezier(0.4,0.0,0.2,1);opacity:0.54}.docs-gm .docs-charts-editor-material-textbutton .docs-icon-img{opacity:1}.docs-charts-editor-material-textbutton-focused .docs-icon-img,.docs-charts-editor-material-textbutton-checked .docs-icon-img{opacity:0.87}.docs-gm .docs-charts-editor-material-textbutton-focused .docs-icon-img,.docs-gm .docs-charts-editor-material-textbutton-checked .docs-icon-img{opacity:1}.docs-charts-editor-material-textbutton-disabled .docs-icon-img{opacity:0.12}.docs-gm .docs-charts-editor-material-textbutton-disabled .docs-icon-img{opacity:.38}.docs-charts-editor-material-text-input input{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;transition:border-bottom-color 0.3s ease;background:none;border:none;border-bottom:1px solid rgba(0,0,0,0.12);color:rgba(0,0,0,0.87);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;height:26px;line-height:26px;outline:none;padding:0;width:100%}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-text-input .jfk-textinput{transition:border-color 0.3s ease;height:42px;line-height:42px;margin:0}.docs-charts-editor-material-text-input input::placeholder{color:rgba(0,0,0,0.38)}.docs-charts-editor-material-text-input input::-webkit-input-placeholder{color:rgba(0,0,0,0.38)}.docs-charts-editor-material-text-input input::-moz-placeholder{color:rgba(0,0,0,0.38)}.docs-charts-editor-material-text-input input:-ms-input-placeholder{color:rgba(0,0,0,0.38)}.docs-charts-editor-material-text-input input::-ms-input-placeholder{color:rgba(0,0,0,0.38)}.docs-charts-editor-material-text-input input:hover,.docs-charts-editor-material-text-input-hover input{border-bottom-color:rgba(0,0,0,0.38)}.docs-charts-editor-material-text-input input:focus,.docs-charts-editor-material-text-input-focus input{box-shadow:none;border:none;border-bottom:2px solid #4285f4}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-text-input input:focus,.docs-charts-editor-material-text-input-focus input{box-shadow:none;border:2px solid #4285f4}.docs-charts-editor-material-text-input input:disabled,.docs-charts-editor-material-text-input-disabled input{background:none;border-bottom:1px dotted rgba(0,0,0,0.12);color:rgba(0,0,0,0.12)}.docs-charts-editor-material-togglebutton{transition:background 200ms cubic-bezier(0.4,0.0,0.2,1);background:rgba(0,0,0,0.04);border-radius:2px;cursor:pointer;height:26px;line-height:26px;margin-right:4px;outline:none;text-align:center;width:26px}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-togglebutton{background:#fff;border:2px solid #fff;border-radius:4px;height:34px;line-height:34px;margin-right:0;width:30px}.docs-charts-editor-material-togglebutton-hover,.docs-charts-editor-material-togglebutton-focused{}.docs-charts-editor-material-togglebutton-checked{background:rgba(0,0,0,0.12)}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-togglebutton-checked{background:#e6f4ea}.docs-charts-editor-material-togglebutton-checked.docs-charts-editor-material-togglebutton-hover,.docs-charts-editor-material-togglebutton-checked.docs-charts-editor-material-togglebutton-focused{}.docs-charts-editor-material-togglebutton-checked.docs-charts-editor-material-togglebutton-active{}.docs-charts-editor-material-togglebutton-disabled{cursor:default}.docs-charts-editor-material-togglebutton .docs-icon-img{transition:opacity 200ms cubic-bezier(0.4,0.0,0.2,1);opacity:0.54}.docs-gm .docs-charts-editor-material-togglebutton .docs-icon-img{opacity:1}.docs-charts-editor-material-togglebutton-focused .docs-icon-img,.docs-charts-editor-material-togglebutton-checked .docs-icon-img{opacity:0.87}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-togglebutton-checked .docs-icon-img{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_green.svg)}.docs-gm .docs-charts-editor-material-togglebutton-focused .docs-icon-img,.docs-gm .docs-charts-editor-material-togglebutton-checked .docs-icon-img{opacity:1}.docs-charts-editor-material-togglebutton-disabled .docs-icon-img{opacity:0.12}.docs-gm .docs-charts-editor-material-togglebutton-disabled .docs-icon-img{opacity:.38}.docs-charts-editor-material-toolbar-color-picker{cursor:pointer;height:26px;min-width:40px;outline:none;user-select:none}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-toolbar-color-picker{color:#3c4043;outline:none;width:100%;height:42px;max-width:100%;width:auto}.docs-charts-editor-material-toolbar-color-picker-disabled{cursor:default}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-toolbar-color-picker-disabled{color:#5f6368;opacity:.38;cursor:default}.docs-charts-editor-material-toolbar-color-picker-outer-box{transition:background 250ms cubic-bezier(0.4,0.0,0.2,1);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:rgba(0,0,0,0.04);border-radius:2px;height:100%;padding:2px 4px;width:100%}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-toolbar-color-picker-outer-box{border:1px solid #dadce0;border-radius:4px;box-sizing:border-box;cursor:pointer;padding:8px 6px 8px 8px;width:100%;background:#fff;max-width:100%;width:auto}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-toolbar-color-picker-hover .docs-charts-editor-material-toolbar-color-picker-outer-box{background-color:rgba(60,64,67,0.04);border:1px solid #dadce0}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-toolbar-color-picker-disabled .docs-charts-editor-material-toolbar-color-picker-outer-box{border:1px solid #dadce0;box-shadow:none;cursor:default}.docs-charts-editor-material-toolbar-color-picker-open .docs-charts-editor-material-toolbar-color-picker-outer-box{background:rgba(0,0,0,0.12)}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-toolbar-color-picker-open .docs-charts-editor-material-toolbar-color-picker-outer-box{background-color:rgba(60,64,67,0.04);border:1px solid transparent}.docs-charts-editor-material-toolbar-color-picker-inner-box{width:100%}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-toolbar-color-picker-inner-box{align-items:center;display:flex;justify-content:space-between;position:relative;width:100%;height:100%}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-toolbar-color-picker-content-container{width:80%}.docs-charts-editor-material-toolbar-color-picker-indicator{border-bottom:3px solid transparent;height:18px;width:22px}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-toolbar-color-picker-indicator{height:22px;width:22px;border-radius:50%;border:1px solid #dadce0;margin:0;outline:none}.docs-charts-editor-material-toolbar-color-picker-disabled .docs-charts-editor-material-toolbar-color-picker-indicator{opacity:0.12}.docs-gm .docs-charts-editor-material-toolbar-color-picker-disabled .docs-charts-editor-material-toolbar-color-picker-indicator{opacity:.38}.docs-charts-editor-material-toolbar-color-picker-indicator .docs-icon{transition:opacity 250ms cubic-bezier(0.4,0.0,0.2,1);-webkit-transform:scale(0.9);-moz-transform:scale(0.9);-ms-transform:scale(0.9);-o-transform:scale(0.9);transform:scale(0.9);height:14px;left:1px;opacity:0.54;width:18px}.docs-gm .docs-charts-editor-material-toolbar-color-picker-indicator .docs-icon{opacity:1}.docs-charts-editor-material-toolbar-color-picker-focused .docs-charts-editor-material-toolbar-color-picker-indicator .docs-icon,.docs-charts-editor-material-toolbar-color-picker-open .docs-charts-editor-material-toolbar-color-picker-indicator .docs-icon{opacity:0.87}.docs-gm .docs-charts-editor-material-toolbar-color-picker-focused .docs-charts-editor-material-toolbar-color-picker-indicator .docs-icon,.docs-gm .docs-charts-editor-material-toolbar-color-picker-open .docs-charts-editor-material-toolbar-color-picker-indicator .docs-icon{opacity:1}.docs-charts-editor-material-toolbar-color-picker-text{transition:color 250ms cubic-bezier(0.4,0.0,0.2,1);color:rgba(0,0,0,0.54);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:11px;padding:3px 8px 3px 2px;top:1px}.docs-gm .docs-charts-editor-material-toolbar-color-picker-text{color:rgba(0,0,0,0.87)}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-toolbar-color-picker-text{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;color:#202124;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;height:20px;line-height:20px;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;height:100%;padding:3px 5px;max-width:65%}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-toolbar-color-picker-caption{height:100%}.docs-charts-editor-material-toolbar-color-picker-focused .docs-charts-editor-material-toolbar-color-picker-text,.docs-charts-editor-material-toolbar-color-picker-open .docs-charts-editor-material-toolbar-color-picker-text{color:rgba(0,0,0,0.87)}.docs-charts-editor-material-toolbar-color-picker-disabled .docs-charts-editor-material-toolbar-color-picker-text{color:rgba(0,0,0,0.12)}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-toolbar-color-picker-disabled .docs-charts-editor-material-toolbar-color-picker-text{color:rgba(0,0,0,0.26)}.docs-charts-editor-material-toolbar-color-picker-dropdown{float:right}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-toolbar-color-picker-dropdown{align-items:center;display:flex;height:24px;justify-content:center;width:24px}.docs-charts-editor-material-toolbar-color-picker-dropdown-icon{transition:opacity 250ms cubic-bezier(0.4,0.0,0.2,1);background:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI1IiBoZWlnaHQ9IjMiPjxwb2x5Z29uIHBvaW50cz0iMCwwIDUsMCAyLjUsMyIgZmlsbD0iIzAwMCIvPjwvc3ZnPg==") no-repeat;background-size:contain;height:8px;opacity:0.54;position:relative;top:9px;width:8px}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-toolbar-color-picker-dropdown-icon{background:no-repeat url(//ssl.gstatic.com/docs/common/material_common_sprite222_grey_medium.svg) -40px -732px;height:18px;width:18px;opacity:1;top:0}.docs-charts-editor-material-toolbar-color-picker-focused .docs-charts-editor-material-toolbar-color-picker-dropdown-icon,.docs-charts-editor-material-toolbar-color-picker-open .docs-charts-editor-material-toolbar-color-picker-dropdown-icon{opacity:0.87}.docs-gm .docs-charts-editor-material-toolbar-color-picker-focused .docs-charts-editor-material-toolbar-color-picker-dropdown-icon,.docs-gm .docs-charts-editor-material-toolbar-color-picker-open .docs-charts-editor-material-toolbar-color-picker-dropdown-icon{opacity:1}.docs-gm .waffle-gm-sidebar .docs-charts-editor-material-toolbar-color-picker-open .docs-charts-editor-material-toolbar-color-picker-dropdown-icon{-moz-transform:rotate(180deg);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.docs-charts-editor-material-toolbar-color-picker-disabled .docs-charts-editor-material-toolbar-color-picker-dropdown-icon{opacity:0.12}.docs-gm .docs-charts-editor-material-toolbar-color-picker-disabled .docs-charts-editor-material-toolbar-color-picker-dropdown-icon{opacity:.38}.docs-charts-editor-overflow-menu-button{outline:none;cursor:pointer}.docs-charts-editor-overflow-menu-button-icon{transition:opacity 0.3s ease;background:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgdmlld2JveD0iMCAwIDIwIDIwIiBoZWlnaHQ9IjIwIj48cGF0aCBkPSJtMTAgNmMxLjEgMCAyLTAuOSAyLTJzLTAuOS0yLTItMi0yIDAuOS0yIDIgMC45IDIgMiAyem0wIDJjLTEuMSAwLTIgMC45LTIgMnMwLjkgMiAyIDIgMi0wLjkgMi0yLTAuOS0yLTItMnptMCA2Yy0xLjEgMC0yIDAuOS0yIDJzMC45IDIgMiAyIDItMC45IDItMi0wLjktMi0yLTJ6Ii8+PC9zdmc+") no-repeat;opacity:0.38;height:21px;position:relative;right:5px;top:6px;width:21px}.docs-gm .waffle-gm-sidebar .docs-charts-editor-overflow-menu-button-icon{right:12px;top:7px}.docs-charts-editor-overflow-menu-button-hover .docs-charts-editor-overflow-menu-button-icon,.docs-charts-editor-overflow-menu-button-focused .docs-charts-editor-overflow-menu-button-icon{opacity:0.54}.docs-charts-editor-overflow-menu-button-disabled .docs-charts-editor-overflow-menu-button-icon{opacity:0.12}.docs-charts-editor-overflow-menu-button-caption{min-height:21px;overflow:hidden;padding-right:28px;position:absolute;text-overflow:ellipsis;top:10px;white-space:nowrap}.docs-charts-editor-material-icon-menu-button-palette .toolbar-icon,.docs-charts-editor-material-icon-menu-button-palette .docs-common-icon{margin:3px 5px 4px 2px}.docs-charts-editor-material-icon-menu-button-palette .goog-palette-cell{border:0}.docs-charts-editor-material-icon-menu-button-palette .goog-palette-table{border:0;margin:0 4px}.docs-charts-editor-material-icon-menu-button-palette .goog-palette-cell-hover{background:#eeeeee}.docs-charts-editor-chip-content{display:flex;background-color:#f1f3f4;border-radius:32px;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;height:32px;overflow:hidden;position:relative;white-space:nowrap}.docs-gm .waffle-gm-sidebar .docs-charts-editor-chip-content{border-radius:36px;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;height:36px}.docs-charts-editor-chip-content>*{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.docs-charts-editor-chip-label{-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-shrink:1;-ms-flex-negative:1;flex-shrink:1;cursor:default;line-height:32px;margin-left:16px;overflow:hidden;text-overflow:ellipsis;vertical-align:top}.docs-gm .waffle-gm-sidebar .docs-charts-editor-chip-label{line-height:36px;margin-right:10px}.docs-charts-editor-chip-button{box-shadow:none;cursor:pointer;margin:0;min-width:0;outline:0;padding:0;position:absolute;right:0}.docs-charts-editor-chip.docs-charts-editor-chip-invalid .docs-charts-editor-chip-content{border:1px solid #db4437}.docs-charts-editor-chip.docs-charts-editor-chip-invalid .docs-charts-editor-chip-error-message{display:block}.docs-charts-editor-chip-error-message{color:#db4437;display:none;font-size:11px;left:8px;position:relative;top:3px}.docs-charts-editor-collapsible-header{transition:color 250ms cubic-bezier(0.4,0.0,0.2,1);color:rgba(0,0,0,0.54);cursor:pointer;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;font-weight:500;height:42px;line-height:42px;position:relative}.docs-gm .waffle-gm-sidebar .docs-charts-editor-collapsible-header{background-color:#f8f9fa;color:#80868b;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;height:56px;line-height:56px}.docs-charts-editor-collapsible-header.goog-control-open{color:rgba(0,0,0,0.87)}.docs-charts-editor-collapsible-header.goog-control-disabled{color:rgba(0,0,0,0.26);cursor:default}.docs-charts-editor-collapsible-header.goog-control-focused{color:rgba(0,0,0,0.87);outline:none}.docs-gm .waffle-gm-sidebar .docs-charts-editor-collapsible-header.goog-control-focused{color:#3c4043}.docs-charts-editor-collapsible-title{height:42px;line-height:42px;margin:0 2px 0 16px;overflow:hidden;text-overflow:ellipsis;width:190px}.docs-gm .waffle-gm-sidebar .docs-charts-editor-collapsible-title{height:56px;line-height:56px;padding:0 36px}.docs-charts-editor-collapsible-summary{color:rgba(0,0,0,0.54);height:42px;line-height:42px;overflow:hidden;position:absolute;right:42px;text-align:right;text-overflow:ellipsis;width:115px}.docs-gm .waffle-gm-sidebar .docs-charts-editor-collapsible-summary{height:56px;line-height:56px}.goog-control-disabled .docs-charts-editor-collapsible-summary{color:#888}.docs-charts-editor-collapsible-icon{transition:all 250ms cubic-bezier(0.4,0.0,0.2,1);background:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgdmlld0JveD0iMCAwIDE4IDE4Ij48ZyBzdHlsZT0iZmlsbDpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZTpub25lIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSg5IDkpc2NhbGUoMSAtMSl0cmFuc2xhdGUoLTkgLTkpIj48cmVjdCB3aWR0aD0iMTgiIGhlaWdodD0iMTgiLz48cG9seWdvbiBwb2ludHM9IjkgNSAzIDExIDQuNCAxMi40IDkgNy44IDEzLjYgMTIuNCAxNSAxMSIgZmlsbD0iIzAwMCIvPjwvZz48L2c+PC9zdmc+");height:18px;opacity:0.54;position:absolute;right:16px;top:11px;width:18px}.docs-gm .waffle-gm-sidebar .docs-charts-editor-collapsible-icon{background:none;height:20px;left:16px;top:20px;transform:rotate(-90deg);width:20px}.docs-gm .waffle-gm-sidebar .docs-charts-editor-collapsible-icon .docs-icon{height:20px;vertical-align:top;width:20px}.goog-control-checked .docs-charts-editor-collapsible-icon{opacity:0.87;transform:rotate(-180deg)}.docs-gm .waffle-gm-sidebar .goog-control-checked .docs-charts-editor-collapsible-icon{top:14px;transform:none}.docs-gm .waffle-gm-sidebar .goog-control-focused .docs-charts-editor-collapsible-icon{opacity:0.87}.goog-control-disabled .docs-charts-editor-collapsible-icon{display:none}.docs-charts-editor-collapsible-content{transition:max-height 0.25s cubic-bezier(0.4,0.0,0.2,1);overflow:hidden}.docs-gm .waffle-gm-sidebar .docs-charts-editor-collapsible-content{background-color:#fff}.docs-charts-editor-collapsible-content-animating{transition:none}.docs-charts-editor-collapsible-content>div{padding:0 16px 6px 16px}.docs-charts-editor-collapsible-content.docs-charts-editor-collapsible-content-no-padding>div{padding:0}.docs-gm .waffle-gm-sidebar .docs-charts-editor-customize-tab .docs-charts-editor-bundle.docs-charts-editor-parent-bundle>.docs-charts-editor-collapsible-opened{box-shadow:0 1px 3px 1px rgba(60,64,67,.15);border:2px solid #fff;border-radius:8px}.docs-gm .waffle-gm-sidebar .docs-charts-editor-collapsible-opened .docs-charts-editor-collapsible-header{background-color:#fff;color:#3c4043}.docs-charts-editor-back-tab-header-back{float:left;margin:6px 7px 0 7px;right:auto}.docs-gm .docs-material .docs-charts-editor-back-tab-header-back .docs-icon .docs-icon-img{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_green.svg)}.docs-charts-editor-back-tab-header-title.jfk-button.docs-sidebar-toggle-tab{text-align:left;width:270px}.docs-charts-editor-back-tab-header.docs-sidebar-toggle-tabs .jfk-button.docs-sidebar-toggle-tab>div{overflow:hidden;text-overflow:ellipsis;width:100%}.docs-charts-editor-back-tab-header .docs-charts-editor-back-tab-header-title.jfk-button.docs-sidebar-toggle-tab-active>div:after{border-bottom:none}.docs-charts-editor-editorslider-hide{display:none}.docs-charts-editor-editorslider-slide-in-right{animation-duration:0.3s;animation-name:docs-charts-editor-editorslider-slide-in-right;animation-timing-function:ease;transform:translateX(0%)}.docs-charts-editor-editorslider-slide-out-right{animation-duration:0.3s;animation-name:docs-charts-editor-editorslider-slide-out-right;animation-timing-function:ease;transform:translateX(100%)}@keyframes docs-charts-editor-editorslider-slide-in-right{from{transform:translateX(100%)}to{transform:translateX(0%)}}@keyframes docs-charts-editor-editorslider-slide-out-right{from{transform:translateX(0%)}to{transform:translateX(100%)}}.docs-charts-editor-labeledinput-error{color:#db4437;display:none;font-size:11px;margin-bottom:4px;margin-top:4px}.docs-charts-editor-labeledinput-haserror .docs-charts-editor-labeledinput-error{display:block}.docs-gm .waffle-gm-sidebar .docs-charts-editor-labeledinput-haserror input:hover{border-color:#c53929}.docs-charts-editor-labeledinput-haserror input,.docs-charts-editor-labeledinput-haserror input:focus{border-bottom:2px solid #db4437}.docs-gm .waffle-gm-sidebar .docs-charts-editor-labeledinput-haserror input,.docs-gm .waffle-gm-sidebar .docs-charts-editor-labeledinput-haserror input:focus{border:2px solid #db4437}.docs-charts-editor-labeledinput-haserror input:hover:not(:focus){border-bottom-color:#c53929}.docs-charts-editor-labeledselect-menu-style-wide{width:255px}.docs-charts-editor-labeledselect-menu-style-narrow{width:146px}.docs-gm .waffle-gm-sidebar .docs-material-gm-labeled-select-disabled .docs-material-gm-labeled-select-caption{color:rgba(0,0,0,0.26)}.docs-gm .waffle-gm-sidebar .docs-material-gm-labeled-select-disabled .docs-material-gm-labeled-select-dropdown-icon{opacity:.26}.docs-gm .waffle-gm-sidebar .docs-charts-editor-customize-tab .docs-charts-editor-bundle.docs-charts-editor-parent-bundle>.docs-charts-editor-noncollapsible-section.docs-charts-editor-collapsible-opened{border:none;border-radius:0;box-shadow:none}.docs-gm .waffle-gm-sidebar .docs-charts-editor-noncollapsible-section .docs-charts-editor-collapsible-header{color:#3c4043;cursor:default;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;height:auto;line-height:1;padding-bottom:0.5em;padding-top:1.5em}.docs-gm .waffle-gm-sidebar .docs-charts-editor-noncollapsible-section .docs-charts-editor-collapsible-title{height:auto;line-height:1;padding-left:0;overflow:visible}.docs-explore-icon{direction:ltr;text-align:left;overflow:hidden;position:relative;vertical-align:middle}.docs-explore-img:before{content:url(//ssl.gstatic.com/docs/common/menu_feature_sprite7.svg)}.docs-explore-img{height:4332px;position:absolute;width:72px}.docs-explore-hc-gecko .docs-explore-icon{filter:invert(100%)}.docs-explore-hc-ie .docs-explore-icon{-ms-high-contrast-adjust:none;background-color:white}.docs-explore-auto-awesome-grey{left:0;top:-4314px}.docs-explore-back-white{left:0;top:-4194px}.docs-explore-back-white-rtl{left:-36px;top:-640px}.docs-explore-cite-black{left:-42px;top:-2992px}.docs-explore-cite-black-18{left:-48px;top:-4128px}.docs-explore-docs-18{left:0;top:-2974px}.docs-explore-drawing-18{left:-50px;top:-3034px}.docs-explore-email-18{left:-36px;top:-3946px}.docs-explore-excel-18{left:-24px;top:-4128px}.docs-explore-expand-down{left:0;top:-1748px}.docs-explore-expand-up{left:0;top:-164px}.docs-explore-file-18{left:0;top:-1080px}.docs-explore-filter-button-black-18{left:0;top:-434px}.docs-explore-folder-18{left:-20px;top:-4194px}.docs-explore-form-18{left:-18px;top:-1122px}.docs-explore-forward-arrow-black{left:0;top:-4170px}.docs-explore-forward-arrow-black-rtl{left:-18px;top:-988px}.docs-explore-google-logo{left:-24px;top:-3840px}.docs-explore-group-blue-18{left:-18px;top:-4314px}.docs-explore-group-black-18{left:0;top:-1122px}.docs-explore-image-18{left:-24px;top:-164px}.docs-explore-insert-black{left:0;top:-3840px}.docs-explore-insert-black-18{left:-18px;top:-640px}.docs-explore-keep-yellow-18{left:0;top:-3658px}.docs-explore-lock-black-18{left:-50px;top:-2474px}.docs-explore-more-black{left:-48px;top:-4146px}.docs-explore-pdf-18{left:0;top:-988px}.docs-explore-powerpoint-18{left:-18px;top:-3946px}.docs-explore-preview-white{left:0;top:-4128px}.docs-explore-question-green{left:-50px;top:-2454px}.docs-explore-search-black{left:-18px;top:-2992px}.docs-explore-search-close-white{left:0;top:-1098px}.docs-explore-search-history-black{left:0;top:-452px}.docs-explore-sheets-18{left:-36px;top:-4314px}.docs-explore-sites-18{left:0;top:-1944px}.docs-explore-slides-18{left:-24px;top:-1098px}.docs-explore-thumb-down-18{left:-50px;top:-3052px}.docs-explore-thumb-up-18{left:0;top:-2522px}.docs-explore-video-18{left:0;top:-3946px}.docs-explore-word-18{left:-50px;top:-3016px}.docs-explore-show-more-14{left:0;top:-4152px}.docs-explore-promo-icon-wrapper{background-color:white;border-radius:50px;display:flex;height:100px;left:-46px;position:absolute;top:-36px;width:100px}.docs-explore-promo-icon{cursor:pointer;display:block;margin:auto}.waffle-assistant-entry{background-color:rgba(255,255,255,0.8);border:none;border-left:1px solid #c2c2c2;float:right;height:38px;padding-right:10px}.waffle-assistant-entry-button{border:1px solid transparent;cursor:pointer;height:34px;transition:padding 0.5s cubic-bezier(0.4,0.0,0.2,1);width:100%}.waffle-assistant-entry-button-icon{display:inline-block;position:relative;padding:7px 0 7px 8px}.waffle-assistant-entry-label{color:#0f9d58;display:inline-block;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;overflow:hidden;padding-left:8px;transition:all 0.5s cubic-bezier(0.4,0.0,0.2,1);vertical-align:middle}.waffle-assistant-entry-button-black-icon{display:none;opacity:.54}.waffle-assistant-entry-inactive{border-left:1px solid transparent;background-color:transparent}.waffle-assistant-entry-inactive .waffle-assistant-entry-button-black-icon{display:block}.waffle-assistant-entry-inactive .waffle-assistant-entry-button-green-icon{display:none}.waffle-assistant-entry-inactive .waffle-assistant-entry-label{color:#737373;opacity:0;padding-right:0}.waffle-assistant-entry-expanded{background-color:rgba(255,255,255,0.8);border-left:1px solid #c2c2c2}.waffle-assistant-entry-expanded .waffle-assistant-entry-label{opacity:1;padding-right:6px}.waffle-assistant-entry-opened{background-color:#dadada;border-left:1px solid #c2c2c2;box-shadow:inset 0 0 6px rgba(0,0,0,.22)}.waffle-assistant-entry-opened .waffle-assistant-entry-button-black-icon{display:block}.waffle-assistant-entry-opened .waffle-assistant-entry-button-green-icon{display:none}.waffle-assistant-entry-opened .waffle-assistant-entry-label{color:#737373}.waffle-assistant-link-button{color:#4285f4;display:inline;text-decoration:underline}.waffle-assistant-link-button:hover,.waffle-assistant-link-button:focus{cursor:pointer;text-decoration:underline}.waffle-assistant-link-button:focus{margin:0 2px;outline-color:#4285f4;outline-width:2px}.waffle-assistant-button{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;border:1px solid transparent;border-radius:2px;font-size:11px;font-weight:500;margin-right:0;min-width:40px;opacity:0.8;padding:0;text-align:center;white-space:nowrap}.waffle-assistant-button-focused{border:1px solid #5e97f6;outline:none}.waffle-assistant-button-hover,.waffle-assistant-button-focused,.waffle-assistant-button-holder .waffle-assistant-button.waffle-assistant-button-hover,.waffle-assistant-button-holder .waffle-assistant-button.waffle-assistant-button-focused{cursor:pointer;opacity:1}.waffle-assistant-button-holder .waffle-assistant-button{height:24px;min-width:24px;opacity:0.6;padding:2px}.waffle-assistant-dragged-formula{box-shadow:1px 1px 4px rgba(0,0,0,0.28);background-color:#fff;border:1px solid #e0e0e0;line-height:22px;overflow-wrap:break-word;word-wrap:break-word}.waffle-assistant-formula-insertion-rect{background-color:#000;opacity:0.06}.waffle-assistant-visible{visibility:visible}.docs-ui-toast.waffle-assistant-toast{box-shadow:0px 2px 2px 0px rgba(0,0,0,0.14),0px 3px 1px -2px rgba(0,0,0,0.12),0px 1px 5px 0px rgba(0,0,0,0.2);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:flex;bottom:60px;color:rgba(255,255,255,0.87);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;font-weight:500;left:auto;line-height:20px;min-width:0;padding:14px 24px;right:15px;width:286px}.waffle-assistant-toast-content{-ms-flex:1;-webkit-flex:1;flex:1;font-weight:400;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.waffle-assistant-toast-action{color:#a0c1fc;text-transform:uppercase}.waffle-assistant-panel-title-bar{height:20px}.waffle-assistant-panel-back-button{cursor:pointer}.waffle-assistant-panel-back-button-icon{height:20px;margin-bottom:1px}.waffle-assistant-panel-pane{height:100%}.waffle-assistant-sidebar.waffle-sidebar-container{box-shadow:0px 2px 2px 0px rgba(0,0,0,0.14),0px 3px 1px -2px rgba(0,0,0,0.12),0px 1px 5px 0px rgba(0,0,0,0.2);background:#f1f1f1;width:320px}.waffle-assistant-title.waffle-sidebar-title{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;transition:height .3s;background-color:#0f9d58;color:#fff;font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;line-height:20px;min-height:36px;padding:0px}.waffle-assistant-title .waffle-sidebar-title-close{right:11px;top:6px}.waffle-assistant-title-bar,.waffle-assistant-panel-title-bar{display:flex;-webkit-align-items:center;align-items:center}.waffle-assistant-replaceable-title,.waffle-assistant-title-bar{padding:8px 12px}.waffle-assistant-replaceable-title .waffle-assistant-title-bar{padding:0}.waffle-assistant-title-text{-ms-flex:1;-webkit-flex:1;flex:1;-webkit-align-items:center;align-items:center;font-weight:500;margin-top:4px;padding-left:12px}.waffle-assistant-title-icon{height:20px;position:relative;width:20px}.waffle-assistant-sidebar-content.waffle-sidebar-content{overflow:hidden}.waffle-assistant-scroll-pane{background:#f1f1f1;height:100%;overflow-x:hidden;overflow-y:auto}.waffle-assistant-scroll-pane-content{height:100%}.waffle-assistant-scroll-pane-feature-content{height:100%}.waffle-assistant-expanded-panel{height:100%;width:320px}.waffle-assistant-spinner-container{text-align:center;pointer-events:none;position:absolute;width:100%}.waffle-assistant-expanded-panel .waffle-assistant-spinner-container{display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;height:100%}.waffle-assistant-empty-list{display:flex;background:#fff;color:rgb(46%,46%,46%);height:100%;text-align:center;width:320px}.waffle-assistant-empty-list-content{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;margin:auto 24px;width:100%}.waffle-assistant-empty-list svg{padding-bottom:24px}.waffle-assistant-empty-list-title{color:rgb(46%,46%,46%);font-size:15px;font-weight:500}.waffle-assistant-empty-list-body{color:rgb(46%,46%,46%);font-size:13px;padding:8px 0}.waffle-assistant-empty-list-link{font-size:13px;font-weight:400;margin:0}.waffle-assistant-empty-list-link span,.waffle-assistant-empty-list-link a{color:#1a73e8;cursor:pointer}.waffle-assistant-empty-list-link a:hover{text-decoration:none}.waffle-assistant-feature-section{box-shadow:0 2px 2px rgba(0,0,0,0.10);background:white;margin-bottom:8px}.waffle-assistant-feature-section:last-child{margin-bottom:0}.waffle-assistant-section-header{display:flex;-webkit-align-items:center;align-items:center;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;padding:16px 16px 0 16px;position:relative;width:288px}.waffle-assistant-section-title{-ms-flex:1;-webkit-flex:1;flex:1;color:rgba(0,0,0,0.54);font-size:13px;font-weight:600;height:15px;line-height:15px;text-transform:uppercase}.jfk-button.waffle-assistant-section-more-button{border:0;color:#1a73e8;cursor:pointer;height:15px;font-size:13px;line-height:15px;margin-right:16px;text-transform:uppercase}.jfk-button.waffle-assistant-section-more-button:focus{border:1px solid #5e97f6;outline:none}.waffle-assistant-section-content{padding-bottom:10px}.waffle-assistant-scroll-pane::-webkit-scrollbar{width:12px}.waffle-assistant-scroll-pane::-webkit-scrollbar-thumb{background-clip:padding-box;background-color:#dadce0;border:solid transparent;border-width:1px 1px 1px 2px;box-shadow:none;min-height:28px;padding:1px}.waffle-assistant-scroll-pane::-webkit-scrollbar-thumb:hover{background-color:#bdc1c6;box-shadow:none}.waffle-assistant-scroll-pane::-webkit-scrollbar-thumb:active{background-color:#80868b}.waffle-assistant-scroll-pane::-webkit-scrollbar-track{background-clip:border-box;background-color:#f8f8f8;border:none;border-width:1px;box-shadow:none}.waffle-assistant-scroll-pane::-webkit-scrollbar-track:hover{background-clip:border-box;background-color:#f8f8f8;border:none;border-width:1px;box-shadow:none}.waffle-assistant-form .waffle-assistant-input-edit-button{flex-shrink:0;margin-right:3px}.waffle-assistant-card-feedback{flex-shrink:0;margin-right:3px}.waffle-assistant-card{background:#fff;border-bottom:1px solid #e0e0e0;margin-bottom:8px;outline:0;overflow:hidden;position:relative}.waffle-assistant-feature-section .waffle-assistant-card{margin-bottom:0}.waffle-assistant-panel-pane .waffle-assistant-card{box-shadow:0 2px 2px rgba(0,0,0,0.10)}.waffle-assistant-card-spinner-container{position:absolute;text-align:center;top:50%;transform:translateY(-50%);width:100%}.waffle-assistant-card-inner{position:relative}.waffle-assistant-padded-card{padding:15px}.waffle-assistant-button-holder{background-color:rgba(255,255,255,0.7);padding:3px;position:absolute;top:0;z-index:1}.waffle-assistant-dragger-card .waffle-assistant-button-holder,.waffle-assistant-dragger-card .waffle-assistant-chart-highlights,.waffle-assistant-dragger-card .waffle-assistant-facet-section{display:none}.waffle-assistant-card-draggable{cursor:move}.waffle-assistant-readonly .waffle-assistant-card:hover{cursor:default}.waffle-assistant-card-options{-webkit-border-radius:0 0 0 2px;-moz-border-radius:0 0 0 2px;border-radius:0 0 0 2px;box-shadow:-1px 1px 3px #d3d3d3;right:0}.waffle-assistant-padded-card{padding:15px}.waffle-assistant-feedback-card-content{-ms-flex:1;-webkit-flex:1;flex:1;vertical-align:middle;line-height:19px}.waffle-assistant-feedback-card-text{margin:2px 0}.waffle-assistant-feedback-card-custom-msg-placeholder{font-size:10px;font-style:italic;line-height:11px;margin:2px 0}.waffle-assistant-feedback-card{box-shadow:0px 2px 4px rgba(0,0,0,.3);display:flex;background-color:white;cursor:default;margin:5px;max-height:500px;overflow:hidden;padding:15px;width:250px}.waffle-assistant-feedback-card-close-button{-webkit-align-self:flex-start;align-self:flex-start;min-width:auto}.waffle-assistant-card .waffle-assistant-feedback-card{transition:all .1s}.waffle-assistant-dragger-card .waffle-assistant-feedback-card{display:none}.waffle-assistant-card .waffle-assistant-feedback-card-hidden{padding:0 15px 0 15px;margin:0 5px 0 5px;max-height:0}.waffle-assistant-insert-chart-button.jfk-button,.waffle-assistant-zoom-button.jfk-button,.waffle-assistant-thumbs-down-button.jfk-button,.waffle-assistant-thumbs-up-button.jfk-button{cursor:pointer;display:block;height:24px;margin:0 auto 0 auto;min-width:24px;opacity:.6;padding:1px;width:24px}.waffle-assistant-insert-chart-button.jfk-button:hover,.waffle-assistant-zoom-button.jfk-button:hover,.waffle-assistant-thumbs-down-button.jfk-button:hover,.waffle-assistant-thumbs-up-button.jfk-button:hover{opacity:.8}.waffle-assistant-insert-chart-button.jfk-button:active,.waffle-assistant-zoom-button.jfk-button:active,.waffle-assistant-thumbs-down-button.jfk-button:active,.waffle-assistant-thumbs-up-button.jfk-button:active{opacity:1}.waffle-assistant-thumbs-down-icon{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -150px 0;height:24px;width:24px}.waffle-assistant-thumbs-up-icon{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -113px -46px;height:24px;width:24px}.waffle-assistant-button-separator{border-bottom:1px solid #d3d3d3;height:0;margin:3px;width:21px}.waffle-assistant-card-feedback-container{display:flex;-webkit-align-items:flex-end;align-items:flex-end;-webkit-justify-content:center;justify-content:center;background:rgba(0,0,0,0.38);height:100%;position:absolute;width:100%;z-index:1}.waffle-assistant-feedback-card-hidden{display:none!important}.waffle-assistant-thumbs-container,.waffle-assistant-facet-thumbs-container{border-top:1px dashed #e0e0e0;color:#616161}.waffle-assistant-thumbs{display:flex;-webkit-align-items:center;align-items:center;height:40px;line-height:16px;padding:0 15px}.waffle-assistant-thumbs-button-holder{display:flex}.waffle-assistant-thumbs-up-button,.waffle-assistant-thumbs-down-button{min-width:30px!important}.waffle-assistant-thumbs-text{-ms-flex:1;-webkit-flex:1;flex:1;text-transform:uppercase}.waffle-assistant-quicksum-panel{background:#fff;border-bottom:1px solid #e0e0e0;line-height:19px;margin-bottom:8px;padding:15px;position:relative}.waffle-assistant-scroll-pane-feature-content .waffle-assistant-quicksum-panel{box-shadow:0 2px 2px rgba(0,0,0,0.10)}.waffle-assistant-quicksum-entry{border:1px solid transparent;color:#757575;cursor:move;font-family:Roboto,Arial,sans-serif;padding:0 5px}.waffle-assistant-quicksum-entry:hover,.waffle-assistant-quicksum-entry:focus{border:1px solid #5e97f6}.waffle-assistant-quicksum-panel-readonly .waffle-assistant-quicksum-entry:hover,.waffle-assistant-quicksum-panel-readonly .waffle-assistant-quicksum-entry:focus{border:1px solid transparent}.waffle-assistant-quicksum-panel-readonly .waffle-assistant-quicksum-entry{border:1px solid transparent;cursor:default}.waffle-assistant-quicksum-entry-name{font-weight:500;margin-right:10px}.waffle-assistant-quicksum-entry-value{float:right}.waffle-assistant-walkthrough-promo-content{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;line-height:22px;padding:15px 20px;width:300px}.waffle-assistant-walkthrough-promo-header{font-size:20px}.waffle-assistant-walkthrough-promo-button{cursor:pointer;font-size:14px;font-weight:500;text-transform:uppercase}.waffle-assistant-walkthrough-promo-continue-button{color:#5e97f5;margin-right:10px}.waffle-assistant-walkthrough-promo-close-button{margin-left:10px;opacity:0.7}.waffle-april2018-promo-base,.waffle-assistant-entry-promo{background-color:#0f9d58;border-color:#0f9d58;bottom:-500px;right:-450px}.waffle-april2018-promo-content,.waffle-assistant-entry-promo .docs-explore-promo-content{left:-300px;top:-170px;width:360px}.range-border.waffle-assistant-table-range-border{border-color:#0f9d58;border-style:dashed;line-height:0}.waffle-assistant-table-range-rect{background-color:#0f9d58;opacity:0.06;pointer-events:none}.range-border.waffle-assistant-header-range-border{border-color:#f09300;border-style:dashed;line-height:0}.waffle-assistant-header-range-rect{background-color:#f09300;opacity:0.06;pointer-events:none}.waffle-assistant-card .docs-charts-tooltip{font-size:10px;padding:4px 8px;line-height:1.1em}.waffle-assistant-highlight-styled-rect{background-color:#34a853;opacity:0.06;pointer-events:none}.range-border.waffle-assistant-highlight-styled-border{border-color:#34a853;border-style:dashed}.waffle-assistant-highlight-styled-rect-red{background-color:#ea4335;opacity:0.06;pointer-events:none}.range-border.waffle-assistant-highlight-styled-border-red{border-color:#ea4335;border-style:dashed}.waffle-assistant-mouseover-highlight-styled-rect{background-color:#34a853;opacity:0.25;pointer-events:none}.range-border.waffle-assistant-mouseover-highlight-styled-border{border-color:#34a853;border-style:dashed}.waffle-assistant-mouseover-highlight-styled-rect-red{background-color:#ea4335;opacity:0.25;pointer-events:none}.range-border.waffle-assistant-mouseover-highlight-styled-border-red{border-color:#ea4335;border-style:dashed}.waffle-inline-assistant-refresh-banner{background:white;border:0.5px solid transparent;box-shadow:0 -1px 5px rgba(128,134,139,0.09),0px 3px 5px rgba(128,134,139,0.06),0px 1px 2px rgba(60,64,67,0.3),0px 1px 3px rgba(60,64,67,0.15);margin-bottom:8px;overflow:hidden;position:absolute;z-index:10}.waffle-inline-assistant-refresh-text{color:#202124;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:0.3px;line-height:16px;margin:12px 0 12px 16px;width:166px}.waffle-inline-assistant-refresh-text-container{align-items:center;background:#e6f4ea;border-radius:4px;display:flex;flex-wrap:wrap;justify-content:space-between;margin:8px;position:relative;width:284px}.waffle-sidebar-container .waffle-inline-assistant-refresh-button.jfk-button-standard,.waffle-sidebar-container .waffle-inline-assistant-refresh-button.jfk-button-standard.jfk-button-hover,.waffle-sidebar-container .waffle-inline-assistant-refresh-button.jfk-button-standard.jfk-button-focused,.waffle-sidebar-container .waffle-inline-assistant-refresh-button.jfk-button-standard.jfk-button-hover.jfk-button-focused{background:none;border:none!important;color:#188038;cursor:pointer;margin-right:8px;max-width:100%;overflow:hidden;padding:8px;text-overflow:ellipsis;white-space:nowrap}.waffle-sidebar-container .waffle-inline-assistant-refresh-button.jfk-button-standard.jfk-button-hover,.waffle-sidebar-container .waffle-inline-assistant-refresh-button.jfk-button-standard.jfk-button-focused,.waffle-sidebar-container .waffle-inline-assistant-refresh-button.jfk-button-standard.jfk-button-hover.jfk-button-focused{background:rgba(0,0,0,.06)}.waffle-inline-assistant-sidebar-category-cards{color:#3c4043;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif}.waffle-inline-assistant-sidebar-category-label{color:#5f6368;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:11px;font-weight:500;height:14px;letter-spacing:0.8px;line-height:14px;text-transform:uppercase}.waffle-inline-assistant-sidebar-category-description{color:#3c4043;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;line-height:16px;letter-spacing:0.3px;font-weight:normal;padding:8px 8px 4px 16px}.waffle-inline-assistant-sidebar-intro{color:#80868b;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;padding:16px 16px 6px}.waffle-inline-assistant-sidebar-accepted-container{margin:0 20px;text-align:center}.waffle-inline-assistant-sidebar-accept-back{margin-right:0}.waffle-inline-assistant-sidebar-column-filter-dropdown-container{margin-bottom:16px;overflow:hidden;padding-right:15px;position:relative}.waffle-inline-assistant-sidebar-column-filter-dropdown{float:right;margin:auto;width:125px}.docs-material-gm-labeled-select-focused .docs-material-gm-labeled-select-outer-box{background-color:rgba(60,64,67,0.06);border:1px solid #dadce0}.waffle-inline-assistant-sidebar-column-filter-dropdown .docs-material-gm-labeled-select-outer-box{border-radius:8px;padding:0 6px 0 10px;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif}.waffle-inline-assistant-sidebar-column-filter-dropdown .waffle-view-icons-error-filled{display:none;height:13px;width:13px}.waffle-inline-assistant-sidebar-column-filter-dropdown .filter-active .waffle-view-icons-error-filled{display:block}.waffle-inline-assistant-sidebar-column-filter-dropdown .filter-active .docs-material-gm-labeled-select-outer-box{border:none;background-color:#fce8e6}.waffle-inline-assistant-sidebar-column-filter-dropdown .filter-active.docs-material-gm-labeled-select-focused .docs-material-gm-labeled-select-outer-box{background-color:#fad2cf}.waffle-inline-assistant-sidebar-column-filter-dropdown .filter-active .docs-material-gm-labeled-select-caption{color:#d93025}.waffle-inline-assistant-recommendation-container{align-items:center;border:1px solid #dadce0;border-top:none;display:flex;height:36px;margin:0;outline:none;overflow-x:auto;overflow-y:hidden;position:relative}.waffle-inline-assistant-recommendation-container:last-child{border-bottom-left-radius:4px;border-bottom-right-radius:4px}.waffle-inline-assistant-overflow-suggestions .waffle-inline-assistant-recommendation-container:last-child{border-bottom-left-radius:0;border-bottom-right-radius:0}.waffle-inline-assistant-gridrange-chip{background-color:#f8f9fa;border-right:1px solid #dadce0;box-sizing:border-box;color:#d93025;flex-shrink:0;font-weight:500;height:36px;line-height:36px;overflow:hidden;padding:1px 0;position:relative;text-align:center;width:48px}.waffle-inline-assistant-gridrange-chip.waffle-inline-assistant-gridrange-chip-changed{color:#1a73e8}.waffle-inline-assistant-gridrange-chip.waffle-inline-assistant-gridrange-chip-neutral{color:#3c4043}.waffle-inline-assistant-gridrange-chip-hovered{background-color:rgba(0,0,0,.06)}.waffle-inline-assistant-suggestion-row{flex-grow:1;overflow:hidden;position:relative;white-space:nowrap}.waffle-inline-assistant-suggestion-overflow-action-strip{align-items:center;border:1px solid #dadce0;border-radius:0 0 4px 4px;border-top:none;display:flex;flex-wrap:wrap;justify-content:flex-end;min-height:32px;padding:0 6px;text-align:left}.waffle-inline-assistant-suggestion-overflow-action-strip .waffle-assistant-feedback-button{height:30px}.waffle-inline-assistant-accept-button,.waffle-inline-assistant-ignore-button{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.waffle-inline-assistant-card-show-more-button{border-radius:100%;color:#3c4043;cursor:pointer;font-size:12px;font-weight:normal;height:24px;letter-spacing:0.3px;margin:0 auto 0 6px;min-width:24px;padding:2px;width:24px}.waffle-inline-assistant-card-show-more-button.jfk-button-checked{transform:rotate(180deg)}.waffle-inline-assistant-card-show-more-button.jfk-button-checked .docs-icon{margin-bottom:5px;margin-right:1px}.waffle-inline-assistant-card-show-more-button.jfk-button-checked:hover{box-shadow:0 -1px 1px rgba(0,0,0,0.1)}.waffle-inline-assistant-card-show-more-button:hover,.waffle-inline-assistant-card-show-more-button:focus{background:rgba(0,0,0,.06)}.waffle-inline-assistant-card-show-more-button:active{background:rgba(0,0,0,0.12)}.waffle-inline-assistant-card-show-more-button .docs-icon{height:24px;margin:0;width:24px;zoom:75%}.waffle-inline-assistant-suggestion-details{border-radius:4px;border-top:1px solid #dadce0;margin:0 14px 16px;outline:none;overflow:hidden}.waffle-inline-assistant-suggestion-details:last-child{margin:0 14px 14px}.waffle-inline-assistant-nf-suggestion{margin-bottom:8px;outline:none}.waffle-inline-assistant-nf-row{align-items:center;border:none;border-radius:0;display:flex;margin:0;overflow:hidden;padding:0 0 0 8px;text-overflow:ellipsis}.waffle-inline-assistant-nf-suggestion-description{color:#5f6368;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:normal;letter-spacing:0.3px;line-height:16px;margin:0 16px 3px}.waffle-inline-assistant-nf-suggestion-text{flex-grow:1;height:36px;padding:1px 0;line-height:36px;overflow:hidden;position:relative;text-overflow:ellipsis;border-radius:4px 0 0 4px;box-sizing:border-box}.waffle-inline-assistant-nf-original-preview{text-decoration:line-through}.waffle-inline-assistant-nf-suggested-preview{color:#188038}.waffle-inline-assistant-nf-check{border-radius:50%;flex-shrink:0;width:27px;min-width:27px;margin:0 3px;padding:2px;cursor:pointer}.waffle-inline-assistant-nf-check.jfk-button-hover{box-shadow:none}.waffle-inline-assistant-nf-check:hover,.waffle-inline-assistant-nf-check:focus{background:rgba(0,0,0,.06)}.waffle-inline-assistant-nf-check:active{background:rgba(0,0,0,0.12)}.waffle-inline-assistant-sidebar-rd-category-bulk-pill{align-items:center;border:1px solid #dadce0;border-radius:4px;box-sizing:border-box;color:#3c4043;display:flex;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;justify-content:space-between;margin:0 14px 11px;padding:5px 6px;overflow:hidden}.waffle-inline-assistant-bulk-rd-message{height:30px;line-height:30px;margin:0 10px}.waffle-inline-assistant-rd-cell-preview{border:none;border-radius:0;margin:0;padding:0 8px;overflow:hidden;text-overflow:ellipsis}.waffle-inline-assistant-rd-deleted-strikethrough{position:absolute;left:9px;top:50%;height:1px;background:#3c4043;z-index:1;right:9px}.waffle-inline-assistant-rd-cell-value-divider{height:36px;border-left:1px solid #dadce0;margin:0 10px;display:inline-block;vertical-align:middle}.waffle-inline-assistant-tw-row{height:36px;line-height:36px;padding:0 8px}.waffle-inline-assistant-tw-space{background:#f28b82;border:1px solid transparent;box-sizing:border-box;display:inline-block;height:18px;margin:8px 0.5px 10px 0.5px;mix-blend-mode:multiply;vertical-align:middle;width:4px}.docs-material-gm-checkbox.waffle-inline-assistant-rd-checkbox{position:absolute;right:8px;top:50%!important;transform:translateY(-50%);border:2px solid #5f6368!important}.docs-material-gm-checkbox-checked.waffle-inline-assistant-rd-checkbox{background-color:#5f6368!important;border:2px solid #5f6368!important}.docs-material-gm-checkbox-checked.waffle-assistant-kg-apply-all-check{background-color:#5f6368!important;border:2px solid #5f6368!important}.waffle-inline-assistant-sidebar .waffle-sidebar-content{bottom:0;left:0;position:absolute;right:0;z-index:1}.waffle-inline-assistant-sidebar-toast{align-items:center;background:#202124;border:1px solid transparent;border-radius:4px;bottom:14px;box-shadow:0 5px 7px rgba(60,64,67,0.15),0 2px 2px rgba(60,64,67,0.3);box-sizing:border-box;display:flex;opacity:1;overflow:hidden;padding:16px 12px 16px 16px;position:absolute;right:14px;width:268px;z-index:1000}.waffle-inline-assistant-sidebar-toast-hidden{opacity:0;transition:opacity 0.2s linear}.waffle-inline-assistant-toast-text{color:#dadce0;flex-grow:1;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:normal;letter-spacing:0.25px;line-height:19px}.jfk-button.waffle-inline-assistant-toast-undo-button{box-sizing:border-box;color:#6ba5ed;cursor:pointer;margin:0;padding:0}.waffle-inline-assistant-sidebar-rd-category-bulk-pill .waffle-inline-assistant-bulk-rd-accept-button,.waffle-inline-assistant-toast-undo-button{margin:0 2px 0 0}.waffle-inline-assistant-sidebar-insights-promo{background:#f8f9fa;border-radius:8px;margin:14px;padding:18px}.waffle-inline-assistant-sidebar-insights-button{display:block;margin:0 auto}.waffle-inline-assistant-sidebar-insights-header{color:#202124;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:16px;font-weight:500;letter-spacing:0.1px;line-height:24px;text-align:center}.waffle-inline-assistant-sidebar-insights-body{color:#3c4043;font-size:14px;letter-spacing:0.2px;line-height:20px;margin:16px 0;text-align:center}.waffle-inline-assistant-sidebar-empty-container{margin:20px;text-align:center}.waffle-inline-assistant-sidebar-accepted-message,.waffle-inline-assistant-sidebar-empty-message{color:#3c4043;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;letter-spacing:0.2px;margin:15px}.waffle-inline-assistant-sidebar-empty-check{filter:invert(100%);height:30px;padding:10px}.waffle-assistant-floating-popup{box-shadow:0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12),0px 2px 4px -1px rgba(0,0,0,0.2);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:white;border-radius:10px;bottom:30px;left:55px;padding:18px;position:absolute;width:320px;z-index:20}.waffle-assistant-popup-view{box-shadow:0 2px 6px 2px rgba(60,64,67,.15);display:table;position:absolute}.waffle-assistant-popup-suggestion{background:#fff;color:#3c4043;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;overflow:hidden;outline:none;margin:2px 10px;padding:8px 0 8px 14px;position:relative;text-align:left;cursor:pointer}.waffle-assistant-popup-suggestion:hover,.waffle-assistant-popup-suggestion:focus{background:rgba(0,0,0,.06)}.waffle-assistant-popup-suggestion:active{background:rgba(0,0,0,0.12)}.waffle-assistant-popup-suggestion-text{font-size:14px;line-height:21px;white-space:normal;word-wrap:break-word}.docs-material-gm-checkbox.waffle-assistant-card-checkbox{border:2px solid #80868b;float:left;margin-top:-1px;position:absolute;top:50%;transform:translateY(-50%)}.docs-material-gm-checkbox-checked.waffle-assistant-card-checkbox{border:2px solid #188038}.waffle-assistant-card-unchecked-hovered-checkbox{opacity:0.7}.waffle-inline-assistant-sidebar-accept{float:right;margin:16px}.waffle-inline-assistant-sidebar-survey-container{background-color:#f8f9fa;cursor:pointer;padding:12px;text-align:center}.waffle-inline-assistant-sidebar-accepted-container .waffle-inline-assistant-sidebar-survey-container{margin:0 -20px}.waffle-inline-assistant-sidebar-survey-link:hover{text-decoration:none}.waffle-inline-assistant-sidebar-survey-container:hover,.waffle-inline-assistant-sidebar-survey-container:focus{background:rgba(0,0,0,.06)}.waffle-inline-assistant-sidebar-survey-container:active{background:rgba(0,0,0,0.12)}.waffle-inline-assistant-sidebar{background-color:white}.waffle-inline-assistant-sidebar .waffle-sidebar-footer-container{background-color:white;border-top:1px solid #dadce0}.waffle-inline-assistant-feedback-button.waffle-ui-text-link-button{align-items:center;color:#5f6368;display:flex;float:right;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;line-height:24px;padding:8px}.waffle-inline-assistant-feedback-button svg{margin-right:5px}.waffle-assistant-card-text{color:#5f6368;display:inline-block;font-size:14px;letter-spacing:0.2px;line-height:20px;margin-left:32px;margin-right:40px;white-space:normal;word-wrap:break-word}.waffle-assistant-card-text .waffle-assistant-feedback-button{float:right}.waffle-assistant-form{align-items:center;display:flex;flex-shrink:1;overflow:hidden;width:100%}.waffle-assistant-form .jfk-textinput{flex-shrink:1;min-width:1px;width:100%;text-overflow:ellipsis}.waffle-inline-assistant-sidebar-category-show-more-button{color:#3c4043;cursor:pointer;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:normal;letter-spacing:0.3px;margin:4px 14px 16px;position:relative;text-align:center}.waffle-inline-assistant-sidebar-category-show-more-description{background:white;display:inline-block;line-height:16px;padding:0 8px}.waffle-inline-assistant-sidebar-category-show-more-background-line{background:#dadce0;height:1px;left:0;margin-top:-1px;position:absolute;right:0;top:50%;z-index:-100}.waffle-inline-assistant-sidebar-category-show-more-button:hover .waffle-inline-assistant-sidebar-category-show-more-description,.waffle-inline-assistant-sidebar-category-show-more-button:focus .waffle-inline-assistant-sidebar-category-show-more-description{background:#f0f0f0}.waffle-inline-assistant-sidebar-category-show-more-button:hover,.waffle-inline-assistant-sidebar-category-show-more-button:focus{background:rgba(0,0,0,.06)}.waffle-inline-assistant-sidebar-category-show-more-button:active .waffle-inline-assistant-sidebar-category-show-more-description{background:#e0e0e0}.waffle-inline-assistant-sidebar-category-show-more-button:active{background:rgba(0,0,0,0.12)}.waffle-inline-assistant-sidebar-divider{border-top:1px solid #dadce0;margin:6px 15px 8px}.waffle-inline-assistant-sidebar-category-show-more-button .docs-icon{height:24px;margin:0 4px 0 0;width:24px}.docs-auto-fix{filter:invert(37%) sepia(93%) saturate(360%) hue-rotate(86deg) brightness(88%) contrast(100%)}.waffle-inline-assistant-sidebar-category-show-more-button.jfk-button-hover{box-shadow:none}.waffle-inline-assistant-sidebar-category-header{color:#188038;margin:12px 0;overflow:hidden;padding:0 3px 0 16px}.waffle-inline-assistant-rec-range{color:#188038;font-weight:500}.waffle-inline-assistant-rec-range-red{color:#d93025;font-weight:500}.waffle-inline-assistant-rec-detail{color:#202124;font-weight:500;white-space:nowrap}.waffle-assistant-popup-num-patterns{font-weight:500}.waffle-assistant-popup-button-row{margin-top:18px;text-align:right}.jfk-button-action.waffle-assistant-popup-button{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff}.jfk-button-action.waffle-assistant-popup-button.goog-button-hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#2a8947;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15)}.jfk-button-action.waffle-assistant-popup-button.goog-button-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#4f9e67;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15)}.jfk-button-action.waffle-assistant-popup-button.goog-button-hover.goog-button-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#62a877;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15)}.jfk-button-standard.waffle-assistant-popup-button{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:white;border:1px solid #dadce0!important;color:#188038}.jfk-button-standard.waffle-assistant-popup-button.goog-button-hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#f8fcf9;border:1px solid #c8e7d1!important}.jfk-button-standard.waffle-assistant-popup-button.goog-button-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#e7f5eb;border:1px solid #bbe2c6!important}.jfk-button-standard.waffle-assistant-popup-button.goog-button-hover.goog-button-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#dff2e4;border:1px solid #b5e0c1!important}.waffle-assistant-popup-button-review{margin-right:0}.waffle-assistant-popup-button-dismiss{background-color:#f1f3f4}.waffle-assistant-popup-logo{float:left;margin-right:18px;min-width:0;outline:none;padding:3px}.waffle-feedback-troubleshoot-item{color:#5f6368;font-size:11px;width:168px}.waffle-feedback-troubleshoot-item-icon,.waffle-feedback-troubleshoot-item-text{display:inline}.waffle-assistant-feedback-dialog,.waffle-assistant-feedback-product-info-dialog{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif}.waffle-assistant-feedback-dialog{min-width:464px;max-width:512px}.waffle-assistant-feedback-dialog .docs-material-gm-dialog-content{font-size:14px;padding-bottom:0}.waffle-assistant-feedback-dialog-radio-button{padding:8px}.waffle-assistant-feedback-dialog-radio-button .jfk-radiobutton-radio{left:0}.waffle-assistant-feedback-dialog-radio-button .jfk-radiobutton-label{margin-left:16px}.waffle-assistant-feedback-dialog-feedback-radio-buttons-control .waffle-assistant-feedback-dialog-radio-button{display:block}.waffle-assistant-feedback-dialog-legal{margin-right:16px;max-width:256px}.waffle-assistant-feedback-dialog-legal-information-text{color:#80868b}.waffle-assistant-feedback-dialog-product-info-display-text{color:#5f6368;cursor:pointer;padding-top:10px;text-decoration:underline}.waffle-assistant-feedback-dialog-header{color:#1967d2;font-weight:500;padding:8px 0;text-transform:uppercase}.waffle-assistant-feedback-product-info-dialog .docs-material-gm-dialog-content{max-height:568px;overflow:auto;overflow-wrap:break-word;width:466px}.waffle-assistant-feedback-product-info-dialog dt{font-weight:500}.waffle-assistant-feedback-dialog .jfk-textinput{border:1px solid #dadce0;border-radius:4px;box-sizing:border-box;color:#3c4043;padding:1px 8px;font-size:14px;height:36px;margin:8px 0}.waffle-assistant-feedback-dialog textarea.jfk-textinput{height:auto;height:unset;min-height:52px;min-width:100%;max-height:52px;padding:7px 8px}.waffle-assistant-feedback-dialog .jfk-textinput:focus{border:2px solid #1a73e8;box-shadow:none;padding:0px 7px}.waffle-assistant-feedback-dialog textarea.jfk-textinput:focus{padding:6px 7px}.waffle-assistant-kg-description{color:#5f6368;display:inline-block;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;letter-spacing:.3px;line-height:16px;margin:0 16px;white-space:normal;word-wrap:break-word}.waffle-assistant-apply-all-description{color:#5f6368;display:inline-block;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;letter-spacing:.3px;line-height:16px;margin:0 16px;white-space:normal;word-wrap:break-word}.waffle-assistant-kg-card{border-radius:8px;box-shadow:0 -1px 5px rgba(128,134,139,0.09),0 3px 5px rgba(128,134,139,0.06),0 1px 2px rgba(60,64,67,0.3),0 1px 3px rgba(60,64,67,0.15);margin:0 14px 16px;outline:none;overflow:hidden;position:relative}.waffle-assistant-kg-cell-input-row{border:1px solid #dadce0;border-top:none;font-size:13px;margin:0;position:relative}.waffle-inline-assistant-overflow-suggestions:last-child .waffle-assistant-kg-cell-input-row{border-bottom-left-radius:4px;border-bottom-right-radius:4px}.waffle-assistant-card-apply-all{background-color:#e6f4ea;border-radius:4px;color:#188038;font-family:'Google Sans Medium',sans-serif;font-size:14px;font-weight:medium;height:36px;margin:0 14px 4px;overflow:hidden;position:relative;z-index:1000}.waffle-assistant-card-apply-all .waffle-inline-assistant-apply-all-input-box.jfk-textinput{color:inherit}.waffle-assistant-card-apply-all-focused{background-color:white;border:1.5px solid #1a73e8;color:inherit;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;margin:0 14px 2px}.waffle-assistant-apply-all-text-empty{background-color:white;border:1px solid #dadce0}.waffle-inline-assistant-category-card{border-radius:8px;box-shadow:0 -1px 5px rgba(128,134,139,0.09),0 3px 5px rgba(128,134,139,0.06),0 1px 2px rgba(60,64,67,0.3),0 1px 3px rgba(60,64,67,0.15);margin:0 14px 16px;overflow:hidden}.waffle-assistant-input-container{display:flex;height:36px;overflow-x:auto;overflow-y:hidden}.waffle-assistant-input-container.waffle-assistant-input-container-focused,.waffle-assistant-input-container.waffle-assistant-input-container-changed{border-radius:4px;margin:0 -1px}.waffle-assistant-input-container.waffle-assistant-input-container-focused{border:1.5px solid #d93025}.waffle-assistant-card-apply-all .waffle-assistant-input-container.waffle-assistant-input-container-focused{margin:0 14px -1px}.waffle-assistant-input-container.waffle-assistant-input-container-changed{border:1.5px solid #1a73e8}.waffle-assistant-input-reject-icon{cursor:pointer;height:36px;line-height:36px;margin:-1px 0 0 0;min-width:27px;opacity:0;z-index:-1}.waffle-inline-assistant-gridrange-chip-hovered .waffle-assistant-input-reject-icon,.waffle-assistant-kg-cell-input-row:hover .waffle-assistant-input-reject-icon,.waffle-assistant-kg-cell-input-row:focus .waffle-assistant-input-reject-icon{opacity:100;z-index:1000}.waffle-assistant-input-reject-icon:focus{background:rgba(0,0,0,.06);opacity:100;z-index:1000}.waffle-assistant-input-reject-icon:hover{background:rgba(0,0,0,.06)}.waffle-assistant-input-reject-icon:active{background:rgba(0,0,0,0.12)}.waffle-assistant-input-return-icon{cursor:pointer;filter:invert(37%) sepia(68%) saturate(4465%) hue-rotate(204deg) brightness(96%) contrast(89%);flex-shrink:0;margin:4px}.waffle-sidebar-container .waffle-assistant-kg-cell-input.jfk-textinput:focus{border:none;outline-offset:0;padding:1px 8px}.waffle-sidebar-container .waffle-assistant-kg-cell-input.jfk-textinput{background-color:transparent;border:none;border-radius:0;margin:0}.waffle-assistant-kg-apply-all-container{display:flex;margin:0;overflow-x:auto;overflow-y:hidden;padding:8px 9px}waffle-assistant-kg-apply-to-all-text{display:inline-block;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;letter-spacing:0.3px;line-height:16px;margin:1px 1px 1px 4px;vertical-align:middle}input.jfk-textinput.waffle-assistant-kg-cell-input.waffle-inline-assistant-apply-all-input-box{width:100%}.waffle-assistant-kg-card-apply-all-hint{background:white;color:#1a73e8;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;left:27px;letter-spacing:0.3px;line-height:16px;padding:2px 4px;position:absolute;top:-9px;z-index:1001}.waffle-assistant-kg-card-apply-all-hint.waffle-assistant-kg-card-apply-all-hint-changed{color:#1a73e8}.waffle-inline-assistant-fade-in .waffle-inline-assistant-sidebar-column-filter-dropdown,.waffle-inline-assistant-fade-in .waffle-inline-assistant-sidebar-section{animation-duration:.5s;animation-name:fadein}@keyframes fadein{from{opacity:0;transform:scale(.85,.85)}to{opacity:1;transform:scale(1,1)}}.waffle-assistant-icon-button{background:transparent;border-radius:50%;box-sizing:border-box;cursor:pointer;height:32px;line-height:32px;outline:none;text-align:center;width:32px}.small.waffle-assistant-icon-button{height:24px;line-height:24px;width:24px}.waffle-assistant-icon-button:hover{background:rgba(13,101,45,.06)}.waffle-assistant-icon-button:focus{background:rgba(13,101,45,.12)}.waffle-assistant-icon-button:active{background:rgba(13,101,45,.1)}.goog-grey.waffle-assistant-icon-button:hover{background:rgba(32,33,36,.04)}.goog-grey.waffle-assistant-icon-button:focus{background:rgba(13,101,45,.12)}.goog-grey.waffle-assistant-icon-button:active{background:rgba(13,101,45,.1)}.waffle-assistant-input-return-icon.waffle-assistant-icon-button:hover{background:rgba(0,0,0,.06)}.waffle-assistant-input-return-icon.waffle-assistant-icon-button:focus{background:rgba(0,0,0,.12)}.waffle-assistant-input-return-icon.waffle-assistant-icon-button:active{background:rgba(0,0,0,.1)}.waffle-assistant-kg-card.waffle-assistant-input-edit-button{display:none}.waffle-assistant-anomaly-message{font-weight:bold;text-transform:lowercase}.waffle-assistant-input-edit-button .docs-icon{margin:0 1px 4px 0}.waffle-inline-assistant-bulk-accept-button{border:1px solid #a8dab5;cursor:pointer}.waffle-inline-assistant-bulk-accept-button:hover{background:#e6f4ea}.waffle-inline-assistant-bulk-accept-button:focus{background:#ceead6;border:1px solid #0d652d}.waffle-inline-assistant-bulk-accept-button:active{background:#ceead6;border:1px solid #a8dab5}.waffle-inline-assistant-bulk-action-button-disabled,.waffle-inline-assistant-bulk-action-button-disabled:hover,.waffle-inline-assistant-bulk-action-button-disabled:focus,.waffle-inline-assistant-bulk-action-button-disabled:active{background:white;border:1px solid rgba(60,64,67,0.12);cursor:default}.waffle-inline-assistant-bulk-accept-button-icon.docs-icon{height:24px;margin:1px 2px 1px 5px;width:24px}.waffle-inline-assistant-bulk-accept-button-icon .docs-icon-img{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_green.svg)!important}.waffle-inline-assistant-bulk-action-button-disabled .docs-icon-img{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_grey_medium.svg)}.waffle-inline-assistant-bulk-reject-button{border:1px solid #dadce0}.waffle-inline-assistant-bulk-reject-button:hover{background:#f8f9fa;cursor:pointer}.waffle-inline-assistant-bulk-reject-button:focus{background:#f1f3f4;border:1px solid #202124}.waffle-inline-assistant-bulk-reject-button:active{background:#f1f3f4;border:1px solid #dadce0}.waffle-inline-assistant-bulk-reject-button-icon.docs-icon{height:24px;margin:1.5px 2px 1.5px 5px;width:24px}.waffle-inline-assistant-bulk-action-buttons-wrapper{display:flex;margin:12px 0 12px 16px;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row}.waffle-inline-assistant-bulk-action-button{align-items:center;background:#ffffff;border-radius:20px;box-sizing:border-box;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;height:36px;margin-right:8px;mix-blend-mode:normal;width:36px}.waffle-inline-assistant-bulk-action-button:focus{outline:none}.waffle-inline-assistant-bulk-action-buttons-description{color:#188038;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:16px;line-height:24px;margin-left:16px}.waffle-assistant-filter-button{margin:0;max-width:100%;min-width:28px;overflow:hidden;padding:0!important;text-overflow:ellipsis;white-space:nowrap}.waffle-assistant-insert-chart-button.jfk-button{position:relative;left:-1px}.waffle-assistant-zoom-button.jfk-button{position:relative;left:1px}.waffle-assistant-chart-preview{cursor:move;height:238px;width:271px}.waffle-assistant-readonly .waffle-assistant-chart-preview{cursor:default}.waffle-assistant-chart-preview.waffle-assistant-dragged-card{background-color:#fff;border:1px solid #e0e0e0;z-index:1000}.waffle-assistant-chart-highlights{border-left:3px solid #0f9d58;color:#616161;cursor:text;padding-left:15px;margin-top:20px;margin-bottom:20px;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text}.waffle-assistant-facet-section{background-color:#fafafa;cursor:default}.waffle-assistant-facet-header{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;padding:8px 16px}.waffle-assistant-facet-content-wrapper{max-height:1000px;position:relative;transition:all .2s}.waffle-assistant-facet-charts-wrapper-hidden,.waffle-assistant-facet-charts-wrapper-hidden .waffle-assistant-facet-charts-container{margin-top:0;margin-bottom:0;max-height:0}.waffle-assistant-facet-charts-container{overflow-y:hidden;margin:24px 16px 0;max-height:1000px;transition:all .2s;width:350px}.waffle-assistant-pie-icon{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -501px 0;display:inline-block;height:24px;margin-right:10px;opacity:.5;vertical-align:middle;width:24px}.waffle-assistant-facet-chart-larger-icon{height:24px;width:24px}.waffle-assistant-facet-top-text{color:#757575;display:inline-block;overflow:hidden;text-overflow:ellipsis;vertical-align:middle;width:185px}.waffle-assistant-facet-title{font-weight:500}.waffle-assistant-facet-toggle{color:#4285f4;cursor:pointer;float:right;font-size:13px;font-weight:normal;line-height:24px;margin-right:0;min-width:initial;outline:none;text-align:right}.waffle-assistant-facet-toggle:hover{box-shadow:none}.waffle-assistant-facet-chart-row{margin-bottom:16px;white-space:nowrap}.waffle-assistant-single-facet{display:inline-block;margin-right:16px;vertical-align:bottom}.waffle-assistant-single-facet-title{color:#757575;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;white-space:normal;width:130px}.waffle-assistant-faceted-chart{border:1px solid #e0e0e0;cursor:move;height:98px;margin-top:5px;outline:none;overflow:hidden;width:134px}.waffle-assistant-facet-by-color-container{padding:15px}.waffle-assistant-facet-by-color{border:none;height:270px;margin-top:0;overflow:hidden;width:271px}.waffle-assistant-facet-white-section{background-color:#fff}.waffle-assistant-readonly .waffle-assistant-faceted-chart{cursor:default}.waffle-assistant-word-cloud-card{padding:16px 16px 24px}.waffle-assistant-word-cloud-content-container{background-color:#fff;color:rgba(0,0,0,.54);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif}.waffle-assistant-word-cloud-title{color:#757575;font-size:13px;margin-bottom:10px}.waffle-assistant-styled-rect{opacity:0.1}.waffle-assistant-answers-logging-message-container{display:flex;background:#f4f4f4;margin:10px 0;padding:7px}.waffle-assistant-answers-logging-message{-ms-flex:1;-webkit-flex:1;flex:1;color:#757575;font-size:11px;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;line-height:20px;margin-left:5px}.waffle-assistant-answers-learn-more,.waffle-assistant-answers-logging-opt-out{padding:0 5px;text-decoration:none}.waffle-assistant-answers-logging-opt-out{border-left:1px solid rgba(0,0,0,0.12)}.waffle-assistant-section-content .waffle-assistant-answers-input{margin:16px 16px 0}.waffle-assistant-suggested-questions{padding-bottom:15px}.waffle-assistant-section-content .waffle-assistant-answers-input{padding-bottom:5px}.waffle-assistant-replaceable-title .waffle-assistant-answers-input{margin:10px 0;padding-bottom:0}.waffle-assistant-answers-query-box{box-shadow:0px 0px 2px 0px rgba(0,0,0,0.12),0px 2px 2px 0px rgba(0,0,0,0.24);display:flex;-webkit-align-items:center;align-items:center;background:#fafafa;border-radius:2px;height:40px;line-height:40px}.waffle-assistant-replaceable-title .waffle-assistant-answers-query-box{background:#fafafa;width:295px}.waffle-assistant-answers-query-box.waffle-assistant-answers-query-box-focused,.waffle-assistant-answers-query-box:hover{background:#fff}.waffle-assistant-replaceable-title .waffle-assistant-answers-query-box-focused,.waffle-assistant-replaceable-title .waffle-assistant-answers-query-box:hover{background:#fafafa}.waffle-assistant-replaceable-title .waffle-assistant-answers-query-box-focused{border-bottom-left-radius:0;border-bottom-right-radius:0}.waffle-assistant-answers-input-container{display:flex;-ms-flex:8;-webkit-flex:8;flex:8}.waffle-assistant-replaceable-title .waffle-assistant-answers-input-box{padding:0 5px 0 10px}.waffle-assistant-answers-input-box{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:transparent;border:none;height:40px;line-height:15px;outline:none;padding:0 5px;width:100%}.waffle-assistant-answers-input-with-icon .waffle-assistant-answers-input-box{padding-left:40px}.waffle-assistant-answers-toolbar-enabled .waffle-assistant-answers-input-box::-webkit-input-placeholder{color:#80868b!important;font:14px 'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif!important}.waffle-assistant-answers-toolbar-enabled .waffle-assistant-answers-input-box::-moz-placeholder{color:#80868b!important;font:14px 'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif!important}.waffle-assistant-answers-toolbar-enabled .waffle-assistant-answers-input-box:-moz-placeholder{color:#80868b!important;font:14px 'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif!important}.waffle-assistant-answers-toolbar-enabled .waffle-assistant-answers-input-box:-ms-input-placeholder{color:#80868b!important;font:14px 'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif!important}.waffle-assistant-answers-input-box::-webkit-input-placeholder{color:#80868b!important;font:14px 'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif!important}.waffle-assistant-answers-input-box::-moz-placeholder{color:#80868b!important;font:14px 'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif!important;line-height:40px!important}.waffle-assistant-answers-input-box:-moz-placeholder{color:#80868b!important;font:14px 'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif!important;line-height:40px!important}.waffle-assistant-answers-input-box:-ms-input-placeholder{color:#80868b!important;font:14px 'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif!important}.waffle-assistant-answers-search-icon{display:none;position:absolute}.waffle-assistant-answers-input-with-icon .waffle-assistant-answers-search-icon{display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center}.waffle-assistant-answers-search-icon,.waffle-assistant-answers-input-controls{height:40px;width:40px}.waffle-assistant-answers-query-box-button{height:40px}.waffle-assistant-answers-search-icon .docs-icon-img,.waffle-assistant-answers-clear-query-button .docs-icon-img{opacity:0.7}.waffle-assistant-answers-spinner-container{display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;height:40px;width:40px}.waffle-assistant-answers-spinner-container .waffle-spinner{height:25px;width:25px}.waffle-assistant-answers-output{background:rgba(0,0,0,0.12)}.waffle-assistant-answers-toolbar-ac-renderer,.waffle-assistant-answers-ac-renderer{box-shadow:0px 0px 2px 0px rgba(0,0,0,0.12),0px 2px 2px 0px rgba(0,0,0,0.24);background:#fafafa;border-bottom-left-radius:2px;border-bottom-right-radius:2px;color:#616161;font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;line-height:20px;position:absolute;width:295px;z-index:10000}.waffle-assistant-answers-toolbar-ac-renderer{-webkit-transform:translate(-1px,-5px);-moz-transform:translate(-1px,-5px);-ms-transform:translate(-1px,-5px);-o-transform:translate(-1px,-5px);transform:translate(-1px,-5px);background:#fff;border-bottom-left-radius:8px;border-bottom-right-radius:8px;width:250px}.waffle-assistant-answers-ac-row{cursor:default;padding:10px}.waffle-assistant-answers-ac-row-suggested-query:first-child,:not(.waffle-assistant-answers-ac-row-suggested-query)+.waffle-assistant-answers-ac-row-suggested-query,.waffle-assistant-answers-ac-row-session-query:first-child,:not(.waffle-assistant-answers-ac-row-session-query)+.waffle-assistant-answers-ac-row-session-query,.waffle-assistant-answers-ac-row-entity:first-child,:not(.waffle-assistant-answers-ac-row-entity)+.waffle-assistant-answers-ac-row-entity{border-top:1px solid rgba(0,0,0,0.12)}.waffle-assistant-answers-ac-active{background:#f5f5f5;cursor:pointer}.waffle-assistant-answers-ac-highlighted{font-weight:700}.waffle-assistant-answers-ac-entity{font-weight:700}.waffle-assistant-answers-ac-suggestion{display:flex}.waffle-assistant-answers-ac-suggestion-icon-container{margin-right:5px;opacity:0.7;width:24px}.waffle-assistant-answers-ac-suggestion-text{-ms-flex:8;-webkit-flex:8;flex:8;overflow:hidden;text-overflow:ellipsis;-webkit-box-orient:vertical;-webkit-line-clamp:3;display:-webkit-box;max-height:60px;overflow:hidden;overflow-wrap:break-word;word-wrap:break-word}.waffle-assistant-answercard-content{-webkit-user-select:auto;-moz-user-select:auto;-ms-user-select:auto;color:#757575}.waffle-assistant-answercard-question-container,.waffle-assistant-answercard-answer-container,.waffle-assistant-answercard-error-container{line-height:20px}.waffle-assistant-answercard-answer-container,.waffle-assistant-answercard-error-container,.waffle-assistant-answercard-question-container{padding:5px 0}.waffle-assistant-answercard-answer-container{margin-top:5px}.waffle-assistant-answercard-question-container.waffle-assistant-button,.waffle-assistant-answercard-error-container{display:flex}.waffle-assistant-answercard-question-container.waffle-assistant-button{-webkit-align-items:initial;align-items:initial;color:#757575;padding:5px 16px;opacity:1;text-align:left;white-space:normal;font-weight:400;font-size:13px}.waffle-assistant-answercard-question-container.waffle-assistant-button-hover,.waffle-assistant-answercard-question-container.waffle-assistant-button-focused{background-color:#f5f5f5;outline:none}.waffle-assistant-answercard-question-header,.waffle-assistant-answercard-answer-header{color:#0f9d58;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;font-weight:500;padding-bottom:3px;text-transform:uppercase}.waffle-assistant-button .waffle-assistant-answercard-question-header{opacity:0.7}.waffle-assistant-button .waffle-assistant-answercard-question-header,.waffle-assistant-answercard-error-image{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;height:18px;margin-right:10px;width:18px}.waffle-assistant-answercard-error-image{opacity:0.5}.waffle-assistant-answercard-question-content,.waffle-assistant-answercard-interpret-content,.waffle-assistant-answercard-answer-content,.waffle-assistant-answercard-error-content{overflow:hidden}.waffle-assistant-answercard-interpret-content{font-style:italic;padding-bottom:6px}.waffle-assistant-button .waffle-assistant-answercard-question-content,.waffle-assistant-answercard-error-content{-ms-flex:1;-webkit-flex:1;flex:1}.waffle-assistant-answercard-question,.waffle-assistant-answercard-interpret,.waffle-assistant-answercard-answer-col,.waffle-assistant-answercard-formula,.waffle-assistant-answercard-error{overflow:hidden;text-overflow:ellipsis}.waffle-assistant-answercard-question,.waffle-assistant-answercard-interpret,.waffle-assistant-errorcard-text{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text}.waffle-assistant-answercard-question-unused-phrase{text-decoration:line-through}.waffle-assistant-answercard-question-used-entity{font-weight:700}.waffle-assistant-answercard-question-error-msg-unused-phrase{font-weight:700;display:block}.waffle-assistant-answercard-answer-rowheader{display:flex;border-bottom:1px solid #979797;font-weight:700;margin-top:0;padding:4px 0 0}.waffle-assistant-answercard-answer-rows{max-height:200px;overflow-x:hidden;overflow-y:auto}.waffle-assistant-answercard-answer-row{display:flex;border-bottom:1px dashed #979797;padding:4px 0}.waffle-assistant-answercard-answer-row:first-child{margin-top:0}.waffle-assistant-answercard-answer-list-row.waffle-assistant-answercard-answer-row{font-weight:400}.waffle-assistant-answercard-answer-list-row.waffle-assistant-answercard-answer-row:last-child{border-bottom:1px dashed #979797}.waffle-assistant-answercard-answer-row:last-child{border:none;margin-bottom:0}.waffle-assistant-answercard-answer-col{-ms-flex:2;-webkit-flex:2;flex:2;margin:0 2px}.waffle-assistant-answercard-answer-col:first-child{margin-left:0}.waffle-assistant-answercard-answer-col:last-child{margin-right:0}.waffle-assistant-answercard-answer-col:nth-child(even){-ms-flex:1;-webkit-flex:1;flex:1;text-align:right}.waffle-assistant-answercard-answer-empty{color:rgba(0,0,0,0.54);font-weight:400;font-style:italic}.waffle-assistant-answercard-answer{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;color:rgba(0,0,0,0.54);font-weight:700}.waffle-assistant-answercard-info-msgs{font-size:12px;color:#949494;line-height:15px;margin:5px 0}.waffle-assistant-answercard-formula-holder{color:#757575;font-size:12px;font-style:italic;line-height:18px;margin-top:10px}.waffle-assistant-answercard-formula{display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;border:1px solid #4285f4;margin-top:5px}.waffle-assistant-readonly-card .waffle-assistant-answercard-formula{border:1px solid transparent}.waffle-assistant-answercard-formula-display{display:flex}.waffle-assistant-answercard-formula-help{background:#4285f4;color:#fff;padding-left:5px}.waffle-assistant-answercard-see-formula-link,.waffle-assistant-answercard-hide-formula-link{color:#757575}.waffle-assistant-answercard-formula-icon{display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;background:rgba(0,0,0,0.12);min-height:28px;width:30px}.waffle-assistant-answercard-formula-text-container{-ms-flex:1;-webkit-flex:1;flex:1;border-radius:3px;overflow-wrap:break-word;word-wrap:break-word;white-space:pre-wrap}.waffle-assistant-answercard-formula-text:hover,.waffle-assistant-answercard-formula-text:focus{outline:none}.waffle-assistant-answercard-formula-text:hover{cursor:move}.waffle-assistant-readonly-card .waffle-assistant-answercard-formula-text:hover{cursor:default}.waffle-assistant-answercard-formula-text{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:#f5f5f5;max-width:257px;padding:5px}.waffle-assistant-answercard-feedback-container{border-top:1px dashed #e0e0e0;padding:0 15px}.waffle-assistant-answercard-feedback-link{color:#757575;line-height:40px}.waffle-assistant-answers-range-styled-rect{opacity:0.20}.waffle-assistant-answers-styled-rect{opacity:0.06}.waffle-assistant-answers-range-styled-rect,.waffle-assistant-answers-styled-rect{background-color:#0f9d58;pointer-events:none}.waffle-assistant-answers-range-styled-border,.waffle-assistant-answers-styled-border{border-color:#0f9d58!important;border-style:dashed!important;line-height:0}.waffle-assistant-answers-suggestioncard{color:#757575}.waffle-assistant-answers-suggestioncard .waffle-assistant-answercard-error-container{padding:15px;padding-bottom:0}.waffle-assistant-suggestionscard-header{color:#0f9d58;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;font-weight:500;line-height:20px;padding-bottom:3px;padding-left:15px;padding-right:15px;padding-top:20px;text-transform:uppercase}.waffle-assistant-errorcard-content,.waffle-assistant-errorcard-text{line-height:20px}.waffle-assistant-answers-previousheadercard{color:#757575;padding:20px 15px 10px;text-transform:uppercase}.waffle-assistant-answercard-chart{height:200px;width:278px}.waffle-assistant-answercard-pivot-content{margin-bottom:10px;max-height:200px;overflow:hidden;width:278px}.waffle-pivottable-pivot-canvas{border:1px solid rgba(0,0,0,0.12)}.waffle-pivottable-pivot-canvas:hover,.waffle-pivottable-pivot-canvas:focus{border:1px solid #4285f4;cursor:pointer}.waffle-assistant-answercard-tabs{-ms-flex-align:center;-moz-box-align:center;-webkit-box-align:center;box-align:center;-webkit-align-items:center;align-items:center;display:flex;box-pack:center;-ms-flex-pack:center;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center;text-align:center}.waffle-assistant-answercard-chart-tab,.waffle-assistant-answercard-formula-tab,.waffle-assistant-answercard-pivot-tab{-ms-flex:1;-webkit-flex:1;flex:1;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;line-height:18px}.waffle-assistant-answercard-chart-tab.goog-tab.goog-tab-selected,.waffle-assistant-answercard-formula-tab.goog-tab.goog-tab-selected,.waffle-assistant-answercard-pivot-tab.goog-tab.goog-tab-selected{background:#9e9e9e;color:#fff;cursor:default;font-weight:500}.waffle-assistant-answercard-chart-tab.goog-tab,.waffle-assistant-answercard-formula-tab.goog-tab,.waffle-assistant-answercard-pivot-tab.goog-tab{border:1px solid rgba(0,0,0,0.1);color:#8f8f8f;cursor:pointer;padding:2px 4px;text-decoration:none}.waffle-assistant-answercard-chart-tab.goog-tab{border-top-right-radius:2px;border-bottom-right-radius:2px}.waffle-assistant-answercard-formula-tab.goog-tab,.waffle-assistant-answercard-pivot-tab.goog-tab{border-top-left-radius:2px;border-bottom-left-radius:2px}.waffle-assistant-answercard-tabs.goog-tab-bar{background:inherit;margin-bottom:10px}.waffle-assistant-answercard-insert-chart,.waffle-assistant-answercard-insert-pivot{color:rgba(0,0,0,0.87);float:right;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;font-weight:500;margin:0 5px}.waffle-assistant-answercard-chart-type-select,.waffle-assistant-answercard-chart-type-select:hover,.waffle-assistant-answercard-chart-type-select:focus{background:none;border-color:transparent;color:rgba(0,0,0,0.87);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;padding:0 18px 0 0}.waffle-assistant-answercard-chart-type-select:hover .goog-flat-menu-button-caption{text-decoration:underline}.waffle-answers-panel{height:100%}.waffle-dbsource-configbar-answers-wrapper{display:flex;-ms-flex:1;-webkit-flex:1;flex:1;-webkit-justify-content:flex-end;justify-content:flex-end;position:relative}.waffle-dbsource-configbar-answers-wrapper .waffle-assistant-answers-input{opacity:0.3}.waffle-dbsource-configbar-answers-wrapper.waffle-assistant-answers-toolbar-enabled .waffle-assistant-answers-input{opacity:1}.waffle-dbsource-configbar-answers-wrapper .waffle-assistant-answers-input{margin:0;padding-bottom:0;width:250px}.waffle-dbsource-configbar-answers-wrapper .waffle-assistant-answers-query-box,.waffle-dbsource-configbar-answers-wrapper.waffle-assistant-answers-toolbar-enabled .waffle-assistant-answers-query-box{box-shadow:none;transition:all 200ms ease-out;background:#f1f3f4;border-radius:8px;height:36px;line-height:36px;width:250px}.waffle-dbsource-configbar-answers-wrapper.waffle-assistant-answers-toolbar-enabled .waffle-assistant-answers-query-box.waffle-assistant-answers-query-box-focused,.waffle-dbsource-configbar-answers-wrapper.waffle-assistant-answers-toolbar-enabled .waffle-assistant-answers-query-box:hover{box-shadow:0px 3px 4px 0px rgba(0,0,0,0.14),0px 3px 3px -2px rgba(0,0,0,0.12),0px 1px 8px 0px rgba(0,0,0,0.2);background:white}.waffle-dbsource-configbar-answers-wrapper .waffle-assistant-answers-query-box.waffle-assistant-answers-query-box-focused,.waffle-dbsource-configbar-answers-wrapper .waffle-assistant-answers-query-box:hover{background:#f1f3f4}.waffle-dbsource-configbar-answers-wrapper .waffle-assistant-answers-search-icon,.waffle-dbsource-configbar-answers-wrapper .waffle-assistant-answers-input-controls,.waffle-dbsource-configbar-answers-wrapper .waffle-assistant-answers-query-box-button{height:36px}.waffle-dbsource-configbar-answers-wrapper .waffle-assistant-answers-input-box{color:#80868b;font-size:14px;height:36px}.waffle-answers-bar .waffle-assistant-answers-query-box{box-shadow:none;border:1px solid #dadce0;border-radius:8px;background:#fff;opacity:0.5}.waffle-dbanswers-answers-bar-controls{-webkit-align-items:center;align-items:center;display:flex}.waffle-dbanswers-answers-bar-enable-button{padding:5px;font-weight:700}.waffle-answers-button.jfk-button{background:none;border:none;border-radius:50%;height:30px;margin:0 9px 0 0;min-width:30px;opacity:0.5;padding:5px}.waffle-answers-button.jfk-button-hover{background-color:rgba(0,0,0,.06)}.waffle-answers-bar.waffle-assistant-answers-toolbar-enabled .waffle-assistant-answers-query-box{opacity:1}.waffle-answers-bar.waffle-assistant-answers-toolbar-enabled .waffle-answers-button{opacity:1}.waffle-answers-bar .waffle-assistant-answers-input{margin:2px 4px 2px;width:250px}.waffle-answers-bar.waffle-assistant-answers-toolbar-enabled .waffle-assistant-answers-query-box.waffle-assistant-answers-query-box-focused,.waffle-answers-bar.waffle-assistant-answers-toolbar-enabled .waffle-assistant-answers-query-box:hover{box-shadow:0px 1px 1px 0px rgba(0,0,0,0.14),0px 2px 1px -1px rgba(0,0,0,0.12),0px 1px 3px 0px rgba(0,0,0,0.2)}.waffle-dbanswers-answers-bar-enable-answers-popup{background:#fff;border-radius:5px;box-shadow:0px 2px 2px 0px rgba(0,0,0,0.14),0px 3px 1px -2px rgba(0,0,0,0.12),0px 1px 5px 0px rgba(0,0,0,0.2);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;padding:20px;position:absolute;width:275px}.waffle-dbanswers-answers-bar-enable-answers-popup-setup-link{font-weight:700}.waffle-dbanswers-answers-bar-message{color:#80868b;font-size:9px}.waffle-assistant-datavalidation-rule-group{margin:16px}.waffle-assistant-datavalidation-rule-holder{border:1px solid #ccc;cursor:pointer;display:block;margin-bottom:5px;padding:1px;width:258px}.waffle-assistant-datavalidation-description{color:rgba(0,0,0,0.54);display:inline-block;text-overflow:ellipsis}.waffle-assistant-datavalidation-apply-button.jfk-button{color:#1a73e8;cursor:pointer;display:inline-block;float:right;font-size:13px;text-align:right;text-transform:uppercase}.waffle-assistant-datavalidation-range{font-weight:500}.waffle-assistant-datavalidation-details{display:inline-block;margin-bottom:12px;width:100%}.waffle-assistant-datavalidation-detail-chip{background-color:#eeeeee;border:1px solid #e0e0e0;border-radius:11px;color:rgba(0,0,0,.87);display:inline-block;line-height:21px;margin:3px;max-width:234px;overflow:hidden;padding:0 16px;text-overflow:ellipsis;white-space:nowrap}.waffle-assistant-conditionalformat-rule-group{margin:16px}.waffle-assistant-conditionalformat-rule-holder{border:1px solid #ccc;cursor:pointer;display:block;margin-bottom:5px;padding:1px;width:258px}.waffle-assistant-conditionalformat-format-preview{border:1px solid transparent;display:inline-table;height:21px;margin:1px;overflow:hidden;text-align:center}.waffle-assistant-conditionalformat-format-preview.one-rule{max-width:254px;width:254px}.waffle-assistant-conditionalformat-format-preview.two-rules{max-width:125px;width:125px}.waffle-assistant-conditionalformat-format-preview.three-rules{max-width:82px;width:82px}.waffle-assistant-conditionalformat-format-preview-label{display:block;height:17px;line-height:17px;max-height:17px;padding:2px;text-overflow:ellipsis}.waffle-assistant-conditionalformat-format-preview.one-rule .waffle-assistant-conditionalformat-format-preview-label{max-width:250px;width:250px}.waffle-assistant-conditionalformat-format-preview.two-rules .waffle-assistant-conditionalformat-format-preview-label{max-width:121px;width:121px}.waffle-assistant-conditionalformat-format-preview.three-rules .waffle-assistant-conditionalformat-format-preview-label{max-width:78px;width:78px}.waffle-assistant-conditionalformat-description{color:#757575;display:inline-block;height:21px;line-height:21px;text-overflow:ellipsis;width:237px}.waffle-assistant-conditionalformat-edit-button.jfk-button{cursor:pointer;width:21px}.waffle-assistant-banding-recommendation{margin:16px;overflow:hidden}.waffle-assistant-banding-color-picker-container{padding-bottom:5px}.waffle-assistant-banding-color-picker-container .waffle-banding-color-picker-table{border-spacing:8px;margin-left:-8px}.waffle-assistant-banding-range-wrapper{border:1px solid transparent;color:#757575;display:inline-block;float:left;line-height:21px;text-align:left}.waffle-assistant-banding-range{font-weight:500}.waffle-assistant-formatting-edit-button{color:#5e97f5;cursor:pointer;display:inline-block;float:right;text-align:right;text-transform:uppercase}.waffle-assistant-insert-pivottable-button.jfk-button{left:-1px}.waffle-assistant-pivottable-rule-group{margin:16px}.waffle-assistant-pivottable-rule-holder{border:1px solid #ccc;cursor:pointer;display:block;margin-bottom:5px;padding:1px;width:258px}.waffle-assistant-pivottable-description{color:#757575;display:inline-block;height:21px;line-height:21px;text-overflow:ellipsis;width:237px}.waffle-assistant-zoom-button.jfk-button{left:1px;position:relative}.waffle-pivottable-preview-pane{display:flex;-ms-flex:1;-webkit-flex:1;flex:1;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;-webkit-justify-content:center;justify-content:center;max-height:80%;max-width:80%}.waffle-pivot-suggestion-preview-insert.jfk-button-focused{border:1px solid #5e97f6!important;outline:none}.waffle-pivottable-canvas{overflow:auto;background:white}.waffle-pivottable-canvas-content{padding:25px}.waffle-pivottable-preview-interpret{-webkit-align-items:left;align-items:left;color:white;max-width:500px;margin-bottom:10px;overflow:visible;overflow-wrap:break-word;padding:5px;text-overflow:ellipsis}.waffle-pivottable-lightbox{-webkit-align-items:center;align-items:center;display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;background-color:rgba(0,0,0,0.85);height:100%;left:0;position:absolute;top:0;width:100%;z-index:1000}.waffle-assistant-tables-recommendation{display:flex;margin-bottom:15px;overflow:hidden}.waffle-assistant-table-range-container{margin-right:20px;width:50%}.waffle-assistant-header-range-container{width:50%}.waffle-assistant-tables-range-wrapper{-ms-flex:1;-webkit-flex:1;flex:1;border:1px solid transparent;border-bottom:1px solid #d0d0d0;color:rgba(0,0,0,.54);font-size:11px;line-height:21px;text-align:left}.waffle-assistant-header-range-container .waffle-assistant-tables-range-wrapper{border-bottom:none}.waffle-assistant-tables-range-wrapper .waffle-range-selection-input,.waffle-assistant-tables-range-wrapper .waffle-range-selection-input-focus,.waffle-assistant-tables-range-wrapper .waffle-range-selection-input:focus{border:1px solid transparent;color:rgba(0,0,0,.87);font-size:13px;line-height:21px;padding:0 4px!important;text-align:left}.waffle-assistant-tables-range-wrapper .waffle-range-selection-container-focus{border:none;box-shadow:none;outline:none}.waffle-assistant-tables-range-wrapper .waffle-range-selection-button{cursor:default;height:26px}.waffle-assistant-tables-range-wrapper input:disabled{background-color:transparent}.waffle-assistant-table-canvas{border:1px solid #dcdcdc;display:block;margin:0 auto}.waffle-assistant-canvas-container{margin-top:10px;overflow:hidden}.waffle-assistant-tables-edit-headers-button{display:flex}.waffle-assistant-tables-edit-headers-button .docs-charts-editor-material-menu-button-caption{font-size:13px;height:24px;overflow:hidden;text-align:left;text-overflow:ellipsis;width:100%}.waffle-assistant-tables-edit-headers-button .docs-charts-editor-material-menu-button{margin:0;width:100%}.waffle-tables-popup{background:white;border-radius:2px;box-shadow:0 2px 10px rgba(0,0,0,0.3);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;margin:0 10px;outline:none;overflow:hidden;position:relative;top:45px}.waffle-tables-popup-answers-enabled{top:38px}.waffle-tables-popup-header{background-color:#eeeeee;padding:12px 15px 12px 20px}.waffle-tables-popup-title{color:rgba(0,0,0,87);font-size:16px;font-weight:500}.waffle-tables-popup-content{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;padding:16px 16px 0}.waffle-tables-popup-buttons{display:flex;flex-direction:row-reverse;padding:8px 8px 8px 24px}.waffle-tables-popup-button{background:none;border:none;border-radius:2px;color:#4285f4;cursor:pointer;display:inline-block;height:36px;margin-left:8px;min-width:64px;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;letter-spacing:0;line-height:36px;overflow:hidden;outline:none;padding:0 8px;position:relative;text-align:center;text-decoration:none;text-transform:uppercase;vertical-align:middle}.waffle-assistant-tables-edit-range-button{border:none;float:right;font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;font-weight:500;height:100%;padding:0 14px;text-transform:uppercase;white-space:nowrap}.waffle-assistant-sidebar-tables-range{float:left;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;padding:12px 0px 12px 12px;position:relative;top:50%;transform:translateY(-50%);-ms-flex:1;-webkit-flex:1;flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.waffle-tables-bar-content{overflow:hidden;text-overflow:ellipsis}.waffle-sidebar-tables-bar{box-shadow:inset 0 -2px 2px rgba(0,0,0,.1);background:#f1f1f1;color:#5f5f5f;height:40px;overflow:hidden;vertical-align:middle;display:flex}.waffle-assistant-tables-range-wrapper .waffle-range-selection-container{border:none}.waffle-sidebar-overlay{background-color:rgba(51,51,51,0.3);bottom:0;left:0;overflow-y:auto;position:absolute;right:0;top:0;z-index:1003}.waffle-assistant-table-bar-range{font-weight:500}.waffle-assistant-table-first-header{display:inline-block;font-weight:500;max-width:95px;overflow:hidden;padding-bottom:2px;text-overflow:ellipsis;vertical-align:middle;white-space:nowrap}.waffle-assistant-tables-scroll-pane{bottom:0;height:auto;left:0;position:absolute;right:0;top:40px}.waffle-assistant-tables-range-error{color:#c53929;font-size:11px;padding-top:2px}.waffle-assistant-tables-range-error-input{border-bottom:1px solid #c53929}.docs-action-new-badge{background-color:#c6dafc;border-radius:2px;color:#2a56c6;display:inline-block;float:right;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:11px;font-weight:500;margin-left:15px;margin-top:-4px;padding:5px 8px;text-transform:uppercase}.docs-gm .docs-action-new-badge{background-color:transparent;border-radius:4px;border:1px solid #188038;box-sizing:border-box;color:#188038;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;height:24px;line-height:24px;margin-top:-2px;padding:0px 8px;text-transform:none;vertical-align:middle}.docs-action-new-badge-submenu .docs-action-new-badge{margin-right:-27px}.docs-action-new-badge-submenu{display:inline-block;margin-bottom:-4px;min-width:100%}.docs-action-new-badge-text-ie{float:left}.docs-action-new-badge-clearfix-ie:after{clear:both;content:"";display:table}.docs-action-updated-dot{background-color:#188038;border-radius:50%;display:inline-block;float:right;height:9px;width:9px;margin-top:5px}.docs-action-updated-dot-submenu .docs-action-updated-dot{margin-right:-15px}.docs-action-updated-dot-submenu{display:inline-block;margin-bottom:-6px;margin-right:-5px;min-width:calc(100% - 40px)}.docs-action-updated-dot-shortcut-keys .docs-action-updated-dot{margin-right:-27px}.docs-action-updated-dot-shortcut-keys{display:inline-block;margin-bottom:-4px;margin-right:12px}.apps-marquee{font:bold 13px Arial,sans-serif;height:0;left:20%;position:fixed;_position:absolute;text-align:center;top:0;width:60%;z-index:1001}.apps-marquee-item{display:inline-block;margin:0 5px 4px;color:#fff999}.apps-marquee-text{background:#fff999;border-color:#fff999;border-style:solid;border-width:0 3px;color:black;padding:2px 5px 2px}.apps-marquee-round-bottom{border-left:3px dotted transparent;border-right:3px dotted transparent;border-top:3px solid}.apps-marquee-round-top{border-left:3px dotted transparent;border-right:3px dotted transparent;border-bottom:3px solid}.apps-marquee-warning{color:#a00}.apps-marquee-warning .apps-marquee-text{background:#a00;border-color:#a00;color:white}.apps-promo{position:absolute;z-index:10000;font-size:11px}.apps-promo-arrow-container{position:relative}.apps-promo-arrow{position:absolute;background:transparent url(//ssl.gstatic.com/docs/common/promo_arrows-0.png) no-repeat}.apps-promo-close{position:relative;top:-5px;width:16px;height:16px;float:right;cursor:pointer;background:transparent url(//ssl.gstatic.com/docs/common/promo_close-0.png) no-repeat}.apps-promo-popup{background:#fff;box-shadow:0 7px 7px #666;-moz-box-shadow:0 7px 7px #666;-webkit-box-shadow:0 7px 7px #666;border:1px solid #ccc;width:275px;padding:15px;padding-right:10px}.apps-promo-header-content{font-weight:bold;font-size:14px}.apps-promo-content{padding-top:15px;font-size:13px}.apps-promo-buttons{padding-top:15px;padding-left:4px}.apps-promo-buttons a{font-size:13px;vertical-align:middle;margin-left:15px}.apps-promo-buttons-inner{display:inline}.apps-promo-buttons-inner .goog-imageless-button-content{white-space:nowrap}.apps-toast{font-size:13px;bottom:-200px;width:227px;display:block;opacity:1;position:absolute;z-index:50}.apps-toast-top{height:18px;width:227px;opacity:1;background:url("//ssl.gstatic.com/docs/common/toastBackTop-ltr-1.png")}.apps-toast-fill{height:92px;width:227px;opacity:1;background:url("//ssl.gstatic.com/docs/common/toastBackFill-0.png");z-index:51}.apps-toast-title{font-weight:bold;padding:0px 20px}.apps-toast-content{padding:0 20px 8px}html{overflow:hidden}.waffle,.grid-fixed-table{font-size:13px;table-layout:fixed;border-collapse:separate;border-style:none;border-spacing:0;width:0;cursor:default}.mimic-overlay{position:absolute;z-index:4}.mimic-overlay-canvas{display:block}.scroll-container{position:absolute;overflow:auto;border-width:0;padding:0;margin:0;z-index:1;top:0;left:0}.native-scrollbar{overflow:auto;position:absolute;border-width:0;padding:0;margin:0;top:0;left:0}.static-overlay-container{z-index:6}.grid-container{background-color:#eee;overflow:hidden;position:relative;z-index:0}.grid-table-container{overflow:hidden;z-index:3;position:relative}.ritz.grid-container table.waffle svg{display:block}.fixed-table-container{overflow:visible;z-index:4}.docs-guides-htmlguiderenderer{z-index:14}.fixed4-inner-container,.fixed4-outer-container,.grid4-inner-container,.grid4-outer-container{position:relative;vertical-align:top}.fixed4-outer-container,.grid4-outer-container{overflow:visible}.fixed4-inner-container,.grid4-inner-container{overflow:hidden}.fixed4-inner-container{z-index:4}.grid4-inner-container{z-index:3}.grid-fixed-wrapper{overflow:hidden;white-space:nowrap}.grid-scrollable-wrapper{white-space:nowrap}.uberlay{position:absolute;height:0;width:0;top:0}.overlay-container-ltr{position:absolute;height:0;width:0;top:0;left:0}.overlay-container-rtl{position:absolute;height:0;width:0;top:0;right:0}.focused-overlay-container{position:absolute;overflow:hidden;pointer-events:none}.grid-vertical-scroll{width:20px}.grid-horizontal-scroll{height:20px;float:right}.header-bg{background-color:#e8eef7}.waffle-measurement-table{position:absolute;width:0;height:0;overflow:hidden}.cell-input{width:100%;height:100%;margin:0;outline:none;cursor:text;-webkit-user-modify:read-write-plaintext-only;white-space:pre-wrap;-webkit-transform:translateZ(0);background-color:white}.waffle-formula-preview-decorator{background:white;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;box-shadow:0 1px 2px rgba(0,0,0,0.5);color:#3266d5;font-family:Inconsolata,monospace,arial,sans,sans-serif;font-size:13px;line-height:17px;padding:3px 2px 3px 7px}.waffle-formula-preview-decorator.waffle-formula-preview-equals-aligned::before,.waffle-formula-preview-decorator.waffle-formula-preview-partial::before{background-color:white;bottom:-4.5px;box-shadow:2px 2px 2px rgba(0,0,0,0.2);content:'\0000a0';display:block;margin-left:-5px;height:10px;position:absolute;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg);width:10px}.waffle-formula-preview-decorator.waffle-formula-preview-partial::before{left:50%}.waffle-formula-preview-result{display:inline-block;max-width:280px;overflow:hidden;text-overflow:ellipsis;vertical-align:top}.waffle-formula-preview-button{display:inline-block;margin:-2px;opacity:.35;-webkit-transform:scale(.6,.6);-moz-transform:scale(.6,.6);-ms-transform:scale(.6,.6);-o-transform:scale(.6,.6);transform:scale(.6,.6)}.waffle-formula-preview-button:hover{opacity:.7}.selection{position:absolute;opacity:0.20;z-index:5}.input-box{border:2px #5292f7 solid;border-color:#1a73e8;box-shadow:0 2px 6px 2px rgba(60,64,67,.15);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;font-style:normal;font-variant:normal;font-weight:400;margin:0;max-height:9900px;max-width:9900px;outline:none;overflow:auto;padding:0 2px;position:absolute;resize:none;text-align:left;top:-10000px;white-space:pre-wrap;word-wrap:break-word;z-index:15}.input-box-disable-box-shadow{box-shadow:none}.IE .input-box{padding-top:1px}.disabled-input{-webkit-user-modify:read-only;color:#777}.text-sizer,.input-capturer{position:absolute;top:-4000px}.range-border{position:absolute;border-width:0;border-style:solid;padding:0;_overflow:hidden}.border-opacity{filter:alpha(opacity=30);opacity:0.3}.cell-border{line-height:1px}.active-cell-border{border-color:#1a73e8;line-height:1px;z-index:7}.selection-border{border-color:#1a73e8;line-height:0;z-index:7}.selection-border-cover{position:absolute;z-index:7}.selection-border-dragging{border-color:#1a73e8;border-style:dashed;line-height:0;z-index:7}.waffle-clipboard-border{border-color:#1a73e8;border-style:dashed;line-height:0}.autofill-border{border-color:gray;border-style:dashed;line-height:0}.array-border{border-color:#1a73e8;border-style:solid;line-height:0}.autofill-handle{_overflow:hidden;background-color:#1a73e8;border:1px solid white;height:6px;margin-top:1px;position:absolute;width:6px;z-index:8}.autofill-handle-rtl{border-width:1px 1px 0 0}.autofill-handle-ltr{border-width:1px 0 0 1px}.autofill-cover{position:absolute;cursor:crosshair;width:8px;height:8px;z-index:9}.postpaste-parent{background:#f5f5f5;border:1px solid #d9d9d9;box-shadow:inset 0 1px 0 0 #fff;background-color:#f5f5f5;background-image:-webkit-linear-gradient(top,#f5f5f5,#eee);background-image:-moz-linear-gradient(top,#f5f5f5,#eee);background-image:-ms-linear-gradient(top,#f5f5f5,#eee);background-image:-o-linear-gradient(top,#f5f5f5,#eee);background-image:linear-gradient(top,#f5f5f5,#eee);position:absolute;z-index:8}.postpaste-parent{background:#fff;border:none;box-shadow:0 1px 3px 1px rgba(60,64,67,.15);border-radius:4px}.goog-toolbar-menu-button.postpaste-container{margin:0;min-width:0px;border-color:transparent!important}.goog-toolbar-menu-button.postpaste-container{border:none!important;height:100%;width:100%}.postpaste-container.goog-toolbar-menu-button-open.goog-toolbar-menu-button-hover{background:#ceead6}.goog-toolbar-menu-button-focused.postpaste-container{border-color:#c6c6c6!important}.goog-toolbar-menu-button-open.postpaste-container{border-color:#c6c6c6!important}.goog-menuitem.postpaste-menu-item{padding-right:26px;padding-left:15px}.post-paste-menu{margin:12px 3px 0 0}.postpaste-clipboard-icon{margin-left:8px;margin-top:4px}.overlay-container-rtl .postpaste-clipboard-icon{margin-right:26px}.postpaste-parent .goog-toolbar-menu-button-dropdown.postpaste-arrow{left:0;margin-left:32px;margin-top:4px;position:absolute;right:0}.overlay-container-rtl .goog-toolbar-menu-button-dropdown.postpaste-arrow{margin-right:10px}.waffle-dbsource-container,.waffle-recommendation-card-overlay,.waffle-texttocolumns-overlay{position:absolute;z-index:8}.waffle-texttocolumns-wrapper{background:#f5f5f5;border:1px solid #d9d9d9;padding:2px}.waffle-texttocolumns-separator-label{font-size:11px;font-weight:500;margin:2px;top:0}.waffle-texttocolumns-custom-input{position:absolute;top:3px;width:120px}.waffle-blameview{background:#fff;border-radius:8px;box-shadow:0 2px 6px 2px rgba(60,64,67,.15);display:flex;outline:none;overflow:hidden;position:absolute;width:240px}.waffle-blameview-cell-ref{font-family:Inconsolata,monospace,arial,sans,sans-serif;font-style:normal}.waffle-blameview-formula-text{font-family:Inconsolata,monospace,arial,sans,sans-serif;font-style:normal}a.waffle-blameview-image-link{color:#1a73e8;font-style:italic;text-decoration:underline}.freezebar .freezebar-drop,.freezebar .freezebar-handle-bar,.resizer,.resizer-hover .resizer-handle-bar,.resizer-drop,.rowcol-dragger .rowcol-dragger-handle,.rowcol-dragger .rowcol-dragger-handle-bar,.rowcol-dragger .rowcol-dragger-drop{display:none;outline:0}.freezebar-active .freezebar-drop,.freezebar-active .freezebar-handle-bar,.resizer-hover,.resizer-active,.resizer-active .resizer-handle-bar,.resizer-active .resizer-drop,.rowcol-dragger-hover .rowcol-dragger-handle,.rowcol-dragger-active .rowcol-dragger-handle,.rowcol-dragger-active .rowcol-dragger-handle-bar,.rowcol-dragger-active .rowcol-dragger-drop{display:block}.resizer{z-index:7;position:absolute}.resizer-handle{position:relative;border-style:none}.resizer-horizontal-handle{height:5px;cursor:n-resize;background:#4d90fe}.resizer-vertical-handle{width:5px;cursor:e-resize;background:#4d90fe}.resizer-rtl .resizer-vertical-handle{cursor:w-resize}.resizer-horizontal-handle-bar{position:absolute;height:1px;background-color:#4d90fe;top:2px;overflow:hidden}.resizer-vertical-handle-bar{position:absolute;width:1px;background-color:#4d90fe;left:2px;border:0;padding:0;overflow:hidden}.freezebar-handle,.freezebar-drop{position:absolute;z-index:6}.freezebar-handle-bar,.freezebar-drop-bar{position:relative;z-index:7}.freezebar-vertical-handle-bar{width:2px;background:#dbe5f7;border-color:#a5c6fe;border-style:solid;border-width:0 1px;opacity:0.45;filter:alpha(opacity=45)}.freezebar-horizontal-handle-bar{height:2px;background:#dbe5f7;border-color:#a5c6fe;border-style:solid;border-width:1px 0;opacity:0.45;filter:alpha(opacity=45)}.freezebar-vertical-handle{width:4px;background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAYCAIAAABSh8vJAAAAEElEQVQYV2PYgwQYRjnEcgDquNOBEawK+wAAAABJRU5ErkJggg==") no-repeat}.overlay-container-rtl .freezebar-vertical-handle{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAYCAIAAABSh8vJAAAAEElEQVQYV2PYgwQYRjnEcgDquNOBEawK+wAAAABJRU5ErkJggg==") no-repeat;background-position:top right}.freezebar-vertical-handle-invisible{width:4px}.freezebar-active .freezebar-vertical-handle{width:5px}.freezebar-hover .freezebar-horizontal-handle{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC4AAAAECAIAAAB+7JowAAAAFUlEQVQY02NYeuzfIEEMo04Z3E4BAHKzu4gtAIWGAAAAAElFTkSuQmCC") no-repeat;z-index:7}.freezebar-hover .freezebar-vertical-handle{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAYCAIAAABSh8vJAAAAE0lEQVQYV2NYeuwfHDGMcojlAADmjOdhimOdggAAAABJRU5ErkJggg==") no-repeat;z-index:7}.overlay-container-rtl .freezebar-hover .freezebar-horizontal-handle{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC4AAAAECAIAAAB+7JowAAAAFUlEQVQY02NYeuzfIEEMo04Z3E4BAHKzu4gtAIWGAAAAAElFTkSuQmCC") no-repeat;background-position:top right}.overlay-container-rtl .freezebar-hover .freezebar-vertical-handle{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAYCAIAAABSh8vJAAAAE0lEQVQYV2NYeuwfHDGMcojlAADmjOdhimOdggAAAABJRU5ErkJggg==") no-repeat;background-position:top right}.freezebar-horizontal-handle{height:4px;background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC4AAAAECAIAAAB+7JowAAAAEklEQVQY02PYM2gAw6hTBrdTAFI0lXC16jX6AAAAAElFTkSuQmCC") no-repeat}.overlay-container-rtl .freezebar-horizontal-handle{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC4AAAAECAIAAAB+7JowAAAAEklEQVQY02PYM2gAw6hTBrdTAFI0lXC16jX6AAAAAElFTkSuQmCC") no-repeat;background-position:top right}.overlay-container-rtl .freezebar-horizontal-drop{background-position:right}.freezebar-horizontal-handle-invisible{height:4px}.freezebar-active .freezebar-horizontal-handle{height:5px}.freezebar-origin-rtl,.freezebar-origin-ltr{height:23px;width:45px;position:absolute;top:0px;border:1px #ccc solid}.freezebar-origin-ltr{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -205px 0;left:0px;border-width:0 1px 1px 0}.freezebar-origin-rtl{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -305px -62px;right:0px;border-width:0 0 1px 1px}.freezebar-vertical-drop{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAYCAIAAABSh8vJAAAAEklEQVQYV2NInfsHjhhGOcRyAFpkv0GBZT1JAAAAAElFTkSuQmCC") no-repeat;width:4px}.freezebar-horizontal-drop{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC4AAAAECAIAAAB+7JowAAAAFUlEQVQoz2NInftnkCCGUacMbqcAAL1HbqBCYk6sAAAAAElFTkSuQmCC") no-repeat;height:4px}.freezebar-vertical-drop-bar{width:4px;background-color:#afbbd1;border-width:2px 1px 2px 2px}.freezebar-horizontal-drop-bar{height:4px;overflow:hidden;background-color:#afbbd1;border-width:2px 2px 1px 2px}.waffle-incelldropdownselect-menu-vertical{overflow-y:auto}.rowcol-dragger{position:absolute;z-index:6}.rowcol-dragger-drop-bar,.rowcol-dragger-handle-bar{z-index:6;position:absolute;background-color:#777;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.rowcol-dragger-handle-bar{border:2px solid #36c;opacity:0.20;filter:alpha(opacity=20)}.rowcol-dragger-horizontal-handle{width:36px}.rowcol-dragger-horizontal-drop-bar{height:2px}.rowcol-dragger-vertical-handle{height:23px}.rowcol-dragger-vertical-drop-bar{width:2px}.rowcol-dragger-handle,.rowcol-dragger-drop{position:absolute;z-index:6}.jfk-freestanding-menu-button.waffle-kennedy-column-menu-button{background:url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNyIgaGVpZ2h0PSI0IiAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBmaWxsPSIjQkRCREJEIiBkPSJNMCAwTDcgMCBMMy41IDR6Ii8+PC9zdmc+") center no-repeat;background-color:#f8f8f8;z-index:7}.jfk-freestanding-menu-button-hover.waffle-kennedy-column-menu-button{background:url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNyIgaGVpZ2h0PSI0IiAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBmaWxsPSIjNjE2MTYxIiBkPSJNMCAwTDcgMCBMMy41IDR6Ii8+PC9zdmc+") center no-repeat;background-color:#f8f8f8}.jfk-freestanding-menu-button-hover.waffle-column-type-button{box-shadow:0px -1px 5px rgba(128,134,139,0.09),0px 3px 5px rgba(128,134,139,0.06),0px 1px 2px rgba(60,64,67,0.3),0px 1px 3px rgba(60,64,67,0.15)}.jfk-freestanding-menu-button-focused.waffle-column-type-button{background:#ffffff;box-shadow:0px -1px 5px rgba(128,134,139,0.09),0px 3px 5px rgba(128,134,139,0.06),0px 1px 2px rgba(60,64,67,0.3),0px 1px 3px rgba(60,64,67,0.15);opacity:0.32}.goog-flat-menu-button-focused.waffle-set-column-type-button,.goog-flat-menu-button-focused.waffle-set-column-type-button:hover{background-color:#80868b;border:1px solid #80868b}a.in-cell-link{text-decoration:underline;cursor:default}.docs-bubble-link.docs-bubble-link-visited{color:#673ab7!important}.docs-link-insertlinkbubble .docs-icon-grid,.docs-link-insertlinkbubble .docs-icon-grid:before{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_green.svg)}.annotation-bubble{position:absolute;z-index:14;margin:0 0 0 -2px;padding:0;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;max-width:200px}.annotation-editable{background-color:white;border:1px solid rgba(60,64,67,.15);border-radius:4px;box-shadow:0 2px 6px 2px rgba(60,64,67,.15);color:#5f6368;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:500;margin:0;outline:none;padding:8px;width:100%}.annotation-attribution{background-color:#fff;border-radius:4px;box-shadow:0 4px 8px 3px rgba(60,64,67,.15);font-size:13px;overflow:scroll;overflow-wrap:break-word;padding:12px;user-select:text}.annotation-attribution strong{display:block;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:700;line-height:20px;margin-bottom:8px}.annotation-attribution span{display:block}.annotation-attribution-error{border-left:4px solid #ea4335}.annotation-attribution-error strong{color:#ea4335}.annotation-attribution-invalid{border-left:4px solid #ea4335}.annotation-attribution-invalid strong{color:#ea4335}.annotation-attribution-help{border-left:4px solid #ea4335}.annotation-attribution-help strong{color:#ea4335}.annotation-importrange{background-color:#ffffff;border:1px solid #ff0000;box-shadow:2px 2px 6px #888;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;margin:0;overflow-x:hidden;text-align:left;vertical-align:top;width:100%}.annotation-importrange-error-msg-box{margin-bottom:10px;text-align:left}.waffle-footer-container{height:4000px;position:relative;z-index:3}.waffle-background-container{background-color:#eee;width:50000px;height:0px;position:absolute;top:0;z-index:-1}.addRowsWidget-ltr{color:#222;float:left;padding:6px 0 0 45px;direction:ltr}.addRowsWidget-rtl{color:#222;float:right;padding:6px 45px 0 0;direction:ltr}div.addRowsButton-ltr{margin-top:0;margin-right:2px;vertical-align:middle}div.addRowsButton-rtl{margin-top:0;margin-left:2px;vertical-align:middle}div.addRowsText{color:#000000;padding-top:5px;vertical-align:middle}.addRowsError-ltr{color:#c00;float:left;padding:13px 0 0 10px}.addRowsError-rtl{color:#c00;float:right;padding:13px 10px 0 0}.addRowsInput{margin:0 4px 0 4px;vertical-align:middle}.waffle-formula-help-popup P{margin-top:0}.waffle-formula-help-popup a:visited{color:#15c}.waffle-formula-help-popup{position:absolute;top:0px;left:0px;-moz-border-radius:2px 2px 2px 2px;border-radius:2px 2px 2px 2px;-moz-box-shadow:0 2px 4px rgba(0,0,0,0.2);-webkit-box-shadow:0 2px 4px rgba(0,0,0,0.2);box-shadow:0 2px 4px rgba(0,0,0,0.2);background-color:#ffffff;border:1px solid #cccccc;padding:16px;width:400px;margin-left:-1px;margin-top:-1px;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;font-weight:400;font-style:normal;color:#333333;white-space:normal}.waffle-input-box-decorator{border-style:none;border-width:0px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;font-weight:500;overflow:visible;position:absolute;white-space:nowrap;z-index:15}.waffle-input-box-locator{background-color:#4589eb;border-radius:1px;box-shadow:0px 1px 2px rgba(0,0,0,0.5);color:white;font-size:12px;line-height:14px;padding:6px 7px 4px 7px}.waffle-input-box-formula-help-decorator{background:#6da1ff;border:2px solid #5790f6;border-right:none;color:white;-webkit-border-radius:2px 0 0 2px;-moz-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px;cursor:pointer;font-size:11px;height:20px;line-height:13px;padding:2px 2px}.waffle-formula-bar-formula-help-decorator{-webkit-border-radius:2px 2px 2px 2px;-moz-border-radius:2px 2px 2px 2px;border-radius:2px 2px 2px 2px;border-right:2px solid #5790f6;height:18px;line-height:11px}.waffle-collab-presence{-moz-box-sizing:border-box;background-color:#65ad89;border-radius:2px;box-sizing:border-box;color:white;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:500;line-height:12px;padding:1px 2px;position:absolute;z-index:7}#waffle-loading-screen{background-color:#fff;width:100%;font-size:15px;display:none}.waffle-loading-rows{width:100%;font-size:12px;padding:5px 30px}.waffle-loading-rows-spinner{vertical-align:text-bottom;width:16px;height:16px;margin:0px 10px}.waffle-hyperlink-icon{display:inline-block;position:absolute}.waffle-hyperlink-icon-visited:after{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -565px -12px;cursor:pointer;width:12px;height:12px;display:block;float:right;content:"";margin-top:4px;margin-bottom:-1px}.waffle-hyperlink-icon:after{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -70px -24px;cursor:pointer;width:12px;height:12px;display:block;float:right;content:"";margin-top:4px;margin-bottom:-1px}.waffle-hyperlink-tooltip:hover{background:#fff;box-shadow:0px 0px 2px 0px rgba(0,0,0,0.20),0px 2px 3px 0px rgba(0,0,0,0.30)}.waffle-hyperlink-tooltip{background:#fcfcfc;box-shadow:0px 0px 2px 0px rgba(0,0,0,0.15),0px 1px 2px 0px rgba(0,0,0,0.40);border-radius:1px;display:inline-block;padding:5px 18px 5px 7px;position:absolute}.waffle-hyperlink-tooltip-link{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;color:#15c;line-height:19px;padding:5px 7px 5px 0;text-decoration:none;white-space:nowrap}a.waffle-hyperlink-tooltip-link{color:#15c}.waffle-hyperlink-tooltip-link:hover{text-decoration:none}.waffle-multilink-tooltip{position:absolute}.waffle-insert-link-selection-overlay{background-color:rgba(140,196,116,0.25);overflow:hidden;position:absolute;z-index:16}.waffle-column-menu-button{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -168px -43px;cursor:pointer;list-style:none;width:12px;height:12px;outline:none;position:absolute;z-index:7}.waffle-column-menu-button-hover,.waffle-column-menu-button-checked,.waffle-column-menu-button-focused{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -83px -34px}.waffle-column-menu-button-disabled{cursor:default;filter:alpha(opacity=30);opacity:0.3}.waffle-column-type-button{background:none;border-radius:2px;cursor:pointer;height:18px;list-style:none;outline:none;position:absolute;width:18px;z-index:7}.waffle-set-column-type-button{background-color:#f8f8f8;border:1px solid #e5e5e5;border-radius:1px;cursor:pointer;height:11px;outline:none;width:11px;z-index:7}.waffle-set-column-type-button:hover{border:1px solid #c6c6c6}.waffle-set-column-type-button .docs-icon{height:12px;left:-2px;top:-3px;width:12px}.waffle-set-column-type-button .docs-icon-img:before{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222.svg)}.waffle-set-column-type-button .docs-icon-gear{left:0;top:-4504px}.waffle-set-column-type-button .docs-icon-gear:hover{left:-40px;top:-5271px}.goog-flat-menu-button-focused.waffle-set-column-type-button .docs-icon-gear:hover{left:0;top:-4504px}.waffle-calculated-column-button{background:#80868b;border:none;cursor:pointer;list-style:none;opacity:0;outline:none;position:absolute;z-index:7}.waffle-calculated-column-button:hover{opacity:1}.waffle-disclaimer{font-size:11px;background-color:#ececec;color:#656565;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;height:20px}#waffle-disclaimer-content{border-bottom:1px solid #c0c0c0;border-left:0 none;border-right:0 none;padding-left:47px}.waffle-disclaimer-link{color:#77c;padding-left:3px}.apps-toast{z-index:16}.apps-toast-fill{z-index:17}.trix-offscreen{position:absolute;left:-10000px;top:-10000px}#promo-target{display:inline}#waffle-grid-container{margin-right:auto;position:relative}#docs-editor-container{touch-action:none;-ms-scroll-chaining:none}.border-style-menu-item-container{background-position:left 15px center;padding-left:30px!important;padding-right:40px!important}.border-style-menu-item{height:12px;min-height:12px!important}.border-style-menu-item .border-style-menu-icon{position:relative;left:15px;top:-4px}@media all and (-ms-high-contrast:none),(-ms-high-contrast:active){.border-style-menu-item .border-style-menu-icon{position:relative;left:15.5px;top:-4.78px}}@media screen and (-moz-windows-theme){.border-style-menu-item .border-style-menu-icon{position:relative;left:15px;top:-4.5px}}#t-border-palette .goog-palette-cell-selected{background-color:#e1e1e1}#t-border-palette .goog-palette-cell{padding:2px}#t-border-palette .goog-palette-table{border-right:1px solid #eee}span.jfk-checkbox{margin-bottom:1px}.match-paren{background-color:#e5e5e5;font-weight:500}.match-string{background-color:#eee}.error-code,.boolean{color:#15c}.active-range{box-shadow:0 0 6px 2px #333;opacity:0.1;pointer-events:none}.inactive{opacity:0.5}.formula-error{color:#dd4b39}.argument-error,.formula-eval-error{color:#dd4b39;text-decoration:underline}.number{color:#15c}.string{color:green}.default-formula-text-color{color:black}.insert-range-indicator{background:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4IiBoZWlnaHQ9IjMiIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiNjY2MiPjxwYXRoIGQ9Ik0wLjUgMEwwLjUgM00wIDIuNUw4IDIuNU03LjUgM0w3LjUgMCIvPjwvc3ZnPg==") bottom no-repeat;background-size:contain;width:8px;margin-left:2px;cursor:default}.insert-range-indicator:after{content:" "}.formula-replace-text{text-decoration:underline}.trix-tooltip-link{color:#4285f4}.trix-tooltip-link:hover{text-decoration:underline}.formula-content{font-family:Inconsolata,monospace,arial,sans,sans-serif;font-size:14px}#apps-debug-tracers{display:none}.jfk-bubble.waffle-error-bubble{background-color:#fff3f2;border:1px solid #db4437;border-radius:1px;box-shadow:0 1px 2px 0 rgba(0,0,0,0.1);color:#c5221f;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:500;letter-spacing:-0.1px;line-height:16px;max-width:200px;padding:8px;transition:opacity 200ms ease-in}.waffle-function-localization-promo{background-color:#fafafa;bottom:100px;box-shadow:1px 2px 5px rgba(0,0,0,0.28);color:#616161;height:180px;padding:20px;position:absolute;right:25px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;width:350px;z-index:1000}.waffle-function-localization-promo-title{font-size:18px;font-weight:500;margin:5px 0 20px 0}.waffle-function-localization-promo-body{font-size:13px;line-height:22px}.waffle-function-localization-promo-button-bar{bottom:25px;right:25px;line-height:22px;position:absolute}.jfk-button.waffle-function-localization-promo-no-button{color:#0f9d58;cursor:pointer;margin-right:10px;padding:5px}.jfk-button.waffle-function-localization-promo-yes-button{background-color:#0f9d58;color:#fafafa;cursor:pointer;padding:5px}.apps-ui-material-slide-toggle-container-checked .apps-ui-material-slide-toggle-track{background-color:#ceead6;opacity:1}.apps-ui-material-slide-toggle-container-checked .apps-ui-material-slide-toggle-thumb{background-color:#188038}.apps-actiondatawidget-shortcut-desc{width:278px}.apps-actiondatawidget-shortcut-key{line-height:17px;width:251px;padding-left:24px}.apps-actiondatawidget-content{width:100%}::-ms-clear,::-ms-reveal{display:none}.waffle-rich-text-link,a.waffle-rich-text-link{color:#15c;text-decoration:underline}.waffle-rich-text-link-popup{background-color:#fff;border:1px solid;border-color:#bbb #bbb #a8a8a8;padding:12px 20px;position:absolute;white-space:nowrap;z-index:15}.waffle-dataconnectormenu-note{color:rgba(0,0,0,0.38);font-size:11px;padding-left:8px}.waffle-assistant-data-cleanup-suggestions-bottom-entry-point-button{align-items:center;background-color:#fff;border-radius:15px;border:1px solid #dadce0;box-sizing:border-box;color:#d93025;cursor:pointer;display:flex;float:right;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;height:30px;margin:4px 8px;outline:none;padding:0 8px}.waffle-assistant-data-cleanup-suggestions-bottom-entry-point-button:hover{background:rgba(217,48,37,.04);color:#a50e0e}.waffle-assistant-data-cleanup-suggestions-bottom-entry-point-button:focus{background:rgba(217,48,37,.12);color:#a50e0e}.waffle-assistant-data-cleanup-suggestions-bottom-entry-point-button:focus{background:rgba(217,48,37,.1);border:1px solid #a50e0e;color:#a50e0e}.waffle-assistant-data-cleanup-suggestions-bottom-entry-point-button .waffle-view-icons-error-filled{height:18px;margin-right:8px;width:18px}.jfk-bubble.jfk-bubble-promo.waffle-assistant-data-cleanup-suggestions-bottom-entry-point-bubble{background:#fff;border:none;border-radius:8px;box-shadow:0 2px 6px 2px rgba(60,64,67,.15);box-sizing:border-box;min-height:140px;padding:8px;width:275px}.jfk-bubble-promo.waffle-assistant-data-cleanup-suggestions-bottom-entry-point-bubble .jfk-bubble-arrowdown .jfk-bubble-arrowimplbefore,.jfk-bubble-promo.waffle-assistant-data-cleanup-suggestions-bottom-entry-point-bubble .jfk-bubble-arrowup .jfk-bubble-arrowimplbefore{border-color:rgba(60,64,67,.15) transparent}.jfk-bubble-promo.waffle-assistant-data-cleanup-suggestions-bottom-entry-point-bubble .jfk-bubble-arrowdown .jfk-bubble-arrowimplafter,.jfk-bubble-promo.waffle-assistant-data-cleanup-suggestions-bottom-entry-point-bubble .jfk-bubble-arrowup .jfk-bubble-arrowimplafter{border-color:#fff transparent}.waffle-assistant-data-cleanup-suggestions-bottom-entry-point-bubble-header{color:#202124;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:16px;line-height:24px;letter-spacing:0.1px;margin:8px}.waffle-assistant-data-cleanup-suggestions-bottom-entry-point-bubble-body{color:#5f6368;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;letter-spacing:0.2px;margin:0 8px 8px 8px}.waffle-assistant-data-cleanup-suggestions-bottom-entry-point-bubble-buttons{display:flex;justify-content:flex-end}.waffle-assistant-data-cleanup-suggestions-bottom-entry-point-bubble-call-to-action,.waffle-assistant-data-cleanup-suggestions-bottom-entry-point-bubble-dismiss-button{margin-right:8px}.waffle-ui-text-link-button{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:transparent;border:none;color:#188038;cursor:pointer;outline:none;padding:8px}.waffle-ui-text-link-button.dense{height:24px;padding:0 8px}.waffle-ui-text-link-button-hover{background:rgba(24,128,56,0.04);color:#0d652d}.waffle-ui-text-link-button-focused{background:rgba(24,128,56,0.12);color:#0d652d}.waffle-ui-text-link-button-active{background:rgba(24,128,56,0.1)}.waffle-ui-text-link-button-disabled{color:rgba(60,64,67,0.38)}.waffle-ui-text-link-with-icon-button-text{display:inline-block;margin-left:2px;margin-top:1px;vertical-align:middle}.docs-gm .docs-material .waffle-ui-text-link-green-icon .docs-icon-img{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_green.svg)}.goog-grey.waffle-ui-text-link-button{color:#5f6368}.goog-grey.waffle-ui-text-link-button-hover{background:rgba(32,33,36,0.04);color:#202124}.goog-grey.waffle-ui-text-link-button-focused{background:rgba(32,33,36,0.12);color:#202124}.goog-grey.waffle-ui-text-link-button-active{background:rgba(32,33,36,0.1);color:#202124}.goog-red.waffle-ui-text-link-button{color:#d93025}.goog-red.waffle-ui-text-link-button-hover{background:rgba(217,48,37,0.04);color:#a50e0e}.goog-red.waffle-ui-text-link-button-focused{background:rgba(217,48,37,0.12);color:#a50e0e}.goog-red.waffle-ui-text-link-button-active{background:rgba(217,48,37,0.1);color:#a50e0e}.docs-charts-editor{margin-right:10px}.docs-charts-editor .docs-charts-editor-toggle-tabs{position:absolute;top:0;width:100%}.docs-charts-editor .docs-charts-editor-scroll-pane{bottom:0;position:absolute;top:43px;overflow:auto;width:100%}.docs-charts-editor .docs-charts-editor-scroll-pane .docs-charts-editor-customize-tab{background-color:#f8f9fa;bottom:0;position:absolute;top:0;width:100%}.docs-charts-editor-control-label{color:#5f6368;display:block;font-size:12px;line-height:15px;margin-bottom:8px;margin-right:2px}.docs-charts-editor-row,.docs-charts-editor-tall-row{font-size:0}.docs-charts-editor-row>.docs-charts-editor-col{font-size:13px;vertical-align:top}.docs-charts-editor-row>.docs-charts-editor-col>div{margin:10px 0 10px 0}.docs-charts-editor-checkboxes-container{margin:10px 0}.docs-charts-editor-checkboxes-container-no-bottom-margin{margin:10px 0 0}.docs-charts-editor-checkboxes-container .docs-material-gm-labeled-checkbox{padding:4px 0}.docs-charts-editor-row>.docs-charts-editor-col>div>.docs-material-labeled-checkbox{margin:0}.docs-charts-editor-tall-row>.docs-charts-editor-col>div{margin:20px 0 20px 0}.docs-charts-editor-tall-row:first-child .docs-charts-editor-col>div{margin-top:10px}.docs-charts-editor-col.col-100{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:100%}.docs-charts-editor-col.col-50{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:inline-block;width:50%}.docs-charts-editor-col.col-50~.docs-charts-editor-col.col-50:first-of-type{padding-right:10px}.docs-charts-editor-col.col-50+.docs-charts-editor-col.col-50:last-of-type{padding-left:10px}.docs-charts-editor-col.col-70-left{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:inline-block;padding-right:10px;width:70%}.docs-charts-editor-col.col-30-right{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:inline-block;padding-left:10px;width:30%}.docs-charts-editor-col.col-60-left{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:inline-block;padding-right:10px;width:60%}.docs-charts-editor-col.col-40-right{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:inline-block;padding-left:10px;width:40%}.docs-charts-editor-col.col-50 .docs-material-gm-labeled-checkbox-content{max-width:80%}.docs-charts-editor-col.col-50>div>.docs-material-labeled-checkbox{margin-top:24px}.docs-charts-editor-scroll-pane.docs-charts-editor-scroll-pane-custom-sidebar::-webkit-scrollbar{width:12px}.docs-charts-editor-scroll-pane.docs-charts-editor-scroll-pane-custom-sidebar::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,0.2);background-clip:padding-box;border:solid transparent;border-width:1px 2px 1px 2px;box-shadow:none;min-height:28px;padding:1px}.docs-charts-editor-scroll-pane.docs-charts-editor-scroll-pane-custom-sidebar::-webkit-scrollbar-thumb:hover{box-shadow:none}.docs-charts-editor-scroll-pane.docs-charts-editor-scroll-pane-custom-sidebar::-webkit-scrollbar-track{background-clip:border-box;background-color:#f5f5f5;border:solid #e0e0e0;border-width:1px;box-shadow:none}.docs-charts-editor-scroll-pane.docs-charts-editor-scroll-pane-custom-sidebar::-webkit-scrollbar-track:hover{background-color:#f5f5f5;background-clip:border-box;box-shadow:none;border:solid #e0e0e0;border-width:1px}.docs-charts-editor-bundle.docs-charts-editor-parent-bundle{border-bottom:1px solid rgba(0,0,0,0.12)}.docs-charts-editor-customize-tab .docs-charts-editor-bundle.docs-charts-editor-parent-bundle{border-bottom:2px solid #f8f9fa}.docs-charts-editor-customize-tab .docs-charts-editor-bundle.docs-charts-editor-parent-bundle>div{border:2px solid #f8f9fa}.docs-charts-editor-bundle.docs-charts-editor-parent-bundle.docs-charts-editor-open-bundle{padding:8px 16px 6px 16px}.docs-charts-editor-selector-bundle-selector-wrapper{padding:0 16px}.docs-charts-editor-selector-bundle-selector-wrapper{padding:8px 16px}.docs-charts-editor-selector-bundle-selector-label{color:rgba(0,0,0,0.54);display:inline-block;line-height:26px;vertical-align:top}.docs-charts-editor-selector-bundle-selector{display:inline-block;max-width:100%;padding-left:0;width:100%}.docs-charts-editor-selector-bundle-selector .docs-material-labeled-select-outer-box{border:none;margin-bottom:0px}.docs-charts-editor-selector-bundle-selector .docs-material-gm-labeled-select-outer-box{box-shadow:0 1px 3px 1px rgba(60,64,67,.15);border:none;margin-bottom:0px}.docs-charts-editor-selector-bundle-selector .docs-material-labeled-select-caption{font-weight:500}.docs-charts-editor-selector-bundle-selector .docs-material-gm-labeled-select-caption{color:#188038;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;letter-spacing:.25px}.docs-charts-editor-selector-bundle-selector .docs-material-labeled-select-content{display:none}.docs-charts-editor-selector-bundle-selector .docs-material-gm-labeled-select-content{display:none}.docs-charts-editor-selector-bundle-selector .docs-material-gm-labeled-select-focused .docs-material-gm-labeled-select-outer-box,.docs-charts-editor-selector-bundle-selector .docs-material-gm-labeled-select-open .docs-material-gm-labeled-select-outer-box{background-color:#f1f3f4}.docs-charts-editor-selector-bundle-selector .docs-material-gm-labeled-select-hover .docs-material-gm-labeled-select-outer-box{background-color:#f8f9fa}.docs-charts-editor-selector-bundle{background:transparent;padding:4px 16px 6px 16px}.docs-charts-editor-selector-bundle .docs-charts-editor-selector-bundle-header{color:#3c4043;font-size:14px;font-weight:500;letter-spacing:.2px;line-height:24px;margin-bottom:-4px;padding:10px 0;padding-top:8px}.docs-charts-editor-bundle-container{padding:0 16px 6px}.docs-charts-editor-basic-bundle .docs-charts-editor-bundle.docs-charts-editor-parent-bundle{border-bottom:none}.docs-charts-editor-basic-bundle .docs-charts-editor-bundle.docs-charts-editor-parent-bundle.docs-charts-editor-open-bundle{padding-bottom:0px}.docs-charts-editor-basic-bundle .docs-charts-editor-row,.docs-charts-editor-data-picker-bundle .docs-charts-editor-row{overflow:hidden}.docs-charts-editor-data-picker-bundle .docs-charts-editor-bundle.docs-charts-editor-parent-bundle{border-bottom:none;padding-top:0}.docs-charts-editor-alert-bundle{color:rgba(0,0,0,0.54);line-height:22px;text-align:center}.docs-charts-editor-alert-bundle .docs-charts-editor-bundle.docs-charts-editor-parent-bundle{-ms-flex-align:center;-moz-box-align:center;-webkit-box-align:center;box-align:center;-webkit-align-items:center;align-items:center;border-bottom:none;bottom:0;display:flex;left:0;position:absolute;right:0;top:0}.docs-charts-editor-alert-bundle .docs-charts-editor-bundle.docs-charts-editor-parent-bundle>div{width:100%}.docs-charts-editor-alert-bundle-icon{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSIjRTBFMEUwIj48cGF0aCBkPSJNOSAxN0g3di03aDJ2N3ptNCAwaC0yVjdoMnYxMHptNCAwaC0ydi00aDJ2NHptMi41IDJoLTE1VjVoMTV2MTR6bTAtMTZoLTE1Yy0xIDAtMiAxLTIgMnYxNGMwIDEgMSAyIDIgMmgxNWMxIDAgMi0xIDItMlY1YzAtMS0xLTItMi0yeiIvPjxwYXRoIGZpbGw9Im5vbmUiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L3N2Zz4=");background-position:center;background-repeat:no-repeat;background-size:100px 100px;height:100px;width:100%}.docs-charts-editor-pill-remove-button{background:none;background-color:#bfbfbf;border:none;border-radius:16px;bottom:2px;float:right;height:16px;margin:8px;position:relative;transition:background-color 0.2s ease;width:auto}.docs-charts-editor-pill-remove-button.jfk-button-hover{background-color:#aaa}.docs-charts-editor-pill{background-color:#fff;border-radius:0;box-shadow:none;padding-left:0;padding-right:0}.docs-charts-editor-pill-remove{position:relative;width:100%}.docs-charts-editor-pill-flex{display:flex}.docs-charts-editor-pill-flex-col{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-ms-flex:50%;-webkit-flex:50%;flex:50%;display:inline-block;padding-left:10px}.docs-charts-editor-pill-flex-col:first-of-type{padding-left:0px}.docs-charts-editor-pill-fixed-col{padding-left:10px}.docs-charts-editor-pill-fixed-col:first-of-type{padding-left:0px}.docs-charts-editor-column-names-menu-wrapper{display:none}.docs-charts-editor-column-names-menu-enabled{width:460px!important}.docs-charts-editor-column-names-menu-enabled .docs-charts-editor-toggle-tabs{border-bottom:1px solid #dadce0}.docs-charts-editor-column-names-menu-enabled .docs-charts-editor-scroll-pane{overflow-y:hidden}.docs-charts-editor-column-names-menu-enabled .docs-charts-editor-basic-tab{display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;height:100%;overflow:hidden}.docs-charts-editor-column-names-menu-enabled .docs-charts-editor-basic-tab-bundle-wrapper{border-right:1px solid #dadce0;height:100%;overflow-y:auto;width:300px}.docs-charts-editor-column-names-menu-enabled .docs-charts-editor-column-names-menu-wrapper{display:block;height:100%;overflow-y:auto;width:160px}.docs-charts-editor-column-names-menu-enabled .docs-charts-editor-customize-tab{overflow-y:auto}.docs-charts-editor-customize-tab hr{background-color:#dadce0;border:0;height:1px;margin:17px -16px}.docs-charts-editor-charttype-select-icon{float:left}.docs-charts-editor-charttype-select-icon>svg{height:18px;width:18px;margin-right:10px;vertical-align:sub}.docs-material-select-disabled .docs-charts-editor-charttype-select-icon{opacity:0.12}.docs-charts-editor-charttype-new{background-color:#000;border:1px solid #fff;border-radius:1px;bottom:1px;color:#fff;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:10px;font-weight:500;height:16px;line-height:17px;opacity:.54;padding:0 4px;position:absolute;right:1px;text-transform:uppercase}.docs-charts-editor-chart-type-select .docs-material-gm-select-caption{width:100%}.docs-charts-editor-charttype-menu{box-shadow:0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12),0px 2px 4px -1px rgba(0,0,0,0.2);background-color:white;margin-left:-12px;margin-top:5px;overflow-x:hidden;overflow-y:scroll;padding:10px 16px;position:absolute;width:270px;z-index:3}.docs-charts-editor-charttype-option{border:1px solid #bdbdbd;cursor:pointer;height:45px;margin:0 23px 10px 0;overflow:hidden;padding:2px;position:relative;width:67px}.docs-charts-editor-palette-label{color:rgba(0,0,0,0.87);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px}.docs-charts-editor-charttype-menu .goog-palette{display:inline-block;margin-bottom:0px;margin-top:10px}.docs-charts-editor-charttype-menu .goog-palette-cell{border:0;cursor:inherit}.docs-charts-editor-charttype-menu .goog-palette-table{border:0;margin:5px 0 0 0}.goog-palette-cell-hover .docs-charts-editor-charttype-option{border:1px solid #9e9e9e}.goog-palette-cell-selected .docs-charts-editor-charttype-option{box-shadow:0 0 0 4px #c6dafc}.docs-charts-editor-charttype-option-canvas{direction:ltr;height:45px;width:67px}.docs-charts-editor-charttype-option-gviz-org-chart{-webkit-transform:scale(0.61,0.68);-moz-transform:scale(0.61,0.68);-ms-transform:scale(0.61,0.68);-o-transform:scale(0.61,0.68);transform:scale(0.61,0.68);background:url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -1428px no-repeat}.docs-charts-editor-charttype-option-gviz-radar-chart{-webkit-transform:scale(0.60,0.60);-moz-transform:scale(0.60,0.60);-ms-transform:scale(0.60,0.60);-o-transform:scale(0.60,0.60);transform:scale(0.60,0.60);background:url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -2233px no-repeat}.docs-charts-editor-charttype-option-gviz-annotated-timeline-chart{-webkit-transform:scale(0.61,0.68);-moz-transform:scale(0.61,0.68);-ms-transform:scale(0.61,0.68);-o-transform:scale(0.61,0.68);transform:scale(0.61,0.68);background:url("//ssl.gstatic.com/charts/static/thumbs17.png") 0 -1895px no-repeat}.docs-charts-editor-charttype-option-gviz-table-chart{-webkit-transform:scale(0.61,0.68);-moz-transform:scale(0.61,0.68);-ms-transform:scale(0.61,0.68);-o-transform:scale(0.61,0.68);transform:scale(0.61,0.68);background:url("//ssl.gstatic.com/charts/static/thumbs17.png") 0 -1351px no-repeat}.docs-charts-editor-charttype-option-gviz-geo-chart{-webkit-transform:scale(0.61,0.68);-moz-transform:scale(0.61,0.68);-ms-transform:scale(0.61,0.68);-o-transform:scale(0.61,0.68);transform:scale(0.61,0.68);background:url("//ssl.gstatic.com/charts/static/thumbs17.png") 0 -2772px no-repeat}.docs-charts-editor-charttype-option-gviz-geo-chart-with-markers{-webkit-transform:scale(0.61,0.68);-moz-transform:scale(0.61,0.68);-ms-transform:scale(0.61,0.68);-o-transform:scale(0.61,0.68);transform:scale(0.61,0.68);background:url("//ssl.gstatic.com/charts/static/thumbs17.png") 0 -612px no-repeat}.docs-charts-editor-charttype-option-disabled-chart{opacity:0.25}.docs-charts-editor-charttype-option-gviz-org-chart,.docs-charts-editor-charttype-option-gviz-radar-chart,.docs-charts-editor-charttype-option-gviz-annotated-timeline-chart,.docs-charts-editor-charttype-option-gviz-table-chart,.docs-charts-editor-charttype-option-gviz-geo-chart,.docs-charts-editor-charttype-option-gviz-geo-chart-with-markers{-webkit-transform-origin:0 0;-moz-transform-origin:0 0;-ms-transform-origin:0 0;-o-transform-origin:0 0;transform-origin:0 0;float:left;height:67px;width:110px}.docs-charts-editor-gauge-colored-range-bundle{border-top:1px dashed #9e9e9e;margin-top:20px;padding-top:5px}.docs-charts-editor-gauge-colored-range-bundle .docs-charts-editor-row>.docs-charts-editor-col>div{margin:0}.docs-charts-editor-gauge-colored-range-bundle .docs-charts-editor-row{margin-top:10px}.docs-charts-editor-number-format-type-container{display:flex;justify-content:space-between}.docs-charts-editor-number-format-type-example{color:#80868b}.docs-material-gm-labeled-select .docs-charts-editor-number-format-type-example{display:none}.docs-charts-editor-number-format-type-header{color:#5f6368;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:11px;font-weight:500;left:38px;line-height:13px;padding:4px 0;text-transform:uppercase}.docs-charts-editor-pie-slice-options hr{background-color:#dadce0;border:0;height:1px;margin:17px -16px}.docs-charts-editor-recommendation-zippy{background-color:#e6f4ea;border:1px solid #ceead6;border-radius:4px}.docs-charts-editor-recommendation-zippy-header{padding:4px 0}.docs-charts-editor-recommendation-zippy-header-icon{display:inline-block;padding:0 8px}.docs-charts-editor-recommendation-zippy-header-text{color:#3c4043;font-weight:500}.docs-charts-editor-recommendation-zippy-toggle{font-weight:400;text-transform:none}.docs-charts-editor-recommendation-zippy-header-left{float:left;line-height:32px}.docs-charts-editor-recommendation-zippy-header-right{float:right}.docs-charts-editor-recommendation-zippy-header:after{content:"";clear:both;display:table}.docs-charts-editor-recommendation-zippy-body{padding:0 4px;text-align:center}.docs-charts-editor-recommendation-zippy .goog-palette-cell{border:0;cursor:inherit}.docs-charts-editor-recommendation-zippy .goog-palette-table{border:0;margin:5px 0 0 0;width:100%}.docs-charts-editor-recommendation-zippy .waffle-charteditor-recommendation-palette.goog-palette{border-bottom:none;display:inline-block;margin:0;padding:0;width:100%}.docs-charts-editor-recommendation-zippy .waffle-charteditor-recommendation-option{background-color:white;height:75px;margin:4px 6px 8px 8px;max-width:114px;padding:0;width:initial}.docs-charts-editor-series-select-color{border-radius:50%;height:15px;left:-15px;margin:0;position:relative;top:3px;width:15px}.docs-charts-editor-series-select .docs-material-gm-labeled-select-caption>div{color:#202124;padding-left:20px}.docs-charts-editor-series-point-shape-icon{fill:rgba(0,0,0,0.87);height:12px;margin-bottom:-1px;margin-right:9px;width:12px}.goog-menuitem-content .docs-charts-editor-series-point-shape-icon{margin-left:-12px}.docs-charts-editor-series-line-dash-type-icon{height:2px;stroke:rgba(0,0,0,0.87);width:75px;vertical-align:middle}.docs-charts-editor-series-item-selection-dialog-input-default-caption{color:#bdbdbd}.docs-charts-editor-series-format-labeledsection .docs-charts-editor-control-label.docs-charts-editor-labeledsection,.docs-charts-editor-series-format-data-point-button .docs-charts-editor-control-label.docs-charts-editor-labeledactionablebutton-label{color:#3c4043;font-size:14px;font-weight:500;letter-spacing:.2px;line-height:24px;margin-bottom:0;padding:10px 0}.docs-charts-editor-series-format-label-hide{display:none}.docs-charts-editor-series-format-data-point-button>div{display:flex;justify-content:space-between}.docs-charts-editor-series-format-data-point-button .docs-charts-editor-labeledactionablebutton{padding:10px 0}.col-50.docs-charts-editor-series-format-data-point-button{padding:10px 0;text-align:right}.docs-charts-editor-series-single-item-style-item-select{max-width:70%}.docs-charts-editor-table-border-container{background:#fdfdfd;border-top:1px solid #e0e0e0;padding:0 16px 6px}.docs-charts-editor-table-border-container .docs-charts-editor-col.col-50>div>.docs-material-labeled-checkbox{margin-top:24px}.docs-charts-editor-textstyle-toolbar{border:1px solid #d8d8d8;border-radius:1px;margin:6px 0;padding:0 4px}#docs-charts-editor-textstyle-font-family .goog-toolbar-menu-button-caption{overflow-x:hidden;text-overflow:ellipsis;white-space:nowrap;width:67px}#docs-charts-editor-textstyle-font-size .goog-toolbar-combo-button-caption{width:32px}#docs-charts-editor-textstyle-font-size .goog-toolbar-combo-button-input{width:12px}.docs-charts-editor-textstyle-container{border:1px solid #dadce0;border-radius:4px;display:inline-block;height:40px;line-height:40px}.docs-charts-editor-textstyle-separator{border-left:1px solid #dadce0;height:25px;margin:7px 1px;vertical-align:top}.docs-charts-editor-textstyle-italic{margin-left:-1px}.docs-charts-editor-col.docs-charts-editor-waterfall-connector-line-color{width:48%}.docs-charts-editor-col.docs-charts-editor-waterfall-connector-line-thickness{width:52%}.docs-charts-editor-waterfall-add-total-button{color:#4285f4;font-weight:500;padding:2px 1px 0px 1px;text-transform:uppercase}.docs-charts-editor-waterfall-add-total-column{margin-bottom:10px}.docs-charts-editor-waterfall-total-column-label{-ms-flex:1;-webkit-flex:1;flex:1}.docs-charts-contextual-editor .docs-charts-editor-customize-tab .docs-charts-editor-bundle.docs-charts-editor-parent-bundle{border-bottom:none}.docs-charts-contextual-editor{bottom:0;left:0;margin-right:0;position:absolute;right:0;top:0}.docs-charts-editor.docs-charts-contextual-editor .docs-charts-editor-scroll-pane .docs-charts-editor-customize-tab{background-color:white}.docs-charts-editor-data-point-format-fill-style-bundle .docs-charts-editor-selector-bundle,.docs-charts-editor-data-point-format-line-style-bundle .docs-charts-editor-selector-bundle{padding:0}.docs-charts-contextual-editor-content .docs-charts-editor-noncollapsible-section .docs-charts-editor-data-point-format-fill-style-bundle .docs-charts-editor-material-toolbar-color-picker,.docs-charts-contextual-editor-content .docs-charts-editor-noncollapsible-section .docs-charts-editor-data-point-format-fill-style-bundle .docs-charts-editor-material-toolbar-color-picker-outer-box,.docs-charts-contextual-editor-content .docs-charts-editor-noncollapsible-section .docs-charts-editor-data-point-format-line-style-bundle .docs-charts-editor-material-toolbar-color-picker,.docs-charts-contextual-editor-content .docs-charts-editor-noncollapsible-section .docs-charts-editor-data-point-format-line-style-bundle .docs-charts-editor-material-toolbar-color-picker-outer-box{width:100%}.waffle-charteditor-domain-grouping-button-container{display:flex}.waffle-charteditor-domain-grouping-button-label{-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;color:#202124;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;letter-spacing:0.2px;line-height:44px}.waffle-charteditor-domain-grouping-chip .docs-charts-editor-chip-label{color:#424242;font-size:14px}.waffle-charteditor-external-menu-button,.waffle-charteditor-external-menu-button-outer-box,.waffle-charteditor-external-menu-button-inner-box,.waffle-charteditor-external-menu-button-caption,.waffle-charteditor-external-menu-button-dropdown{cursor:pointer;display:block}.waffle-charteditor-data-constraint-disabled .waffle-charteditor-external-menu-button,.waffle-charteditor-data-constraint-disabled .waffle-charteditor-external-menu-button-outer-box,.waffle-charteditor-data-constraint-disabled .waffle-charteditor-external-menu-button-inner-box,.waffle-charteditor-data-constraint-disabled .waffle-charteditor-external-menu-button-caption,.waffle-charteditor-data-constraint-disabled .waffle-charteditor-external-menu-button-dropdown{cursor:not-allowed}.waffle-charteditor-external-menu-button{outline:none}.waffle-charteditor-external-menu-button-dropdown{height:0}.docs-charts-editor-chip.waffle-charteditor-external-menu-button-focused:not(.waffle-charteditor-external-menu-button-open) .docs-charts-editor-chip-content,.waffle-charteditor-pickerchip.waffle-charteditor-external-menu-button-focused:not(.waffle-charteditor-external-menu-button-open) .docs-charts-editor-chip-content{outline:5px auto #4285f4;outline-offset:-3px}.waffle-charteditor-filter-button-container{display:flex}.waffle-charteditor-filter-button-label{-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;color:#202124;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;letter-spacing:0.2px;line-height:44px}.waffle-charteditor-filter-cards{margin-bottom:48px}.waffle-charteditor-filter-card{background-color:#f1f3f4;border-radius:8px;padding:0 10px 10px 10px}.waffle-charteditor-filter-card:not(:last-child){margin-bottom:10px}.waffle-charteditor-filter-card-top-row{-webkit-align-items:center;align-items:center;display:flex;padding-bottom:2px}.waffle-charteditor-filter-card-top-row>div{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.waffle-charteditor-filter-card-remove{margin-right:-10px}.waffle-charteditor-filter-card-top-row>.waffle-charteditor-filter-card-label{-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-shrink:1;-ms-flex-negative:1;flex-shrink:1;overflow:hidden;text-overflow:ellipsis}.waffle-charteditor-filter-card-label{color:#424242;font-size:14px;padding-left:8px}.waffle-charteditor-filter-card-select-label{color:#5f6368;font-size:11px;padding-bottom:3px;padding-left:2px}.waffle-charteditor-filter-card-select .jfk-select.goog-flat-menu-button{background-color:#fff;padding-bottom:2px;padding-top:2px;text-align:left;width:100%}.waffle-charteditor-filter-card-select .jfk-select.goog-flat-menu-button-hover{background-color:rgba(60,64,67,0.04);border:1px solid #dadce0}.waffle-charteditor-filter-card-select .jfk-select.goog-flat-menu-button-focused{background-color:rgba(60,64,67,0.06);border:1px solid #dadce0}.waffle-charteditor-filter-card-select .jfk-select .goog-flat-menu-button-caption{font-size:12px}.waffle-charteditor-rangepicker-multiple-domains-bundle{margin:0 -16px}.waffle-charteditor-multiple-domains-bundle-wrapper{margin:0 16px}.waffle-charteditor-multiple-domains-bundle-wrapper hr{background-color:#f1f3f4;border:0;height:4px;margin:16px -16px 8px -16px}.waffle-charteditor-add-multiple-domains-button-label{color:#188038;display:inline-block;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;line-height:250%;margin-left:4px;vertical-align:middle}.waffle-charteditor-multiple-domains-bundle-add-button>div{width:100%}.waffle-charteditor-multiple-domains-bundle-add-button div[role="button"]{cursor:pointer;background:none;outline:none;width:100%}.waffle-charteditor-numeric-group-control-container{-webkit-align-items:center;align-items:center;display:flex}.waffle-charteditor-numeric-group-control-checkbox{-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1}.waffle-charteditor-sort-button-container{display:flex}.waffle-charteditor-sort-button-label{-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;color:#202124;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;letter-spacing:0.2px;line-height:44px}.waffle-charteditor-sort-order-toggle{background:none;border:0;color:#5f6368;cursor:pointer;font-style:italic}.waffle-charteditor-sort-chip .docs-charts-editor-chip-label{color:#424242;font-size:14px}.waffle-charteditor-sidebar.waffle-sidebar-container{width:320px;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;z-index:2}.waffle-charteditor-content{background-color:#fff;height:100%}.waffle-charteditor-rangepicker-modification-disabled{display:none;font-size:14px;margin-top:15px}.waffle-charteditor-rangepicker-checkboxes-container{margin:10px 0}.waffle-charteditor-rangepicker-checkboxes-container .docs-material-gm-labeled-checkbox{padding:4px 0}.waffle-charteditor-rangepicker-labels-as-text{margin-left:28px}.waffle-charteditor-rangepicker-has-external-data .waffle-charteditor-rangepicker-labels-as-text{margin-left:0}.docs-charts-editor-row>.waffle-charteditor-rangepicker-data-picker>div{margin-top:0}.waffle-charteditor-rangepicker-data-picker .waffle-charteditor-date-group-control-bucket-type .docs-material-gm-labeled-select-content{display:none}.waffle-charteditor-rangepicker-data-transformation .waffle-charteditor-rangepicker-modification-disabled{display:block}.waffle-charteditor-rangepicker-data-transformation .waffle-charteditor-rangepicker-checkboxes-container,.waffle-charteditor-rangepicker-data-transformation .waffle-charteditor-rangepicker-merge{display:none}.waffle-charteditor-rangepicker-error-label{color:#db4437;font-size:13px}.waffle-charteditor-unsupported-chart-type{box-shadow:0px 3px 4px 0px rgba(0,0,0,0.14),0px 3px 3px -2px rgba(0,0,0,0.12),0px 1px 8px 0px rgba(0,0,0,0.2);background:#ffebee;color:rgba(0,0,0,0.87);letter-spacing:0.04em;position:absolute;top:0px;z-index:1}.waffle-charteditor-unsupported-chart-type-message{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;font-size:14px;padding:16px}.waffle-charteditor-recommendation-palette.goog-palette{border-bottom:1px solid rgba(0,0,0,0.12);margin-bottom:10px;padding-bottom:20px;width:265px}.waffle-charteditor-recommendation-palette .docs-charts-editor-palette-label{text-transform:uppercase}.waffle-charteditor-recommendation-option{box-shadow:0 0 0 4px #ddd;cursor:pointer;height:80px;margin:3px 12px 10px 0;overflow:hidden;padding:2px;position:relative;width:123px}.goog-palette-cell-hover .waffle-charteditor-recommendation-option{box-shadow:0 0 0 4px #bbc7ed}.goog-palette-cell-selected .waffle-charteditor-recommendation-option{box-shadow:0 0 0 4px #6485f1}.waffle-charteditor-recommendation-option-canvas{direction:ltr}.waffle-charteditor-recommendation-chip{background-color:#4285f4;border:1px solid #fff;bottom:6px;color:#fff;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:10px;font-weight:500;height:13px;line-height:13px;max-width:84px;overflow-x:hidden;padding:2px 7px 0 7px;position:absolute;right:6px;text-overflow:ellipsis;white-space:nowrap}.waffle-charteditor-recommendation-option .waffle-assistant-feedback-button{margin:0;position:absolute;right:0;top:0}.waffle-charteditor-data-constraint-disabled .waffle-charteditor-picker-button-wrapper{cursor:not-allowed}.waffle-charteditor-picker-button-wrapper{-ms-flex-align:center;-moz-box-align:center;-webkit-box-align:center;box-align:center;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;cursor:pointer;display:flex;height:32px;margin-right:12px}.waffle-charteditor-data-constraint-disabled .waffle-charteditor-pickerchip .docs-charts-editor-chip-label{cursor:not-allowed}.waffle-charteditor-pickerchip .docs-charts-editor-chip-content{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background-color:transparent;border:1px solid #dadce0}.waffle-charteditor-data-constraint-disabled .docs-charts-editor-chip-content{opacity:0.5}.waffle-charteditor-pickerchip-button{transition:opacity 200ms cubic-bezier(0.4,0.0,0.2,1);margin-right:8px;margin-top:1px;opacity:.7}.jfk-button-hover .waffle-charteditor-pickerchip-button{opacity:1}.waffle-charteditor-pickerchip.docs-charts-editor-chip-invalid .docs-charts-editor-chip-content{background-color:#f0f0f0}.waffle-charteditor-pickerchip .docs-charts-editor-chip-label{color:#9e9e9e}.waffle-charteditor-pickerchip .docs-charts-editor-chip-label{color:#80868b;cursor:pointer;font-weight:500}.waffle-charteditor-data-constraint-header{-webkit-align-items:center;align-items:center;display:flex}.waffle-charteditor-data-constraint-name,.waffle-charteditor-annotation-chip-label{color:#3c4043;font-size:11px;font-weight:500;letter-spacing:.8px;margin-top:10px;text-transform:uppercase;vertical-align:top}.waffle-charteditor-data-constraint-name{-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;color:#202124;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;letter-spacing:0.2px;line-height:20px;margin-top:10px;overflow:hidden;text-transform:none}.waffle-charteditor-annotation-chip-label{color:#80868b;line-height:16px;margin-right:10px}.waffle-charteditor-data-constraint-aggregate-type .docs-material-gm-labeled-select-outer-box{padding:0 0 0 8px}.waffle-charteditor-data-constraint-chip{color:#424242;font-size:14px;margin-top:8px}.waffle-charteditor-data-constraint{position:relative}.waffle-charteditor-annotation-chip-wrapper{display:block;margin-bottom:15px;margin-left:50px}.waffle-charteditor-annotation-chip{-ms-flex:1;-webkit-flex:1;flex:1}.waffle-charteditor-chip-icon{left:8px;margin-left:15px;margin-top:9px;top:7px}.waffle-charteditor-chip-delete-button{background:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+ICA8cGF0aCBmaWxsPSIjZjBmMGYwIiBkPSJNMTkgNi40MUwxNy41OSA1IDEyIDEwLjU5IDYuNDEgNSA1IDYuNDEgMTAuNTkgMTIgNSAxNy41OSA2LjQxIDE5IDEyIDEzLjQxIDE3LjU5IDE5IDE5IDE3LjU5IDEzLjQxIDEyeiIvPjwvc3ZnPg==");background-color:#5f6368;border:0;border-radius:16px;cursor:pointer;height:16px;margin:10px;transition:background-color 0.2s ease;width:16px}.waffle-charteditor-chip-delete-button:hover{background-color:#aaa}.waffle-charteditor-series-aggregate-type{-webkit-align-items:center;align-items:center;display:flex}.waffle-charteditor-series-aggregate-type-label{color:#616161;font-style:italic;padding:0 10px}.waffle-charteditor-chip-during-dragging.goog-menuitem{box-sizing:border-box;border-radius:16px;cursor:move;margin:0 4px;overflow:hidden;padding-left:8px;padding-right:8px;background:#f8f9fa;box-shadow:0 4px 4px 0px rgba(60,64,67,.3),0 8px 12px 6px rgba(60,64,67,.15);opacity:0.9;width:267px;z-index:2}.waffle-charteditor-chip-during-dragging.goog-menuitem .goog-menuitem-content,.waffle-charteditor-chip-during-dragging.goog-menuitem .goog-menuitem-content span{-ms-flex:1;-webkit-flex:1;flex:1;color:#3c4043;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;line-height:18px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:500}.waffle-charteditor-chip-during-dragging.goog-menuitem .goog-menuitem-content>div{display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-webkit-justify-content:flex-start;justify-content:flex-start}.waffle-charteditor-chip-during-dragging.goog-menuitem .goog-menuitem-icon{margin:0 8px 0 0;position:relative;top:0}.waffle-charteditor-chip-hover-highlight .docs-charts-editor-chip-content{background:#ceead6;border:1px solid #34a853;box-shadow:0 1px 3px 1px rgba(60,64,67,.15)}.waffle-charteditor-chip-hover-highlight.docs-charts-editor-bundle.docs-charts-editor-child-bundle.docs-charts-editor-open-bundle .goog-inline-block.docs-charts-editor-material-textbutton{background-color:#f8fcf9}.waffle-charteditor-chip-hover-highlight.docs-charts-editor-bundle.docs-charts-editor-child-bundle.docs-charts-editor-open-bundle{padding-bottom:56px}.waffle-charteditor-chip-hover-highlight.docs-charts-editor-bundle.docs-charts-editor-child-bundle.docs-charts-editor-open-bundle .waffle-charteditor-filter-card{background:#ceead6;border:1px solid #34a853;box-shadow:0 1px 3px 1px rgba(60,64,67,.15)}#docs-editor.companion-enabled{width:100%}#docs-editor.companion-enabled #waffle-grid-container{width:calc(100% - 56px)}#docs-editor.companion-enabled #grid-bottom-bar{width:calc(100% - 56px)}#docs-editor.companion-enabled #grid-bottom-bar.grid-bottom-bar-rtl-companion-collapsed{width:100%}#docs-editor.companion-enabled #grid-bottom-bar.grid-bottom-bar-rtl{right:56px}#docs-editor.companion-enabled #grid-bottom-bar.grid-bottom-bar-rtl.grid-bottom-bar-rtl-companion-collapsed{right:0}#docs-editor.companion-enabled #grid-bottom-bar.grid-bottom-bar-rtl-companion-open{right:calc(56px + 300px)}.docs-ui-toast.waffle-assistant-toast.waffle-assistant-toast-companion{right:calc(56px + 15px)}.waffle-assistant-entry-expanded.companion-collapsed{border-right:1px solid #c2c2c2}.companion-collapser-button-container.companion-collapser-button-container-elevated{margin-bottom:auto}.docs-companion-app-switcher-container-collapsed .companion-collapser-button-container,.docs-companion-app-switcher-container-collapsed .companion-collapser-button{height:38px}.docs-jfk-styling .companion-collapser-button,.docs-jfk-styling .companion-collapser-button .app-switcher-button-icon-container,.docs-jfk-styling .companion-collapser-button .app-switcher-button-icon-background{transition:all 0s ease 0s}.companion-collapser-button.app-switcher-button-checked{right:0}.companion-collapser-button.app-switcher-button-checked .app-switcher-button-icon-container,.companion-collapser-button.app-switcher-button-checked .app-switcher-button-icon-background{box-shadow:none;margin:8px;padding:10px;top:calc(-1*8px);width:20px}.companion-collapser-button.app-switcher-button-checked .app-switcher-button-icon-background{background-color:transparent;border:transparent 1px solid;border-radius:0}.companion-collapser-button{transition:none}.companion-collapser-button .app-switcher-button-icon-container,.companion-collapser-button .app-switcher-button-icon-background{transition-property:background-color}.companion-collapser-button:not(.app-switcher-button-checked) .app-switcher-button-icon-container,.companion-collapser-button:not(.app-switcher-button-checked) .app-switcher-button-icon-background{transition-property:margin-top}.companion-collapser-button.app-switcher-button-hover.app-switcher-button-checked .app-switcher-button-icon-background{background-color:#f1f3f4}.companion-collapser-button.app-switcher-button-focused.app-switcher-button-checked .app-switcher-button-icon-background{background-color:#e8eaed}.companion-collapser-button.app-switcher-button-checked .app-switcher-button-icon{margin-left:0}.docs-jfk-styling .companion-collapser-button.app-switcher-button-checked .app-switcher-button-icon-container,.docs-jfk-styling .companion-collapser-button.app-switcher-button-checked .app-switcher-button-icon-background{top:-10px}.docs-jfk-styling .companion-collapser-button .app-switcher-button-icon{border:transparent 1px solid;transition:all 0s ease 0s}.docs-jfk-styling .companion-collapser-button.app-switcher-button-hover.app-switcher-button-checked .app-switcher-button-icon-background{background-color:transparent}.docs-jfk-styling .companion-collapser-button.app-switcher-button-hover.app-switcher-button-checked .app-switcher-button-icon{border-color:#c6c6c6}.docs-jfk-styling .companion-collapser-button.app-switcher-button-focused.app-switcher-button-checked .app-switcher-button-icon{outline:-webkit-focus-ring-color auto 5px}.waffle-dashboard-fab-plus-button{bottom:40px;position:absolute;right:55px;z-index:20}.waffle-dashboard-fab-list{bottom:100px;position:absolute;right:55px;z-index:20}.waffle-dashboard-fab-buttons{display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;background-color:#fafafa;border-radius:50%;box-shadow:0 10px 10px #bdbdbd;cursor:pointer;height:60px;margin-top:20px;outline:none;width:60px}.waffle-dashboard-fab-buttons:last-child{margin-bottom:20px}.waffle-dashboard-fab-buttons:hover,.waffle-dashboard-fab-buttons:focus{background-color:#eeeeee}.waffle-dashboard-fab-icons{-webkit-transform:scale(1.3);-moz-transform:scale(1.3);-ms-transform:scale(1.3);-o-transform:scale(1.3);transform:scale(1.3)}.waffle-dataconnector-close-badge{background-color:rgba(0,0,0,0.12);border-radius:50%;box-sizing:border-box;height:18px;position:relative;width:18px}.waffle-dataconnector-close-badge svg{height:80%;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:80%}.waffle-dataconnector-close-badge polygon{fill:#fff}.waffle-dataconnector-close-badge-hover{background-color:rgba(0,0,0,0.38);cursor:pointer}.waffle-dataconnector-connectioncard{display:flex;align-items:center;background:#fff;border-radius:30px;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;padding:12px;width:360px}.waffle-dataconnector-connectioncard-hover{background-color:#f0f0f0}.waffle-dataconnector-connectioncard-focused{background-color:#e8f0fe;outline:none}.waffle-dataconnector-connectioncard-icon{-webkit-transform:scale(1.4,1.4);-moz-transform:scale(1.4,1.4);-ms-transform:scale(1.4,1.4);-o-transform:scale(1.4,1.4);transform:scale(1.4,1.4);background:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgdmlld0JveD0iMCAwIDE4IDE4Ij4KICA8ZyBmaWxsPSIjMDAwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgPGVsbGlwc2UgY3g9IjkiIGN5PSI1IiByeD0iNyIgcnk9IjMiLz4KICAgIDxwYXRoIGQ9Ik0xNiw3IEwxNiw4Ljk5OTk5OTgzIEMxNiwxMC42NTY4NTQyIDEyLjg2NTk5MzIsMTIgOSwxMiBDNS4xMzQwMDY3NSwxMiAyLDEwLjY1Njg1NDIgMiw5IEwyLDcgQzIsOC42NTY4NTQyNSA1LjEzNDAwNjc1LDEwIDksMTAgQzEyLjg2NTk5MzIsMTAgMTYsOC42NTY4NTQyNSAxNiw3IFoiLz4KICAgIDxwYXRoIGQ9Ik0xNiwxMSBMMTYsMTIuOTk5OTk5OCBDMTYsMTQuNjU2ODU0MiAxMi44NjU5OTMyLDE2IDksMTYgQzUuMTM0MDA2NzUsMTYgMiwxNC42NTY4NTQyIDIsMTMgTDIsMTEgQzIsMTIuNjU2ODU0MiA1LjEzNDAwNjc1LDE0IDksMTQgQzEyLjg2NTk5MzIsMTQgMTYsMTIuNjU2ODU0MiAxNiwxMSBaIi8+CiAgPC9nPgo8L3N2Zz4K") no-repeat;background-size:cover;display:inline-block;height:1em;margin-right:12px;width:1em}.waffle-dataconnector-connectioncard-body{border-left:1px solid transparent}.waffle-dataconnector-connectioncard-header{color:rgba(0,0,0,0.87);font-weight:bold;line-height:18px}.waffle-dataconnector-connectioncard-type{color:rgba(0,0,0,0.54)}.waffle-dataconnector-pill{display:flex;background:white;border-radius:40px;box-shadow:0px 1px 1px 0px rgba(0,0,0,0.14),0px 2px 1px -1px rgba(0,0,0,0.12),0px 1px 3px 0px rgba(0,0,0,0.2);box-sizing:border-box;padding:5px 20px;position:absolute}.waffle-dataconnector-pill-info{display:flex}.waffle-dataconnector-pill-timestamp{color:#4285f4;height:36px;line-height:36px;margin-right:10px;white-space:nowrap}.waffle-dataconnector-pill-gm .waffle-dataconnector-pill-timestamp,.waffle-dataconnector-pill-gm .waffle-dataconnector-pill-progress,.waffle-dataconnector-pill-gm .waffle-dataconnector-pill-upgrade-button{color:#188038}.waffle-dataconnector-pill .docs-material-button-flat-default{padding:2px 8px}.waffle-dataconnector-pill-progress{-webkit-align-items:center;align-items:center;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;color:#4285f4;height:36px;line-height:36px}.waffle-dataconnector-pill-error{color:#db4437;height:36px;line-height:36px;margin-right:10px}.waffle-dataconnector-pill-error .waffle-dataconnector-error-icon{height:18px;margin-right:4px;position:relative;top:4px;width:18px}.waffle-dataconnector-pill-menu-button{margin:0;padding:2px 0}.waffle-dataconnector-menu-icon{position:relative;top:3px}.waffle-dataconnector-pill-menu svg{-webkit-transform:scale(1.4,1.4);-moz-transform:scale(1.4,1.4);-ms-transform:scale(1.4,1.4);-o-transform:scale(1.4,1.4);transform:scale(1.4,1.4);bottom:-0.125em;height:1em;margin-right:8px;position:relative;width:1em}.waffle-dataconnector-pill-menuitem{-webkit-align-items:center;align-items:center;display:flex;height:36px;line-height:36px}.waffle-dataconnector-pill-menuitem-refreshquery,.waffle-dataconnector-pill-menuitem-truncation{padding-right:15px!important}.waffle-dataconnector-pill-menuitem-accel{margin-left:auto;padding:0 20px 0 40px;text-align:center;color:#9e9e9e}.waffle-dataconnector-pill-menuitem-refreshquery-info svg{margin:0}.waffle-dataconnector-pill-menuitem-refreshquery-info-progress{font-style:italic}.waffle-dataconnector-pill-menuitem-refreshquery-info-error-button{color:#db4437;text-decoration:underline}.waffle-dataconnector-pill-spinner{border-radius:50%;box-shadow:inset 0 0 0 2px;color:#4285f4;display:inline-block;height:18px;margin:7px 0;position:relative;width:18px;margin-right:7px}.waffle-dataconnector-pill-gm .waffle-dataconnector-pill-spinner{border-radius:50%;box-shadow:inset 0 0 0 2px;color:#188038;display:inline-block;height:18px;margin:7px 0;position:relative;width:18px;margin-right:7px}.waffle-dataconnector-pill-spinner:before{-webkit-animation:waffle-dataconnector-pill-spinner-animation 2s infinite ease 1.5s;-moz-animation:waffle-dataconnector-pill-spinner-animation 2s infinite ease 1.5s;-o-animation:waffle-dataconnector-pill-spinner-animation 2s infinite ease 1.5s;animation:waffle-dataconnector-pill-spinner-animation 2s infinite ease 1.5s;-webkit-transform-origin:11px 10px;-moz-transform-origin:11px 10px;-ms-transform-origin:11px 10px;-o-transform-origin:11px 10px;transform-origin:11px 10px;background:#fff;border-radius:20px 0 0 20px;content:"";height:20px;left:-1px;position:absolute;top:-1px;width:11px}.waffle-dataconnector-pill-spinner:after{-webkit-animation:waffle-dataconnector-pill-spinner-animation 2s infinite ease;-moz-animation:waffle-dataconnector-pill-spinner-animation 2s infinite ease;-o-animation:waffle-dataconnector-pill-spinner-animation 2s infinite ease;animation:waffle-dataconnector-pill-spinner-animation 2s infinite ease;-webkit-transform-origin:0 10px;-moz-transform-origin:0 10px;-ms-transform-origin:0 10px;-o-transform-origin:0 10px;transform-origin:0 10px;background:#fff;border-radius:0 20px 20px 0;content:"";height:20px;left:10px;position:absolute;top:-1px;width:11px}@keyframes waffle-dataconnector-pill-spinner-animation{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}.grid-shim-bottom{background-color:#f8f8f8;border-top:1px solid #e5e5e5}.grid-shim-end-ltr,.grid-shim-end-rtl{background:#f8f8f8;height:100%;position:absolute;top:0}.grid-shim-end-ltr{border-left:1px solid #e5e5e5}.grid-shim-end-rtl{border-right:1px solid #e5e5e5}.grid-shim-end-ltr{right:0}.grid-shim-end-rtl{left:0}.grid-bottom-bar{background-color:#eee;z-index:18}.docs-gm .grid-bottom-bar{background-color:#f1f3f4;border-top:1px solid #e8eaed}.docs-gm .grid-bottom-bar td{line-height:0}.docs-gm .grid-bottom-bar .goog-toolbar{min-height:0}.grid-bottom-bar,.grid-shim-bottom{width:100%}.docs-sheet-active-tab .docs-sheet-tab-dropdown{background:none}.docs-sheet-add .docs-sheet-button-inner-box,.docs-sheet-add .docs-sheet-button-icon{background-position:-180px -37px}.docs-sheet-add.docs-sheet-button-hover .docs-sheet-button-inner-box,.docs-sheet-add.docs-sheet-button-hover .docs-sheet-button-icon{background-position:-642px 0}.docs-sheet-left .docs-sheet-button-inner-box,.docs-sheet-left .docs-sheet-button-icon{background-position:-430px -62px}.docs-sheet-left.docs-sheet-button-hover .docs-sheet-button-inner-box,.docs-sheet-left.docs-sheet-button-hover .docs-sheet-button-icon{background-position:-757px -44px}.docs-sheet-left.docs-sheet-button-disabled .docs-sheet-button-inner-box,.docs-sheet-left.docs-sheet-button-disabled .docs-sheet-button-icon{background-position:-430px -62px}.docs-sheet-right .docs-sheet-button-inner-box,.docs-sheet-right .docs-sheet-button-icon{background-position:-509px -62px}.docs-sheet-right.docs-sheet-button-hover .docs-sheet-button-inner-box,.docs-sheet-right.docs-sheet-button-hover .docs-sheet-button-icon{background-position:-597px -37px}.docs-sheet-right.docs-sheet-button-disabled .docs-sheet-button-inner-box,.docs-sheet-right.docs-sheet-button-disabled .docs-sheet-button-icon{background-position:-509px -62px}.docs-sheet-all .docs-sheet-button-inner-box,.docs-sheet-all .docs-sheet-button-icon{background-position:-791px -67px}.docs-sheet-all.docs-sheet-button-hover .docs-sheet-button-inner-box,.docs-sheet-all.docs-sheet-button-hover .docs-sheet-button-icon{background-position:-217px -62px}.docs-sheet-button-inner-box:hover,.docs-sheet-button-outer-box:hover{border-color:#c6c6c6!important}.docs-sheet-button-inner-box{background:none}.docs-sheet-button-icon{background:url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") no-repeat;margin:2px}.docs-sheet-comment-indicator{background:none;color:white;font-size:11px;font-weight:500;text-align:center}.docs-sheet-outer-container{vertical-align:top}.docs-sheet-container{height:30px;overflow:hidden;top:-1px}.docs-gm .docs-sheet-container{height:40px;line-height:normal;margin-top:-1px;top:0}div.docs-sheet-container-bar{background:none;border:none;font-size:13px;padding:0 0 0 0.5em;margin:0 2px 2px 2px;overflow-x:auto;overflow-y:hidden;white-space:nowrap}.docs-sheet-container-bar .docs-sheet-tab-open{border-top:none;-moz-box-shadow:0 2px 4px rgba(0,0,0,0.2)!important;-webkit-box-shadow:0 2px 4px rgba(0,0,0,0.2)!important;box-shadow:0 2px 4px rgba(0,0,0,0.2)!important;z-index:1004}.docs-sheet-tab-open{border-top:1px solid #fff}div.docs-sheet-button-bar{background:none;border:none;padding:2px 4px 4px 0;margin:0 0 0 2px;overflow:hidden;white-space:nowrap}.docs-sheet-tab{text-decoration:none;list-style:none;vertical-align:top;outline:none;height:24px;z-index:1003;color:#666;background-color:#e9e9e9;border-style:solid;border-width:1px;border-color:#ccc;border-top-color:#aaa;cursor:pointer;padding:2px;margin:0 0 2px 0;min-width:30px;border-radius:0 0 2px 2px}.docs-gm .docs-sheet-tab{align-items:center;background-color:#f1f3f4;border-bottom:none;border-left:1px solid #e8eaed;border-radius:0;border-right:1px solid #e8eaed;border-top:1px solid #e8eaed;display:inline-flex;height:39px;margin-right:-1px;padding:0 12px 0 16px}.docs-sheet-tab.docs-sheet-tab-selected{background-color:#fff;color:#222}.docs-sheet-tab-hover{color:#444;background-color:#f1f1f1;margin:0 0 2px 0}.docs-gm .docs-sheet-tab-hover{background-color:#e8eaed;border-top-color:#e8eaed}.docs-sheet-active-tab{color:#222;cursor:default;background-color:#fff;border-color:#aaa;border-top-color:#fff;border-width:0 1px 1px 1px;box-shadow:0 1px 1px rgba(0,0,0,0.15);font-weight:500;margin:0 0 2px 0;z-index:1004}.docs-gm .docs-sheet-active-tab{background-color:#fff;border-top-color:#f1f3f4;box-shadow:0 1px 3px 1px rgba(60,64,67,.15)}.docs-sheet-tab-menu{border-color:#aaa!important}.docs-gm .docs-sheet-tab-menu{border-color:transparent!important}.docs-sheet-tab-outer-box{border-color:#e4e4e4}.docs-sheet-active-tab .docs-sheet-tab-outer-box{border-color:#d8d8d8}.docs-sheet-tab-outer-box{border-width:1px 0;padding:0;margin:0 -1px;white-space:nowrap;padding:3px 0 3px 5px}.docs-gm .docs-sheet-tab-outer-box{margin-top:-2px;padding:0}.docs-sheet-button-outer-box{margin:0;border-width:1px 0;padding:0}.docs-sheet-button-inner-box{margin:0 -1px;border-width:0 1px;white-space:nowrap}.docs-sheet-menu-inner-box{padding:1px 2px}.docs-gm .docs-sheet-button-outer-box,.docs-gm .docs-sheet-button-inner-box{border:none}.docs-gm .docs-sheet-button-disabled{opacity:.38}::root .docs-sheet-tab,::root .docs-sheet-tab-outer-box{line-height:0}::root .docs-sheet-tab-caption,::root .docs-sheet-tab-dropdown{line-height:normal}.docs-sheet-tab-color{height:3px;margin:3px -20px 0 -5px}.docs-gm .docs-sheet-tab-outer-box,.docs-gm .docs-sheet-tab-inner-box,.docs-gm .docs-sheet-tab-caption{position:static}.docs-gm .docs-sheet-tab-color{bottom:0;height:4px;left:0;margin:0;position:absolute;right:0}.docs-sheet-active-tab .docs-sheet-tab-dropdown{display:inline-block}.docs-sheet-tab .docs-sheet-tab-dropdown{display:inline-block;margin-top:-7px}.docs-gm .docs-sheet-tab .docs-sheet-tab-dropdown{border-radius:2px;margin:0;opacity:1}.docs-sheet-tab-dropdown{opacity:0.3;filter:alpha(opacity=30);margin:-2px -1px -2px -2px}.docs-sheet-active-tab .docs-sheet-tab-dropdown:hover{cursor:pointer;opacity:1;filter:alpha(opacity=100)}.docs-sheet-tab-dropdown{vertical-align:middle}.docs-gm .docs-sheet-active-tab .docs-sheet-tab-dropdown{border:1px solid transparent;margin-left:-1px;margin-right:-1px;opacity:1.0}.docs-gm .docs-sheet-active-tab .docs-sheet-tab-dropdown:hover{background-color:#e6f4ea}.docs-gm .docs-sheet-active-tab .docs-sheet-tab-dropdown:active{background-color:#ceead6}.docs-gm .docs-sheet-tab-open .docs-sheet-tab-dropdown,.docs-gm .docs-sheet-tab-open .docs-sheet-tab-dropdown:hover{background-color:#e6f4ea}.docs-gm .docs-sheet-tab-edit .docs-sheet-tab-dropdown{display:none}.docs-sheet-tab-caption{margin-right:2px;vertical-align:middle;white-space:pre}.docs-gm .docs-sheet-tab-caption{margin-right:3px}.docs-sheet-tab-rtl .docs-sheet-tab-caption{margin-right:0;margin-left:2px}.docs-gm .docs-sheet-tab-rtl .docs-sheet-tab-caption{margin-left:3px}.docs-material .docs-sheet-tab-caption .docs-icon{float:none;margin:-3px 5px 0 0}.docs-gm .docs-material.docs-sheet-tab .docs-icon .docs-icon-arrow-dropdown{left:-52px;top:-3064px}.docs-gm .docs-material.docs-sheet-tab .docs-icon .docs-icon-comment-blank{left:-20px;top:-5619px}.docs-gm .docs-material.docs-sheet-tab .docs-icon .docs-icon-database{left:0;top:-2404px}.docs-gm .docs-material.docs-sheet-tab .docs-icon .docs-icon-locked{left:0;top:-5415px}.docs-gm .docs-material.docs-sheet-active-tab .docs-icon .docs-icon-arrow-dropdown{left:-40px;top:-732px}.docs-gm .docs-material.docs-sheet-active-tab .docs-icon .docs-icon-comment-blank{left:0;top:-4681px}.docs-gm .docs-material.docs-sheet-active-tab .docs-icon .docs-icon-database{left:0;top:-2726px}.docs-gm .docs-material.docs-sheet-active-tab .docs-icon .docs-icon-locked{left:0;top:-4464px}.docs-sheet-tab-name{padding:3px 1px;font-size:13px;font-size:var(--docs-material-font-size-normal,13px)}.docs-gm .docs-sheet-tab-name{color:#80868b;display:inline-block;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;letter-spacing:.025rem}.docs-gm .docs-sheet-active-tab .docs-sheet-tab-name{color:#188038}.docs-sheet-tab-name[contenteditable="true"]{border:1px solid #d9d9d9;display:inline-block;height:16px;min-width:8px;margin:-4px -1px;-moz-user-modify:read-write-plaintext-only;-webkit-user-modify:read-write-plaintext-only;-moz-user-select:text!important;-ms-user-select:text!important;-webkit-user-select:text!important}.docs-gm .docs-sheet-tab-name[contenteditable="true"]{border:2px solid #1a73e8;border-radius:4px;color:#222;height:auto;margin:0 -5px 0 -5px;padding:4px 22px 4px 4px}.docs-sheet-tab-name[contenteditable="true"]:focus{box-shadow:inset 0 1px 2px rgba(0,0,0,0.3);border:1px solid #4d90fe;outline:none}.docs-gm .docs-sheet-tab-name[contenteditable="true"]:focus{border:2px solid #1a73e8;box-shadow:none}.docs-sheet-tab-name-error{border-color:red!important}.docs-sheet-button-inner-box{width:25px;height:25px}.docs-sheet-button,.docs-sheet-menu-button{margin:0 3px;cursor:pointer}.docs-gm .docs-sheet-button{border:1px solid transparent;border-radius:2px;outline:none}.docs-gm .docs-sheet-button-hover{background-color:#f1f3f4}.docs-gm .docs-sheet-button-active{background-color:#e8eaed}.docs-gm .docs-sheet-button-open{background-color:#e6f4ea}.docs-sheet-button-outer-box,.docs-sheet-button-inner-box{border-style:solid;vertical-align:top;border-color:transparent}.docs-sheet-button-disabled,.docs-sheet-button-disabled .docs-sheet-button-outer-box,.docs-sheet-button-disabled .docs-sheet-button-inner-box{cursor:default}.docs-sheet-tab .docs-icon-locked{margin-left:-3px}.docs-material .docs-sheet-tab .docs-icon-locked{margin-left:0}.docs-icon.docs-sheet-lock-container{float:left;margin-top:-3px;width:16px}.docs-sheet-comment-indicator-container{float:left;margin-top:-3px;width:22px}.docs-icon-img-container.docs-sheet-database-icon{width:18px;height:18px;margin-top:2px}.docs-material .docs-icon-img-container.docs-sheet-database-icon{margin-top:0}.docs-sheet-database-icon{background:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgdmlld0JveD0iMCAwIDE4IDE4Ij4KICA8ZyBmaWxsPSIjMDAwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgPGVsbGlwc2UgY3g9IjkiIGN5PSI1IiByeD0iNyIgcnk9IjMiLz4KICAgIDxwYXRoIGQ9Ik0xNiw3IEwxNiw4Ljk5OTk5OTgzIEMxNiwxMC42NTY4NTQyIDEyLjg2NTk5MzIsMTIgOSwxMiBDNS4xMzQwMDY3NSwxMiAyLDEwLjY1Njg1NDIgMiw5IEwyLDcgQzIsOC42NTY4NTQyNSA1LjEzNDAwNjc1LDEwIDksMTAgQzEyLjg2NTk5MzIsMTAgMTYsOC42NTY4NTQyNSAxNiw3IFoiLz4KICAgIDxwYXRoIGQ9Ik0xNiwxMSBMMTYsMTIuOTk5OTk5OCBDMTYsMTQuNjU2ODU0MiAxMi44NjU5OTMyLDE2IDksMTYgQzUuMTM0MDA2NzUsMTYgMiwxNC42NTY4NTQyIDIsMTMgTDIsMTEgQzIsMTIuNjU2ODU0MiA1LjEzNDAwNjc1LDE0IDksMTQgQzEyLjg2NTk5MzIsMTQgMTYsMTIuNjU2ODU0MiAxNiwxMSBaIi8+CiAgPC9nPgo8L3N2Zz4K") no-repeat}.docs-sheet-database-icon-container{float:left;margin-top:-3px;width:20px}.docs-sheet-form-icon-container{float:left;margin-top:-3px;opacity:0.5;width:22px}.docs-sheet-active-tab .docs-sheet-form-icon-container{opacity:1}.docs-sheet-comment-indicator{display:block;height:16px;line-height:12px;width:16px;position:absolute;top:4px;left:3px;margin-top:0px}.docs-material .docs-sheet-comment-indicator{height:12px;left:1px;line-height:12px;top:2px}.docs-sheet-all-sheet-menu-item{white-space:nowrap}.docs-sheet-all-sheet-menu-item-hidden .goog-menuitem-content{color:#888}.docs-sheet-all-sheet-menu-item-swatch{border-radius:9px;display:inline-block;height:9px;margin-right:8px;width:9px}.docs-sheet-button-bar-container.fit-content{width:1em}.docs-sheet-button-bar-container:last-child,.docs-sheet-button-bar-container.fit-content:last-child{width:100%}.docs-sheet-status-container{width:158px;overflow:hidden;padding:0;border-left:1px solid #ccc}.docs-sheet-status-container-avs{overflow:hidden;padding:0}.docs-sheet-status{max-width:150px;float:right;margin-right:8px;overflow:hidden}.docs-sheet-status-avs{max-width:150px;float:right;margin-right:8px;overflow:hidden;position:relative;top:3px}.docs-gm .docs-sheet-status-avs{top:4px;max-width:170px}.docs-sheet-status>.jfk-select{line-height:29px;margin:0 3px 0 6px;max-width:119px}.docs-sheet-status-avs>.jfk-select{line-height:29px;max-width:119px}.docs-gm .docs-sheet-status-avs .goog-flat-menu-button{border:1px solid #dadce0;border-radius:4px;box-sizing:border-box;cursor:pointer;padding:8px 6px 8px 8px;width:100%;align-items:center;background:white;color:#3c4043;display:inline-flex;justify-content:space-between;outline:none;padding:4px;position:relative;max-width:139px;width:auto;width:unset}.docs-gm .docs-sheet-status-avs .goog-flat-menu-button-disabled{color:#5f6368;opacity:.38;cursor:default}.docs-gm .docs-sheet-status-avs .goog-flat-menu-button:active{background-color:#fff;border:1px solid transparent;box-shadow:0 2px 6px 2px rgba(60,64,67,.15)}.docs-gm .docs-sheet-status-avs .goog-flat-menu-button-hover{background-color:rgba(60,64,67,0.04);border:1px solid #dadce0;box-shadow:none}.docs-gm .docs-sheet-status-avs .goog-flat-menu-button-focused{background-color:rgba(60,64,67,0.06);border:1px solid #dadce0}.docs-gm .docs-sheet-status-avs .goog-flat-menu-button-open{background-color:rgba(60,64,67,0.04);border:1px solid transparent}.docs-gm .docs-sheet-status-avs .goog-flat-menu-button-hover.goog-flat-menu-button-open{background-color:rgba(60,64,67,0.06)}.docs-gm .docs-sheet-status-avs .goog-flat-menu-button-focused.goog-flat-menu-button-open{background-color:rgba(60,64,67,0.08)}.docs-gm .docs-sheet-status-avs .goog-flat-menu-button-disabled{border:1px solid #dadce0;box-shadow:none;cursor:default}.docs-gm .docs-sheet-status-avs .goog-flat-menu-button-caption{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;color:#202124;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;height:20px;line-height:20px;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:11px}.docs-gm .docs-sheet-status-avs .goog-flat-menu-button-disabled .goog-flat-menu-button-caption{color:#5f6368;opacity:.38;cursor:default}.docs-gm .docs-sheet-status-avs .goog-flat-menu-button-dropdown{background:no-repeat url(//ssl.gstatic.com/docs/common/material_common_sprite222_grey_medium.svg) -40px -732px;height:18px;width:18px;border:none;margin-top:0;position:relative;right:0;top:0}.docs-gm .docs-sheet-status-avs .goog-flat-menu-button-disabled .goog-flat-menu-button-dropdown{opacity:.38}.docs-gm .docs-sheet-status-avs .goog-flat-menu-button-disabled.goog-flat-menu-button:active{border:1px solid #dadce0;box-shadow:none;cursor:default;box-shadow:none}.docs-gm .docs-sheet-status-avs .goog-flat-menu-button-open .goog-flat-menu-button-dropdown{-moz-transform:rotate(180deg);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.docs-gm .docs-sheet-status-avs .jfk-radiobutton-disabled .jfk-radiobutton-label{color:#5f6368;opacity:.38;cursor:default}.docs-sheet-status .goog-flat-menu-button-caption,.docs-sheet-status-avs .goog-flat-menu-button-caption{text-overflow:ellipsis}.waffle-quicksum-container{color:#333;font-size:11px;font-weight:500;height:30px;line-height:30px;margin-right:22px;overflow:hidden;text-align:right}.waffle-autovis-quicksum{height:34px;margin:1px}.jfk-button.waffle-autovis-quicksum-button{border:1px solid transparent;cursor:pointer;height:28px;margin:0;padding:2px;position:relative;width:154px}.docs-sheet-fade{position:absolute;display:block;top:0;width:6px;height:100%;z-index:1005}.docs-sheet-fade div{background-color:#d7d7d7;width:2px;float:right;position:relative;height:100%}.docs-sheet-fade-left{left:0}.docs-sheet-fade-right{right:0}.docs-sheet-fade1{opacity:0.82;filter:alpha(opacity=82)}.docs-sheet-fade2{opacity:0.62;filter:alpha(opacity=62)}.docs-sheet-fade3{opacity:0.4;filter:alpha(opacity=40)}.waffle-slicereditor-sidebar.waffle-sidebar-container{width:320px;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;z-index:2}.waffle-slicer-editor-send-feedback-container{text-align:end}.waffle-slicer-editor-style-tab .waffle-slicer-editor-style-format-option,.waffle-slicer-editor-style-color-option-non-gm .docs-charts-editor-material-toolbar-color-picker-outer-box{background-color:#f1f3f4}.goog-menu-vertical .waffle-slicer-editor-column-selector-menu-seperator{margin-left:0}.waffle-slicer-editor-column-selector-menu-item{display:flex;border:1px solid transparent;line-height:20px;margin:0;padding:5px;width:286px}.waffle-slicer-editor-column-selector-menu-item-name{-ms-flex:1;-webkit-flex:1;flex:1;margin:0 20px 0 10px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.waffle-slicer-editor-column-selector-menu-item-range{display:flex;opacity:0.5;max-width:143px}.waffle-slicer-editor-column-selector-menu-item-rect{-ms-flex:1;-webkit-flex:1;flex:1}.waffle-slicer-editor-column-selector-menu-item-sheet-name{overflow:hidden;text-overflow:ellipsis}.waffle-slicer-editor-setup-tab .waffle-slicer-editor-style-tab{width:100%}.waffle-slicer-editor-sidebar-col{width:50%;margin-right:10px}.waffle-slicer-editor-sidebar-col:last-child{margin-right:0}.waffle-slicer-editor-sidebar-control-label{color:#616161;font-size:11px;line-height:16px;margin-bottom:8px;margin-right:2px}.waffle-slicer-editor-sidebar-custom-row{display:flex}.waffle-slicer-editor-sidebar-title-input-box{width:100%}.waffle-slicer-editor-sidebar-title-input-box>input{border-left:none;border-right:none;border-top:none;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:18px;height:100%;padding:0;width:100%}.waffle-slicer-editor-sidebar-title-input-box>input:disabled{opacity:0.75}.waffle-slicer-editor-sidebar-title-input-box>input:focus{border:none;border-bottom:2px solid #4285f4}.waffle-slicer-editor-sidebar-row{padding:10px 16px}.waffle-slicer-editor-sidebar-align .goog-toolbar-menu-button-dropdown{margin:0}.waffle-slicer-editor-sidebar-align-menu-items .goog-palette-table{border:0;margin:0 4px}.waffle-slicer-editor-sidebar-align-menu-items .goog-palette-cell{border:0;padding:2px}.waffle-slicer-editor-sidebar-align-menu-items .goog-palette-cell-hover{background:#eeeeee}.waffle-slicer-editor-sidebar-rangepicker-error-label{color:#db4437;font-size:13px}.waffle-slicer-editor-apply-to-pivot-table-row{display:flex;-webkit-align-items:center;align-items:center}.waffle-slicer-editor-apply-to-pivot-table-checkbox{display:flex}.waffle-slicer-editor-apply-to-pivot-table-checkbox-label{-ms-flex:1;-webkit-flex:1;flex:1;margin:0 5px}.waffle-slicer-editor-sidebar-title-format{border:1px solid #dadce0;border-radius:4px;display:inline-block;height:40px;line-height:40px}.waffle-slicer-editor-textstyle-separator{border-left:1px solid #dadce0;height:25px;margin:7px 1px;vertical-align:top}.waffle-slicer-editor-sidebar-title-input{transition:border-color 0.3s ease;color:#3c4043;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;height:42px;line-height:36px;margin-bottom:0;min-height:42px;resize:none}.waffle-slicer-editor-sidebar-title-input-label{color:#5f6368;font-size:12px;line-height:15px;margin-bottom:8px}.docs-multi-menu-col{float:left}.docs-multi-menu-col .goog-menuheader{color:#777;font-size:11px;padding:.3em .5em .3em 0.5em;text-transform:uppercase}.dialog-separator{border-bottom:1px solid #e5e5e5;margin:0 -42px 20px}.nfd-inputall,.nfd-input,.nfd-apply,.nfd-inner-input-content{display:inline-block}.nfd-input{min-height:18px;position:relative}.nfd-input span:focus{outline:none}.nfd-date-time-left-most{display:inline-block;min-width:1px}.nfd-inner-input-content{text-align:right}.nfd-date-time-input{position:relative;transform:translateZ(0)}.nfd-date-time-input .goog-flat-menu-button{margin:1px 2px}.nfd-input .jfk-select .goog-flat-menu-button-dropdown{background:no-repeat url(//ssl.gstatic.com/docs/common/material_common_sprite222.svg) 0 -3598px;left:0}.nfd-input table{border-spacing:0;width:100%}.nfd-dialog-content ul{list-style:none;margin:0;padding:0}.nfd-format-pill{border-bottom:1px solid #e5e5e5;border-left:1px solid transparent;font-size:15px;padding:16px;position:relative}.nfd-format-pill:focus{border-left:1px solid #4d90fe;outline:none}.nfd-format-pill:hover{background-color:#f1f1f1}.nfd-format-display{display:inline-block}.nfd-format-sample{color:#777;display:inline-block;position:absolute;right:20px}.nfd-pill-container li:last-child{border-bottom:none}.cnf-sample-table{border-spacing:0;display:inline-table}.cnf-sample-wrapper{position:relative}.cnf-help-link{position:absolute;right:0}td.nfd-sample-label{color:#777;padding-left:0;padding-right:5px}.number-format-menu .goog-menuitem{padding-right:1em}.nfd-date-time-menu-button:focus{outline:none}.nfd-input.nfd-invalid{border:1px solid #dd4b39}.nfd-date-time-menu .goog-menuitem{padding-left:6px;padding-right:4em}.nfd-dialog .nfd-inputall .nfd-input{font-size:13px;height:initial;margin-top:0;min-height:36px;overflow-x:auto;padding:2px 8px;width:366px}.nfd-dialog.modal-dialog{padding:24px}.nfd-dialog .dialog-separator{display:none}.nfd-input input{border:none;font-size:inherit;margin:0;outline:none;padding:0;width:100%}.nfd-input>input{height:18px;padding:6px 0}.nfd-inner-input{height:16px;line-height:16px;min-width:25px;padding:7px 0;width:100%}.nfd-input.nfd-input-focus{border:2px solid #1a73e8;box-shadow:none;padding:0px 7px;box-shadow:none;outline:none}.nfd-input.nfd-input-focus>input{padding:7px 0}.nfd-input.nfd-input-focus .nfd-inner-input{padding:8px 0}.nfd-dialog.modal-dialog-content{min-width:464px;width:auto;width:unset}.nfd-dialog-content{border:1px solid #e5e5e5;cursor:pointer;height:400px;margin-top:8px;overflow-y:scroll;-webkit-tap-highlight-color:transparent}.nfd-input .goog-flat-menu-button{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:white;border:1px solid #dadce0!important;color:#188038;height:24px;padding:3px 12px 5px;border-radius:24px;color:#3c4043;font-size:12px;line-height:17px;padding:3px 24px 3px 10px}.nfd-input .goog-flat-menu-button-caption{font-weight:500}.nfd-input .goog-flat-menu-button.goog-flat-menu-button-hover{background:#f8f9fa}.nfd-date-time-pill{margin:2px 0}.nfd-input .nfd-currency-other-formats{padding-top:4px;margin-right:0}.nfd-date-time-menu-button{background:no-repeat url(//ssl.gstatic.com/docs/common/material_common_sprite222.svg) 0 -712px;border:none;float:right;height:18px;margin:6px 0;position:fixed;right:108px;top:2px;width:18px}.nfd-input .goog-flat-menu-button-dropdown{background:no-repeat url(//ssl.gstatic.com/docs/common/material_common_sprite222.svg) 0 -3598px;height:18px;left:18px;top:0;width:18px}.jfk-button.nfd-apply{margin-left:9px;margin-right:0;vertical-align:top}.goog-palette{cursor:default;outline:none}.goog-palette-table{border:1px solid #666;border-collapse:collapse;margin:5px}.goog-palette-cell{border:0;border-right:1px solid #666;cursor:pointer;height:18px;margin:0;text-align:center;vertical-align:middle;width:18px}.goog-palette-cell .goog-palette-colorswatch{border:none;font-size:x-small;height:18px;position:relative;width:18px}.goog-palette-cell-hover .goog-palette-colorswatch{border:1px solid #fff;height:16px;width:16px}.goog-palette-cell-selected .goog-palette-colorswatch{background:url(//ssl.gstatic.com/editor/editortoolbar.png) no-repeat -368px 0;border:1px solid #333;color:#fff;font-weight:bold;height:16px;width:16px}.goog-palette-customcolor{background-color:#fafafa;border:1px solid #eee;color:#666;font-size:x-small;height:15px;position:relative;width:15px}.goog-palette-cell-hover .goog-palette-customcolor{background-color:#fee;border:1px solid #f66;color:#f66}.goog-color-menu-button-indicator{border-bottom:4px solid #f0f0f0}.goog-color-menu-button .goog-menu-button-inner-box,.goog-toolbar-color-menu-button .goog-toolbar-menu-button-inner-box{padding-top:2px!important;padding-bottom:2px!important}.goog-tab{position:relative;padding:4px 8px;color:#00c;text-decoration:underline;cursor:default}.goog-tab-bar-top .goog-tab{margin:1px 4px 0 0;border-bottom:0;float:left}.goog-tab-bar-top:after,.goog-tab-bar-bottom:after{content:" ";display:block;height:0;clear:both;visibility:hidden}.goog-tab-bar-bottom .goog-tab{margin:0 4px 1px 0;border-top:0;float:left}.goog-tab-bar-start .goog-tab{margin:0 0 4px 1px;border-right:0}.goog-tab-bar-end .goog-tab{margin:0 1px 4px 0;border-left:0}.goog-tab-hover{background:#eee}.goog-tab-disabled{color:#666}.goog-tab-selected{color:#000;background:#fff;text-decoration:none;font-weight:bold;border:1px solid #6b90da}.goog-tab-bar-top{padding-top:5px!important;padding-left:5px!important;border-bottom:1px solid #6b90da!important}.goog-tab-bar-top .goog-tab-selected{top:1px;margin-top:0;padding-bottom:5px}.goog-tab-bar-bottom .goog-tab-selected{top:-1px;margin-bottom:0;padding-top:5px}.goog-tab-bar-start .goog-tab-selected{left:1px;margin-left:0;padding-right:9px}.goog-tab-bar-end .goog-tab-selected{left:-1px;margin-right:0;padding-left:9px}.goog-tab-bar{margin:0;border:0;padding:0;list-style:none;cursor:default;outline:none;background:#ebeff9}.goog-tab-bar-clear{clear:both;height:0;overflow:hidden}.goog-tab-bar-start{float:left}.goog-tab-bar-end{float:right}* html .goog-tab-bar-start{margin-right:-3px}* html .goog-tab-bar-end{margin-left:-3px}.jfk-scrollbar::-webkit-scrollbar{height:16px;overflow:visible;width:16px}.jfk-scrollbar::-webkit-scrollbar-button{height:0;width:0}.jfk-scrollbar::-webkit-scrollbar-track{background-clip:padding-box;border:solid transparent;border-width:0 0 0 4px}.jfk-scrollbar::-webkit-scrollbar-track:horizontal{border-width:4px 0 0}.jfk-scrollbar::-webkit-scrollbar-track:hover{background-color:rgba(0,0,0,.05);box-shadow:inset 1px 0 0 rgba(0,0,0,.1)}.jfk-scrollbar::-webkit-scrollbar-track:horizontal:hover{box-shadow:inset 0 1px 0 rgba(0,0,0,.1)}.jfk-scrollbar::-webkit-scrollbar-track:active{background-color:rgba(0,0,0,.05);box-shadow:inset 1px 0 0 rgba(0,0,0,.14),inset -1px 0 0 rgba(0,0,0,.07)}.jfk-scrollbar::-webkit-scrollbar-track:horizontal:active{box-shadow:inset 0 1px 0 rgba(0,0,0,.14),inset 0 -1px 0 rgba(0,0,0,.07)}.jfk-scrollbar-dark.jfk-scrollbar::-webkit-scrollbar-track:hover{background-color:rgba(255,255,255,.1);box-shadow:inset 1px 0 0 rgba(255,255,255,.2)}.jfk-scrollbar-dark.jfk-scrollbar::-webkit-scrollbar-track:horizontal:hover{box-shadow:inset 0 1px 0 rgba(255,255,255,.2)}.jfk-scrollbar-dark.jfk-scrollbar::-webkit-scrollbar-track:active{background-color:rgba(255,255,255,.1);box-shadow:inset 1px 0 0 rgba(255,255,255,.25),inset -1px 0 0 rgba(255,255,255,.15)}.jfk-scrollbar-dark.jfk-scrollbar::-webkit-scrollbar-track:horizontal:active{box-shadow:inset 0 1px 0 rgba(255,255,255,.25),inset 0 -1px 0 rgba(255,255,255,.15)}.jfk-scrollbar::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.2);background-clip:padding-box;border:solid transparent;border-width:1px 1px 1px 6px;min-height:28px;padding:100px 0 0;box-shadow:inset 1px 1px 0 rgba(0,0,0,.1),inset 0 -1px 0 rgba(0,0,0,.07)}.jfk-scrollbar::-webkit-scrollbar-thumb:horizontal{border-width:6px 1px 1px;padding:0 0 0 100px;box-shadow:inset 1px 1px 0 rgba(0,0,0,.1),inset -1px 0 0 rgba(0,0,0,.07)}.jfk-scrollbar::-webkit-scrollbar-thumb:hover{background-color:rgba(0,0,0,.4);box-shadow:inset 1px 1px 1px rgba(0,0,0,.25)}.jfk-scrollbar::-webkit-scrollbar-thumb:active{background-color:rgba(0,0,0,0.5);box-shadow:inset 1px 1px 3px rgba(0,0,0,0.35)}.jfk-scrollbar-dark.jfk-scrollbar::-webkit-scrollbar-thumb{background-color:rgba(255,255,255,.3);box-shadow:inset 1px 1px 0 rgba(255,255,255,.15),inset 0 -1px 0 rgba(255,255,255,.1)}.jfk-scrollbar-dark.jfk-scrollbar::-webkit-scrollbar-thumb:horizontal{box-shadow:inset 1px 1px 0 rgba(255,255,255,.15),inset -1px 0 0 rgba(255,255,255,.1)}.jfk-scrollbar-dark.jfk-scrollbar::-webkit-scrollbar-thumb:hover{background-color:rgba(255,255,255,.6);box-shadow:inset 1px 1px 1px rgba(255,255,255,.37)}.jfk-scrollbar-dark.jfk-scrollbar::-webkit-scrollbar-thumb:active{background-color:rgba(255,255,255,.75);box-shadow:inset 1px 1px 3px rgba(255,255,255,.5)}.jfk-scrollbar-borderless.jfk-scrollbar::-webkit-scrollbar-track{border-width:0 1px 0 6px}.jfk-scrollbar-borderless.jfk-scrollbar::-webkit-scrollbar-track:horizontal{border-width:6px 0 1px}.jfk-scrollbar-borderless.jfk-scrollbar::-webkit-scrollbar-track:hover{background-color:rgba(0,0,0,.035);box-shadow:inset 1px 1px 0 rgba(0,0,0,.14),inset -1px -1px 0 rgba(0,0,0,.07)}.jfk-scrollbar-borderless.jfk-scrollbar-dark.jfk-scrollbar::-webkit-scrollbar-track:hover{background-color:rgba(255,255,255,.07);box-shadow:inset 1px 1px 0 rgba(255,255,255,.25),inset -1px -1px 0 rgba(255,255,255,.15)}.jfk-scrollbar-borderless.jfk-scrollbar::-webkit-scrollbar-thumb{border-width:0 1px 0 6px}.jfk-scrollbar-borderless.jfk-scrollbar::-webkit-scrollbar-thumb:horizontal{border-width:6px 0 1px}.jfk-scrollbar::-webkit-scrollbar-corner{background:transparent}body.jfk-scrollbar::-webkit-scrollbar-track-piece{background-clip:padding-box;background-color:#f5f5f5;border:solid #fff;border-width:0 0 0 3px;box-shadow:inset 1px 0 0 rgba(0,0,0,.14),inset -1px 0 0 rgba(0,0,0,.07)}body.jfk-scrollbar::-webkit-scrollbar-track-piece:horizontal{border-width:3px 0 0;box-shadow:inset 0 1px 0 rgba(0,0,0,.14),inset 0 -1px 0 rgba(0,0,0,.07)}body.jfk-scrollbar::-webkit-scrollbar-thumb{border-width:1px 1px 1px 5px}body.jfk-scrollbar::-webkit-scrollbar-thumb:horizontal{border-width:5px 1px 1px}body.jfk-scrollbar::-webkit-scrollbar-corner{background-clip:padding-box;background-color:#f5f5f5;border:solid #fff;border-width:3px 0 0 3px;box-shadow:inset 1px 1px 0 rgba(0,0,0,.14)}#docs-toolbar-wrapper{border-top:1px solid #d9d9d9;border-bottom:1px solid #d9d9d9;min-height:35px;box-shadow:inset 0 1px 0 0 #fff;background-color:#f5f5f5;background-image:-webkit-linear-gradient(top,#f5f5f5,#eee);background-image:-moz-linear-gradient(top,#f5f5f5,#eee);background-image:-ms-linear-gradient(top,#f5f5f5,#eee);background-image:-o-linear-gradient(top,#f5f5f5,#eee);background-image:linear-gradient(top,#f5f5f5,#eee);padding:0 44px 0 58px;position:relative}#docs-toolbar-wrapper.docs-hub-appbar{border:none}#docs-toolbar{background:none;border-width:0!important;display:inline;min-height:35px;padding:0}#docs-primary-toolbars{display:block}#docs-omnibox-toolbar{background:none;border-width:0!important;display:inline-block;padding:0;vertical-align:middle;width:182px;overflow:hidden}#docs-side-toolbar{background:none;border:0;margin:0 44px 0 0;padding:0;position:absolute;right:0;top:0}.goog-toolbar{margin-bottom:0;outline:0}.goog-toolbar-button,.goog-toolbar-menu-button{margin:4px 0 0 -1px}.goog-toolbar-button-inner-box,.goog-toolbar-menu-button-inner-box{height:25px;min-width:25px;padding:0;text-align:center}.docs-toolbar-button-split-left .goog-toolbar-button-inner-box{min-width:23px}.goog-toolbar-button-inner-box .docs-icon,.goog-toolbar-menu-button-caption .docs-icon,.goog-toolbar-menu-button-caption .goog-color-menu-button-indicator .docs-icon{margin-top:-3px}.goog-toolbar-menu-button .goog-toolbar-menu-button-outer-box .goog-toolbar-menu-button-inner-box,.goog-toolbar-button .goog-toolbar-menu-button-outer-box .goog-toolbar-menu-button-inner-box{margin:0 1px}.goog-toolbar-menu-button-dropdown{margin-left:4px;margin-right:0;margin-top:9px}.goog-toolbar-color-menu-button .goog-toolbar-menu-button-dropdown{margin-top:7px}.goog-toolbar-separator.goog-inline-block{border-left:1px solid #d9d9d9;height:35px;margin:0 5px 0 4px;vertical-align:top}.goog-toolbar-select .goog-toolbar-menu-button-outer-box .goog-toolbar-menu-button-inner-box{margin:0;margin-right:1px}.goog-color-menu-button-indicator{position:relative;height:19px}.goog-toolbar-color-menu-button .goog-toolbar-menu-button-caption{top:-2px}.docs-toolbar-small-separator.goog-toolbar-separator{border-left:1px solid #ccc;display:inline;font-size:11px;height:17px;line-height:normal;list-style:none;margin:0 -3px 0 -1px;outline:none;overflow:hidden;padding:0 0 3px 0;text-decoration:none;vertical-align:middle;width:0}.docs-toolbar-small-separator.goog-toolbar-separator,.docs-toolbar-small-separator.goog-toolbar-separator{display:inline-block;height:35px;margin:0 5px 0 4px;padding:0;vertical-align:top}.docs-toolbar-small-separator.goog-toolbar-separator+.docs-toolbar-small-separator.goog-toolbar-separator{display:none}.goog-toolbar-button+div.docs-toolbar-small-separator,div.goog-toolbar-separator+div.docs-toolbar-small-separator,div.goog-toolbar-menu-button+div.docs-toolbar-small-separator{margin-left:3px}.docs-toolbar-small-separator+div.goog-toolbar-button,.docs-toolbar-small-separator+div.goog-toolbar-menu-button,.docs-toolbar-small-separator+div[class~=goog-toolbar-select]{margin-left:-1px}div[class~="goog-toolbar-select"]+div.docs-toolbar-small-separator{margin-left:-1px}.docs-toolbar-small-separator+div.goog-toolbar-select{margin-left:-3px}.docs-toolbar-inset-separator.docs-toolbar-small-separator{border-left:1px solid 1px solid #d9d9d9;height:20px;margin:5px 5px 0 4px;vertical-align:middle}.goog-toolbar-toggle-button.goog-toolbar-button-checked+.goog-toolbar-toggle-button.goog-toolbar-button-checked{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0;margin-left:-1px}.goog-toolbar-toggle-button.goog-toolbar-button-checked+.goog-toolbar-toggle-button.goog-toolbar-button-checked .goog-toolbar-button-outer-box .goog-toolbar-button-inner-box,.goog-toolbar-toggle-button.goog-toolbar-button-checked+.goog-toolbar-toggle-button.goog-toolbar-button-checked.goog-toolbar-button-hover .goog-toolbar-button-outer-box .goog-toolbar-button-inner-box{margin-left:1px}.goog-toolbar-button .docs-icon,.goog-toolbar-menu-button .docs-icon{opacity:.70}.goog-toolbar-button-hover .docs-icon,.goog-toolbar-button-selected .docs-icon,.goog-toolbar-button-checked .docs-icon,.goog-toolbar-menu-button-hover .docs-icon,.goog-toolbar-menu-button-selected .docs-icon,.goog-toolbar-menu-button-checked .docs-icon{opacity:0.9}.goog-toolbar-button-active .docs-icon,.goog-toolbar-menu-button-open .docs-icon{opacity:1.0}.goog-toolbar-select .goog-toolbar-menu-button-outer-box .goog-toolbar-menu-button-inner-box .goog-toolbar-menu-button-caption{margin-left:10px;text-align:left}.goog-toolbar-select .goog-toolbar-menu-button-outer-box .goog-toolbar-menu-button-inner-box .goog-toolbar-menu-button-dropdown{margin-left:5px;margin-right:4px}.docs-toolbar-button-split-left,.docs-toolbar-button-split-left *{border-top-right-radius:0!important;border-bottom-right-radius:0!important}.docs-toolbar-button-split-right,.docs-toolbar-button-split-right *{border-top-left-radius:0!important;border-bottom-left-radius:0!important;min-width:5px!important}.docs-toolbar-button-split-right .goog-toolbar-menu-button-dropdown{margin-left:3px}.docs-toolbar-button-split-sympathy-hover{border-color:#c6c6c6}.docs-toolbar-button-split-left .goog-toolbar-button-hover,.docs-toolbar-button-split-right .goog-toolbar-button-hover{z-index:1}.docs-toolbar-split-create-button.goog-toolbar-menu-button{margin-right:4px}.docs-toolbar-split-create-button .goog-toolbar-menu-button-dropdown{background:url(//ssl.gstatic.com/ui/v1/disclosure/small-grey-disclosure-arrow-down.png) center no-repeat;height:7px;margin-top:9px;opacity:1}.docs-toolbar-split-create-button{background-color:#f5f5f5;background-image:-webkit-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:-moz-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:-ms-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:-o-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:linear-gradient(top,#f5f5f5,#f1f1f1);border-color:#c6c6c6!important}.docs-toolbar-split-create-button.goog-toolbar-button-disabled{border-right-color:#fff!important}.docs-toolbar-split-create-button.goog-toolbar-button-hover,.docs-toolbar-split-create-button.goog-toolbar-menu-button-hover{background-color:#f8f8f8;background-image:-webkit-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-moz-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-ms-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-o-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:linear-gradient(top,#f8f8f8,#f1f1f1);border-color:#c6c6c6!important}.docs-toolbar-split-create-button.goog-toolbar-button-active,.docs-toolbar-split-create-button.goog-toolbar-menu-button-active{background-color:#f8f8f8;background-image:-webkit-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-moz-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-ms-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-o-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:linear-gradient(top,#f8f8f8,#f1f1f1);border-color:#c6c6c6!important}.docs-toolbar-split-create-button .docs-icon{opacity:1}.docs-toolbar-text-button .goog-toolbar-button-outer-box,.docs-toolbar-text-button .goog-toolbar-menu-button-outer-box{padding-left:4px}.docs-toolbar-text-button .goog-toolbar-button-outer-box{padding-right:4px}.goog-toolbar-menu-button-outer-box{padding-right:3px}.goog-toolbar-menu-button-arrow-hidden.goog-toolbar-menu-button-outer-box{padding-right:0px}.jfk-bubble.docs-toolbar-more-bubble{padding:0px;z-index:902!important}.docs-toolbar-more-bubble .jfk-bubble-arrowup .jfk-bubble-arrowimplafter{border-color:#eee transparent}.docs-toolbar-more-toolbar{background:#eee;border:0;min-height:35px;padding:0 0 0 10px}.docs-collapsable-toolbar{white-space:nowrap}.docs-collapsable-toolbar-control{white-space:normal}.docs-hc-gecko .docs-icon-img{filter:invert(100%)}.docs-hc-gecko .docs-icon-img.docs-icon-document,.docs-hc-gecko .docs-icon-img.docs-icon-punch,.docs-hc-gecko .docs-icon-img.docs-icon-presentation,.docs-hc-gecko .docs-icon-img.docs-icon-spreadsheet,.docs-hc-gecko .docs-icon-img.docs-icon-form,.docs-hc-gecko .docs-icon-img.docs-icon-drawing,.docs-hc-gecko .docs-icon-img.docs-icon-script,.docs-hc-gecko .docs-icon-img.docs-icon-site{filter:none}.docs-hc-ie .docs-icon-img{-ms-high-contrast-adjust:none;background-color:white}.docs-icon-toolbar-button-with-text{padding-left:4px;padding-right:4px}.docs-icon-toolbar-button-with-text .docs-icon-toolbar-button-with-text-icon-container{margin-right:4px}.google-visualization-clickeditor-bubble.jfk-bubble{padding:3px;z-index:inherit!important;background-color:#f5f5f5;font-family:Arial,san-serif;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;border-color:#dadada}.google-visualization-clickeditor-bubble .jfk-bubble-arrowdown .jfk-bubble-arrowimplafter,.google-visualization-clickeditor-bubble .jfk-bubble-arrowup .jfk-bubble-arrowimplafter{border-color:#f5f5f5 transparent}.google-visualization-clickeditor-combobox .goog-toolbar-combo-button-input{width:28px;padding:0 0 0 3px;position:relative}.goog-menuitem .google-visualization-clickeditor-combobox-icon{position:absolute;top:4px;left:100px}.google-visualization-charteditor-menu .goog-menuheader{padding-left:10px;color:#888}.google-visualization-clickeditor-combobox .google-visualization-clickeditor-combobox-icon{position:absolute;height:100%;width:34px;top:0;left:0;background-color:#f5f5f5}.goog-toolbar-combo-button-open .google-visualization-clickeditor-combobox-icon{filter:alpha(opacity=0);opacity:0}.google-visualization-clickeditor-combobox-icon .docs-icon{margin:0 0 0 7px;filter:alpha(opacity=60);opacity:0.6}.google-visualization-clickeditor-bubble .goog-toolbar-combo-button,.google-visualization-clickeditor-bubble .goog-toolbar-menu-button,.google-visualization-clickeditor-bubble .goog-toolbar-button{margin:0;top:auto}.google-visualization-clickeditor-bubble .goog-toolbar-color-menu-button .goog-toolbar-menu-button-dropdown{top:-2px}.google-visualization-clickeditor-color .goog-color-menu-button-indicator{width:14px;height:0;border-bottom-width:14px;margin:6px;outline:1px solid #bbb}.google-visualization-clickeditor-tooltip{font-family:Arial,sans-serif;font-weight:normal;-webkit-transition:background-color .5s;-moz-transition:background-color .5s;-ms-transition:background-color .5s;-o-transition:background-color .5s;transition:background-color .5s}.google-visualization-clickeditor-bubble .goog-toolbar-separator{height:20px;vertical-align:middle;border-color:#ccc}.google-visualization-clickeditor-separator{width:98%;height:0;border:1px solid #f8f8f8;margin:3px}.google-visualization-clickeditor-input-box{padding:5px}.google-visualization-clickeditor-enter-msg{font-size:11px;color:#555;padding:4px}.google-visualization-clickeditor-bubble .google-visualization-charteditor-input:focus{outline-color:#008df0}.google-visualization-clickeditor-bubble .google-visualization-charteditor-input-inline-x,.google-visualization-clickeditor-bubble .google-visualization-charteditor-input-inline-y,.google-visualization-clickeditor-bubble .google-visualization-charteditor-input-inline-right{font-size:12px;margin:4px}.google-visualization-clickeditor-bubble .google-visualization-charteditor-input-inline-x{width:79px}.google-visualization-clickeditor-bubble .google-visualization-charteditor-input-inline-y,.google-visualization-clickeditor-bubble .google-visualization-charteditor-input-inline-right{width:52px}.google-visualization-clickeditor-bubble .google-visualization-charteditor-combobox,.google-visualization-clickeditor-bubble .goog-flat-menu-button{margin:0}.goog-flat-menu-button-disabled .goog-flat-menu-button-dropdown{border-color:#b8b8b8 transparent}.google-visualization-clickeditor-entity-cover{position:absolute;visibility:hidden;overflow:hidden;cursor:pointer}.google-visualization-clickeditor-entity-cover-stripes{position:absolute;top:0;width:100%;height:100%;background:url("//ssl.gstatic.com/charts/static/stripes.png") repeat;visibility:visible;filter:alpha(opacity=10);opacity:0.1}.google-visualization-clickeditor-entity-cover-top,.google-visualization-clickeditor-entity-cover-bottom,.google-visualization-clickeditor-entity-cover-left,.google-visualization-clickeditor-entity-cover-right{visibility:visible;background-color:#008ef1;width:1px;height:1px;position:absolute}.google-visualization-clickeditor-entity-cover-top,.google-visualization-clickeditor-entity-cover-bottom{width:100%}.google-visualization-clickeditor-entity-cover-left,.google-visualization-clickeditor-entity-cover-right{height:100%}.google-visualization-clickeditor-entity-cover-right{right:0}.google-visualization-clickeditor-entity-cover-left{left:0}.google-visualization-clickeditor-entity-cover-bottom{bottom:0}.google-visualization-clickeditor-entity-cover .google-visualization-clickeditor-mid-input{width:98%;filter:alpha(opacity=0);opacity:0}.google-visualization-clickeditor-entity-cover .google-visualization-clickeditor-mid-input:focus{filter:alpha(opacity=100);opacity:1}.google-visualization-clickeditor-header{height:30px;background-color:white;padding:3px;overflow:hidden}.google-visualization-clickeditor-header-text{margin-left:5px;font-family:Arial,sans-serif;font-size:12px;color:#999;white-space:nowrap}.jfk-button.google-visualization-clickeditor-header-view,.jfk-button.google-visualization-clickeditor-header-edit{z-index:0}.jfk-button.jfk-button-disabled.google-visualization-clickeditor-header-view,.jfk-button.jfk-button-disabled.google-visualization-clickeditor-header-edit{background:transparent;border:none;box-shadow:none;margin-top:1px;margin-left:1px;opacity:0.5}.google-visualization-clickeditor-header-view .docs-icon,.google-visualization-clickeditor-header-edit .docs-icon{margin-top:-3px;margin-left:-2px;filter:alpha(opacity=60);opacity:0.6}.jfk-button.google-visualization-clickeditor-header-edit{margin-right:5px}.google-visualization-clickeditor-context-icon{position:absolute;right:10px;padding:0 5px;top:2px}.jfk-button.jfk-button-disabled.google-visualization-clickeditor-resize,.jfk-button.jfk-button-disabled.google-visualization-clickeditor-fit-area{background:#f5f5f5}.google-visualization-clickeditor-resize,.google-visualization-clickeditor-fit-area{height:24px;line-height:24px;border-color:transparent;margin-right:2px}.google-visualization-clickeditor-resize .docs-icon,.google-visualization-clickeditor-fit-area .docs-icon{margin-top:-3px;filter:alpha(opacity=60);opacity:0.6}.google-visualization-clickeditor-resize-text,.google-visualization-clickeditor-fit-area-text{font-size:11px;font-weight:bold;color:#555;margin:0 5px}.google-visualization-resizer-overlay{position:absolute;visibility:hidden}.google-visualization-resizer-bar{background:url("//ssl.gstatic.com/charts/static/stripes.png") #ffffff;position:absolute;opacity:0.1;visibility:visible;width:100%;height:100%}.google-visualization-resizer-bar:hover{opacity:0.2}.google-visualization-resizer-bar-center{height:100%;width:100%;cursor:crosshair;position:absolute;top:0}.google-visualization-resizer-bar-north{height:10px;cursor:n-resize;top:0}.google-visualization-resizer-bar-south{height:10px;cursor:s-resize;position:absolute;bottom:0}.google-visualization-resizer-bar-east{width:10px;cursor:e-resize;position:absolute;right:0}.google-visualization-resizer-bar-west{width:10px;cursor:w-resize;position:absolute;left:0}.google-visualization-charteditor-dialog{height:508px;width:917px}.google-visualization-charteditor-dialog .modal-dialog-title{font-family:Arial,sans-serif}#google-visualization-charteditor-layout-table,.google-visualization-charteditor-custom-panel,#google-visualization-clickeditor,.google-visualization-charteditor-menu{color:#222;font-family:Arial,sans-serif;font-size:12px}.google-visualization-charteditor-small-input,.google-visualization-charteditor-mid-input,.google-visualization-charteditor-input{-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;border:1px solid #d9d9d9;border-top:1px solid silver;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;font-size:13px;height:16px;padding:5px 2px}.google-visualization-charteditor-dialog .goog-flat-menu-button-dropdown,.google-visualization-clickeditor-bubble .goog-flat-menu-button-dropdown,.google-visualization-charteditor-custom-panel .goog-flat-menu-button-dropdown{background:url(//ssl.gstatic.com/ui/v1/disclosure/small-grey-disclosure-arrow-down.png) center no-repeat;border-width:0;height:7px;opacity:0.8;position:absolute;top:10px;width:5px}.google-visualization-charteditor-dialog .goog-flat-menu-button,.google-visualization-clickeditor-bubble .goog-flat-menu-button,.google-visualization-charteditor-custom-panel .goog-flat-menu-button{height:14px;line-height:normal;margin:0 0 0 5px;min-width:0;padding:6px 0 6px 6px;text-align:left}#google-visualization-clickeditor .goog-flat-menu-button{min-width:34px}#google-visualization-charteditor-series-select-div.goog-flat-menu-button,#google-visualization-charteditor-axes-select-div.goog-flat-menu-button{margin:0;width:100%}#google-visualization-charteditor-select-legend-position{margin-left:0}.google-visualization-charteditor-axis-select-scale.goog-select{margin-left:0;margin-right:36px}#google-visualization-charteditor-select-legend-position .goog-flat-menu-button-caption{width:74px}#google-visualization-charteditor-layout-table,#google-visualization-clickeditor,.google-visualization-charteditor-custom-panel{border:0;font-size:12px;margin:0;padding:0}.google-visualization-charteditor-settings-td,.google-visualization-charteditor-custom-panel{overflow:hidden;padding:0 0 0 4px;position:relative;left:-4px;vertical-align:top;width:288px}.google-visualization-charteditor-custom-panel{height:420px;line-height:1.4em}.google-visualization-charteditor-preview-td{height:411px;left:346px;overflow:hidden;padding:0 0 0 6px;position:absolute;top:81px;vertical-align:top;width:602px}#google-visualization-charteditor-preview-example-template{color:#15c}#google-visualization-charteditor-help-link{color:#1111cc;float:right;font-size:12px;font-weight:normal}.google-visualization-charteditor-dialog-spinner-div{height:370px;position:relative;text-align:center}.google-visualization-charteditor-dialog-spinner{background:url('//ssl.gstatic.com/docs/spreadsheets/spinner.gif') no-repeat;height:20px;position:relative;top:155px;width:20px}#google-visualization-charteditor-panel-wrapper{float:left;height:373px;width:300px}#google-visualization-charteditor-preview-div-wrapper{border:1px solid #e4e4e4;padding:0;position:relative;top:8px}#google-visualization-charteditor-preview-div-chart{overflow:hidden}.google-visualization-charteditor-panel{height:100%;width:100%}.google-visualization-charteditor-panel-scroll{overflow:auto;position:relative}.google-visualization-charteditor-panel .goog-menu-button{cursor:default}#google-visualization-charteditor-custom-data-input{position:relative}#google-visualization-charteditor-custom-data-input .sites-gviz-datasource-control{outline:none}#google-visualization-charteditor-panel-navigate-div{border-bottom:1px solid #ccc;font-size:13px;line-height:1.5em;margin-bottom:15px;padding:5px 0 0 10px;width:900px}#google-visualization-charteditor-panel-navigate-div.goog-tab-bar{background:none;cursor:default;list-style:none;outline:none}.google-visualization-charteditor-panel-navigation-cell.goog-tab{background:white;border:none;color:#666;cursor:default;padding:3px 10px;position:relative;text-decoration:none}.google-visualization-charteditor-panel-navigation-cell.goog-tab-hover{color:#222;cursor:pointer}.google-visualization-charteditor-panel-navigation-cell.goog-tab-selected{color:#202020;border:1px solid #ccc;border-bottom-color:white;-webkit-border-top-left-radius:2px;-webkit-border-top-right-radius:2px;-moz-border-radius-topleft:2px;-moz-border-radius-topright:2px;border-top-left-radius:2px;border-top-right-radius:2px;cursor:default;font-weight:700;margin-bottom:-1px;text-decoration:none}.google-visualization-charteditor-panel-navigation-cell.goog-tab-selected.goog-tab-hover{cursor:default;text-decoration:none}.google-visualization-charteditor-panel-title{font-size:13px;font-weight:800;padding-bottom:6px;position:relative}.google-visualization-charteditor-section{position:relative}#google-visualization-charteditor-options-panel .google-visualization-charteditor-section{background:white;border:1px solid #e5e5e5;margin-top:-1px;padding:10px 10px 20px;width:260px}.google-visualization-charteditor-multi-section-gap{height:4px}.google-visualization-charteditor-item-gap{height:15px}.google-visualization-charteditor-title-gap{height:10px}.google-visualization-charteditor-multi-section-title{background:whiteSmoke;border:1px #e5e5e5 solid;color:#d14836;display:table;font-size:13px;font-weight:bold;padding:6px 10px;text-align:left;width:260px}.google-visualization-charteditor-multi-section-title-text{display:table-cell;padding-right:7px}.google-visualization-charteditor-multi-section-chooser{display:table-cell;width:100%}.google-visualization-charteditor-section-title{color:#222;font-size:13px;font-weight:normal;padding:5px 0}.google-visualization-charteditor-data-range{color:#222;font-size:13px;font-weight:bold;padding:5px 0}.google-visualization-charteditor-short-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:88px}.google-visualization-charteditor-section>div>table{border:0;border-collapse:collapse;border-spacing:0;margin:0;padding:0;table-layout:fixed;width:250px}.google-visualization-charteditor-section>tbody>tr>td{margin:0;padding:0;vertical-align:top;width:125px}#google-visualization-charteditor-select-series{margin:0!important}.google-visualization-charteditor-select-series-color{height:10px;left:-15px;margin:0;position:relative;top:1px;width:10px}.google-visualization-charteditor-series-color-palette .goog-palette-cell{border-right:1px solid #333}.google-visualization-charteditor-menu-item-global{margin-left:10px}.google-visualization-charteditor-color .goog-flat-menu-button{min-width:38px}.google-visualization-charteditor-color .goog-flat-menu-button-disabled{background-image:none}.google-visualization-charteditor-color .goog-flat-menu-button-disabled .goog-flat-menu-button-dropdown{opacity:0.4}.google-visualization-charteditor-color .goog-flat-menu-button-disabled .goog-flat-menu-button-indicator{opacity:0.5}.google-visualization-charteditor-color .goog-flat-menu-button-indicator{height:14px;margin-left:4px;outline:1px solid #bbb;width:14px}.google-visualization-charteditor-inherit-color{height:25px}.google-visualization-charteditor-inherit-color .jfk-palette-colorswatch{background-color:#f3f3f3!important}.google-visualization-charteditor-inherit-color-header{margin:5px;top:-4px}.google-visualization-charteditor-none-color.goog-option-selected .goog-menuitem-checkbox{border:1px solid transparent;outline:1px solid black}.google-visualization-charteditor-none-color.goog-menuitem{color:#333;font-family:Arial,sans-serif;font-size:12px;padding-left:20px}.google-visualization-charteditor-none-color.goog-option-selected{background-image:none}.google-visualization-charteditor-theme-header.goog-menuheader{color:#333;font-family:Arial,sans-serif;font-size:12px;margin-top:4px;padding:5px 0 0 0}.google-visualization-charteditor-colormenu .jfk-palette-table{margin:3px 0 0 0;padding:0}.google-visualization-charteditor-colormenu.jfk-colormenu{padding:10px}.google-visualization-charteditor-none-color .goog-menuitem-checkbox{background:url(//ssl.gstatic.com/ui/v1/dialog/close-x.png) no-repeat 50% 50%!important;height:13px;margin:0;top:7px;width:13px}.google-visualization-charteditor-color-full .goog-menu-button-caption{padding:0}.google-visualization-charteditor-color-full .goog-menu-button-inner-box{padding:2px!important}.google-visualization-charteditor-link{color:blue;font-weight:bold}.google-visualization-charteditor-link:hover{cursor:pointer;text-decoration:underline}.google-visualization-charteditor-input{width:98%}.google-visualization-charteditor-input-disabled{background-color:#f3f3f3;border:1px solid #dadada;color:#ccc}.google-visualization-charteditor-input-label-disabled{color:#ccc}.google-visualization-charteditor-mid-input{width:138px}.google-visualization-charteditor-glasspane{background-color:#eee;filter:alpha(opacity=0.6);opacity:0.6}.google-visualization-charteditor-help-text{color:#ccc;font-size:12px}#google-visualization-charteditor-data-preview{display:none}#google-visualization-charteditor-data-preview-arrow{background:url(//ssl.gstatic.com/editor/editortoolbar.png) no-repeat -422px center;cursor:default;display:none;height:10px;top:50%;width:10px}.google-visualization-charteditor-data-mismatch{color:#555;font-size:13px;line-height:1em;padding:10px}.google-visualization-charteditor-data-mismatch-header{color:black;font-size:16px;margin-bottom:10px;margin-left:10px}.google-visualization-charteditor-mismatch-icon{background:url("//ssl.gstatic.com/charts/static/alert.png") no-repeat;height:18px;width:20px}#google-visualization-charteditor-preview-mismatch-thumbnail{float:right;height:68px;margin:0 0 0 2px;width:110px}.google-visualization-charteditor-tooltip{font-family:Arial,sans-serif}.google-visualization-charteditor-link{color:#333;font-weight:normal;text-decoration:none}.google-visualization-charteditor-link:hover{cursor:pointer;text-decoration:underline}.google-visualization-charteditor-checkbox{cursor:default;display:inline-block;margin:2px 2px 2px 0;overflow:hidden;padding:0;position:relative;white-space:nowrap}.google-visualization-charteditor-checkbox-container .google-visualization-charteditor-checkbox{width:120px}.google-visualization-charteditor-combobox.google-visualization-charteditor-combobox-closed{background-color:whiteSmoke;background-image:-webkit-linear-gradient(top,whiteSmoke,#f1f1f1);background-image:-moz-linear-gradient(top,whiteSmoke,#f1f1f1);background-image:-ms-linear-gradient(top,whiteSmoke,#f1f1f1);background-image:-o-linear-gradient(top,whiteSmoke,#f1f1f1);background-image:linear-gradient(top,whiteSmoke,#f1f1f1);border:1px solid gainsboro;border:1px solid rgba(0,0,0,0.1)}.google-visualization-charteditor-combobox.google-visualization-charteditor-combobox-disabled{background-color:white;border:1px solid #f2f2f2;opacity:1}.google-visualization-charteditor-combobox .goog-toolbar-combo-button-input{padding:0 0 0 3px;position:relative;width:28px}.google-visualization-charteditor-combobox-disabled .goog-toolbar-combo-button-input{color:#b8b8b8}.google-visualization-charteditor-combobox-disabled .goog-toolbar-combo-button-dropdown{opacity:0.4}.google-visualization-charteditor-combobox.goog-toolbar-combo-button{margin-left:4px;padding:1px 0;top:auto}.google-visualization-charteditor-checkbox-disabled{color:#666}.google-visualization-charteditor-checkbox .goog-checkbox{cursor:default}.google-visualization-charteditor-toggle{min-width:24px;margin:0}.google-visualization-charteditor-toggle.jfk-button{height:26px;line-height:24px;padding:0;z-index:auto}.google-visualization-charteditor-toggle-disabled{opacity:0.3}.google-visualization-charteditor-toggle-bold-content{background:url(//ssl.gstatic.com/docs/common/jfk_sprite40.png) -23px -466px no-repeat;height:16px;top:2px;width:16px}.google-visualization-charteditor-toggle-italic-content{background:url(//ssl.gstatic.com/docs/common/jfk_sprite40.png) -2px -2176px no-repeat;height:16px;top:2px;width:16px}.google-visualization-charteditor-name-input{border:1px solid transparent;color:#202020;font-family:Arial,sans-serif;font-size:13px;font-weight:800;height:14px;padding:4px;width:400px}.google-visualization-charteditor-name-input.google-visualization-charteditor-help-text{color:#666;font-weight:normal}.google-visualization-charteditor-name-input:hover,.google-visualization-charteditor-name-input:focus{border:1px solid #e4e4e4}.google-visualization-charteditor-small-input{width:118px}.google-visualization-charteditor-chart-img-div{border:1px solid #ddd;margin-top:5px;padding:2px;text-align:center;width:45px}.google-visualization-charteditor-chart-type-table{background-color:#f6f6f6;width:100%}.google-visualization-charteditor-type-select-button .goog-custom-button-inner-box{border-width:1px;margin:0;padding:1px;vertical-align:middle}.google-visualization-charteditor-type-select-button .goog-custom-button-outer-box{border-width:1px;margin:0;padding:0.5px;vertical-align:middle}.google-visualization-charteditor-type-select-label{border:0;font-size:10px;height:10px;margin:0;margin-top:-4px;padding:0;text-align:center;vertical-align:text-top}.google-visualization-charteditor-thumbnail .jfk-radiobutton-radio{-webkit-border-radius:0px;-moz-border-radius:0px;border-radius:0px;border:none;left:0;margin:0;position:static;top:0}.google-visualization-charteditor-thumbnail .jfk-radiobutton-radio::after{content:none}.google-visualization-charteditor-thumbnail.jfk-radiobutton{border:4px solid #ddd;display:block;margin:4px 12px 8px 0;padding:0px;height:68px;width:110px}.google-visualization-charteditor-thumbnail.jfk-radiobutton-checked{border:4px solid #6688ee;height:68px;outline-color:#fff;width:110px}.google-visualization-charteditor-thumbnail:focus{border:4px solid #c1d9ff;cursor:pointer}.google-visualization-charteditor-thumbnail.jfk-radiobutton-checked:focus{border:4px solid #6688ee}#google-visualization-charteditor-chart-type-categories{border-right:2px dotted #dcdcdc;float:left;width:105px}#google-visualization-charteditor-chart-type-categories.goog-tab-bar{background:none;cursor:default;list-style:none;outline:none}.google-visualization-charteditor-category.goog-tab{background:white;border:none;cursor:default;font-weight:normal;height:25px;margin-bottom:5px;padding:2px 0;position:relative;text-decoration:none}.google-visualization-charteditor-category.goog-tab-hover{cursor:pointer;background-color:#f2f2f2}.google-visualization-charteditor-category.goog-tab-hover .google-visualization-charteditor-category-label{text-decoration:underline}.google-visualization-charteditor-category.goog-tab-selected{background-color:#ddd!important;font-weight:bold}.google-visualization-charteditor-category.goog-tab-selected.goog-tab-hover{cursor:default;background-color:#ddd}.google-visualization-charteditor-category.goog-tab-selected.goog-tab-hover .google-visualization-charteditor-category-label{text-decoration:none}.google-visualization-charteditor-category-label{color:#666;font-size:13px;font-family:Arial,sans-serif;margin-left:15px;position:relative;top:-7px}.google-visualization-charteditor-category-label{text-decoration:inherit}.google-visualization-charteditor-mini{margin:2px}.google-visualization-charteditor-chart-type-subtypes{display:block;height:100%;overflow-y:scroll;max-height:372px}#google-visualization-charteditor-chart-type-subtypes{float:right;width:155px}.google-visualization-charteditor-combobox-icon{height:12px;left:9px;position:absolute;top:7px;width:12px}.google-visualization-charteditor-horizontal-menu{padding:1px 5px 5px 5px}.google-visualization-charteditor-float-start{float:left}.google-visualization-charteditor-float-end{float:right}.google-visualization-charteditor-float-clear{clear:both}.google-visualization-charteditor-align-end{text-align:right}.google-visualization-charteditor-align-start{text-align:left}.google-visualization-charteditor-display-none{display:none}.annotationsdiv .goog-custom-button-outer-box,.annotationsdiv .goog-custom-button-inner-box{border:0;margin:0;padding:0}.google-visualization-charteditor-mini-area{background:no-repeat url("//ssl.gstatic.com/charts/static/mini3.png") 0 -105px;width:21px;height:21px}.google-visualization-charteditor-mini-bar{background:no-repeat url("//ssl.gstatic.com/charts/static/mini3.png") 0 -168px;width:21px;height:21px}.google-visualization-charteditor-mini-column{background:no-repeat url("//ssl.gstatic.com/charts/static/mini3.png") 0 0;width:21px;height:21px}.google-visualization-charteditor-mini-combo{background:no-repeat url("//ssl.gstatic.com/charts/static/mini3.png") 0 -42px;width:21px;height:21px}.google-visualization-charteditor-mini-line{background:no-repeat url("//ssl.gstatic.com/charts/static/mini3.png") 0 -126px;width:21px;height:21px}.google-visualization-charteditor-mini-map{background:no-repeat url("//ssl.gstatic.com/charts/static/mini3.png") 0 -21px;width:21px;height:21px}.google-visualization-charteditor-mini-more{background:no-repeat url("//ssl.gstatic.com/charts/static/mini3.png") 0 -63px;width:21px;height:21px}.google-visualization-charteditor-mini-pie{background:no-repeat url("//ssl.gstatic.com/charts/static/mini3.png") 0 -84px;width:21px;height:21px}.google-visualization-charteditor-mini-scatter{background:no-repeat url("//ssl.gstatic.com/charts/static/mini3.png") 0 -147px;width:21px;height:21px}.google-visualization-charteditor-mini-step{background:no-repeat url("//ssl.gstatic.com/charts/static/mini3.png") 0 -210px;width:21px;height:21px}.google-visualization-charteditor-mini-trend{background:no-repeat url("//ssl.gstatic.com/charts/static/mini3.png") 0 -189px;width:21px;height:21px}.google-visualization-charteditor-mini-histogram{background:no-repeat url("//ssl.gstatic.com/charts/static/mini3.png") 0 -231px;width:21px;height:21px}.google-visualization-charteditor-thumbs-annotatedtimeline-disabled{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -612px;width:110px;height:68px}.google-visualization-charteditor-thumbs-annotatedtimeline{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -2507px;width:110px;height:68px}.google-visualization-charteditor-thumbs-areachart-disabled{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -3391px;width:110px;height:68px}.google-visualization-charteditor-thumbs-areachart{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -2779px;width:110px;height:68px}.google-visualization-charteditor-thumbs-areachart-stacked-disabled{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -408px;width:110px;height:68px}.google-visualization-charteditor-thumbs-areachart-stacked{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -2031px;width:110px;height:68px}.google-visualization-charteditor-thumbs-barchart-disabled{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -4124px;width:110px;height:68px}.google-visualization-charteditor-thumbs-barchart{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -3187px;width:110px;height:68px}.google-visualization-charteditor-thumbs-barchart-stacked-disabled{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -3527px;width:110px;height:68px}.google-visualization-charteditor-thumbs-barchart-stacked{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -816px;width:110px;height:68px}.google-visualization-charteditor-thumbs-bubblechart-disabled{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -136px;width:110px;height:68px}.google-visualization-charteditor-thumbs-bubblechart{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -1020px;width:110px;height:68px}.google-visualization-charteditor-thumbs-candlestickchart-disabled{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -1156px;width:110px;height:68px}.google-visualization-charteditor-thumbs-candlestickchart{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -3255px;width:110px;height:68px}.google-visualization-charteditor-thumbs-columnchart-disabled{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -3784px;width:110px;height:68px}.google-visualization-charteditor-thumbs-columnchart{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -2099px;width:110px;height:68px}.google-visualization-charteditor-thumbs-columnchart-stacked-disabled{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -2983px;width:110px;height:68px}.google-visualization-charteditor-thumbs-columnchart-stacked{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -1088px;width:110px;height:68px}.google-visualization-charteditor-thumbs-combochart-disabled{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -340px;width:110px;height:68px}.google-visualization-charteditor-thumbs-combochart{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 0;width:110px;height:68px}.google-visualization-charteditor-thumbs-donutchart-disabled{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -1360px;width:110px;height:68px}.google-visualization-charteditor-thumbs-donutchart{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -2371px;width:110px;height:68px}.google-visualization-charteditor-thumbs-gauge-disabled{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -1496px;width:110px;height:68px}.google-visualization-charteditor-thumbs-gauge{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -476px;width:110px;height:68px}.google-visualization-charteditor-thumbs-geochart-disabled{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -2575px;width:110px;height:68px}.google-visualization-charteditor-thumbs-geochart-markers-disabled{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -68px;width:110px;height:68px}.google-visualization-charteditor-thumbs-geochart-markers{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -2439px;width:110px;height:68px}.google-visualization-charteditor-thumbs-geochart{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -4192px;width:110px;height:68px}.google-visualization-charteditor-thumbs-histogram-disabled{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -3323px;width:110px;height:68px}.google-visualization-charteditor-thumbs-histogram{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -1564px;width:110px;height:68px}.google-visualization-charteditor-thumbs-imageradarchart-disabled{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -3051px;width:110px;height:68px}.google-visualization-charteditor-thumbs-imageradarchart{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -2235px;width:110px;height:68px}.google-visualization-charteditor-thumbs-imagesparkline-disabled{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -2643px;width:110px;height:68px}.google-visualization-charteditor-thumbs-imagesparkline{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -2167px;width:110px;height:68px}.google-visualization-charteditor-thumbs-linechart-disabled{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -1632px;width:110px;height:68px}.google-visualization-charteditor-thumbs-linechart{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -544px;width:110px;height:68px}.google-visualization-charteditor-thumbs-linechart-smooth-disabled{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -1963px;width:110px;height:68px}.google-visualization-charteditor-thumbs-linechart-smooth{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -3119px;width:110px;height:68px}.google-visualization-charteditor-thumbs-map-disabled{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -4056px;width:110px;height:68px}.google-visualization-charteditor-thumbs-map-normal{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -1904px;width:100px;height:59px}.google-visualization-charteditor-thumbs-map{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -1292px;width:110px;height:68px}.google-visualization-charteditor-thumbs-map-satellite{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -3595px;width:100px;height:60px}.google-visualization-charteditor-thumbs-map-street-disabled{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -2915px;width:110px;height:68px}.google-visualization-charteditor-thumbs-map-street{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -680px;width:110px;height:68px}.google-visualization-charteditor-thumbs-map-terrain{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -3723px;width:100px;height:61px}.google-visualization-charteditor-thumbs-motionchart-disabled{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -2711px;width:110px;height:68px}.google-visualization-charteditor-thumbs-motionchart{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -1836px;width:110px;height:68px}.google-visualization-charteditor-thumbs-orgchart-disabled{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -884px;width:110px;height:68px}.google-visualization-charteditor-thumbs-orgchart{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -1428px;width:110px;height:68px}.google-visualization-charteditor-thumbs-piechart-3d-disabled{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -952px;width:110px;height:68px}.google-visualization-charteditor-thumbs-piechart-3d{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -3655px;width:110px;height:68px}.google-visualization-charteditor-thumbs-piechart-disabled{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -2303px;width:110px;height:68px}.google-visualization-charteditor-thumbs-piechart{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -3852px;width:110px;height:68px}.google-visualization-charteditor-thumbs-scatterchart-disabled{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -272px;width:110px;height:68px}.google-visualization-charteditor-thumbs-scatterchart{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -3988px;width:110px;height:68px}.google-visualization-charteditor-thumbs-steppedareachart-disabled{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -2847px;width:110px;height:68px}.google-visualization-charteditor-thumbs-steppedareachart{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -3920px;width:110px;height:68px}.google-visualization-charteditor-thumbs-table-disabled{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -1768px;width:110px;height:68px}.google-visualization-charteditor-thumbs-table{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -204px;width:110px;height:68px}.google-visualization-charteditor-thumbs-timeline-disabled{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -1224px;width:110px;height:68px}.google-visualization-charteditor-thumbs-timeline{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -3459px;width:110px;height:68px}.google-visualization-charteditor-thumbs-treemap-disabled{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -1700px;width:110px;height:68px}.google-visualization-charteditor-thumbs-treemap{background:no-repeat url("//ssl.gstatic.com/charts/static/thumbs18.png") 0 -748px;width:110px;height:68px}.google-visualization-atl.container{}.google-visualization-atl .border{border:1px solid #808080;background-color:#ffffff}.google-visualization-atl .containerTable{display:table;table-layout:fixed;width:100%;height:100%;border:0;padding:0}.google-visualization-atl .containerTableRow{display:table-row}.google-visualization-atl .containerTable .td{display:table-cell;vertical-align:top;padding:0}.google-visualization-atl .chartTdContainer{}.google-visualization-atl .outerChartContainer{overflow:hidden}.google-visualization-atl .chartControls{display:table;border-spacing:0;border-collapse:collapse;height:auto;width:100%;white-space:nowrap}.google-visualization-atl .chartControls.twoRows{height:41px}.google-visualization-atl .zoomControls{display:table-cell;padding:4px 7px 1px;font-size:10px;white-space:nowrap;overflow:hidden}.google-visualization-atl .zoomControls button.zoomButton{margin-right:0.33em}.google-visualization-atl button{padding:0 2px;font-size:9px;line-height:10px}.google-visualization-atl .legend{display:table-cell;padding:4px 7px 1px;font-size:10px;text-align:right;white-space:nowrap;overflow:hidden}.google-visualization-atl .legend-dot{display:inline-block;height:8px;width:8px;border-radius:4px;margin-right:2px;-webkit-box-shadow:0px 0px 1px 1px rgba(206,206,195,0.75);-moz-box-shadow:0px 0px 1px 1px rgba(206,206,195,0.75);box-shadow:0px 0px 1px 1px rgba(206,206,195,0.75)}.google-visualization-atl .rangeControl{overflow:hidden}.google-visualization-atl .annotationsTdContainer{height:0;border-left:1px solid #808080}.google-visualization-atl .annotationsFilterContainer{padding:4px;font-size:10px;white-space:nowrap;overflow:hidden}.google-visualization-atl .annotationsFilterContainer input{font-size:10px;width:15em}.google-visualization-atl .annotationsContainer{}.google-visualization-atl .annotationsContainer .google-visualization-table-tr-head{display:none}.google-visualization-atl .annotationsContainer .google-visualization-table-tr-odd,.google-visualization-atl .annotationsContainer .google-visualization-table-tr-odd td{background:none}.google-visualization-atl .annotationsContainer .google-visualization-table-tr-even,.google-visualization-atl .annotationsContainer .google-visualization-table-tr-even td{background:none}.google-visualization-atl .annotationsContainer .google-visualization-table-tr-sel,.google-visualization-atl .annotationsContainer .google-visualization-table-tr-sel td{background-color:#eeeeee}.google-visualization-atl .annotationsContainer .google-visualization-table-td{border-width:0;border-bottom-width:1px;vertical-align:top;font-size:0.75em}.google-visualization-atl .annotationsContainer .title{font-weight:bold}.google-visualization-atl .annotationsContainer .date{color:#666666;font-size:0.75em;white-space:nowrap}.google-visualization-table{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;display:inline-block;vertical-align:bottom}.google-visualization-table *{-moz-box-sizing:inherit;-webkit-box-sizing:inherit;box-sizing:inherit}.google-visualization-table>div:first-child{border:solid #eee;border-width:0}.google-visualization-table>div:first-child.scrolling .google-visualization-table-table th,.google-visualization-table>div:first-child.scrolling .google-visualization-table-table .frozen-column{visibility:hidden;opacity:0;color:transparent}.google-visualization-table>div:first-child.doneScrolling .google-visualization-table-table th{-webkit-transition:opacity .25s ease-in .1s;-o-transition:opacity .25s ease-in .1s;transition:opacity 0.25s ease-in 0.1s}.google-visualization-table>div:first-child.doneScrolling .google-visualization-table-table .frozen-column{-webkit-transition:visibility,opacity .15s ease-in .15s;-o-transition:visibility,opacity .15s ease-in .15s;transition:visibility,opacity 0.15s ease-in 0.15s}.google-visualization-table-table{font-family:arial,helvetica;font-size:10pt;cursor:default;margin:0;background:white;border-spacing:0;border-collapse:separate}.google-visualization-table-table *{margin:0}.google-visualization-table .gradient{background-image:url("//ssl.gstatic.com/charts/static/table-title-bg.gif") repeat-x left bottom;background-image:-moz-linear-gradient(top,rgba(255,255,255,0.8) 0%,rgba(255,255,255,0.7) 30%,rgba(255,255,255,0.5) 60%,rgba(255,255,255,0) 100%);background-image:-webkit-linear-gradient(top,rgba(255,255,255,0.8) 0%,rgba(255,255,255,0.7) 30%,rgba(255,255,255,0.5) 60%,rgba(255,255,255,0) 100%);background-image:-o-linear-gradient(top,rgba(255,255,255,0.8) 0%,rgba(255,255,255,0.7) 30%,rgba(255,255,255,0.5) 60%,rgba(255,255,255,0) 100%);background-image:-ms-linear-gradient(top,rgba(255,255,255,0.8) 0%,rgba(255,255,255,0.7) 30%,rgba(255,255,255,0.5) 60%,rgba(255,255,255,0) 100%);background-image:linear-gradient(to bottom,rgba(255,255,255,0.8) 0%,rgba(255,255,255,0.7) 30%,rgba(255,255,255,0.5) 60%,rgba(255,255,255,0) 100%)}.google-visualization-table-tr-head{background-color:rgb(228,233,244);font-weight:bold;text-align:center}.google-visualization-table-sorthdr{cursor:pointer}.google-visualization-table-sortind{color:#ccc;padding-left:4px}.unsorted .google-visualization-table-sortind{display:none}.unsorted .google-visualization-table-sortind:after{content:"\002003"}.sort-ascending .google-visualization-table-sortind:after{content:"\0025b2"}.sort-descending .google-visualization-table-sortind:after{content:"\0025bc"}.google-visualization-table-th{cursor:pointer;white-space:nowrap}.google-visualization-table-td{overflow:hidden}.google-visualization-table-th,.google-visualization-table-td{padding:2px 0.35em;background-color:inherit;background-clip:padding-box}.google-visualization-table-table td,.google-visualization-table-table th{border:solid #eee;border-width:0 1px 1px 0;padding:2px 0.35em}.google-visualization-table-table th{position:relative;z-index:10}.google-visualization-table-table td.frozen-column{position:relative;z-index:5}.google-visualization-table-table thead th.frozen-column{z-index:15}.google-visualization-table-table .last-frozen-column{border-right:2px ridge #eee}.google-visualization-table-tr-even{background-color:#fff}.google-visualization-table-tr-odd{background-color:#fafafa}.google-visualization-table-tr-sel{background-color:#d6e9f8}.google-visualization-table-tr-over{background-color:#e7e9f9}.google-visualization-table-td.google-visualization-table-type-bool{text-align:center;font-family:"Arial Unicode MS",Arial,Helvetica}.google-visualization-table-td.google-visualization-table-type-date{text-align:center}.google-visualization-table-td.google-visualization-table-type-number{text-align:right;white-space:nowrap}.google-visualization-table-seq{text-align:right;color:#666}.google-visualization-table-div-page{display:inline-block;width:100%;padding:1px 0 0 1px;border:0;background-color:rgb(228,233,244);font-family:Arial,sans-serif}.google-visualization-table-div-page [role="button"]{display:inline-block;cursor:pointer;margin-top:2px;margin-bottom:2px;font-family:"Arial Unicode MS",Arial,Helvetica;font-size:10px;line-height:10px}.google-visualization-table-div-page [role="button"] .goog-custom-button-inner-box{padding:1px 1px 2px 1px}.google-visualization-table-page-prev,.google-visualization-table-page-next{}.google-visualization-table-page-prev:before{content:"\0025c4"}.google-visualization-table-page-next:before{content:"\0025ba"}.google-visualization-table-page-numbers{display:inline-block;zoom:1;margin:0;vertical-align:middle}.ie8 .google-visualization-table-page-numbers{display:inline}.google-visualization-table-page-number{display:inline-block;background-color:rgb(228,233,244);border:1px ButtonShadow outset;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;color:black;font-size:10px;min-width:10px;margin:2px;padding:0 2px;text-align:center;text-decoration:none;vertical-align:middle}.google-visualization-table-page-number.current{font-weight:bold;font-size:11px;background:#fefefe;border-style:inset}.google-visualization-table-page-number:hover{background:#fefefe;border-style:inset}.google-visualization-table .transparent{background-image:none;background-color:transparent;border-color:transparent}.google-visualization-table .transparentIE6{background:none}.google-visualization-table th .transparent,.google-visualization-table td .transparent{color:transparent;opacity:0}.google-visualization-table .google-visualization-hidden{visibility:hidden;pointer-events:none}.google-visualization-table-loadtest{padding-left:6px}.google-visualization-sparkline-default{background-color:#ffffff;border-spacing:0px;font-size:small;color:gray}.google-visualization-sparkline-selected{background-color:#d6e9f8;padding:1px;border-spacing:0px;font-size:small;color:gray}.google-visualization-sparkline-over{background-color:#e7e9f9;padding:1px;border-spacing:0px;font-size:small;color:gray}.google-visualization-sparkline-image{display:block}.google-visualization-orgchart-table{border:0;text-align:center}.google-visualization-orgchart-table *{margin:0;padding:2px}.google-visualization-orgchart-space-small{width:4px;height:1px;border:0}.google-visualization-orgchart-space-medium{width:10px;height:1px;border:0}.google-visualization-orgchart-space-large{width:16px;height:1px;border:0}.google-visualization-orgchart-noderow-small{height:12px;border:0}.google-visualization-orgchart-noderow-medium{height:30px;border:0}.google-visualization-orgchart-noderow-large{height:46px;border:0}.google-visualization-orgchart-connrow-small{height:2px;font-size:1px}.google-visualization-orgchart-connrow-medium{height:6px;font-size:4px}.google-visualization-orgchart-connrow-large{height:10px;font-size:8px}.google-visualization-orgchart-node{text-align:center;vertical-align:middle;font-family:arial,helvetica;cursor:default;border:2px solid #b5d9ea;-moz-border-radius:5px;-webkit-border-radius:5px;-webkit-box-shadow:rgba(0,0,0,0.5) 3px 3px 3px;-moz-box-shadow:rgba(0,0,0,0.5) 3px 3px 3px;background-color:#edf7ff;background:-webkit-gradient(linear,left top,left bottom,from(#edf7ff),to(#cde7ee))}.google-visualization-orgchart-nodesel{border:2px solid #e3ca4b;background-color:#fff7ae;background:-webkit-gradient(linear,left top,left bottom,from(#fff7ae),to(#eee79e))}.google-visualization-orgchart-node-small{font-size:0.6em}.google-visualization-orgchart-node-medium{font-size:0.8em}.google-visualization-orgchart-node-large{font-size:1.2em;font-weight:bold}.google-visualization-orgchart-linenode{border:0}.google-visualization-orgchart-lineleft{border-left:1px solid #3388dd}.google-visualization-orgchart-lineright{border-right:1px solid #3388dd}.google-visualization-orgchart-linebottom{border-bottom:1px solid #3388dd}.waffle-charteditor-chart-area-resizer .docs-squarehandleselectionbox-border{transition:opacity 250ms cubic-bezier(0.4,0.0,1,1);border:1px solid #9e9e9e;opacity:0}.waffle-charteditor-chart-area-resizer .docs-squarehandleselectionbox-handle{transition:opacity 250ms cubic-bezier(0.4,0.0,1,1);background:#fff;border:1px solid #9e9e9e;opacity:0}.waffle-charteditor-chart-area-resizer:hover .docs-squarehandleselectionbox-border,.waffle-charteditor-chart-area-resizer:hover .docs-squarehandleselectionbox-handle,.waffle-charteditor-chart-area-resizer-active .docs-squarehandleselectionbox-border,.waffle-charteditor-chart-area-resizer-active .docs-squarehandleselectionbox-handle,.waffle-charteditor-chart-area-resizer-dragging .docs-squarehandleselectionbox-border,.waffle-charteditor-chart-area-resizer-dragging .docs-squarehandleselectionbox-handle{opacity:1}.waffle-charteditor-edit-context-menu{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif}.waffle-charteditor-edit-context-menu .goog-menuitem{padding-left:30px;padding-right:110px}.waffle-charteditor-edit-context-menu-header{color:rgba(0,0,0,0.38);font-weight:bold;padding:2px 8px 6px 8px;text-transform:uppercase}.waffle-charteditor-edit-context-menu-submenu-label{float:left}.waffle-charteditor-select-to-zoom{background-color:rgba(0,0,255,0.1);border:1px dashed #9e9e9e;position:absolute}.waffle-charteditor-text-edit-overlay{background-color:#fff;border:1px solid #44a3fa;cursor:text;color:rgba(0,0,0,0.54);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:16px;line-height:1;outline:3px solid rgba(68,163,250,.3);outline-offset:0;position:absolute;resize:none;z-index:1}.waffle-charteditor-text-edit-overlay-vertical{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg);-webkit-transform-origin:top left;-moz-transform-origin:top left;-ms-transform-origin:top left;-o-transform-origin:top left;transform-origin:top left}.docs-ui-toast.waffle-charts-customizable-toast{bottom:10px;left:10px;position:absolute}.waffle-charts-switching-chart-component-gviz-backed{background:white}.waffle-dataconnector-dbrecord-projection-column-selection-type-buttons{margin-top:12px}.waffle-dataconnector-dbrecord-projection-column-selection-type-buttons .jfk-radiobutton{margin-left:16px;padding:0}.waffle-dataconnector-dbrecord-projection-column-selection-type-buttons .jfk-radiobutton-label{color:#202124;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;letter-spacing:0.2px;line-height:20px;margin-left:32px;text-decoration-line:none}.waffle-dataconnector-dbrecord-projection-column-selection-type-buttons .jfk-radiobutton-radio{left:0;height:20px;width:20px;top:0}.waffle-dataconnector-dbrecord-projection-column-selection-type-buttons .jfk-radiobutton-checked .jfk-radiobutton-radio::after{height:10px;margin:3px;width:10px}.waffle-dataconnector-dbrecord-projection-column-selection-type-sync-all-helper{color:#5f6368;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;letter-spacing:0.3px;line-height:16px;margin:8px 16px 16px 48px;max-width:200px}.waffle-dataconnector-dbrecord-projection-column-selection-type .goog-menu-filter{margin-left:48px;max-width:184px}.waffle-dataconnector-dbrecord-projection-column-selection-type .waffle-dbsource-column-filtered-menu-select-all-and-clear{margin-left:48px}.waffle-dataconnector-dbrecord-projection-column-selection-type .goog-menu-content{margin-left:16px;margin-bottom:8px}.waffle-dataconnector-dbrecord-projection-column-selection-type .waffle-dbsource-column-filtered-menu-item-icon{margin-left:28px}.waffle-dataconnector-dbrecord-projection-column-selection-type .goog-menuitem .goog-menuitem-content{margin-left:24px}.waffle-dbsource-column-filtered-menu.waffle-dataconnector-dbrecord-projection-column-selection-type .goog-menuitem.goog-option-selected{background-position:left center}.waffle-sidebar-container.waffle-filter-by-value-sidebar{width:460px}.waffle-filter-by-value-sidebar-footer-button-bar{border-top:1px solid #dadce0;display:flex;justify-content:flex-end;padding:16px 0}.waffle-filter-by-value-sidebar .waffle-sidebar-footer-container{background-color:white}.waffle-filter-by-value-cancel-button-wrapper{margin-right:4px}.waffle-filter-by-value-ok-button-wrapper{margin-right:12px}.waffle-filter-by-value-menu .goog-menu,.waffle-filter-by-value-additional-values-menu .goog-menu{position:relative;width:100%}.waffle-filter-by-value-item-value{left:90px;position:absolute}.waffle-filter-by-value-sidebar .waffle-filter-by-value-search-container .waffle-filter-by-value-search-input{border:none;width:100%}.waffle-filter-by-value-search-container{border-bottom:1px solid #dadce0}.waffle-filter-by-value-additional-values-menu-item{font-size:14px;font-weight:bold}.waffle-filter-by-value-separator{border-left:1px solid #dadce0;height:20px;margin-right:16px}.waffle-dataconnector-dbrecord-sidebar-widget{padding:20px 16px 0}.waffle-dataconnector-dbrecord-sidebar-widget-header{display:flex;align-items:center;justify-content:space-between}.waffle-dataconnector-dbrecord-sidebar-widget-header-label{color:#202124;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;line-height:40px}.waffle-dataconnector-dbrecord-sidebar .docs-charts-editor-material-textbutton.docs-material:focus{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#e7f5eb;border:1px solid #bbe2c6!important;height:24px;padding:3px 12px 5px}.waffle-dataconnector-dbrecord-sidebar-sort-widget-chip,.waffle-dataconnector-dbrecord-sidebar-projection-widget-chip{margin-top:8px}.waffle-dataconnector-dbrecord-sidebar-sort-widget-chip .docs-charts-editor-chip-content,.waffle-dataconnector-dbrecord-sidebar-projection-widget-chip .docs-charts-editor-chip-content{display:flex;align-items:center}.waffle-dataconnector-dbrecord-sidebar-projection-widget-chip .docs-charts-editor-chip-content,.waffle-dataconnector-dbrecord-sidebar-projection-widget-chip .docs-charts-editor-chip-label,.waffle-dataconnector-dbrecord-sidebar-sort-widget-chip .docs-charts-editor-chip-content,.waffle-dataconnector-dbrecord-sidebar-sort-widget-chip .docs-charts-editor-chip-label{cursor:move}.waffle-dataconnector-dbrecord-chip-nodrag .docs-charts-editor-chip-content,.waffle-dataconnector-dbrecord-chip-nodrag .docs-charts-editor-chip-label,.waffle-dataconnector-dbrecord-chip-nodrag{cursor:default}.waffle-dataconnector-dbrecord-sidebar-sort-widget-chip-icon,.waffle-dataconnector-dbrecord-sidebar-projection-widget-chip-icon{margin-left:15px}.waffle-dataconnector-dbrecord-sidebar .waffle-dbsource-table-icon{height:24px;width:24px}.waffle-dataconnector-dbrecord-sidebar-filter-widget .waffle-filter-filtercard{background-color:#f1f3f4}.waffle-dataconnector-dbrecord-sidebar-filter-widget .waffle-filter-filtercard .waffle-filter-filtercard-delete-button{background-color:#5f6368}.waffle-dataconnector-dbrecord-sidebar-filter-widget .waffle-filter-filtercard .waffle-filter-filtercard-select .jfk-select{width:100%}.waffle-dataconnector-dbrecord-sidebar-truncation-widget-row-limit-label{color:#5f6368;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;padding-bottom:5px}.waffle-dataconnector-dbrecord-sidebar-truncation-widget-repeated-values{align-items:center;display:flex;margin-top:8px}.docs-calendar-select{background-color:#f1f3f4;border-radius:8px;outline:none}.docs-calendar-select-disabled{color:#5f6368;opacity:.38;cursor:default}.docs-calendar-select-outer-box{border-radius:4px;cursor:pointer;padding:8px 6px 8px 8px}.docs-calendar-select-outer-box:active{background-color:#fff;border:1px solid transparent;box-shadow:0 2px 6px 2px rgba(60,64,67,.15)}.docs-calendar-select-hover .docs-calendar-select-outer-box{background-color:rgba(60,64,67,0.04)}.docs-calendar-select-open .docs-calendar-select-outer-box{background-color:rgba(60,64,67,0.04);border:1px solid transparent}.docs-calendar-select-open.docs-calendar-select-hover .docs-calendar-select-outer-box{background-color:rgba(60,64,67,0.04)}.docs-calendar-select-inner-box{align-items:center;display:flex;justify-content:space-between;position:relative;width:100%}.docs-calendar-select-caption{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;color:#202124;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;height:20px;line-height:20px;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.docs-calendar-select-dropdown{align-items:center;display:flex;height:24px;justify-content:center;width:24px}.docs-calendar-select-dropdown-icon{background:no-repeat url(//ssl.gstatic.com/docs/common/material_common_sprite222_grey_medium.svg) -40px -732px;height:18px;width:18px}.docs-calendar-select-open .docs-calendar-select-dropdown-icon{-moz-transform:rotate(180deg);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.waffle-dataconnector-refresh-all-dbobject-item{display:inline-block;height:35px;width:100%}.waffle-dataconnector-refresh-all-dbobject-item-enabled:focus{outline:none}.waffle-dataconnector-refresh-all-dbobject-item-enabled.valid-highlight:hover{background-color:#f1f3f4;border-radius:20px;box-sizing:border-box}.waffle-dataconnector-refresh-all-dbobject-item-enabled.valid-highlight:focus{background-color:#e8eaed;border-radius:20px;box-sizing:border-box;outline:none}.waffle-dataconnector-refresh-all-dbobject-item-enabled.error-highlight:hover{background-color:#fce8e6;border-radius:20px;box-sizing:border-box}.waffle-dataconnector-refresh-all-dbobject-item-enabled.error-highlight:focus{background-color:#fad2cf;border-radius:20px;box-sizing:border-box;outline:none}.waffle-dataconnector-refresh-all-dbobject-item-disabled{color:#80868b;cursor:default}.waffle-dataconnector-refresh-all-dbobject-item-icon-wrapper{float:left;margin-left:16px;margin-right:16px;margin-top:8px}.waffle-dataconnector-refresh-all-dbobject-item-title{color:#3c4043;float:left;font:400 14px/20px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;letter-spacing:0.2px;margin-top:8px}.waffle-dataconnector-refresh-all-dbobject-item-status-wrapper{float:right;font:400 12px/16px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;letter-spacing:0.3px;margin-right:16px;margin-top:8px}.waffle-dataconnector-refresh-all-dbobject-item-timestamp{color:#80868b}.waffle-dataconnector-refresh-all-dbobject-item-loading,.waffle-dataconnector-refresh-all-dbobject-item-running{color:#202124}.waffle-dataconnector-refresh-all-dbobject-item-error{color:#d93025;font-weight:bold}.waffle-dataconnector-refresh-all-dbobject-list-footer-button-wrapper{float:right;margin-right:7px}.waffle-dataconnector-refresh-all-dbobject-list-footer{display:inline-block;margin-bottom:10px;margin-top:10px;width:100%}.waffle-dataconnector-refresh-all-dbobject-list-footer-bytes-wrapper{float:left;margin-left:21px;margin-top:9px}.waffle-dataconnector-refresh-all-dbobject-item-icon-spinner .waffle-spinner{height:18px;width:18px}.waffle-dataconnector-refresh-all-dbobject-item-icon-spinner .waffle-spinner-circle{border-width:2px}.waffle-dataconnector-refresh-sidebar-backdrop{background-color:#000;left:0;position:absolute;top:0;z-index:1002;height:100%;opacity:.6;width:100%}.waffle-dataconnector-refresh-all-dbobject-list-single-datasource-title{font-family:Google Sans;font-size:14px;font-weight:500;letter-spacing:0.25px;overflow:hidden;padding:20px 20px 12px;text-overflow:ellipsis}.waffle-dataconnector-refresh-sidebar-refresh-widget{background-color:#f8f9fa;overflow-x:hidden;overflow-y:auto}.waffle-dataconnector-refresh-all-pane{height:100%}.waffle-dataconnector-refresh-all-datasources-container{bottom:0;height:100%;left:0;position:relative;right:0;top:0}.waffle-dataconnector-refresh-all-datasources-container.waffle-dataconnector-refresh-all-single-datasource-container{background-color:white}.waffle-dataconnector-refresh-all-datasources-container .waffle-dataconnector-refresh-all-dbobject-list-collapsible{border:2px solid transparent}.waffle-dataconnector-refresh-all-datasources-container .waffle-dataconnector-refresh-all-dbobject-list-collapsible.docs-charts-editor-collapsible-opened{box-shadow:0 1px 3px 1px rgba(60,64,67,.15);border:2px solid #fff;border-radius:8px}.waffle-dataconnector-refresh-all-dbobject-list-parent{border-bottom:2px solid #f8f9fa}.waffle-dataconnector-refreshall-highlight-valid::after{background-color:#000000;bottom:0;position:absolute;content:"";left:0;opacity:.2;right:0;top:0}.waffle-dataconnector-refreshall-highlight-error::after{background-color:#f6aea9;bottom:0;position:absolute;content:"";left:0;opacity:.2;right:0;top:0}.waffle-dataconnector-refresh-all-datasources-container .docs-charts-editor-collapsible-opened .docs-charts-editor-collapsible-header .docs-charts-editor-collapsible-title{color:#202124}.waffle-dataconnector-refresh-schedules-new-widget{background-color:#fff;border-top:1px solid #dadce0;bottom:65px;position:absolute;width:100%}.waffle-dataconnector-refresh-schedules-new-header{display:flex;flex-direction:column;height:64px;justify-content:center;padding:0 16px}.waffle-dataconnector-refresh-schedules-new-widget-opened .waffle-dataconnector-refresh-schedules-new-header{height:auto}.waffle-dataconnector-refresh-schedules-new-top-section{align-items:center;display:flex;justify-content:space-between;padding-bottom:4px}.waffle-dataconnector-refresh-schedules-new-widget-opened .waffle-dataconnector-refresh-schedules-new-top-section{height:50px}.waffle-dataconnector-refresh-schedules-new-fullview-section{color:#5f6368;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px}.waffle-dataconnector-refresh-schedules-new-fullview-text{color:#202124;font-size:14px;font-weight:500;line-height:20px}.waffle-dataconnector-refresh-schedules-new-header .goog-link-button{color:#1a73e8;text-decoration:none}.waffle-dataconnector-refresh-schedules-new-header-title{color:#3c4043;display:flex;font:500 14px "Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;line-height:20px}.waffle-dataconnector-refresh-schedules-new-info-icon{padding-left:4px}.waffle-dataconnector-refresh-schedules-new-edit-section{padding:16px}.waffle-dataconnector-refresh-schedules-new-edit-section-row{margin-bottom:16px}.waffle-dataconnector-refresh-schedules-new-select .docs-material-gm-labeled-select.docs-material-gm-labeled-select-focused .docs-material-gm-labeled-select-outer-box{background-color:#f1f3f4}.waffle-dataconnector-refresh-schedules-new-select .docs-material-gm-labeled-select{align-items:center;display:flex;justify-content:space-between}.waffle-dataconnector-refresh-schedules-new-select .docs-material-gm-labeled-select-content{margin-bottom:0px}.waffle-dataconnector-refresh-schedules-new-select .docs-material-gm-labeled-select-label{color:#3c4043;font:500 12px "Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;line-height:20px}.waffle-dataconnector-refresh-schedules-new-select .docs-material-gm-labeled-select-outer-box{padding:0;width:176px}.waffle-dataconnector-refresh-schedules-new-select .docs-material-gm-labeled-select-caption{font-size:13px;height:auto;line-height:16px;padding:4px 0 4px 8px}.waffle-dataconnector-refresh-schedules-new-btns{align-items:center;display:flex;justify-content:flex-end}.waffle-dataconnector-refresh-schedules-new-overview-section{font-size:12px}.waffle-dataconnector-refresh-schedules-new-overview-text{color:#5f6368}.waffle-dataconnector-refresh-schedules-new-edit-btn{padding-left:2px}.waffle-dataconnector-refresh-schedules-new-save-btn .docs-material-button{text-transform:none}.waffle-dataconnector-refresh-schedules-new-owner-info{color:#5f6368;font-size:12px;margin:32px 0 16px 0}.waffle-dataconnector-refresh-schedules-new-widget-opened{animation-name:waffle-dataconnector-refresh-schedules-new-widget-open;animation-duration:300ms;border-radius:8px 8px 0 0;border-top:none;bottom:0;box-shadow:0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12),0px 2px 4px -1px rgba(0,0,0,0.2);z-index:1002}@keyframes waffle-dataconnector-refresh-schedules-new-widget-open{from{bottom:-300px}to{bottom:0px}}.waffle-dataconnector-refresh-schedules-new-resume-prompt{max-width:420px}.waffle-dataconnector-refresh-schedules-new-resume-prompt .waffle-dataconnector-prompt-content{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;padding:0 24px 24px}.waffle-dataconnector-refresh-schedules-new-resume-prompt h4{margin:20px 0 4px 0}.waffle-dataconnector-refresh-schedules-new-label{font-weight:bold;padding-bottom:6px}.waffle-dataconnector-refresh-schedules-new-start-date-select{width:89px}.waffle-dataconnector-refresh-schedules-widget{background-color:#fff;border-top:1px solid #dadce0;bottom:65px;position:absolute;width:100%}.waffle-dataconnector-refresh-schedules-header{display:flex;flex-direction:column;height:64px;justify-content:center;padding:0 16px}.waffle-dataconnector-refresh-schedules-widget-opened .waffle-dataconnector-refresh-schedules-header{height:auto}.waffle-dataconnector-refresh-schedules-top-section{align-items:center;display:flex;justify-content:space-between;padding-bottom:4px}.waffle-dataconnector-refresh-schedules-widget-opened .waffle-dataconnector-refresh-schedules-top-section{height:50px}.waffle-dataconnector-refresh-schedules-fullview-section{color:#5f6368;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px}.waffle-dataconnector-refresh-schedules-fullview-text{color:#202124;font-size:14px;font-weight:500;line-height:20px}.waffle-dataconnector-refresh-schedules-header .goog-link-button{color:#1a73e8;text-decoration:none}.waffle-dataconnector-refresh-schedules-header-title{color:#3c4043;display:flex;font:500 14px "Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;line-height:20px}.waffle-dataconnector-refresh-schedules-info-icon{padding-left:4px}.waffle-dataconnector-refresh-schedules-edit-section{padding:16px}.waffle-dataconnector-refresh-schedules-edit-section-row{margin-bottom:16px}.waffle-dataconnector-refresh-schedules-select .docs-material-gm-labeled-select.docs-material-gm-labeled-select-focused .docs-material-gm-labeled-select-outer-box{background-color:#f1f3f4}.waffle-dataconnector-refresh-schedules-select .docs-material-gm-labeled-select{align-items:center;display:flex;justify-content:space-between}.waffle-dataconnector-refresh-schedules-select .docs-material-gm-labeled-select-content{margin-bottom:0px}.waffle-dataconnector-refresh-schedules-select .docs-material-gm-labeled-select-label{color:#3c4043;font:500 12px "Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;line-height:20px}.waffle-dataconnector-refresh-schedules-select .docs-material-gm-labeled-select-outer-box{padding:0;width:176px}.waffle-dataconnector-refresh-schedules-select .docs-material-gm-labeled-select-caption{font-size:13px;height:auto;line-height:16px;padding:4px 0 4px 8px}.waffle-dataconnector-refresh-schedules-btns{align-items:center;display:flex;justify-content:flex-end}.waffle-dataconnector-refresh-schedules-overview-section{font-size:12px}.waffle-dataconnector-refresh-schedules-overview-text{color:#5f6368}.waffle-dataconnector-refresh-schedules-edit-btn{padding-left:2px}.waffle-dataconnector-refresh-schedules-save-btn .docs-material-button{text-transform:none}.waffle-dataconnector-refresh-schedules-owner-info{color:#5f6368;font-size:12px;margin:32px 0 16px 0}.waffle-dataconnector-refresh-schedules-widget-opened{animation-name:waffle-dataconnector-refresh-schedules-widget-open;animation-duration:300ms;border-radius:8px 8px 0 0;border-top:none;bottom:0;box-shadow:0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12),0px 2px 4px -1px rgba(0,0,0,0.2);z-index:1002}@keyframes waffle-dataconnector-refresh-schedules-widget-open{from{bottom:-300px}to{bottom:0px}}.waffle-dataconnector-refresh-schedules-resume-prompt{max-width:420px}.waffle-dataconnector-refresh-schedules-resume-prompt .waffle-dataconnector-prompt-content{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;padding:0 24px 24px}.waffle-dataconnector-refresh-schedules-resume-prompt h4{margin:20px 0 4px 0}.waffle-dataconnector-refresh-weekday-select{display:contents;width:24px}.waffle-dataconnector-refresh-weekday-toggle{align-items:center;background-color:#f1f3f4;border-radius:50%;color:#80868b;cursor:pointer;display:inline-flex;font-size:12px;height:30px;justify-content:center;margin-right:8px;width:30px}.waffle-dataconnector-refresh-weekday-toggle-focused{background-color:rgba(95,99,104,0.122)}.waffle-dataconnector-refresh-weekday-toggle-focused{outline:none}.waffle-dataconnector-refresh-weekday-toggle-checked{background-color:#1e8e3e;color:white}.waffle-dataconnector-refresh-weekday-toggle-checked.waffle-dataconnector-refresh-weekday-toggle-focused{background-color:#188038}.waffle-dbsource-advanced-options-menuitem-change-billing-project svg{height:18px;left:10px;position:absolute;width:18px}.waffle-dbsource-advanced-options-menuitem-change-billing-project-short-caption{color:#80868b;font-size:12px}.waffle-bigquery-change-billing-project-dialog{display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;box-sizing:border-box;height:495px;width:512px}.waffle-bigquery-change-billing-project-dialog .waffle-dataconnector-modal-header{border-bottom:none;box-sizing:border-box;height:73px;padding:24px 24px 25px 24px}.waffle-bigquery-change-billing-project-dialog .waffle-dataconnector-modal-title{line-height:24px;opacity:1}.waffle-bigquery-change-billing-project-dialog .waffle-dataconnector-modal-close-button{height:34px;margin-right:-5px;margin-top:-5px;width:34px}.waffle-bigquery-change-billing-project-dialog .waffle-dataconnector-modal-close-button svg{height:24px;width:24px}.waffle-bigquery-change-billing-project-dialog .waffle-dataconnector-modal-body{height:338px;padding:0;z-index:0}.waffle-bigquery-change-billing-project-dialog-project-header{color:#5f6368;font-size:14px;letter-spacing:0.29px;margin:0;opacity:1;padding:10px 24px}.waffle-bigquery-change-billing-project-dialog .waffle-dataconnector-modal-footer{border-top:none;box-shadow:0 2px 6px 2px rgba(60,64,67,.15);padding:24px;z-index:1}.waffle-bigquery-change-billing-project-dialog-footer-wrapper{display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row}.waffle-bigquery-change-billing-project-dialog-footer-wrapper .docs-material-button{margin:0}.waffle-bigquery-change-billing-project-dialog-footer-wrapper .docs-material-button:first-child{margin-left:auto}.waffle-bigquery-change-billing-project-dialog .waffle-dataconnector-tablepicker-menuitem-content-nexticon{display:none}.waffle-bigquery-change-billing-project-dialog .waffle-dataconnector-tablepicker-menuitem-content-id{margin-left:auto}.waffle-bigquerydbsourceediterror-error-text{color:#3c4043;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;margin-bottom:24px}.waffle-bigquerydbsourceediterror .waffle-dataconnector-modal{max-width:600px}.waffle-bigquerydbsourceediterror .waffle-dataconnector-modal-header{border:none;padding-bottom:0}.waffle-bigquerydbsourceediterror .waffle-dataconnector-modal-footer{border:none;display:flex;-ms-flex-direction:row-reverse;-webkit-flex-direction:row-reverse;flex-direction:row-reverse;padding-top:0}.waffle-bigquerydbsourcesettingsdialog{display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;box-sizing:border-box;height:495px;width:512px}.waffle-bigquerydbsourcesettingsdialog .waffle-dataconnector-modal-header{border-bottom:none;box-sizing:border-box;height:73px;padding:24px 24px 25px 24px}.waffle-bigquerydbsourcesettingsdialog .waffle-dataconnector-modal-title{line-height:24px;opacity:1}.waffle-bigquerydbsourcesettingsdialog .waffle-dataconnector-modal-close-button{height:34px;margin-right:-5px;margin-top:-5px;width:34px}.waffle-bigquerydbsourcesettingsdialog .waffle-dataconnector-modal-close-button svg{height:24px;width:24px}.waffle-bigquerydbsourcesettingsdialog .waffle-dataconnector-modal-body{height:376px;padding:0;z-index:0}.waffle-bigquerydbsourcesettingsdialog-project-header{font:500 16px/20px "Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;letter-spacing:0.29px;margin:0;opacity:1;padding:10px 24px}.waffle-bigquerydbsourcesettingsdialog-transition-out .waffle-dataconnector-modal-title,.waffle-bigquerydbsourcesettingsdialog-transition-out .waffle-bigquerydbsourcesettingsdialog-project-header{opacity:0;transition:opacity 150ms cubic-bezier(0.0,0.0,0.2,1)}.waffle-bigquerydbsourcesettingsdialog-error-caption{padding:16px 32px}.waffle-bigquerydbsourcesettingsdialog .waffle-dataconnector-modal-footer{border-top:none;box-shadow:0 2px 6px 2px rgba(60,64,67,.15);z-index:1}.waffle-bigquerydbsourcesettingsdialog-footer-wrapper{display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row}.waffle-bigquerydbsourcesettingsdialog-footer-message{-webkit-box-flex:2;box-flex:2;-ms-flex-positive:2;-webkit-flex-grow:2;flex-grow:2;color:#5f6368;font-size:12px;line-height:16px;margin:0 24px 0 0;width:329px}.waffle-bigquerydbsourcesettingsdialog-footer-wrapper .docs-material-button{margin:0}.waffle-bigquerytabledatasourceviewonly-footer-wrapper{display:flex;-ms-flex-direction:row-reverse;-webkit-flex-direction:row-reverse;flex-direction:row-reverse}.waffle-bigquerytableinfopanel-configuration-wrapper{border-bottom:1px solid rgba(0,0,0,0.12);height:68px;margin-bottom:16px}.waffle-bigquerytableinfopanel-configuration-title{color:#202124;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:11px;font-weight:500;letter-spacing:0.8px;line-height:20px;padding-bottom:4px;text-transform:uppercase;vertical-align:top}.waffle-bigquerytableinfopanel-configuration-wrapper .waffle-dataconnector-tablepicker-menuitem-content-schemaicon{margin-bottom:auto;margin-top:auto}.waffle-bigquerytablepickermodal{display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;box-sizing:border-box;height:495px;width:512px}.waffle-bigquerytablepickermodal .waffle-dataconnector-modal-header{border-bottom:none;box-sizing:border-box;height:73px;padding:19px 24px 20px}.waffle-bigquerytablepickermodal-back-button{background:transparent;border-radius:50%;cursor:pointer;display:block;height:33px;margin-left:-5px;opacity:0;position:relative;transition:background-color 0.28s cubic-bezier(0.0,0.0,0.2,1),opacity 150ms cubic-bezier(0.0,0.0,0.2,1);width:33px}.waffle-bigquerytablepickermodal-cloud-project-edit-button{background:transparent;border-radius:50%;cursor:pointer;display:block;height:33px;margin-left:-5px;margin-top:5px;position:relative;width:33px}.waffle-bigquerytablepickermodal-transition-in .waffle-bigquerytablepickermodal-back-button{opacity:1}.waffle-bigquerytablepickermodal-back-button .docs-icon{margin:5px}.waffle-bigquerytablepickermodal-back-button-focused{opacity:1.0;background-color:rgba(0,0,0,0.12);outline:none}.waffle-bigquerytablepickermodal-back-button-hover{opacity:1.0}.waffle-bigquerytablepickermodal .waffle-dataconnector-modal-title{box-sizing:border-box;line-height:34px;opacity:0;padding-right:0;width:400px}.waffle-bigquerytablepickermodal .waffle-dataconnector-modal-close-button{height:34px;margin-right:-5px;width:34px}.waffle-bigquerytablepickermodal .waffle-dataconnector-modal-close-button svg{height:24px;width:24px}.waffle-bigquerytablepickermodal .waffle-dataconnector-modal-body{height:338px;padding:0;z-index:0}.waffle-bigquerytablepickermodal-project-menu-header-wrapper{display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;align-items:center;height:40px;-webkit-justify-content:space-between;justify-content:space-between}.waffle-bigquerytablepickermodal-project-menu-header{-webkit-box-flex:2;box-flex:2;-ms-flex-positive:2;-webkit-flex-grow:2;flex-grow:2;font:500 16px/20px "Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;letter-spacing:0.29px;margin:0;opacity:0;padding:10px 24px}.waffle-bigquerytablepickermodal-project-menu-billing-project-edit-button{background:transparent;border:1px solid transparent;border-radius:4px;box-shadow:none;color:#202124;cursor:pointer;font:500 14px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;line-height:20px;margin-right:24px;max-width:40%;overflow:hidden;padding:8px;text-overflow:ellipsis;vertical-align:middle;white-space:nowrap}.waffle-bigquerytablepickermodal-project-menu-billing-project-edit-button svg{margin-right:6px;vertical-align:middle}.waffle-bigquerytablepickermodal-project-menu-billing-project-edit-button:hover{background-color:#f1f3f4}.waffle-bigquerytablepickermodal-project-menu-billing-project-edit-button:active{background-color:#e8eaed;outline:none}.waffle-bigquerytablepickermodal-project-menu-billing-project-edit-button:focus{background-color:#e8eaed;outline:none}.waffle-bigquerytablepickermodal-project-menu-billing-project-text{font:400 14px Roboto,RobotoDraft,Helvetica,Arial,sans-serif}.waffle-bigquerytablepickermodal-transition-in .waffle-dataconnector-modal-title,.waffle-bigquerytablepickermodal-transition-in .waffle-bigquerytablepickermodal-project-menu-header{opacity:1;transition:opacity 150ms cubic-bezier(0.4,0.0,1,1)}.waffle-bigquerytablepickermodal-breadcrumbnavigator-wrapper{background-color:#f8f9fa;padding:8px 26px}.waffle-bigquerytablepickermodal .waffle-dataconnector-modal-footer{border-top:none;box-shadow:0 2px 6px 2px rgba(60,64,67,.15);padding:24px;z-index:1}.waffle-bigquerytablepickermodal-footer-wrapper{display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-webkit-justify-content:space-between;justify-content:space-between}.waffle-bigquerytablepickermodal-footer-wrapper .docs-material-button{margin:0}.waffle-bigquerytablepickermodal-write-query-button .goog-flat-button{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:white;color:#188038;outline:none;text-transform:none}.waffle-bigquerytablepickermodal-write-query-button .goog-flat-button-hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#f8fcf9;color:#188038}.waffle-bigquerytablepickermodal-write-query-button .goog-flat-button-active{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#dff2e4;color:#188038;box-shadow:0 2px 6px 2px rgba(60,64,67,.15)}.waffle-bigquerytablepickermodal-write-query-button .goog-flat-button-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#e7f5eb;color:#188038}.waffle-dataconnector-modal.waffle-bigquerywrongskudialog{box-sizing:border-box;height:240px;width:360px}.waffle-bigquerywrongskudialog .waffle-dataconnector-modal-body{padding-right:56px;padding-top:0}.waffle-bigquerywrongskudialog .waffle-dataconnector-modal-header{border-bottom:none}.waffle-bigquerywrongskudialog .waffle-dataconnector-modal-footer{border-top:none;padding-right:24px;padding-top:32px}.waffle-bigquerywrongskudialog-footer-wrapper{display:flex;-ms-flex-direction:row-reverse;-webkit-flex-direction:row-reverse;flex-direction:row-reverse}.waffle-bigquerywrongskudialog-message{color:#3c4043;font-family:Roboto;font-size:14px;font-weight:400;text-align:left;vertical-align:top}.waffle-dbsource-flat-default{color:#188038;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;height:36px;line-height:36px;padding:0 8px;text-transform:none}.waffle-dbsource-flat-default.docs-material-button-flat-default.docs-material-button.docs-material-button-hover{background-color:rgba(52,168,83,0.04)}.waffle-dbsource-flat-default.docs-material-button-flat-default.docs-material-button.docs-material-button-active{background-color:rgba(52,168,83,0.16);color:#188038;line-height:36px}.waffle-dbsource-flat-default.docs-material-button-flat-default.docs-material-button.docs-material-button-focused{background-color:rgba(52,168,83,0.12);border:none;line-height:36px;padding:0 8px}.waffle-dbsource-flat-default.docs-material-button-flat-default.docs-material-button.docs-material-button-no-focus-border{line-height:36px}.waffle-dbsource-flat-default>.docs-material-button-ripple-element{background-color:rgba(52,168,83,0.10)}.waffle-dbobject-estimated-bytes-info{display:flex}.waffle-dbobject-estimated-bytes-spinner .waffle-spinner{height:18px;width:18px}.waffle-dbobject-estimated-bytes-spinner .waffle-spinner-circle{border-width:2px}.waffle-dbobject-estimated-bytes-icon{margin-right:8px}.waffle-dbobject-estimated-bytes-error{color:#db4437;text-decoration:underline}.waffle-dbobject-estimated-bytes-error:focus{outline:none}.waffle-dbobject-estimated-bytes-details{color:#80868b;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;letter-spacing:0.3px;line-height:16px}.waffle-dbobject-estimated-bytes-details-tooltip{display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;align-items:center;background-color:#000000;color:white;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:500;height:24px;text-align:center}.waffle-dbsource-column-filtered-menu .goog-menu-filter{display:flex;border-bottom:1px solid #e0e0e0;padding:6px 6px 12px 10px}.waffle-dbsource-column-filtered-menu input{-ms-flex:1;-webkit-flex:1;flex:1;border:0;color:rgba(0,0,0,0.87);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;min-width:0;outline:0}.waffle-dbsource-column-filtered-menu .waffle-charteditor-picker-button-wrapper{height:24px;margin-right:0}.waffle-dbsource-column-filtered-menu .goog-menu-filter:before{content:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNHB4IiBoZWlnaHQ9IjI0cHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0iIzc1NzU3NSI+CiAgICA8cGF0aCBkPSJNMTUuNSAxNGgtLjc5bC0uMjgtLjI3QzE1LjQxIDEyLjU5IDE2IDExLjExIDE2IDkuNSAxNiA1LjkxIDEzLjA5IDMgOS41IDNTMyA1LjkxIDMgOS41IDUuOTEgMTYgOS41IDE2YzEuNjEgMCAzLjA5LS41OSA0LjIzLTEuNTdsLjI3LjI4di43OWw1IDQuOTlMMjAuNDkgMTlsLTQuOTktNXptLTYgMEM3LjAxIDE0IDUgMTEuOTkgNSA5LjVTNy4wMSA1IDkuNSA1IDE0IDcuMDEgMTQgOS41IDExLjk5IDE0IDkuNSAxNHoiLz4KICAgIDxwYXRoIGQ9Ik0wIDBoMjR2MjRIMHoiIGZpbGw9Im5vbmUiLz4KPC9zdmc+Cg==');height:24px;margin-right:6px;width:24px}.waffle-dbsource-column-filtered-menu-item-icon{margin-left:5px;margin-top:3px}.goog-menuitem-highlight .waffle-dbsource-column-filtered-menu-item-icon{margin-top:2px}.waffle-dbsource-column-filtered-menu-item-icon.docs-hc-ie{background-color:white;-ms-high-contrast-adjust:none}.waffle-dbsource-column-filtered-menu-item-icon.docs-hc-gecko{filter:invert(1)}.waffle-dbsource-column-filtered-menu.docs-hc-ie .goog-menu-filter:before{background-color:white;padding-top:12px;-ms-high-contrast-adjust:none}.waffle-dbsource-column-filtered-menu.docs-hc-gecko .goog-menu-filter:before{filter:url("data:image/svg+xml;utf8,\00003csvg%20xmlns=\000027http://www.w3.org/2000/svg\000027\00003e\00003cfilter%20id=\000027invertColor\000027\00003e\00003cfeColorMatrix%20type=\000027matrix\000027%20values=\000027-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0\000027/\00003e\00003c/filter\00003e\00003c/svg\00003e#invertColor")}.waffle-filterable-by-text-contains-menu-item-match{font-weight:500}.waffle-dbsource-column-filtered-menu .goog-menuitem{padding-right:20px}.waffle-dbsource-column-filtered-menu-select-all-and-clear{margin:6px 0 0 10px}.waffle-dbsource-column-filtered-menu-select-all{color:#1a73e8;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;letter-spacing:0.3px;line-height:16px;text-decoration-line:none}.waffle-dbsource-column-filtered-menu-select-all-and-clear-separator{color:#dadce0;display:inline-block;font-size:10px;line-height:16px;margin:0 8px 0 8px;vertical-align:text-bottom}.waffle-dbsource-column-filtered-menu-clear{color:#1a73e8;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;letter-spacing:0.3px;line-height:16px;text-decoration-line:none}.waffle-dbsource-column-filtered-menu .goog-menuitem.goog-option-selected{background-position:right 5px center}.waffle-dbsource-configbar-wrapper{background:#e8eaed;border-bottom:1px solid #dadce0;height:110px;padding-top:16px;position:relative}.waffle-dbsource-configbar{background:white;border-bottom:none;border-radius:8px 8px 0 0;box-sizing:border-box;box-shadow:0 2px 6px 2px rgba(60,64,67,.15);height:100%;overflow-x:auto;overflow-y:hidden;padding:16px 28px}.waffle-dbsource-configbar-header{align-items:center;display:flex;flex-direction:row;font-family:Google Sans,Arial,sans-serif;font-weight:400;margin-left:4px;white-space:nowrap}.waffle-dbsource-configbar-header-icon{height:24px;margin-left:0;margin-right:8px;min-width:24px;position:relative}.waffle-dbsource-configbar-header-title{color:#202124;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:18px;font-weight:400;line-height:24px}.waffle-dbsource-configbar-header-subtitle{color:#5f6368;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;letter-spacing:0.3px;line-height:16px;margin-right:12px}.waffle-dbsource-configbar-schedules-widget{-webkit-align-items:center;align-items:center;border-radius:16px;color:#202124;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;height:32px;letter-spacing:0.3px;line-height:16px}.waffle-dbsource-configbar-schedules-widget-content{-webkit-align-items:center;align-items:center;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row}.waffle-dbsource-configbar-schedules-widget-edit-button-wrapper .goog-link-button{color:#188038;text-decoration:none}.waffle-dbsource-configbar-schedules-widget-highlight{background-color:#f1f3f4;padding:0 12px}.waffle-dbsource-configbar-schedules-widget-content svg,.waffle-dbsource-configbar-schedules-widget-last-refresh-content,.waffle-dbsource-configbar-schedules-widget-last-refresh-divider,.waffle-dbsource-configbar-schedules-widget-next-refresh-content{margin-right:8px}.waffle-dbsource-configbar-schedules-widget-last-refresh-divider{border-right:1px solid #dadce0}.waffle-dbsource-configbar-actions{display:flex;flex-direction:row;padding:16px 0}.waffle-dbsource-configbar-button-wrapper{padding:0}.waffle-dbsource-configbar-button-wrapper .docs-material-button{margin:0}.waffle-dbsource-configbar-button-wrapper .docs-material-button-content>div>span{vertical-align:middle}.waffle-dbsource-configbar-columns-menu-button{background:#e6f4ea;border-color:#e6f4ea;border-radius:8px;height:36px;line-height:36px;padding:0 10px;margin-right:12px}.waffle-dbsource-configbar-columns-menu-button.docs-material-menu-button-flat-default,.waffle-dbsource-configbar-columns-menu-button.docs-material-menu-button-flat-default-focused{border:none}.waffle-dbsource-configbar-columns-menu-button .docs-material-menu-button-flat-default-dropdown{margin-left:10px;margin-top:5px}.goog-menu .goog-menuitem.waffle-datasource-configbar-columns-menu-loading{padding:6px 15px}.waffle-dbsource-configbar-options-wrapper{display:flex;-ms-flex:1;-webkit-flex:1;flex:1;-webkit-justify-content:flex-end;justify-content:flex-end}.waffle-dbsource-configbar .waffle-dbsource-configbar-secondary-button .docs-material-button-content span{-webkit-align-items:center;align-items:center;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row}.waffle-dbsource-configbar .waffle-dbsource-configbar-secondary-button .docs-material-button-content .waffle-dbsource-configbar-secondary-button-content span,.waffle-dbsource-configbar .waffle-dbsource-configbar-secondary-button .docs-material-menu-button-flat-default-caption .waffle-dbsource-configbar-secondary-button-content span{color:#5f6368;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;line-height:24px;text-transform:none}.waffle-dbsource-configbar .waffle-dbsource-configbar-secondary-button.docs-material-button-hairline-primary.docs-material-button,.waffle-dbsource-configbar .waffle-dbsource-configbar-secondary-button.docs-material-menu-button-flat-default{border:none!important;height:24px;line-height:24px;margin-right:0;padding:0}.waffle-dbsource-configbar .waffle-dbsource-configbar-secondary-button.docs-material-button-hairline-primary.docs-material-button.docs-material-button-hover,.waffle-dbsource-configbar .waffle-dbsource-configbar-secondary-button.docs-material-menu-button-flat-default-hover,.waffle-dbsource-configbar-connection-settings-button.docs-material-button.docs-material-button-hover{background-color:#f8f9fa}.waffle-dbsource-configbar .waffle-dbsource-configbar-secondary-button.docs-material-button-hairline-primary.docs-material-button.docs-material-button-focused{background-color:#f1f3f4}.waffle-dbsource-configbar-secondary-button.docs-material-button-hairline-primary.docs-material-button .waffle-dbsource-configbar-secondary-button-content,.waffle-dbsource-configbar .waffle-dbsource-configbar-secondary-button.docs-material-menu-button-flat-default .waffle-dbsource-configbar-secondary-button-content{padding:0 8px;text-decoration:none}.waffle-dbsource-configbar .waffle-dbsource-configbar-secondary-button .docs-material-button-content svg{margin-right:5px}.waffle-dbsource-configbar .docs-material-button-hairline-primary.docs-material-button{margin-left:0;margin-right:16px;padding-left:12px;padding-right:16px;white-space:nowrap}.waffle-dbsource-configbar .waffle-dbsource-configbar-secondary-button.docs-material-button-hairline-primary.docs-material-button,.waffle-dbsource-configbar .waffle-dbsource-configbar-secondary-button.docs-material-menu-button-flat-default{margin-left:8px}.waffle-dbsource-configbar .docs-material-button-content svg{margin-right:8px;vertical-align:middle}.waffle-dbsource-configbar-overflow-menu{width:252px}.goog-menu.waffle-dbsource-configbar-overflow-menu .goog-menuitem,.goog-menu.waffle-dbsource-configbar-overflow-menu .goog-menuitem.goog-menuitem-disabled,.goog-menu.waffle-dbsource-configbar-overflow-menu .goog-menuitem.goog-menuitem-disabled.goog-menuitem:hover{padding:6px 12px}.goog-menu.waffle-dbsource-configbar-overflow-menu .goog-menuitem:hover{padding:5px 12px}.waffle-dbsource-configbar-overflow-menu-button.docs-material-menu-button-flat-default{height:24px;line-height:24px;margin-left:16px;opacity:0.4;padding:0;width:24px}.waffle-dbsource-configbar-overflow-menu-button.docs-hc-ie.docs-material-menu-button-flat-default .docs-material-menu-button-flat-default-caption{background-color:white}.waffle-dbsource-configbar-overflow-menu-button.docs-hc-gecko.docs-material-menu-button-flat-default .docs-material-menu-button-flat-default-caption{filter:url("data:image/svg+xml;utf8,\00003csvg%20xmlns=\000027http://www.w3.org/2000/svg\000027\00003e\00003cfilter%20id=\000027invertColor\000027\00003e\00003cfeColorMatrix%20type=\000027matrix\000027%20values=\000027-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0\000027/\00003e\00003c/filter\00003e\00003c/svg\00003e#invertColor")}.waffle-dbsource-configbar-separator{border-left:1px #dadce0 solid;height:20px;margin-left:16px;margin-right:16px}.waffle-dbsource-flat-default.waffle-dbsource-configbar-refresh-options-button,.waffle-dbsource-flat-default.waffle-dbsource-configbar-schedules-widget-main-button{border-radius:4px;font-size:14px;height:20px;letter-spacing:.25px;line-height:20px}.waffle-dbsource-flat-default.waffle-dbsource-configbar-refresh-options-button.docs-material-button-flat-default.docs-material-button.docs-material-button-no-focus-border,.waffle-dbsource-flat-default.waffle-dbsource-configbar-refresh-options-button.docs-material-button-flat-default.docs-material-button.docs-material-button-focused{line-height:24px}.waffle-dbsource-configbar-overflow-menu-button .docs-material-menu-button-flat-default-dropdown{display:none}.waffle-dbsource-configbar-connection-settings-button,.waffle-dbsource-configbar-connection-settings-button.docs-material-button.docs-material-button-no-focus-border,.waffle-dbsource-configbar-connection-settings-button.docs-material-button.docs-material-button-focused{height:24px;line-height:24px}.waffle-dbsource-configbar-connection-settings-button.docs-material-button.docs-material-button-focused{background-color:#f1f3f4;border:none;outline:none;outline-offset:0;padding:0 8px}.waffle-dbsource-configbar-column-insights-icon{margin-right:8px}.waffle-dbsource-configbar-column-insights-icon .docs-icon-img{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_green.svg)!important}.waffle-dbsource-configbar-secondary-button-icon{margin:0 5px 0 0!important}.waffle-dbsource-pill-menuitem.waffle-dbsource-configbar-watch-tutorial-menuitem{align-items:start;height:auto}.waffle-dbsource-pill-menuitem.waffle-dbsource-configbar-watch-tutorial-menuitem svg{height:36px}.waffle-dbsource-configbar-watch-tutorial-menuitem-caption{color:#5f6368;font-size:12px;line-height:16px;white-space:break-spaces;width:150px}.waffle-create-datasheet-welcome-dialog{display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;box-sizing:border-box;height:558px;text-align:center;width:512px}.waffle-create-datasheet-welcome-dialog .waffle-dataconnector-modal-header{border-bottom:none;justify-content:flex-end;padding:24px 24px 0px}.waffle-create-datasheet-welcome-dialog .waffle-dataconnector-modal-title{display:none}.waffle-create-datasheet-welcome-dialog .waffle-dataconnector-modal-body{padding:0}.waffle-create-datasheet-welcome-dialog .waffle-dataconnector-modal-close-button{height:34px;margin-right:-5px;width:34px}.waffle-create-datasheet-welcome-dialog .waffle-dataconnector-modal-close-button svg{height:24px;width:24px}.waffle-create-datasheet-welcome-dialog-image{height:222px;user-select:none}.waffle-create-datasheet-welcome-dialog-welcome-message{display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-webkit-justify-content:center;justify-content:center;color:#202124;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:22px;font-weight:400}.waffle-create-datasheet-welcome-dialog-welcome-description{color:#5f6368;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;letter-spacing:0.2px;line-height:20px;margin:0 auto;max-width:392px}.waffle-create-datasheet-welcome-dialog-button-wrapper{padding-top:36px;padding-bottom:16px}.waffle-create-datasheet-welcome-dialog .waffle-dataconnector-modal-footer{border-top:none}.waffle-create-datasource-sheet-loading-dialog{display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;box-sizing:border-box;height:558px;text-align:center;width:512px}.waffle-create-datasource-sheet-loading-dialog .waffle-dataconnector-modal-header{border-bottom:none;justify-content:flex-end;padding:24px 24px 0px}.waffle-create-datasource-sheet-loading-dialog .waffle-dataconnector-modal-title{display:none}.waffle-create-datasource-sheet-loading-dialog .waffle-dataconnector-modal-body{padding:0;margin-top:-30px}.waffle-create-datasource-sheet-loading-dialog .waffle-dataconnector-modal-close-button{height:34px;margin-right:-5px;width:34px}.waffle-create-datasource-sheet-loading-dialog .waffle-dataconnector-modal-close-button svg{height:24px;width:24px}.waffle-create-datasource-sheet-loading-dialog-tip{color:#202124;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:22px;font-weight:400;height:32px;letter-spacing:0.2px;line-height:20px;margin:32px auto;max-width:392px}.waffle-create-datasource-sheet-loading-dialog-image{height:400px;user-select:none}.waffle-create-datasource-sheet-loading-dialog .waffle-dataconnector-modal-footer{border-top:none}.waffle-create-datasource-sheet-success-dialog{display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;box-sizing:border-box;height:558px;text-align:center;width:512px}.waffle-create-datasource-sheet-success-dialog .waffle-dataconnector-modal-header{border-bottom:none;justify-content:flex-end;padding:24px 24px 0px}.waffle-create-datasource-sheet-success-dialog .waffle-dataconnector-modal-title{display:none}.waffle-create-datasource-sheet-success-dialog .waffle-dataconnector-modal-body{padding:0}.waffle-create-datasource-sheet-success-dialog .waffle-dataconnector-modal-close-button{height:34px;margin-right:-5px;width:34px}.waffle-create-datasource-sheet-success-dialog .waffle-dataconnector-modal-close-button svg{height:24px;width:24px}.waffle-create-datasource-sheet-success-dialog-image{height:185px}.waffle-create-datasource-sheet-success-dialog-success-message{color:#202124;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:22px;font-weight:400;max-width:328px;margin:22px auto 16px auto}.waffle-create-datasource-sheet-success-dialog-success-description{color:#5f6368;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;letter-spacing:0.2px;line-height:20px;margin:8px auto 16px auto;max-width:392px}.waffle-create-datasource-sheet-success-dialog-datasource-info{color:#188038;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;letter-spacing:0.2px;line-height:20px}.waffle-create-datasource-sheet-success-dialog-metadata-wrapper{margin:auto}.waffle-create-datasource-sheet-success-dialog-delegation-wrapper{margin-bottom:16px}.waffle-create-datasource-sheet-success-dialog-start-analyze-button-wrapper{margin-bottom:16px}.waffle-create-datasource-sheet-success-dialog-watch-tutorial{color:#1a73e8;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;letter-spacing:0.3px;line-height:16px;text-decoration-line:none}.waffle-create-datasource-sheet-success-dialog .waffle-dataconnector-modal-footer{border-top:none}.waffle-dbobject-sidebar-footer-estimated-bytes-wrapper{display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;align-items:center;margin-left:16px;margin-right:16px}.waffle-dbobject-sidebar-footer{display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-webkit-justify-content:space-between;justify-content:space-between;align-items:center;background-color:white;border-top:1px solid #dadce0;color:#5f6368;height:64px}.waffle-dbobject-sidebar-footer-refresh-button-wrapper{margin-right:12px}.waffle-dbobject-sidebar-footer-refresh-button{text-transform:none}.waffle-filter-by-value-sidebar-header,.waffle-dbobject-sidebar-header{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;align-items:center;background-color:#fff;border-bottom:1px solid #dadce0;display:flex;flex-direction:row;height:33px;padding-left:18px}.waffle-filter-by-value-sidebar-header-column-name,.waffle-dbobject-sidebar-header-datasource-name{color:#3c4043;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;letter-spacing:0.3px;margin-left:8px;max-width:241px;overflow:hidden;padding-top:1px;text-overflow:ellipsis;white-space:nowrap}.waffle-dataconnector-delegation-widget-toggle{align-items:center;display:flex;justify-content:center}.waffle-dataconnector-delegation-widget-toggle-label{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px}.apps-ui-material-slide-toggle-container{margin-left:8px}.waffle-dbsource-endofpreview{border-top:1px solid #dadce0;box-sizing:border-box;display:block;height:160px;padding:24px;text-align:center;width:100%}.waffle-dbsource-endofpreview-wrapper{display:inline-block;max-width:550px}.waffle-dbsource-endofpreview.hc-enabled-gecko{background-color:black}.waffle-dbsource-endofpreview-enable-endofwaffle{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxIiBoZWlnaHQ9IjgiIHZpZXdCb3g9IjAgMCAxIDgiPiAgPGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSI+ICAgIDxwYXRoIGZpbGw9IiNEQURDRTAiIGQ9Ik0wIDNoMXYxSDB6TTAgN2gxdjFIMHoiLz4gICAgPHBhdGggZmlsbD0iI0YxRjNGNCIgZD0iTTAgMGgxdjNIMHpNMCA0aDF2M0gweiIvPiAgPC9nPjwvc3ZnPg==);background-repeat:repeat-x}.waffle-dbsource-endofpreview-enable-endofwaffle::before{background-color:#f3f3f3;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOSIgaGVpZ2h0PSI4IiB2aWV3Qm94PSIwIDAgMTkgOCI+ICA8ZyBmaWxsPSJub25lIj4gICAgPHBhdGggZmlsbD0iI0YxRjNGNCIgZD0iTTE4LjUgN2guNVY0aC02LjVjMS40IDEuOCAzLjYgMyA2IDN6Ii8+ICAgIDxwYXRoIGZpbGw9IiNEQURDRTAiIGQ9Ik0xOC41IDcuNWMtMi43IDAtNS4yLTEuNC02LjYtMy41aC0uNmMxLjUgMi40IDQuMiA0IDcuMiA0aC41di0uNWgtLjV6Ii8+ICAgIDxwYXRoIGZpbGw9IiNEQURDRTAiIGQ9Ik0xOC41IDcuNWguNVY3aC0uNWMtMi40IDAtNC42LTEuMi02LTNoLS42YzEuNCAyLjEgMy45IDMuNSA2LjYgMy41eiIvPiAgICA8cGF0aCBmaWxsPSIjRjFGM0Y0IiBkPSJNNy41IDNIMTlWMEgxLjVjMS40IDEuOCAzLjYgMyA2IDN6Ii8+ICAgIDxwYXRoIGZpbGw9IiNEQURDRTAiIGQ9Ik03LjUgMy41QzQuOCAzLjUgMi4zIDIuMS45IDBILjNjMS41IDIuNCA0LjIgNCA3LjIgNEgxOXYtLjVINy41eiIvPiAgICA8cGF0aCBmaWxsPSIjREFEQ0UwIiBkPSJNNy41IDMuNUgxOVYzSDcuNWMtMi40IDAtNC42LTEuMi02LTNILjljMS40IDIuMSAzLjkgMy41IDYuNiAzLjV6Ii8+ICA8L2c+PC9zdmc+);content:"";display:block;height:8px;left:0;position:absolute;top:1px;width:19px}.waffle-dbsource-endofpreview-enable-endofwaffle::after{background-color:#f3f3f3;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOSIgaGVpZ2h0PSI4IiB2aWV3Qm94PSIwIDAgMTkgOCI+ICA8ZyBmaWxsPSJub25lIj4gICAgPHBhdGggZmlsbD0iI0YxRjNGNCIgZD0iTTE4LjUgN2guNVY0aC02LjVjMS40IDEuOCAzLjYgMyA2IDN6Ii8+ICAgIDxwYXRoIGZpbGw9IiNEQURDRTAiIGQ9Ik0xOC41IDcuNWMtMi43IDAtNS4yLTEuNC02LjYtMy41aC0uNmMxLjUgMi40IDQuMiA0IDcuMiA0aC41di0uNWgtLjV6Ii8+ICAgIDxwYXRoIGZpbGw9IiNEQURDRTAiIGQ9Ik0xOC41IDcuNWguNVY3aC0uNWMtMi40IDAtNC42LTEuMi02LTNoLS42YzEuNCAyLjEgMy45IDMuNSA2LjYgMy41eiIvPiAgICA8cGF0aCBmaWxsPSIjRjFGM0Y0IiBkPSJNNy41IDNIMTlWMEgxLjVjMS40IDEuOCAzLjYgMyA2IDN6Ii8+ICAgIDxwYXRoIGZpbGw9IiNEQURDRTAiIGQ9Ik03LjUgMy41QzQuOCAzLjUgMi4zIDIuMS45IDBILjNjMS41IDIuNCA0LjIgNCA3LjIgNEgxOXYtLjVINy41eiIvPiAgICA8cGF0aCBmaWxsPSIjREFEQ0UwIiBkPSJNNy41IDMuNUgxOVYzSDcuNWMtMi40IDAtNC42LTEuMi02LTNILjljMS40IDIuMSAzLjkgMy41IDYuNiAzLjV6Ii8+ICA8L2c+PC9zdmc+);content:"";display:block;height:8px;position:absolute;right:0;top:1px;transform:scaleX(-1);width:19px}.waffle-dbsource-endofpreview-header{color:#3c4043;font:400 16px/20px "Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;letter-spacing:0.17px;padding-bottom:8px;text-align:center}.waffle-dbsource-endofpreview-message-line{color:#5f6368;font:400 12px/16px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;letter-spacing:0.3px;text-align:center}.waffle-dbsource-endofpreview-link-button{font:400 12px/16px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;text-decoration:none}.waffle-dbsource-pill{display:flex;background:white;border-radius:8px;box-shadow:0 4px 8px 3px rgba(60,64,67,.15);box-sizing:border-box;color:#4285f4;padding:6px;position:fixed;white-space:nowrap}.waffle-dbsource-pill-info{display:flex;font:400 14px/36px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;letter-spacing:0.2px}.waffle-dbsource-pill-preview-icon .waffle-dataconnector-preview-icon{margin-left:10px;position:relative;vertical-align:middle}.waffle-dbsource-pill-updated-icon .waffle-dataconnector-updated-icon{margin-left:10px;position:relative;vertical-align:middle}.waffle-dbsource-pill-status{color:#202124;margin-left:8px}.waffle-dbsource-pill-timestamp{color:#5f6368;height:36px;line-height:36px;margin:0 16px;white-space:nowrap}.waffle-dbsource-pill-progress{-webkit-align-items:center;align-items:center;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;height:36px;line-height:36px;margin:0 18px 0 10px}.waffle-dbsource-pill-progress .waffle-dataconnector-pill-spinner{border-radius:50%;box-shadow:inset 0 0 0 2px;color:#188038;display:inline-block;height:18px;margin:7px 0;position:relative;width:18px;margin-right:7px}.waffle-dbsource-pill-progress-message{color:#202124}.waffle-dbsource-pill-error-icon{margin-left:10px;width:24px}.waffle-dbsource-pill-error-icon .waffle-dataconnector-error-icon-filled{padding-left:2px;vertical-align:middle}.waffle-dbsource-pill .docs-material-button{font-size:14px;letter-spacing:0.25px}.waffle-dbsource-pill-refresh-button-apply{margin:0 8px 0 0;text-transform:none}.waffle-dbsource-pill-refresh-button-error{color:#202124}.waffle-dbsource-pill-edit-button{border-left:1px #dadce0 solid;padding-top:4px}.waffle-dbsource-pill-refresh-button-error.docs-material-button-flat-default.docs-material-button.docs-material-button-hover{background-color:rgba(60,64,67,0.04)}.waffle-dbsource-pill-refresh-button-error.docs-material-button-flat-default.docs-material-button.docs-material-button-active{background-color:rgba(60,64,67,0.16);color:#202124;line-height:36px}.waffle-dbsource-pill-refresh-button-error>.docs-material-button-ripple-element{background-color:rgba(60,64,67,0.10)}.waffle-dbsource-pill-showerror-button{color:#d93025;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;height:36px;line-height:36px;text-transform:none}.waffle-dbsource-pill-showerror-button.docs-material-button-flat-default.docs-material-button.docs-material-button-hover{background-color:rgba(234,67,53,0.04)}.waffle-dbsource-pill-showerror-button.docs-material-button-flat-default.docs-material-button.docs-material-button-active{background-color:rgba(234,67,53,0.16)}.waffle-dbsource-pill-showerror-button.docs-material-button-flat-default.docs-material-button.docs-material-button-no-focus-border{line-height:36px}.waffle-dbsource-pill-showerror-button.docs-material-button-flat-default.docs-material-button.docs-material-button-focused{border:none;line-height:36px;padding:0 8px}.waffle-dbsource-pill-showerror-button>.docs-material-button-ripple-element{background-color:rgba(234,67,53,0.10)}.waffle-dbsource-pill-menu-button{border:none;height:36px;margin:0;padding:0 6px}.waffle-dbsource-pill-menu-button .waffle-dataconnector-menu-icon{top:5px}.waffle-dbsource-pill-menu-button.docs-material-menu-button-flat-default-hover{background-color:#f8f9fa}.waffle-dbsource-pill-menu-button.docs-material-menu-button-flat-default-active,.waffle-dbsource-pill-menu-button.docs-material-menu-button-flat-default-focused{background-color:#f1f3f4;border:none;line-height:36px}.waffle-dbsource-pill-menu .goog-menuseparator{margin-bottom:0;margin-top:0}.waffle-dbsource-pill-menu.goog-menu .goog-menuitem{padding-left:11px}.waffle-dbsource-pill-menu svg{height:20px;margin-right:8px;position:relative;width:20px}.waffle-dbsource-pill-menuitem{-webkit-align-items:center;align-items:center;display:flex;height:36px;line-height:36px}.waffle-dbsource-pill-menuitem-generic-action{padding-left:27px}.waffle-dbsource-pill-menuitem-accel{margin-left:auto;padding:0 20px 0 40px;text-align:center;color:#9e9e9e}.waffle-dbsource-pill-menuitem-refreshquery-info svg{margin:0}.waffle-dbsource-pill-menuitem-refreshquery-info-progress{font-style:italic}.waffle-dbsource-pill-menuitem-refreshquery-info-error-button{color:#db4437;text-decoration:underline;white-space:nowrap}.waffle-dbsource-pill-menuitem-refreshquery-info-error-button:focus{outline:none}.waffle-dbsource-pill-menuitem-refreshquery-info-message{white-space:nowrap}.waffle-filter-filtercard{background-color:#f0f0f0;border-radius:8px;padding:8px}.waffle-filter-filtercard:not(:last-child){margin-bottom:8px}.waffle-filter-filtercard-top-row{-webkit-align-items:center;align-items:center;display:flex;padding-bottom:8px}.waffle-filter-filtercard-top-row>div{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.waffle-filter-filtercard-top-row>.waffle-filter-filtercard-label{-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-shrink:1;-ms-flex-negative:1;flex-shrink:1;overflow:hidden;text-overflow:ellipsis}.waffle-filter-filtercard-label{color:#424242;font-size:14px;padding-left:8px}.waffle-filter-filtercard-delete-button{transition:background-color 0.2s ease;background:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+ICA8cGF0aCBmaWxsPSIjZjBmMGYwIiBkPSJNMTkgNi40MUwxNy41OSA1IDEyIDEwLjU5IDYuNDEgNSA1IDYuNDEgMTAuNTkgMTIgNSAxNy41OSA2LjQxIDE5IDEyIDEzLjQxIDE3LjU5IDE5IDE5IDE3LjU5IDEzLjQxIDEyeiIvPjwvc3ZnPg==");background-color:#bfbfbf;border:0;border-radius:16px;cursor:pointer;height:16px;margin:8px;width:16px}.waffle-filter-filtercard-delete-button:hover{background-color:#aaa}.waffle-filter-filtercard .waffle-filter-filtercard-select .jfk-select{text-align:left;width:100%}.waffle-filterbox-container{color:#202124;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;line-height:32px;vertical-align:middle}.waffle-filterdropdown-filter-color{border:1px solid rgba(0,0,0,0.1);border-radius:50%;box-sizing:border-box;height:calc(10px*2);left:-15px;margin-top:calc(-1*10px);position:absolute;top:50%;width:calc(10px*2)}.waffle-filterdropdown-filter-color-text{padding-left:18px}.goog-menu.waffle-filterdropdown-filter-colors-menu{max-height:50vh;overflow-x:hidden;overflow-y:auto}.waffle-filterdropdown-filter-color-checkbox::after{content:"\002713";left:6px;position:absolute}.waffle-types-number-icon:after{content:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0wIDV2MmgydjhoMlY1SDB6bTUgMHYyaDR2Mkg3YTIgMiAwIDAwLTIgMnY0aDZ2LTJIN3YtMmgyYTIgMiAwIDAwMi0yVjdhMiAyIDAgMDAtMi0ySDV6bTcgMGg0YTIgMiAwIDAxMiAydjEuNWExLjUgMS41IDAgMDEtMS41IDEuNSAxLjUgMS41IDAgMDExLjUgMS41VjEzYTIgMiAwIDAxLTIgMmgtNHYtMmg0di0yaC0yVjloMlY3aC00VjV6IiBmaWxsPSIjNUY2MzY4Ii8+PC9zdmc+)}.waffle-types-text-icon:after{content:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0yIDRoMTB2Mkg4djlINlY2SDJWNHptOCA0aDZ2MmgtMnY1aC0ydi01aC0yVjh6IiBmaWxsPSIjNUY2MzY4Ii8+PC9zdmc+)}.waffle-types-date-icon:after{content:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xMyAzLjY2N2guNjY3QzE0LjQgMy42NjcgMTUgNC4yNjcgMTUgNXY5LjMzM2MwIC43MzQtLjYgMS4zMzQtMS4zMzMgMS4zMzRINC4zMzNjLS43NCAwLTEuMzMzLS42LTEuMzMzLTEuMzM0TDMuMDA3IDVjMC0uNzMzLjU4Ni0xLjMzMyAxLjMyNi0xLjMzM0g1VjIuMzMzaDEuMzMzdjEuMzM0aDUuMzM0VjIuMzMzSDEzdjEuMzM0ek00LjMzMyAxNC4zMzNoOS4zMzRWN0g0LjMzM3Y3LjMzM3oiIGZpbGw9IiM1RjYzNjgiLz48L3N2Zz4=)}.waffle-types-boolean-icon:after{content:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTkiIGhlaWdodD0iMTgiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbD0iIzVGNjM2OCIgZD0iTTkgM2gxLjV2MTJIOXoiLz48cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTcuOTUzIDQuOTgybC0uOTk0LS45OTRMNC45NyA1Ljk3NiAyLjk4MiAzLjk4OGwtLjk5NC45OTQgMS45ODkgMS45ODktMS45ODkgMS45ODguOTk0Ljk5NCAxLjk4OS0xLjk4OCAxLjk4OCAxLjk4OC45OTQtLjk5NEw1Ljk2NSA2Ljk3bDEuOTg4LTEuOTg5ek0xOC4wOCAxMC40ODVsLS45OTUtLjk5NC0zLjYgMy42LTEuNDktMS40OTEtLjk5NS45OTQgMi40ODUgMi40ODUuMTIxLS4xMiA0LjQ3My00LjQ3NHoiIGZpbGw9IiM1RjYzNjgiLz48L3N2Zz4=)}.waffle-types-boolean-icon:after,.waffle-types-date-icon:after,.waffle-types-number-icon:after,.waffle-types-text-icon:after{background:none;height:18px;width:18px}.goog-menu.waffle-dataconnector-tablepicker-filtered-menu{border:none;border-radius:0;box-shadow:none;box-sizing:border-box;max-height:auto;overflow-x:hidden;padding-top:2px;width:100%}.goog-menu.waffle-dataconnector-tablepicker-filtered-menu .goog-menu-filter{display:flex;background-color:#f8f9fa;border-radius:8px;height:40px;margin:0 24px 16px 24px;position:relative}.goog-menu.waffle-dataconnector-tablepicker-filtered-menu .goog-menu-filter:after{background:#e8eaed;bottom:-16px;content:'';display:block;height:1px;left:0;position:absolute;width:464px}.waffle-dataconnector-tablepicker-filtered-menu-icon-search{border-bottom:none;padding:11px 0 11px 13px;position:absolute}.waffle-dataconnector-tablepicker-filtered-menu-icon-info{border-bottom:none;border-radius:50%;box-sizing:border-box;height:24px;position:absolute;right:13px;top:8px;width:24px}.waffle-dataconnector-tablepicker-filtered-menu-icon-info:hover{background-color:#f1f3f4}.waffle-dataconnector-tablepicker-filtered-menu-icon-info:active{background-color:#e8eaed}.waffle-dataconnector-tablepicker-filtered-menu-icon-info .docs-material .docs-icon{margin:3px}.goog-menu.waffle-dataconnector-tablepicker-filtered-menu input{-ms-flex:1;-webkit-flex:1;flex:1;background:white;border:1px solid transparent;border-radius:8px;box-shadow:0 1px 3px 1px rgba(60,64,67,.15);font:400 14px/20px "Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;letter-spacing:0.17px;outline:0;padding:0 37px}.goog-menu.waffle-dataconnector-tablepicker-filtered-menu .goog-menu-content{max-height:223px;opacity:0;outline:none;overflow-x:hidden;overflow-y:auto;padding:16px 0 0 16px;position:relative}.waffle-bigquerydbsourcesettingsdialog-project-menu-wrapper .goog-menu.waffle-dataconnector-tablepicker-filtered-menu .goog-menu-content{max-height:261px}.waffle-dataconnector-tablepicker-filtered-menu-loading-bar-wrapper{height:4px;margin-top:-1px;position:absolute;width:100%}.waffle-dataconnector-tablepicker-filtered-menu-loading-bar-wrapper .docs-indeterminate-loading-bar{background-color:#e6f4ea;height:100%;overflow:hidden}.waffle-dataconnector-tablepicker-filtered-menu-loading-bar-wrapper .docs-indeterminate-loading-bar>div{-webkit-animation:loading-bar-animation 1.3s ease-in-out infinite;-moz-animation:loading-bar-animation 1.3s ease-in-out infinite;-o-animation:loading-bar-animation 1.3s ease-in-out infinite;animation:loading-bar-animation 1.3s ease-in-out infinite;background-color:#34a853;border-radius:2px;height:100%;left:0;position:absolute;right:0;top:0;transform:none}@keyframes loading-bar-animation{0%{transform:translateX(-50%) scaleX(0)}23%,54%{transform:translateX(0) scaleX(1)}77%,100%{transform:translateX(50%) scaleX(0)}}.waffle-dataconnector-tablepicker-filtered-menu-error-message{color:#5f6368;font-size:14px;line-height:20px;margin-left:8px;margin-right:24px;text-align:center}.waffle-info-icon-bubble.waffle-dataconnector-tablepicker-filtered-menu-info-bubble{background-color:#3c4043;border-radius:0;opacity:.9;padding:4px 8px}.waffle-dataconnector-tablepicker-filtered-menu-info-bubble .jfk-bubble-arrowup .jfk-bubble-arrowimplbefore,.waffle-dataconnector-tablepicker-filtered-menu-info-bubble .jfk-bubble-arrowup .jfk-bubble-arrowimplafter,.waffle-dataconnector-tablepicker-filtered-menu-info-bubble .jfk-bubble-arrowdown .jfk-bubble-arrowimplbefore,.waffle-dataconnector-tablepicker-filtered-menu-info-bubble .jfk-bubble-arrowdown .jfk-bubble-arrowimplafter{border-color:#3c4043 transparent}.waffle-dataconnector-tablepicker-filtered-menu-info-bubble-content{color:#fff;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:12px;line-height:14px;max-width:200px;text-align:center}.goog-menu .waffle-dataconnector-tablepicker-menuitem.goog-menuitem{border-radius:24px;box-sizing:border-box;line-height:36px;padding:0 16px;transition:background-color 100ms linear;white-space:nowrap;width:480px}.waffle-dataconnector-tablepicker-menuitem.goog-menuitem.goog-menuitem-highlight,.waffle-dataconnector-tablepicker-menuitem.goog-menuitem:focus{border-bottom:none;background-color:#e6f4ea;border-top:none;outline:none}.waffle-dataconnector-tablepicker-menuitem.goog-menuitem.goog-menuitem-highlight.goog-menuitem-active{background-color:#ceead6;border-top:none}.waffle-dataconnector-tablepicker-menuitem.goog-menuitem.goog-menuitem-highlight.goog-menuitem-active.goog-option-selected,.waffle-dataconnector-tablepicker-menuitem.goog-menuitem.goog-option-selected{background-color:#e6f4ea;background-image:none;cursor:auto}.docs-hc-gecko.waffle-dataconnector-tablepicker-menuitem.goog-menuitem.goog-menuitem-highlight,.docs-hc-ie.waffle-dataconnector-tablepicker-menuitem.goog-menuitem.goog-menuitem-highlight,.docs-hc-gecko.waffle-dataconnector-tablepicker-menuitem.goog-menuitem.goog-menuitem-highlight.goog-menuitem-active,.docs-hc-ie.waffle-dataconnector-tablepicker-menuitem.goog-menuitem.goog-menuitem-highlight.goog-menuitem-active,.docs-hc-gecko.waffle-dataconnector-tablepicker-menuitem.goog-menuitem.goog-menuitem-highlight.goog-menuitem-active.goog-option-selected,.docs-hc-ie.waffle-dataconnector-tablepicker-menuitem.goog-menuitem.goog-menuitem-highlight.goog-menuitem-active.goog-option-selected,.docs-hc-gecko.waffle-dataconnector-tablepicker-menuitem.goog-menuitem.goog-option-selected,.docs-hc-ie.waffle-dataconnector-tablepicker-menuitem.goog-menuitem.goog-option-selected{border:1px solid transparent}.waffle-dataconnector-tablepicker-menu-bottom-border .waffle-dataconnector-tablepicker-menuitem.goog-menuitem{padding-right:12px}.waffle-dataconnector-tablepicker-menuitem .goog-menuitem-content{font-size:13px}.waffle-dataconnector-tablepicker-menuitem-content-wrapper{display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;position:relative}.waffle-dataconnector-tablepicker-menuitem-content-wrapper .goog-menuitem-checkbox{display:none}.waffle-dataconnector-tablepicker-menuitem-content-name,.waffle-dataconnector-tablepicker-menuitem-content-id{display:inline-block;font:400 14px/24px Roboto,RobotoDraft,Helvetica,Arial,sans-serif}.waffle-dataconnector-tablepicker-menuitem-content-name{color:rgba(0,0,0,0.87);line-height:36px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.waffle-dataconnector-tablepicker-menuitem-content-wrapper-project .waffle-dataconnector-tablepicker-menuitem-content-name{padding-right:22px;width:176px}.waffle-dataconnector-tablepicker-menuitem-content-wrapper-dataset .waffle-dataconnector-tablepicker-menuitem-content-name{width:389px}.waffle-dataconnector-tablepicker-menuitem-content-id{color:rgba(0,0,0,0.54);line-height:36px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:191px}.waffle-dataconnector-tablepicker-menuitem-content-schemaicon{margin-right:8px;min-width:18px;width:18px}.waffle-dataconnector-tablepicker-menuitem-content-schemaicon svg{margin-right:5px;vertical-align:middle}.waffle-dataconnector-tablepicker-menuitem-content-schemaicon .waffle-dataconnector-tablepicker-filtered-menu-icon-search{padding:0px}.waffle-dataconnector-tablepicker-menuitem-content-nexticon{margin-left:auto;width:18px}.waffle-dataconnector-tablepicker-menuitem-content-nexticon svg{vertical-align:middle}.goog-menuitem-rtl .waffle-dataconnector-tablepicker-menuitem-content-nexticon{transform:rotateY(180deg)}.waffle-dataconnector-tablepicker-multilevelmenu{position:relative}.waffle-dataconnector-tablepicker-multilevelmenu,.waffle-dataconnector-tablepicker-multilevelmenu .goog-menu.waffle-dataconnector-tablepicker-menu{height:286px}.waffle-dataconnector-breadcrumbnavigator{display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;overflow:hidden;vertical-align:middle}.waffle-dataconnector-breadcrumbnavigator-entry{border:1px solid transparent;border-radius:4px;box-shadow:none;color:#202124;cursor:pointer;font-size:22px;letter-spacing:.2px;line-height:24px;overflow:hidden;padding:4px;text-overflow:ellipsis;transition:background-color 100ms linear;vertical-align:middle;white-space:nowrap}.waffle-dataconnector-breadcrumbnavigator-entry{flex:0 1 25%;min-width:45px}.waffle-dataconnector-breadcrumbnavigator-entry-condensed{flex:0 1 10%}.waffle-dataconnector-breadcrumbnavigator-entry:last-of-type{flex:none}.waffle-dataconnector-breadcrumbnavigator-entry.goog-control-hover,.waffle-dataconnector-breadcrumbnavigator-entry.goog-control-focused{background-color:#f1f3f4;outline:none}.waffle-dataconnector-breadcrumbnavigator-entry.goog-control-active{background-color:#e8eaed;outline:none}.waffle-dataconnector-breadcrumbnavigator-entry.goog-control-disabled{cursor:auto}.waffle-dataconnector-breadcrumbnavigator-separator{vertical-align:middle}.waffle-dataconnector-modal-title .waffle-dataconnector-breadcrumbnavigator-separator svg{bottom:unset;height:18px;margin-right:0;transform:unset;vertical-align:middle;width:18px}.waffle-dataconnector-modal-title .waffle-dataconnector-breadcrumbnavigator-separator polygon{fill:#5f6368}.waffle-dataconnector-prompt{background:#fff;border-radius:2px;border:none;box-shadow:0px 16px 24px 2px rgba(0,0,0,0.14),0px 6px 30px 5px rgba(0,0,0,0.12),0px 8px 10px -5px rgba(0,0,0,0.2);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;position:absolute;z-index:1302}.waffle-dataconnector-prompt-bg{left:0;position:absolute;top:0;z-index:1300}.waffle-dataconnector-prompt:focus{outline:none}.waffle-dataconnector-prompt-title{padding:24px 24px 20px 24px}.waffle-dataconnector-prompt-title-text{font:500 21px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;padding-right:38px}.waffle-dataconnector-prompt-title-close{background-size:cover;background:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgdmlld0JveD0iMCAwIDE4IDE4Ij4KICA8ZyBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgPHBhdGggZD0iTTAsMCBMMTgsMCBMMTgsMTggTDAsMTggTDAsMCBaIE0wLDAgTDE4LDAgTDE4LDE4IEwwLDE4IEwwLDAgWiIvPgogICAgPHBvbHlnb24gZmlsbD0iIzAwMCIgcG9pbnRzPSIxNC41MyA0LjUzIDEzLjQ3IDMuNDcgOSA3Ljk0IDQuNTMgMy40NyAzLjQ3IDQuNTMgNy45NCA5IDMuNDcgMTMuNDcgNC41MyAxNC41MyA5IDEwLjA2IDEzLjQ3IDE0LjUzIDE0LjUzIDEzLjQ3IDEwLjA2IDkiLz4KICA8L2c+Cjwvc3ZnPgo=") no-repeat;display:block;height:20px;position:absolute;right:24px;top:26px;width:20px}.waffle-dataconnector-prompt-content{padding:0 24px}.waffle-dataconnector-prompt-buttons{float:right;padding:8px 4px 14px 4px}.waffle-dataconnector-prompt-buttons:after{clear:both;content:"";display:block;height:0;width:0}.waffle-dataconnector-modal{background:#fff;border-radius:2px;border:none;box-shadow:0px 16px 24px 2px rgba(0,0,0,0.14),0px 6px 30px 5px rgba(0,0,0,0.12),0px 8px 10px -5px rgba(0,0,0,0.2);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;position:absolute;z-index:1003}.waffle-dataconnector-modal.docs-material-gm-dialog{border-radius:8px;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif}.waffle-dataconnector-modal-bg{background-color:rgba(0,0,0,0.54);z-index:1002}.waffle-dataconnector-modal:focus{outline:none}.waffle-dataconnector-modal-header{display:flex;-webkit-justify-content:space-between;justify-content:space-between;border-bottom:1px solid rgba(0,0,0,0.12);padding:24px;user-select:none}.waffle-dataconnector-modal-title{font-weight:500;font-size:18px;padding-right:38px}.docs-material-gm-dialog .waffle-dataconnector-modal-title{color:#202124;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:400;font-size:22px}.waffle-dataconnector-modal-title svg{-webkit-transform:scale(1.4,1.4);-moz-transform:scale(1.4,1.4);-ms-transform:scale(1.4,1.4);-o-transform:scale(1.4,1.4);transform:scale(1.4,1.4);bottom:-0.125em;font-size:18px;height:1em;margin-right:8px;position:relative;width:1em}.docs-material-gm-dialog .waffle-dataconnector-modal-title svg path{fill:#5f6368}.waffle-dataconnector-modal-close-button{background:transparent;border-radius:50%;cursor:pointer;display:block;height:28px;opacity:0.54;position:relative;transition:background-color 0.28s ease-out,opacity 0.28s ease-out;width:28px}.waffle-dataconnector-modal-close-button svg{height:18px;margin:5px;width:18px}.waffle-dataconnector-modal-close-button:focus{opacity:1.0;background-color:rgba(0,0,0,0.12);outline:none}.waffle-dataconnector-modal-close-button:hover{opacity:1.0}.waffle-dataconnector-modal-body{padding:24px}.waffle-dataconnector-modal-footer{border-top:1px solid rgba(0,0,0,0.12);padding:15px 12px 15px 24px}.docs-hc-gecko.waffle-dataconnector-modal-close-button polygon,.docs-hc-ie.waffle-dataconnector-modal-close-button polygon{fill:#fff}.waffle-dataconnector-bigqueryquerysettingsdialog{width:512px}.waffle-dataconnector-bigqueryquerysettingsdialog .waffle-dataconnector-modal-body{height:283px;padding:0}.waffle-dataconnector-bigqueryquerysettingsdialog-project-select-wrapper{width:100%}.waffle-dataconnector-bigqueryquerysettingsdialog-project-select-header{font-weight:700;margin:16px 0}.waffle-dataconnector-bigqueryquerysettingsdialog-project-section{padding:24px}.waffle-dataconnector-bigqueryquerysettingsdialog-project-select .docs-material-labeled-select-label{color:rgba(0,0,0,0.87);font-size:14px;font-weight:500}.waffle-dataconnector-bigqueryquerysettingsdialog-error-caption{color:#e06055;margin-top:8px}.waffle-dataconnector-bigqueryquerysettingsdialog-project-select .docs-material-labeled-select-outer-box{margin-top:16px}.waffle-dataconnector-bigqueryquerysettingsdialog .waffle-dataconnector-modal-footer{border-top:none;padding:0}.waffle-dataconnector-bigqueryquerysettingsdialog-continue-button-wrapper{display:flex}.waffle-dataconnector-bigqueryquerysettingsdialog-continue-button-wrapper>p{color:rgba(0,0,0,0.54);flex:1;margin:14px 24px}.waffle-dataconnector-bigqueryquerysettingsdialog-continue-button{margin:16px 24px}.waffle-dataconnector-bigqueryquerysettingsdialog-continue-button-wrapper:after{clear:both;content:"";display:block;height:0;width:0}.waffle-dataconnector-footer-sharing-message{background-color:#fafafa;color:rgba(0,0,0,0.54);padding:16px 24px 24px 60px;position:relative}.waffle-dataconnector-footer-sharing-message:after{background-size:contain;background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNHB4IiBoZWlnaHQ9IjI0cHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0iIzAwMDAwMCI+CiAgICA8cGF0aCBkPSJNMCAwaDI0djI0SDB6IiBmaWxsPSJub25lIi8+CiAgICA8cGF0aCBkPSJNMTggOGgtMVY2YzAtMi43Ni0yLjI0LTUtNS01UzcgMy4yNCA3IDZ2Mkg2Yy0xLjEgMC0yIC45LTIgMnYxMGMwIDEuMS45IDIgMiAyaDEyYzEuMSAwIDItLjkgMi0yVjEwYzAtMS4xLS45LTItMi0yem0tNiA5Yy0xLjEgMC0yLS45LTItMnMuOS0yIDItMiAyIC45IDIgMi0uOSAyLTIgMnptMy4xLTlIOC45VjZjMC0xLjcxIDEuMzktMy4xIDMuMS0zLjEgMS43MSAwIDMuMSAxLjM5IDMuMSAzLjF2MnoiLz4KPC9zdmc+Cg==");content:"";display:block;height:18px;left:27px;opacity:0.54;position:absolute;top:23px;width:18px}.waffle-dataconnector-dialog{background:#fff;border-radius:2px;border:none;box-shadow:0px 16px 24px 2px rgba(0,0,0,0.14),0px 6px 30px 5px rgba(0,0,0,0.12),0px 8px 10px -5px rgba(0,0,0,0.2);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;position:absolute;z-index:1003}.waffle-dataconnector-dialog-bg{background-color:#000;left:0;position:absolute;top:0;z-index:1002}.waffle-dataconnector-dialog:focus{outline:none}.waffle-dataconnector-dialog-title{border-bottom:1px solid rgba(0,0,0,0.12);padding:24px}.waffle-dataconnector-dialog-title-draggable{cursor:move}.waffle-dataconnector-dialog-title-text{font:500 21px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;padding-right:38px}.waffle-dataconnector-dialog-title-close{border-radius:50%;cursor:pointer;display:block;height:28px;opacity:0.54;position:absolute;right:18px;top:22px;transition:background-color 0.28s ease-out,opacity 0.28s ease-out;width:28px}.waffle-dataconnector-dialog-title-close svg{-webkit-transform:translate(-50%,-50%);-moz-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);-o-transform:translate(-50%,-50%);transform:translate(-50%,-50%);position:absolute;left:50%;top:50%}.waffle-dataconnector-dialog-title-close:focus{opacity:1.0;background-color:rgba(0,0,0,0.12);outline:none}.waffle-dataconnector-dialog-title-close:hover{background-color:rgba(0,0,0,0.26);opacity:1.0}.waffle-dataconnector-dialog-content{padding:24px}.waffle-dataconnector-dialog-buttons{padding:15px 12px 15px 24px}.waffle-dataconnector-dialog-button-wrapper{float:right}.waffle-dataconnector-dialog-button-wrapper>.docs-material-button{float:left}.waffle-dataconnector-dialog-buttons:after{clear:both;content:'';display:block;height:0;width:0}.waffle-dataconnector-dialog-error-message,.waffle-dataconnector-dialog-info-message{color:rgba(0,0,0,0.87);display:block;font:500 13px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;line-height:18px;margin:7px 0 7px 0px;position:relative;vertical-align:middle}.waffle-dataconnector-dialog-error-message{padding-left:24px;color:#db4437}.waffle-dataconnector-dialog-error-message:before{background-size:cover;background:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgdmlld0JveD0iMCAwIDE4IDE4Ij4KICA8ZyBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgPHBvbHlnb24gcG9pbnRzPSIwIDAgMTggMCAxOCAxOCAwIDE4Ii8+CiAgICA8cGF0aCBmaWxsPSIjZGI0NDM3IiBkPSJNMTUuNDk5ODkzOCwxNiBDMTYuNjA0NTIyLDE2IDE3LjA1NDk3MDgsMTUuMjE0NjU0MyAxNi41MTY2MzgyLDE0LjI2NDY1NTcgTDkuOTgzMzYxNzYsMi43MzUzNDQyOCBDOS40NDAyNjYwNiwxLjc3Njk0MDEgOC41NTQ5NzA3OSwxLjc4NTM0NTY2IDguMDE2NjM4MjQsMi43MzUzNDQyOCBMMS40ODMzNjE3NiwxNC4yNjQ2NTU3IEMwLjk0MDI2NjA1NSwxNS4yMjMwNTk5IDEuMzkwMDU4NDEsMTYgMi41MDAxMDYxOCwxNiBMMTUuNDk5ODkzOCwxNiBaIE0xMCwxNCBMOCwxNCBMOCwxMiBMMTAsMTIgTDEwLDE0IEwxMCwxNCBaIE0xMCwxMSBMOCwxMSBMOCw3IEwxMCw3IEwxMCwxMSBMMTAsMTEgWiIvPgogIDwvZz4KPC9zdmc+Cg==") no-repeat;content:'';display:inline-block;height:18px;left:0px;position:absolute;top:0;width:18px}.waffle-dataconnector-dialog-message-container{float:left;min-height:32px;min-width:200px;width:calc(100% - 260px)}.waffle-dataconnector-dialog-progress-message{margin-left:20px}.waffle-dataconnector-dialog-progress-label{font:13px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;line-height:18px}.waffle-dataconnector-dialog-progress-bar{height:5px;width:450px}.waffle-dataconnector-error-popup{max-width:780px;min-width:480px}.waffle-dataconnector-error-popup .waffle-dataconnector-prompt-content{padding:0 24px;overflow:auto}.waffle-dataconnector-error-popup .waffle-dataconnector-error-message-main{font:500 15px Roboto,RobotoDraft,Helvetica,Arial,sans-serif}.waffle-dataconnector-query-parameter-prompt.waffle-dataconnector-modal{width:320px;z-index:calc(1003 + 300)}.waffle-dataconnector-query-parameter-prompt .waffle-dataconnector-modal-body{padding:0 24px}.waffle-dataconnector-query-parameter-prompt-name-field input{text-transform:uppercase}.waffle-dataconnector-query-parameter-prompt-toggle-row{display:flex;height:21px;margin-top:16px}.waffle-dataconnector-query-parameter-prompt-toggle-label{line-height:21px;margin-left:8px}.waffle-dataconnector-query-parameter-prompt .waffle-dataconnector-modal-header{border-bottom:none}.waffle-dataconnector-query-parameter-prompt .waffle-dataconnector-modal-footer{border-top:none;float:right}.waffle-dataconnector-query-parameter-prompt-rangepicker{border-radius:50%;bottom:6px;height:29px;position:relative;right:0;width:29px}.waffle-dataconnector-query-parameter-prompt-rangepicker .docs-icon{margin:4px auto 4px 3px}.waffle-dataconnector-query-parameter-prompt-rangepicker-focused{background:rgba(0,0,0,0.12);outline:none}.waffle-dataconnector-simple-text-input-prompt-text-field{width:400px}.waffle-dataconnector-bigquery-query-settings-widget-project-section-header{color:rgba(0,0,0,0.54);margin-bottom:4px;whitespace:nowrap}.waffle-dataconnector-bigquery-query-settings-widget-alert{color:#e06055;font-size:11px;font-weight:500}.waffle-dataconnector-bigquery-query-settings-widget-alert .waffle-dataconnector-error-icon{bottom:-0.325em;height:1.4em;margin-right:4px;position:relative;width:1.4em}.waffle-dataconnector-bigquery-query-settings-widget-alert-description{color:#e06055;margin-top:4px}.waffle-dataconnector-bigquery-query-validation-widget-open-button{border-radius:50%;bottom:8px;box-sizing:border-box;cursor:pointer;height:20px;position:absolute;right:8px;width:20px;z-index:10}.waffle-dataconnector-bigquery-query-validation-widget-open-button .waffle-dataconnector-info-icon{height:100%;width:100%}.waffle-dataconnector-bigquery-query-validation-widget-open-button-hover,.waffle-dataconnector-bigquery-query-validation-widget-open-button-focused{background:rgba(66,133,244,0.26)}.waffle-dataconnector-bigquery-query-validation-widget-bar{display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between;background:rgba(66,133,244,0.12);border-top:1px solid rgba(0,0,0,0.12);bottom:0;box-sizing:border-box;color:#4285f4;display:none;font:inherit;font-weight:500;max-height:60px;min-height:40px;padding:8px;padding-left:16px;position:relative;right:0;width:100%}.waffle-dataconnector-bigquery-query-validation-widget-message{max-height:44px;max-width:calc(100% - 30px);overflow-x:hidden;overflow-y:auto}.waffle-dataconnector-bigquery-query-validation-widget-visible>.waffle-dataconnector-bigquery-query-validation-widget-bar{display:flex}.waffle-dataconnector-bigquery-query-validation-widget-visible>.waffle-dataconnector-bigquery-query-validation-widget-open-button{display:none}.waffle-dataconnector-bigquery-query-validation-widget-bar .waffle-dataconnector-error-icon-filled{height:20px;margin-right:8px;min-width:20px;width:20px}.waffle-dataconnector-bigquery-query-validation-widget-valid>.waffle-dataconnector-bigquery-query-validation-widget-bar{background:rgba(15,157,88,0.12);color:#0f9d58}.waffle-dataconnector-bigquery-query-validation-widget-bar .waffle-dataconnector-info-icon{height:20px;margin-right:8px;min-width:20px;width:20px}.waffle-dataconnector-bigquery-query-validation-widget-valid .waffle-dataconnector-info-icon,.waffle-dataconnector-bigquery-query-validation-widget-invalid .waffle-dataconnector-info-icon{display:none}.waffle-dataconnector-bigquery-query-validation-widget .waffle-dataconnector-error-icon-filled{display:none}.waffle-dataconnector-bigquery-query-validation-widget-bar .waffle-dataconnector-error-icon-filled{margin-right:8px}.waffle-dataconnector-bigquery-query-validation-widget .waffle-dataconnector-valid-icon{display:none}.waffle-dataconnector-bigquery-query-validation-widget-bar .waffle-dataconnector-valid-icon{height:20px;margin-right:8px;min-width:20px;width:20px}.waffle-dataconnector-bigquery-query-validation-widget-invalid .waffle-dataconnector-bigquery-query-validation-widget-bar{background:rgba(219,68,55,0.12);color:#db4437}.waffle-dataconnector-bigquery-query-validation-widget-invalid .waffle-dataconnector-error-icon-filled{display:block}.waffle-dataconnector-bigquery-query-validation-widget-valid .waffle-dataconnector-valid-icon{display:block}.waffle-dataconnector-bigquery-query-validation-widget-close-button{border-radius:50%;cursor:pointer;height:24px;margin-left:auto;width:24px}.waffle-dataconnector-bigquery-query-validation-widget-close-button svg{height:20px;margin:2px;width:20px}.waffle-dataconnector-bigquery-query-validation-widget .waffle-dataconnector-close-icon polygon{fill:#4285f4}.waffle-dataconnector-bigquery-query-validation-widget-close-button-hover,.waffle-dataconnector-bigquery-query-validation-widget-close-button-focused{background:rgba(66,133,244,0.26);outline:none}.waffle-dataconnector-bigquery-query-validation-widget-invalid .waffle-dataconnector-bigquery-query-validation-widget-close-button-hover,.waffle-dataconnector-bigquery-query-validation-widget-invalid .waffle-dataconnector-bigquery-query-validation-widget-close-button-focused{background:rgba(219,68,55,0.26)}.waffle-dataconnector-bigquery-query-validation-widget-valid .waffle-dataconnector-bigquery-query-validation-widget-close-button-hover,.waffle-dataconnector-bigquery-query-validation-widget-valid .waffle-dataconnector-bigquery-query-validation-widget-close-button-focused{background:rgba(15,157,88,0.26)}.waffle-dataconnector-bigquery-query-validation-widget-valid .waffle-dataconnector-close-icon polygon{fill:#0f9d58}.waffle-dataconnector-bigquery-query-validation-widget-invalid .waffle-dataconnector-close-icon polygon{fill:#db4437}.waffle-dataconnector-codemirrorquerytexteditor{-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;height:100%;position:relative}.waffle-dataconnector-codemirrorquerytexteditor,.waffle-dataconnector-codemirrorquerytexteditor .CodeMirror{font-family:'Roboto Mono','Consolas',monospace;height:100%}.waffle-dataconnector-codemirrorquerytexteditor .CodeMirror-gutters{border-right:1px solid rgba(0,0,0,0.12)}.waffle-dataconnector-codemirrorquerytexteditor>.CodeMirror-focused .CodeMirror-gutters{border-right:1px solid #4285f4}.waffle-dataconnector-codemirrorquerytexteditor .CodeMirror-linenumbers{background:#f5f5f5;color:rgba(0,0,0,0.54);font:500 14px Roboto,RobotoDraft,Helvetica,Arial,sans-serif}.waffle-dataconnector-codemirrorquerytexteditor .CodeMirror-gutter-elt{min-width:0;padding:0 20px}.waffle-dataconnector-codemirrorquerytexteditor .CodeMirror-lines{padding:16px 0}.waffle-dataconnector-codemirrorquerytexteditor .CodeMirror-line{padding-left:16px}.waffle-dataconnector-queryeditor-collapsible-sidebar-widget{border-bottom:1px solid rgba(0,0,0,0.12)}.waffle-dataconnector-queryeditor-collapsible-sidebar-widget .docs-charts-editor-collapsible-header{color:rgba(0,0,0,0.87)}.waffle-dataconnector-queryeditor-query-settings-icon{margin-right:8px}.waffle-dataconnector-queryeditor-collapsible-sidebar-widget .docs-charts-editor-collapsible-title{width:calc(100% - 50px)}.waffle-dataconnector-queryeditor-collapsible-sidebar-widget .docs-charts-editor-collapsible-summary{display:none}.waffle-dataconnector-queryeditor-collapsible-sidebar-widget .docs-charts-editor-collapsible-content>div{padding:8px 16px 16px}.waffle-dataconnector-queryeditor-collapsible-sidebar-widget .docs-charts-editor-collapsible-header{border:1px solid transparent}.waffle-dataconnector-queryeditor-collapsible-sidebar-widget .docs-charts-editor-collapsible-header.goog-control-focused{border:1px solid #4285f4}.waffle-dataconnector-dbschematreenode-label{cursor:pointer;display:flex;height:22px;position:relative;width:100%}.waffle-dataconnector-dbschematreenode-title{height:22px;line-height:22px;max-width:calc(100% - 18px - 10px);overflow:hidden;text-overflow:ellipsis;vertical-align:middle;white-space:nowrap}.waffle-dataconnector-dbschematreenode .waffle-dataconnector-expand-icon{width:18px;height:18px;margin:2px 10px 2px 2px;transform:rotate(-90deg);transition:transform .2s cubic-bezier(0.4,0.0,1,1)}.waffle-dataconnector-dbschematreenode-rtl .waffle-dataconnector-expand-icon{transform:rotate(90deg)}.waffle-dataconnector-dbschematreenode .waffle-spinner{height:14px;margin:4px 12px 4px 4px;width:14px}.waffle-dataconnector-dbschematreenode .waffle-spinner-circle{border-width:2px}.waffle-dataconnector-dbschematreenode>.waffle-dataconnector-dbschematreenode-label>.waffle-dataconnector-dbschematreenode-spinner-container{display:none}.waffle-dataconnector-dbschematreenode-loading>.waffle-dataconnector-dbschematreenode-label>.waffle-dataconnector-dbschematreenode-spinner-container{display:block}.waffle-dataconnector-dbschematreenode-loading>.waffle-dataconnector-dbschematreenode-label>.waffle-dataconnector-expand-icon{display:none}.waffle-dataconnector-dbschematreenode-open>.waffle-dataconnector-dbschematreenode-label>.waffle-dataconnector-expand-icon{transform:rotate(0deg)}.waffle-dataconnector-dbschematreenode-leaf>.waffle-dataconnector-dbschematreenode-label>.waffle-dataconnector-expand-icon{visibility:hidden}.waffle-dataconnector-dbschematreenode-label:hover,.waffle-dataconnector-dbschematreenode-selected>.waffle-dataconnector-dbschematreenode-label{color:#4285f4}.waffle-dataconnector-dbschematreenode-child-container{display:none;margin-left:16px}.waffle-dataconnector-dbschematreenode-open>.waffle-dataconnector-dbschematreenode-child-container{display:block}.waffle-dataconnector-dbschematreenode-error .waffle-dataconnector-dbschematreenode-title{color:#e06055;font-size:11px;padding-left:13px}.waffle-dataconnector-dbschematreenode-error .waffle-dataconnector-expand-icon{display:none}.waffle-dataconnector-draggablebar{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:rgba(0,0,0,0.12);bottom:0;position:absolute}.waffle-dataconnector-draggablebar-horizontal{width:100%}.waffle-dataconnector-draggablebar-vertical{height:100%}.waffle-dataconnector-draggablebar-handle{background:#fff;border:1px solid rgba(0,0,0,0.12);box-sizing:border-box;z-index:100}.waffle-dataconnector-draggablebar-horizontal .waffle-dataconnector-draggablebar-handle{cursor:row-resize;height:9px;left:calc(50% - 32px/2);position:absolute;top:calc(50% - 9px/2);width:32px}.waffle-dataconnector-draggablebar-vertical .waffle-dataconnector-draggablebar-handle{background:transparent;border:1px solid rgba(0,0,0,0.12);cursor:col-resize;height:32px;left:calc(50% - 9px/2);position:absolute;top:calc(50% - 32px/2);width:9px}.waffle-dataconnector-draggablebar-handle-icon{background:rgba(0,0,0,0.12);border:3px solid #fff;box-sizing:border-box;height:100%;width:100%}.waffle-dataconnector-textarea-editor{-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;height:100%;position:relative}.waffle-dataconnector-textarea-editor-textareawrapper{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border-radius:0;border:none;height:100%;margin:0;overflow:hidden;position:absolute;width:100%}.waffle-dataconnector-textarea-editor-textarea{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background-color:white;border-radius:0;border:none;color:#000;display:block;font-family:'Roboto Mono','Consolas',monospace;font-size:13px;height:100%;line-height:20px;margin:0 0 0 48px;outline:none;overflow:auto;overflow-wrap:normal;padding:8px;resize:none;white-space:pre;width:calc(100% - 48px);word-wrap:normal}.waffle-dataconnector-textarea-editor-linegutter{background:#f5f5f5;border-right:1px solid rgba(0,0,0,0.12);height:100%;left:0;position:absolute;top:0;width:48px}.waffle-dataconnector-textarea-editor-focused .waffle-dataconnector-textarea-editor-linegutter{border-right:1px solid #4285f4}.waffle-dataconnector-textarea-editor-linenumber-container{left:0;padding-top:8px;position:absolute;width:100%}.waffle-dataconnector-textarea-editor-linenumber{height:20px;line-height:20px;text-align:center;user-select:none;vertical-align:middle}.waffle-dataconnector-jdbc-query-settings-widget-connection-name-section{font-family:inherit}.waffle-dataconnector-jdbc-query-settings-widget-connection-name-section{margin-top:8px}.waffle-dataconnector-jdbc-query-settings-widget-connection-name-label{color:rgba(0,0,0,0.54)}.waffle-dataconnector-jdbc-query-settings-widget-connection-name{color:rgba(0,0,0,0.87);font-weight:500;margin-top:8px}.waffle-dataconnector-jdbc-query-settings-widget-connection-name-error{color:#e06055}.waffle-dataconnector-jdbc-query-settings-widget-change-button{left:-8px;margin:8px 0;position:relative}.waffle-dataconnector-plx-query-settings-widget{font:inherit}.waffle-dataconnector-plx-query-settings-widget-engine-section{margin-top:8px}.waffle-dataconnector-plx-query-settings-widget-script-section{margin-top:16px}.waffle-dataconnector-plx-query-settings-widget-script-section .waffle-dataconnector-removable-chip{margin-top:8px}.waffle-dataconnector-plx-query-settings-widget-script-label{font-size:11px}.waffle-dataconnector-plx-query-settings-widget-link-script-button{margin:8px 0 0 0}.waffle-dataconnector-modal.waffle-dataconnector-newqueryeditor{display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;height:calc(100% - 16px);max-height:640px;min-height:400px;width:832px}.waffle-dataconnector-modal.waffle-dataconnector-newqueryeditor.docs-material-gm-dialog{width:880px}.waffle-dataconnector-newqueryeditor .waffle-dataconnector-modal-body{display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;max-height:457px;padding:0}.waffle-dataconnector-newqueryeditor.docs-material-gm-dialog .waffle-dataconnector-modal-body{padding:0 24px 24px}.waffle-dataconnector-newqueryeditor.docs-material-gm-dialog .waffle-dataconnector-modal-header{border:none}.waffle-dataconnector-newqueryeditor .waffle-dataconnector-newqueryeditor-container{display:flex;-ms-flex-direction:row-reverse;-webkit-flex-direction:row-reverse;flex-direction:row-reverse;-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;-webkit-justify-content:space-between;justify-content:space-between;height:100%;overflow:hidden;position:relative}.waffle-dataconnector-newqueryeditor.docs-material-gm-dialog .waffle-dataconnector-newqueryeditor-container{border:1px solid rgba(0,0,0,0.12);border-radius:4px}.waffle-dataconnector-newqueryeditor-main{border-right:1px solid rgba(0,0,0,0.12);overflow:hidden;position:relative;width:576px}.waffle-dataconnector-newqueryeditor-sidebar{box-sizing:border-box;overflow-x:hidden;overflow-y:auto;width:calc(100% - 576px)}.waffle-dataconnector-newqueryeditor-preview-pane{bottom:0;height:0;position:absolute;overflow:hidden;width:100%}.waffle-dataconnector-newqueryeditor-info-pane:after{clear:both;content:"";display:block;height:0;width:0}.waffle-dataconnector-newqueryeditor .waffle-dataconnector-modal-footer{display:flex;align-items:center;border-top:1px solid rgba(0,0,0,0.12);padding:16px}.waffle-dataconnector-newqueryeditor-footer-message-container{display:flex;-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;align-items:center;height:48px;margin:0 8px;overflow:auto}.waffle-dataconnector-newqueryeditor-footer-message{color:rgba(0,0,0,0.54)}.waffle-dataconnector-newqueryeditor-footer-message .waffle-dataconnector-error-message:before{content:"";display:block;height:20px}.waffle-dataconnector-newqueryeditor-footer-message .waffle-dataconnector-error-message:after{content:"";display:block;height:20px}.waffle-dataconnector-newqueryeditor-footer-message-container .waffle-dataconnector-error-icon{display:none;margin-right:8px;height:24px;min-width:24px;width:24px}.waffle-dataconnector-newqueryeditor-footer-message-container.waffle-dataconnector-newqueryeditor-unhandled-error>.waffle-dataconnector-newqueryeditor-footer-message{color:#db4437}.waffle-dataconnector-newqueryeditor-footer-message-container.waffle-dataconnector-newqueryeditor-unhandled-error .waffle-dataconnector-error-icon{display:block}.waffle-dataconnector-newqueryeditor-preview-query-button,.waffle-dataconnector-newqueryeditor-execute-query-button{min-width:140px;white-space:nowrap}.waffle-dataconnector-newqueryeditor-preview-query-button .waffle-dataconnector-refresh-icon{height:24px;margin:4px;width:24px}.waffle-dataconnector-newqueryeditor-preview-query-button .waffle-dataconnector-refresh-icon path{fill:#4285f4}.waffle-dataconnector-newqueryeditor-preview-query-button.docs-material-button-disabled .waffle-dataconnector-refresh-icon path{fill:rgba(0,0,0,0.26)}.waffle-dataconnector-newqueryeditor-editor-pane{display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;height:100%;position:relative;overflow:hidden}.waffle-dataconnector-newqueryeditor-sidebar::-webkit-scrollbar-thumb{background:rgba(0,0,0,0.12);min-height:0;width:8px}.waffle-dataconnector-newqueryeditor-sidebar::-webkit-scrollbar-track{border:none;padding:0;width:8px}.waffle-dataconnector-newqueryeditor-sidebar::-webkit-scrollbar{width:8px;border-left:1px solid rgba(0,0,0,0.12)}.waffle-dataconnector-queryeditor-queryparameterchip-name{font-weight:700}.waffle-dataconnector-queryeditor-removable-chip-error .waffle-dataconnector-queryeditor-queryparameterchip-name{color:#db4437}.waffle-dataconnector-queryeditor-queryparameterwidget .waffle-dataconnector-queryeditor-removable-chip{margin:8px 0}.waffle-dataconnector-queryeditor-queryparameterwidget-header{display:flex;-webkit-align-items:center;align-items:center;height:100%}.waffle-dataconnector-queryeditor-queryparameterwidget-header .waffle-dataconnector-query-parameters-icon{height:18px;margin-right:8px;min-width:18px;width:18px}.waffle-dataconnector-queryeditor-queryparameterwidget .waffle-dataconnector-queryeditor-removable-chip{margin-bottom:0}.waffle-dataconnector-queryeditor-queryparameterwidget-add-parameter-button{margin:8px 0 0 0}.waffle-dataconnector-querypreviewrenderer{height:100%;width:100%}.waffle-dataconnector-querypreviewrenderer-canvas-viewport{background:#f3f3f3;direction:ltr;height:100%;overflow:scroll;width:100%}.waffle-dataconnector-querypreviewrenderer-canvas-viewport.native-scrollbar{position:static}.waffle-dataconnector-querypreviewrenderer-preview-overlay{background:rgba(0,0,0,0.12);height:100%;left:0;line-height:80px;opacity:0;position:absolute;text-align:center;top:0;transition:opacity 0.3s ease-in,visibility 0s linear 0.3s;vertical-align:middle;visibility:hidden;width:100%;z-index:2}.waffle-dataconnector-querypreviewrenderer-preview-overlay-text{-webkit-transform:translate(-50%,-50%);-moz-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);-o-transform:translate(-50%,-50%);transform:translate(-50%,-50%);background:rgba(0,0,0,0.54);border-radius:4px;box-shadow:0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12),0px 2px 4px -1px rgba(0,0,0,0.2);color:white;font:500 21px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;left:50%;max-width:80%;padding:20px;position:absolute;top:50%}.waffle-dataconnector-querypreviewrenderer-preview-overlay.visible{opacity:1;transition-delay:0s;visibility:visible}.waffle-dataconnector-querypreviewrenderer-preview-inactive>.waffle-dataconnector-querypreviewrenderer-canvas-viewport{overflow:hidden}.waffle-dataconnector-querypreviewrenderer-canvas-viewport>canvas{height:100%;width:100%}.waffle-dataconnector-querypreviewrenderer-a11y-region{position:absolute;top:-10000px;left:-10000px}.waffle-dataconnector-queryeditor-query-settings-header .docs-icon{margin-right:8px}.waffle-dataconnector-querytexteditor{position:relative}.waffle-dataconnector-querytexteditor-editor-container{height:100%;position:absolute;width:100%}.waffle-dataconnector-querytexteditor-overlay{background-color:#fff;height:100%;left:0;position:absolute;top:0;width:100%;width:100%;z-index:10000}.waffle-dataconnector-querytexteditor-overlay-message{-webkit-transform:translateY(-50%);-moz-transform:translateY(-50%);-ms-transform:translateY(-50%);-o-transform:translateY(-50%);transform:translateY(-50%);color:rgba(0,0,0,0.54);font:500 13px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;position:absolute;text-align:center;top:50%;width:100%}.waffle-dataconnector-querytexteditor-overlay-message a{color:inherit;text-decoration:underline}.waffle-dataconnector-queryeditor-removable-chip-inner{display:inline-block;max-width:100%;position:relative}.waffle-dataconnector-queryeditor-removable-chip-button{background:#f0f0f0;border-radius:16px;border:2px solid transparent;cursor:pointer;display:block;height:32px;line-height:32px;padding:0 32px 0 12px}.waffle-dataconnector-queryeditor-removable-chip-chip-content{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.waffle-dataconnector-queryeditor-removable-chip-error .waffle-dataconnector-queryeditor-removable-chip-button{background:#fff;border:2px solid #db4437;overflow:hidden}.waffle-dataconnector-queryeditor-removable-chip-view-only .waffle-dataconnector-queryeditor-removable-chip-button{padding-right:12px}.waffle-dataconnector-queryeditor-removable-chip-button-hover{background:#e0e0e0}.waffle-dataconnector-queryeditor-removable-chip-button-active{background:#d0d0d0}.waffle-dataconnector-queryeditor-removable-chip-button-focused{border:2px solid #4285f4;outline:none}.waffle-dataconnector-queryeditor-removable-chip-button a{color:inherit}.waffle-dataconnector-queryeditor-removable-chip-remove-button{-webkit-transform:translateY(-50%);-moz-transform:translateY(-50%);-ms-transform:translateY(-50%);-o-transform:translateY(-50%);transform:translateY(-50%);background-color:rgba(0,0,0,0.12);border-radius:50%;box-sizing:border-box;height:18px;position:absolute;right:9px;top:50%;width:18px}.waffle-dataconnector-queryeditor-removable-chip-remove-button .waffle-dataconnector-close-icon{height:14px;margin:2px;width:14px}.waffle-dataconnector-queryeditor-removable-chip-remove-button .waffle-dataconnector-close-icon polygon{fill:#fff}.waffle-dataconnector-queryeditor-removable-chip-remove-button-hover{background-color:rgba(0,0,0,0.38);cursor:pointer}.waffle-dataconnector-queryeditor-removable-chip-remove-button-focused{background-color:rgba(0,0,0,0.38);outline:none}.waffle-dataconnector-schema-menu{min-height:30px;position:relative}.waffle-dataconnector-schema-menu .waffle-dataconnector-schema-menu-spinner{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}.waffle-dataconnector-schema-menu-error-message{color:rgba(0,0,0,0.54)}.waffle-dataconnector-queryeditor-schemamenuwidget-header{display:flex;-webkit-align-items:center;align-items:center;height:100%}.waffle-dataconnector-queryeditor-schemamenuwidget-header .waffle-dataconnector-database-icon{height:18px;margin-right:8px;min-width:18px;width:18px}.waffle-dataconnector-queryeditor-sidebaraccordion{box-sizing:border-box;display:flex;flex-direction:column;min-width:200px}.waffle-dataconnector-queryeditor-sidebaraccordion:focus{outline-color:#4285f4}.waffle-dataconnector-upgrade-loading-dialog{display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;box-sizing:border-box;height:558px;text-align:center;width:512px}.waffle-dataconnector-upgrade-loading-dialog .waffle-dataconnector-modal-header{border-bottom:none;justify-content:flex-end;padding:24px 24px 0px}.waffle-dataconnector-upgrade-loading-dialog .waffle-dataconnector-modal-title{display:none}.waffle-dataconnector-upgrade-loading-dialog .waffle-dataconnector-modal-body{padding:0;margin-top:-30px}.waffle-dataconnector-upgrade-loading-dialog .waffle-dataconnector-modal-close-button{height:34px;margin-right:-5px;width:34px}.waffle-dataconnector-upgrade-loading-dialog .waffle-dataconnector-modal-close-button svg{height:24px;width:24px}.waffle-dataconnector-upgrade-loading-dialog-tip{color:#202124;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:22px;font-weight:400;height:32px;letter-spacing:0.2px;line-height:20px;margin:32px auto;max-width:392px}.waffle-dataconnector-upgrade-loading-dialog-image{height:350px;user-select:none}.waffle-dataconnector-upgrade-loading-dialog-description{color:#5f6368;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;letter-spacing:0.2px;line-height:20px;margin:4px auto 4px auto;max-width:392px}.waffle-dataconnector-upgrade-loading-dialog .waffle-dataconnector-modal-footer{border-top:none}.waffle-dataconnector-upgrade-prompt-dialog{display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;box-sizing:border-box;height:558px;text-align:center;width:512px;height:630px}.waffle-dataconnector-upgrade-prompt-dialog .waffle-dataconnector-modal-header{border-bottom:none;justify-content:flex-end;padding:24px 24px 0px}.waffle-dataconnector-upgrade-prompt-dialog .waffle-dataconnector-modal-title{display:none}.waffle-dataconnector-upgrade-prompt-dialog .waffle-dataconnector-modal-body{padding:0}.waffle-dataconnector-upgrade-prompt-dialog .waffle-dataconnector-modal-close-button{height:34px;margin-right:-5px;width:34px}.waffle-dataconnector-upgrade-prompt-dialog .waffle-dataconnector-modal-close-button svg{height:24px;width:24px}.waffle-dataconnector-upgrade-prompt-dialog-image{height:185px}.waffle-dataconnector-upgrade-prompt-dialog-title{color:#202124;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:22px;font-weight:400;max-width:428px;margin:22px auto 16px auto}.waffle-dataconnector-upgrade-prompt-dialog-description{color:#5f6368;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;letter-spacing:0.2px;line-height:20px;margin:4px auto 4px auto;max-width:392px}.waffle-dataconnector-upgrade-prompt-dialog-bullet-point{font-weight:bold;padding-right:4px}.waffle-dataconnector-upgrade-prompt-dialog-upgrade-button-wrapper{margin-top:20px}.waffle-dataconnector-upgrade-prompt-dialog .waffle-dataconnector-modal-footer{border-top:none}.waffle-dataconnector-upgrade-success-dialog{display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;box-sizing:border-box;height:558px;text-align:center;width:512px;height:545px}.waffle-dataconnector-upgrade-success-dialog .waffle-dataconnector-modal-header{border-bottom:none;justify-content:flex-end;padding:24px 24px 0px}.waffle-dataconnector-upgrade-success-dialog .waffle-dataconnector-modal-title{display:none}.waffle-dataconnector-upgrade-success-dialog .waffle-dataconnector-modal-body{padding:0}.waffle-dataconnector-upgrade-success-dialog .waffle-dataconnector-modal-close-button{height:34px;margin-right:-5px;width:34px}.waffle-dataconnector-upgrade-success-dialog .waffle-dataconnector-modal-close-button svg{height:24px;width:24px}.waffle-dataconnector-upgrade-success-dialog-image{height:185px}.waffle-dataconnector-upgrade-success-dialog-title{color:#202124;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:22px;font-weight:400;max-width:428px;margin:22px auto 16px auto}.waffle-dataconnector-upgrade-success-dialog-description{color:#5f6368;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;letter-spacing:0.2px;line-height:20px;margin:4px auto 8px auto;max-width:400px}.waffle-dataconnector-upgrade-success-dialog-start-analyze-button-wrapper{margin-top:30px}.waffle-dataconnector-upgrade-success-dialog .waffle-dataconnector-modal-footer{border-top:none}.trix-data-prep-highlight-styled-rect{background-color:#0f9d58;opacity:0.06;pointer-events:none}.range-border.trix-data-prep-highlight-styled-border{border-color:#0f9d58;border-style:dashed}.trix-data-prep-active-column-label{overflow:hidden;padding:6px 12px 0;text-overflow:ellipsis;white-space:nowrap}.trix-data-prep-insights-cta{background:red;border-radius:8px;height:8px;margin:4px;width:8px}.trix-data-prep-column-label-container{align-items:center;background-color:#f1f3f4;border-radius:8px;display:flex;height:40px;padding:0 8px}.trix-data-prep-column-label{color:#202124;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;letter-spacing:0.2px;overflow:hidden;padding-left:12px;text-overflow:ellipsis;width:210px}.trix-data-prep-column-navigation-arrows{display:flex;direction:ltr;margin-left:auto}.trix-data-prep-select-column-menu-button,.trix-data-prep-column-right-button,.trix-data-prep-column-left-button{align-items:center;background-color:transparent;border:none;border-radius:50%;display:flex;height:18px;justify-content:center;outline:none;padding:0;width:18px}.trix-data-prep-select-column-menu-button .docs-icon,.trix-data-prep-column-right-button .docs-icon,.trix-data-prep-column-left-button .docs-icon{left:-3px;margin:0;top:-3px}.trix-data-prep-column-left-button{margin-right:4px}.trix-data-prep-select-column-menu-button:hover,.trix-data-prep-select-column-menu-button:focus,.trix-data-prep-column-right-button:hover,.trix-data-prep-column-right-button:focus,.trix-data-prep-column-left-button:hover,.trix-data-prep-column-left-button:focus{background:#e8eaed;cursor:pointer}.trix-data-prep-select-column-menu-button:active,.trix-data-prep-column-right-button:active,.trix-data-prep-column-left-button:active{background:#dadce0}.trix-data-prep-headers-count{overflow:hidden;padding:6px 12px 0;text-overflow:ellipsis;white-space:nowrap}.trix-data-prep-headers-count-container{align-items:center;border-radius:8px;color:#5f6368;display:flex;float:right;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:normal;justify-content:flex-end}.trix-data-prep-headers-count-prompt{align-content:center;height:24px;letter-spacing:0.3px;line-height:24px;padding:5px 3px}.trix-data-prep-headers-count-select{direction:ltr;display:flex;padding:5px}.trix-data-prep-headers-count-decrement,.trix-data-prep-headers-count-increment{background-color:white;border:0;margin:0;padding:0}.trix-data-prep-headers-count-decrement .goog-toolbar-button,.trix-data-prep-headers-count-increment .goog-toolbar-button{border-color:#dadce0!important}.trix-data-prep-headers-count-decrement .goog-toolbar-button{border-radius:2px 0 0 2px;border-right:0;margin-right:0}.trix-data-prep-headers-count-increment .goog-toolbar-button{border-radius:0 2px 2px 0;border-left:0;margin-left:0}.trix-data-prep-headers-count-decrement .goog-toolbar-button,.trix-data-prep-headers-count-decrement .goog-toolbar-button-outer-box,.trix-data-prep-headers-count-decrement .goog-toolbar-button-inner-box,.trix-data-prep-headers-count-decrement .docs-icon,.trix-data-prep-headers-count-increment .goog-toolbar-button,.trix-data-prep-headers-count-increment .goog-toolbar-button-outer-box,.trix-data-prep-headers-count-increment .goog-toolbar-button-inner-box,.trix-data-prep-headers-count-increment .docs-icon{box-sizing:border-box;height:24px;margin:0;padding:0;width:24px}.waffle-insights-headers-count-combo-box .waffle-insights-headers-count-combo-box-input.jfk-textinput{border-radius:0;height:24px;margin:0;padding:0;text-align:center;width:41px}.goog-inline-block.waffle-insights-headers-count-combo-box-dropdown{display:none}.waffle-insights-headers-count-combo-box-hover .waffle-insights-headers-count-combo-box-input{background-color:#f1f3f4}.trix-data-prep-insights-tab .trix-data-prep-insights-container .docs-charts-editor-material-togglebutton{border:none;display:table;height:inherit;line-height:inherit;text-align:unset;width:100%}.trix-data-prep-sidebar-survey-container{align-items:center;background-color:#f8f9fa;display:flex;height:40px;padding:0 8px}.trix-data-prep-sidebar-survey-link{color:#188038!important;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;letter-spacing:0.25px}.trix-data-prep-sidebar-survey-link:hover{text-decoration:none}.trix-data-prep-sidebar-survey-container:hover,.trix-data-prep-sidebar-survey-container:focus{background:rgba(0,0,0,.06)}.trix-data-prep-sidebar-survey-container:active{background:rgba(0,0,0,0.12)}.trix-data-prep-insight-row,.trix-data-prep-actionable-insight-row{box-sizing:border-box;display:flex;font-size:14px;height:40px;justify-content:space-between;line-height:40px;vertical-align:middle}.trix-data-prep-actionable-insight-row{padding:0 24px 0 11px}.trix-data-prep-actionable-insight-row:hover{background-color:#e6f4ea}.trix-data-prep-actionable-insight-row:hover .docs-icon-img{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_green.svg)}.trix-data-prep-actionable-insight-icon{margin-right:8px}.trix-data-prep-insight-row{margin:0 3px;padding:0 9px}.trix-data-prep-insights-frequency-separator{background:#dadce0;height:1px;margin:0 12px}.trix-data-prep-insight-row-value{color:#80868b;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:400;margin-right:4px;margin-top:2px;overflow:hidden;text-align:right;text-overflow:ellipsis;white-space:nowrap;width:50%}.trix-data-prep-insights-toggle-separator{background:#dadce0;height:16px;margin:0 15px;width:1px}.trix-data-prep-insight-row-name{color:#3c4043;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;overflow:hidden;padding-right:5px;text-overflow:clip;white-space:nowrap}.trix-data-prep-insight-frequency-row-name{color:#3c4043;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:400;overflow:hidden;padding-right:5px;text-overflow:clip;white-space:nowrap}.trix-data-prep-insight-row:hover{background:#e8eaed;border-radius:32px}.trix-data-prep-insights-container{padding-top:12px}.trix-data-prep-insights-chart-container,.trix-data-prep-insights-frequency-tables,.trix-data-prep-insights-section{border:1px solid #dadce0;border-radius:8px;box-sizing:border-box;margin:0 12px;overflow:hidden}.trix-data-prep-insights-toggle-container{box-sizing:border-box;display:flex;justify-content:flex-end;padding:16px;width:100%}.trix-data-prep-insights-label-active,.trix-data-prep-insights-label-inactive{flex-shrink:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.trix-data-prep-insights-label-active{color:#188038;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;letter-spacing:0.25px;line-height:20px;text-align:center}.docs-gm .docs-material .trix-data-prep-insights-label-active .docs-icon-img{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_green.svg)}.trix-data-prep-insights-label-inactive{color:#80868b;cursor:pointer;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;letter-spacing:0.25px;line-height:20px;outline:none;text-align:center}.trix-data-prep-insights-label-inactive:hover,.trix-data-prep-insights-label-inactive:focus{background-color:#f1f3f4}.trix-data-prep-insights-label-inactive:active{background-color:#e8eaed}.goog-control-disabled.trix-data-prep-insights-label-inactive{color:#dadce0;cursor:default;font-size:14px}.goog-control-disabled.trix-data-prep-insights-label-inactive:hover,.goog-control-disabled.trix-data-prep-insights-label-inactive:focus{background-color:transparent}.trix-data-prep-insights-section-label{color:#3c4043;font-family:Google Sans;font-size:14px;font-weight:500;letter-spacing:0.25px;line-height:20px;margin-left:12px;padding-bottom:8px}.trix-data-prep-insights-chart,.trix-data-prep-insights-value-most-frequent-table,.trix-data-prep-insights-value-least-frequent-table{overflow:auto}.trix-data-prep-insights-separator{height:24px}.trix-data-prep-type-button,.trix-data-prep-date-time-input-dropdown,.trix-data-prep-currency-input-dropdown,.trix-data-prep-min-box,.trix-data-prep-max-box,.trix-data-prep-blank-checkbox,.trix-data-prep-duplicate-checkbox,.trix-data-prep-dropdown-list-input,.trix-data-prep-dropdown-type-input{margin:16px}.trix-data-prep-insights-hidden-data-message{color:#5f6368;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;padding:16px 0 40px 0;text-align:center}.trix-data-prep-db-insights .trix-data-prep-insights-local-only{display:none}.trix-column-insights-sidebar-column-selector-menu{margin-left:10px;width:270px}.trix-column-insights-sidebar-column-selector-menu-scrollable-wrapper{max-height:270px;overflow-y:auto}.trix-column-insights-sidebar-column-selector-menuitem{-webkit-align-items:center;align-items:center;display:flex;font-family:Roboto;font-size:14px;font-weight:500;height:32px;letter-spacing:0.2px;line-height:20px;overflow:hidden;padding:0 8px;text-overflow:ellipsis;width:230px;white-space:nowrap}.trix-column-insights-sidebar-column-selector-menuitem-accel{color:#9e9e9e;margin-left:auto;padding-left:20px;text-align:center}.trix-column-insights-sidebar-column-selector-menuitem-refreshquery-info{font-style:italic}.trix-column-insights-sidebar-column-selector-menuitem-refreshquery-info-error-button{color:#db4437;text-decoration:underline}.trix-column-insights-sidebar-column-selector-menuitem-refreshquery-estimate-placeholder{font-style:italic}.trix-data-prep-column-insights-sidebar-refresh-label{overflow:hidden;padding:0 12px 12px;text-overflow:ellipsis;white-space:nowrap}.trix-data-prep-column-insights-sidebar-refresh-label-container{align-items:center;background-color:#f1f3f4;border-radius:8px;display:flex;height:40px}.trix-data-prep-column-insights-sidebar-refresh-label-last-updated{align-items:center;color:#202124;display:flex;font-family:Roboto;font-size:12px;font-weight:500;letter-spacing:0.2px;overflow:hidden;padding:0 12px;text-overflow:ellipsis;width:170px}.trix-data-prep-column-insights-sidebar-refresh-label-last-updated-loaded-msg{overflow:hidden;padding-left:5px;text-overflow:ellipsis}.trix-data-prep-column-insights-sidebar-refresh-label-last-updated-time{overflow:hidden;padding-left:4px;text-overflow:ellipsis}.trix-data-prep-column-insights-sidebar-refresh-label-button{color:#188038;background-color:transparent;border:none;border-radius:50%;font-family:Roboto;font-size:12px;justify-content:center;outline:none;padding:0 12px;width:60px}.trix-data-prep-column-insights-sidebar-refresh-label-separator{border-left:1px #dadce0 solid;height:20px}.trix-data-prep-column-insights-sidebar-refresh-label-last-updated-icon{height:17px;width:17px}.trix-data-prep-column-insights-sidebar-refresh-label-button-wrapper{padding:0}.trix-data-prep-column-insights-sidebar-refresh-label-button-wrapper .docs-material-button{margin:0;text-transform:none}.trix-data-prep-column-insights-sidebar-refresh-label-button-wrapper .docs-material-button-content>div>span{vertical-align:middle}.waffle-dataprep-column-insights-sidebar-icon .docs-icon-img{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_green.svg)!important}.waffle-dataprep-column-insights .waffle-sidebar-title .docs-gm-sidebar-icon{margin-right:0}.trix-data-prep-column-insights-refresh-placeholder-container{align-items:center;display:flex;flex-direction:column;font-family:Roboto;font-size:12px;font-weight:500;letter-spacing:0.2px;padding:60px 65px}.trix-data-prep-column-insights-refresh-placeholder-retrieving-data{align-items:center;display:flex;height:35px}.trix-data-prep-column-insights-refresh-placeholder-retrieving-data-spinner .waffle-spinner{height:12px;width:12px}.trix-data-prep-column-insights-refresh-placeholder-retrieving-data-msg{padding:0 5px}.trix-data-prep-column-insights-refresh-placeholder-load-time-msg{color:#80868b;text-align:center}.trix-data-prep-column-insights-refresh-placeholder-retrieving-data-msg{color:#188038;text-align:center}.docs-material-button-hairline-primary.docs-material-button.waffle-datavalidation-add-rule-button{align-items:center;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;padding:6px 14px}.docs-material-button-hairline-primary.docs-material-button.waffle-datavalidation-delete-all-button{color:#5f6368}.waffle-boolean-condition-picker-checked-text-holder,.waffle-boolean-condition-picker-unchecked-text-holder{align-items:baseline;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-webkit-justify-content:space-between;justify-content:space-between}.waffle-boolean-condition-picker-checked-text-description,.waffle-boolean-condition-picker-unchecked-text-description{float:left}.waffle-boolean-condition-picker-checked-text-input-wrapper,.waffle-boolean-condition-picker-unchecked-text-input-wrapper{float:right}.waffle-boolean-condition-picker-checked-text-input,.waffle-boolean-condition-picker-unchecked-text-input{width:168px}.waffle-datavalidation-add-rule-button-wrapper,.waffle-datavalidation-delete-all-button-wrapper{float:right}.waffle-datavalidation-add-rule-plus{font-size:24px;font-weight:100;line-height:20px;margin-right:8px;vertical-align:text-bottom}.waffle-datavalidation-edit-pill-invalid-type-buttons .jfk-radiobutton-label{margin-bottom:13px}.waffle-datavalidation-edit-pill-button-bar{align-items:center;border-top:1px solid #dadce0;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;padding:16px 0 16px 60px;position:relative;text-align:right}.waffle-datavalidation-edit-pill-cancel-button,.waffle-datavalidation-edit-pill-done-button{cursor:pointer;margin-left:16;text-transform:none}.waffle-datavalidation-edit-pill-section{padding:0 0 24px 0}.waffle-datavalidation-edit-pill-invalid-type-buttons{margin-top:12px}.waffle-datavalidation-edit-pill-invalid-type-buttons .jfk-radiobutton{margin-left:2px;padding:0}.waffle-datavalidation-edit-pill-invalid-type-buttons .jfk-radiobutton-label{color:#202124;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;letter-spacing:0.2px;line-height:20px;margin-left:32px;text-decoration-line:none}.waffle-datavalidation-edit-pill-invalid-type-buttons .jfk-radiobutton-radio{height:20px;left:0;top:0;width:20px}.waffle-datavalidation-edit-pill-invalid-type-buttons .jfk-radiobutton-checked .jfk-radiobutton-radio::after{height:10px;margin:3px;width:10px}.waffle-datavalidation-edit-pill-condition-pane,.waffle-datavalidation-slide-frame{position:relative;width:268px}.waffle-datavalidation-edit-pill-help-text-input{width:208px}.waffle-datavalidation-edit-pill-help-text-input-wrapper{align-items:center;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-webkit-justify-content:space-between;justify-content:space-between}.waffle-datavalidation-edit-pill-help-text-reset-button-wrapper:hover,.waffle-datavalidation-edit-pill-help-text-reset-button-wrapper:focus{outline:none}.waffle-datavalidation-edit-pill-help-text-reset-button-wrapper{color:#5f6368;cursor:pointer;display:inline;margin:8px}.waffle-datavalidation-edit-pill-range-picker{border-bottom:none;padding:16px 16px 12px 16px}.waffle-datavalidation-edit-pill-boolean-condition-picker{margin-bottom:12px}.waffle-datavalidation-edit-pill-section-header{color:#3c4043;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;margin-bottom:8px}.waffle-datavalidation-one-of-range-wrapper{padding:8px 0}.waffle-datavalidation-sidebar-button-bar{align-items:center;border-top:1px solid #dadce0;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;padding:16px;position:relative}.waffle-datavalidation-sidebar-scroll-pane{overflow-x:hidden;overflow-y:auto}.waffle-datavalidation-sidebar-widget{padding:20px 16px 0}.waffle-datavalidation-sidebar-widget-header{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;align-items:center;justify-content:space-between}.waffle-datavalidation-slide-frame{padding:12px 16px 8px 16px;position:relative;width:268px}.waffle-datavalidation-view-pill{background-color:#fff;border-bottom:1px solid #dadce0;cursor:pointer;display:flex;height:56px;padding:10px;position:relative}.waffle-datavalidation-view-pill:focus,.waffle-datavalidation-view-pill:hover{background-color:#f1f3f4;outline:none}.waffle-datavalidation-view-pill-condition{color:#202124;font-size:14px;font-weight:500;letter-spacing:0.15px;line-height:16px;max-height:30px;margin-bottom:4px;overflow:hidden;text-overflow:ellipsis;width:142px}.waffle-datavalidation-view-pill-delete-button-wrapper{height:56px;right:16px;line-height:56px;position:absolute;opacity:0.5}.waffle-datavalidation-view-pill-delete-button-wrapper:hover{opacity:1}.waffle-datavalidation-view-pill-delete-button-wrapper .docs-icon{width:21px;height:21px}.waffle-datavalidation-view-pill-range{color:#3c4043;height:20px;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:20px;letter-spacing:0.2px;overflow:hidden;text-overflow:ellipsis;width:142px}.range-border.waffle-datavalidation-view-pill-highlight-styled-border{border-color:#34a853;border-style:solid;line-height:0}.waffle-datavalidation-view-pill-highlight-styled-rect{background-color:#34a853;opacity:0.06;pointer-events:none}.waffle-datavalidation-view-pill-summary{margin:auto 8px auto 14px;position:relative;width:142px}.waffle-datavalidation-edit-pill-error-bubble{z-index:1000!important}.waffle-datavalidation-edit-pill-boolean-condition-picker-body .waffle-conditionalformat-edit-pill-section-body .jfk-select:focus{border:2px solid #1a73e8!important}.waffle-assistant-overlay-informational-card{background-color:#ffffff;border-radius:8px;box-shadow:0px -3px 11px rgba(128,134,139,0.09),0px 6px 11px rgba(128,134,139,0.06),0px 1px 3px rgba(60,64,67,0.3),0px 4px 8px rgba(60,64,67,0.15);min-height:108px;min-width:220px}.waffle-assistant-overlay-informational-card-content-wrapper{padding:8px 12px 0 12px}.waffle-assistant-overlay-informational-card-headline-message{color:#188038;float:left;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:16px;font-weight:400;letter-spacing:0.1px;line-height:24px;white-space:normal;width:100%;word-break:break-word}.waffle-assistant-overlay-informational-card-send-feedback-cta{color:#80868b;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;letter-spacing:0.3px;line-height:16px;max-height:40px;overflow-y:scroll;text-overflow:clip;white-space:normal;width:100%;word-wrap:break-word}.waffle-assistant-overlay-informational-card-footer-wrapper{padding:8px 12px}.waffle-assistant-overlay-informational-card-buttons-wrapper{display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row}.waffle-assistant-overlay-informational-card-button{align-items:center;background:#ffffff;border-radius:16px;box-sizing:border-box;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;height:24px;margin-right:8px;mix-blend-mode:normal;width:24px}.waffle-assistant-overlay-informational-card-send-feedback-button{border:1px solid #a8dab5}.waffle-assistant-overlay-informational-card-feedback-icon{display:flex;margin:auto}.waffle-assistant-overlay-informational-decorator{background-color:#188038;border-radius:8px 8px 0 0;color:#fff;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;letter-spacing:0.25px;padding:1px 8px;position:absolute}.waffle-assistant-overlay-informational-range-highlighter-border{border-color:#188038;border-style:solid}.waffle-assistant-overlay-informational-range-highlighter-rect{background-color:#e6f4ea;opacity:0.50;pointer-events:none}.waffle-assistant-overlay-recommendation-card{background-color:#ffffff;border-radius:8px;box-shadow:0px -3px 11px rgba(128,134,139,0.09),0px 6px 11px rgba(128,134,139,0.06),0px 1px 3px rgba(60,64,67,0.3),0px 4px 8px rgba(60,64,67,0.15);min-height:134px;width:240px}.waffle-assistant-overlay-recommendation-card-header-wrapper{align-items:center;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-webkit-justify-content:space-between;justify-content:space-between;min-height:32px;padding:8px 12px 0 12px}.waffle-assistant-overlay-recommendation-card-title{color:#5f6368;float:left;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:500;letter-spacing:0.8px;line-height:16px;text-transform:uppercase}.waffle-assistant-overlay-recommendation-card-info-icon{float:right}.waffle-assistant-overlay-recommendation-card-content-wrapper{min-height:58px;padding:0 12px}.waffle-assistant-overlay-recommendation-card-recommendation-wrapper{align-items:center;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row}.waffle-assistant-overlay-recommendation-card-recommendation{color:#188038;float:left;overflow-x:hidden;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:16px;font-weight:400;letter-spacing:0.1px;line-height:24px;white-space:normal;width:100%;word-break:break-word}.waffle-assistant-overlay-recommendation-card-additional-information{color:#80868b;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;letter-spacing:0.3px;line-height:16px;overflow-y:scroll;text-overflow:clip;white-space:normal}.waffle-assistant-overlay-recommendation-card-show-more-information{color:#1a73e8}.waffle-assistant-overlay-recommendation-card-footer-wrapper{padding:8px 12px}.waffle-assistant-overlay-recommendation-card-buttons-wrapper{display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row}.waffle-assistant-overlay-recommendation-card-button{align-items:center;background:#ffffff;border-radius:16px;box-sizing:border-box;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;height:24px;margin-right:8px;mix-blend-mode:normal;width:24px}.waffle-assistant-overlay-recommendation-card-accept-button-icon .docs-icon-img{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_green.svg)!important}.waffle-assistant-overlay-recommendation-card-button-icon{margin:1px}.waffle-assistant-overlay-recommendation-card-accept-button{border:1px solid #a8dab5}.waffle-assistant-overlay-recommendation-card-reject-button{border:1px solid #dadce0}.waffle-assistant-overlay-recommendation-card-menu-button{padding:0}.waffle-autofill-previews-range-highlighter-border{border-color:#188038;border-style:solid}.waffle-autofill-previews-range-highlighter-rect{background-color:#e6f4ea;opacity:0.50;pointer-events:none}.waffle-db-object-formula-tooltip-help-button{box-sizing:border-box;display:inline-block;height:20px;outline:none;padding:2px;vertical-align:bottom;width:20px}.waffle-db-object-formula-tooltip-help-button-hover{background:#f1f3f4;border-radius:75%}.waffle-db-object-formula-tooltip-help-bubble-visible .waffle-db-object-formula-tooltip-help-button,.waffle-db-object-formula-tooltip-help-button-focused,.waffle-db-object-formula-tooltip-help-button-active{background:#e6f4ea;border-radius:75%}.waffle-db-object-formula-tooltip-help-icon{height:100%;width:100%}.waffle-db-object-formula-tooltip-help-bubble-visible .waffle-db-object-formula-tooltip-help-button .waffle-db-object-formula-tooltip-help-icon,.waffle-db-object-formula-tooltip-help-button-focused .waffle-db-object-formula-tooltip-help-icon,.waffle-db-object-formula-tooltip-help-button-active .waffle-db-object-formula-tooltip-help-icon{fill:#188038}.waffle-db-object-formula-tooltip-help-bubble{border:none;border-radius:8px;box-shadow:0 4px 8px 3px rgba(60,64,67,.15);font-size:12px;padding:16px 16px 16px 18px;max-width:280px;width:280px}.waffle-db-object-formula-tooltip-help-bubble:focus{outline:1px solid transparent}.waffle-db-object-formula-tooltip-help-bubble-title{color:#3c4043;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;letter-spacing:0.25px;line-height:20px;margin-bottom:19px}.waffle-db-object-formula-tooltip-help-bubble-subtitle{color:#3c4043;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;letter-spacing:0.3px;line-height:16px}.waffle-db-object-formula-tooltip-help-bubble-example{background-color:#f1f3f4;border-radius:3px;color:#202124;display:inline-block;font-family:'Roboto Mono','Consolas',monospace;font-size:14px;letter-spacing:0.25px;line-height:20px;margin:9px 0 16px 0;opacity:70%;padding:3px 8px 2px 7px}.waffle-db-object-formula-tooltip-help-bubble-link{color:#1a73e8;display:block;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;letter-spacing:0.25px;line-height:20px}.waffle-dv-table .waffle-data-validation-dialog{min-width:672px}.waffle-data-validation-dialog .waffle-dv-table .waffle-dv-list-options-textarea{margin:0;max-width:251px;padding:7px}.waffle-data-validation-dialog .waffle-dv-table .waffle-dv-editbox-number{margin:0;width:50px}.waffle-data-validation-dialog .waffle-dv-table .waffle-dv-editbox-text{margin:0}.waffle-data-validation-dialog .waffle-dv-table .waffle-dv-editbox-date{margin:0;width:72px}.waffle-data-validation-dialog .waffle-input-error-butter-container{margin-left:180px;margin-top:-50px;z-index:999;width:auto}.waffle-dv-table .waffle-dv-customcheckboxlabel{padding-top:14px}.waffle-dv-table .docs-material-gm-labeled-checkbox{padding:0}.waffle-dv-table{width:672px}.waffle-dv-table.jfk-select{margin-right:8px}.waffle-dv-table.goog-flat-menu-button{margin-left:0;height:36px}.waffle-dv-table .waffle-dv-on-invalid-data .jfk-radiobutton-radio{left:2px}.waffle-dv-table .waffle-dv-on-invalid-data .jfk-radiobutton:not(:last-child){padding-right:20px}.waffle-db-object-formula-dialog{height:505px;max-width:670px;min-width:510px}.waffle-db-object-formula-dialog .modal-dialog-title{margin-bottom:12px}.waffle-db-object-formula-dialog .modal-dialog-title-text{height:24px}.waffle-db-object-formula-description{color:#3c4043;display:inline-block;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;height:40px;letter-spacing:0.25px;line-height:20px;margin:0 0 16px 0}.waffle-db-object-formula-tooltip{display:inline-block}.waffle-db-object-formula-display-name-title{color:#3c4043;display:inline-block;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;letter-spacing:0.25px;line-height:20px;margin-bottom:7px}.docs-dialog.waffle-db-object-formula-dialog .waffle-db-object-formula-display-name-input{display:inline-block;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;letter-spacing:0.17px;margin:0}.docs-dialog.waffle-db-object-formula-dialog .waffle-db-object-formula-display-name-input-invalid,.docs-dialog.waffle-db-object-formula-dialog .waffle-db-object-formula-display-name-input-invalid:focus{border:2px solid #d93025;padding:0 7px}.docs-dialog.waffle-db-object-formula-dialog .waffle-db-object-formula-display-name-error{color:#d93025;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;height:16px;letter-spacing:0.3px;line-height:16px;margin:4px 0 8px 0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.docs-dialog.waffle-db-object-formula-dialog .waffle-db-object-formula-formula-editor{display:inline-block;position:relative}.waffle-db-object-formula-display-name-title,.waffle-db-object-formula-display-name-error,.waffle-db-object-formula-display-name-input,.waffle-db-object-formula-formula-editor{width:calc(100% - 212px)}.waffle-db-object-formula-dialog-view-only .waffle-db-object-formula-display-name-title,.waffle-db-object-formula-dialog-view-only .waffle-db-object-formula-display-name-input,.waffle-db-object-formula-dialog-view-only .waffle-db-object-formula-formula-editor{width:100%}.docs-dialog.waffle-db-object-formula-dialog .waffle-db-object-formula-toggle-tabs{display:inline-block;float:right;height:27px;line-height:27px;margin-left:7px;min-width:205px;width:205px}.waffle-db-object-formula-dialog .waffle-db-object-formula-toggle-tabs.waffle-gm-sidebar .docs-sidebar-toggle-tabs .jfk-button.docs-sidebar-toggle-tab,.waffle-db-object-formula-dialog .waffle-db-object-formula-toggle-tabs.waffle-gm-sidebar .docs-sidebar-toggle-tabs .jfk-button.docs-sidebar-toggle-tab:hover{height:27px;line-height:27px;margin-top:0}.waffle-db-object-formula-dialog .waffle-db-object-formula-toggle-tabs.waffle-gm-sidebar .docs-sidebar-toggle-tabs .jfk-button.docs-sidebar-toggle-tab-active{color:#188038}.waffle-db-object-formula-dialog .waffle-db-object-formula-toggle-tabs.waffle-gm-sidebar .docs-sidebar-toggle-tabs .jfk-button.docs-sidebar-toggle-tab-active>div:after{border-bottom:3px solid #188038}.waffle-db-object-formula-dialog .waffle-db-object-formula-toggle-tabs.waffle-gm-sidebar .docs-sidebar-toggle-tabs .jfk-button-focused.docs-sidebar-toggle-tab-inactive>div:after{border-bottom:2px dotted #188038}.docs-dialog.waffle-db-object-formula-dialog .waffle-db-object-formula-column-menu-tab,.docs-dialog.waffle-db-object-formula-dialog .waffle-db-object-formula-function-menu-tab{display:inline;float:right;height:319px;margin-bottom:24px;margin-left:7px;margin-top:0;min-width:205px;position:relative;width:205px}.docs-dialog.waffle-db-object-formula-dialog .waffle-db-object-formula-column-menu-tab .goog-menu.waffle-dbsource-column-filtered-menu,.docs-dialog.waffle-db-object-formula-dialog .waffle-db-object-formula-function-menu-tab .goog-menu.waffle-function-filtered-menu{border:1px solid #dadce0;box-shadow:none;box-sizing:border-box;display:inline-block;height:319px;min-width:205px;overflow-x:hidden;position:absolute;width:205px}.waffle-db-object-formula-webkit-tab-override{position:absolute!important;margin-top:27px!important}.docs-dialog.waffle-db-object-formula-dialog .waffle-db-object-formula-column-menu-tab .goog-menu.waffle-dbsource-column-filtered-menu::-webkit-scrollbar-thumb{min-height:70px}.docs-dialog.waffle-db-object-formula-dialog .waffle-db-object-formula-column-menu-tab .goog-menu.waffle-dbsource-column-filtered-menu .goog-menu-filter{padding:4px 4px 10px 7px}.docs-dialog.waffle-db-object-formula-dialog .waffle-db-object-formula-column-menu-tab .goog-menu.waffle-dbsource-column-filtered-menu .goog-menu-filter input{line-height:24px;padding:0}.docs-dialog.waffle-db-object-formula-dialog .waffle-db-object-formula-column-menu-tab .goog-menu.waffle-dbsource-column-filtered-menu .goog-menu-filter:before{margin-right:7px;transform:scale(0.75)}.waffle-db-object-formula-dialog .modal-dialog-buttons{margin-top:0}.waffle-db-object-formula-editor-container-overall{display:flex;flex-direction:column;height:255px!important;margin-bottom:24px}.waffle-db-object-formula-editor-container{border:1px solid #dadce0;border-radius:4px;box-sizing:border-box;display:flex;flex-direction:column;height:100%;overflow:hidden;position:relative}.waffle-db-object-formula-editor-container-focus{border:2px solid #1a73e8;border-radius:4px}.waffle-db-object-formula-editor-container-invalid{border:2px solid #d93025;border-radius:4px}.waffle-db-object-formula-editor-container .waffle-db-object-formula-editor-input-container{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1;height:100%;position:relative;width:100%}.waffle-db-object-formula-editor-container .waffle-db-object-formula-editor-input-container .waffle-db-object-formula-editor-input,.waffle-db-object-formula-editor-container .waffle-db-object-formula-editor-input-container .waffle-db-object-formula-editor-input:focus{border:none;font-family:'Roboto Mono','Consolas',monospace;font-size:14px;font-weight:500;height:100%!important;letter-spacing:0.2px;margin:0;outline:none;resize:none;width:100%}.waffle-db-object-formula-editor-container .waffle-db-object-formula-editor-input-container .waffle-db-object-formula-editor-input::placeholder{font-weight:400}.waffle-db-object-formula-editor-container .waffle-db-object-formula-editor-input-container .waffle-db-object-formula-editor-input{padding:7px 8px}.waffle-db-object-formula-editor-container-invalid .waffle-db-object-formula-editor-input-container .waffle-db-object-formula-editor-input,.waffle-db-object-formula-editor-container-focus .waffle-db-object-formula-editor-input-container .waffle-db-object-formula-editor-input{padding:6px 7px}.waffle-db-object-formula-editor-summarize-function-containter{height:40px;margin-top:10px}.waffle-db-object-formula-editor-summarize-function-label{color:#5f6368;display:inline;line-height:40px;padding-right:5px;font-size:14px;vertical-align:middle}.waffle-db-object-formula-editor-summarize-function-menu{display:inline}.waffle-db-object-formula-editor-summarize-function-menu .goog-flat-menu-button.jfk-select{width:100px}.waffle-material-confirm-dialog{background:#fff;border-radius:2px;border:none;box-shadow:0px 16px 24px 2px rgba(0,0,0,0.14),0px 6px 30px 5px rgba(0,0,0,0.12),0px 8px 10px -5px rgba(0,0,0,0.2);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;position:absolute;z-index:1002}.waffle-material-confirm-dialog-bg{background-color:rgba(0,0,0,.6);left:0;position:absolute;top:0;z-index:1001}.waffle-material-confirm-dialog-header{font-size:18px;height:18px;line-height:18px;padding:24px 24px 20px 24px}.waffle-material-confirm-dialog-content{padding:0 24px}.waffle-material-confirm-dialog-footer{display:flex;-webkit-justify-content:flex-end;justify-content:flex-end;padding:8px 14px 14px 14px}.waffle-source-destination-selection-dialog{min-width:350px;border-radius:10px}.waffle-source-destination-selection-dialog .docs-material-dialog-title{border-bottom:0}.waffle-source-destination-selection-dialog .docs-material-gm-dialog-title-close{cursor:pointer}.waffle-sdsd-source-container .waffle-sdsd-rangepicker-container{padding:0 0 16px}.waffle-sdsd-destination-container .waffle-sdsd-rangepicker-container{padding:0 0 16px 22px}.waffle-sdsd-rangepicker-label{color:rgba(0,0,0,0.54)}.waffle-sdsd-rangepicker-error-label{color:#d23f31;font-size:13px}.waffle-sdsd-destination-selection{padding:10px 0}.waffle-sdsd-destination-selection .jfk-radiobutton{padding:5px 0}.waffle-sdsd-destination-selection .jfk-radiobutton-radio{left:0}.waffle-range-selection-container{border:1px solid #dadce0;border-radius:4px;box-sizing:border-box;color:#3c4043;padding:1px 8px;font-size:14px;height:36px;margin:8px 0;align-items:center;background:#fff;display:flex;margin:0;min-width:20px;padding:1px;width:100%}.waffle-range-selection-input,.waffle-range-selection-input:focus{background:transparent;border:none;box-sizing:border-box;box-shadow:none;height:25px;color:inherit;font:inherit;margin:0;outline:none;padding:1px 8px;width:calc(100% - 34px)}.waffle-range-selection-button-container{overflow:hidden;padding:0;text-align:right;width:34px}.waffle-range-selection-button:hover,.waffle-range-selection-button:focus{opacity:0.9}.waffle-range-selection-container.waffle-range-selection-container-focus{border:2px solid #1a73e8;box-shadow:none;padding:0px 7px;padding:0}.modal-dialog .waffle-range-selection-container .waffle-range-selection-button,.modal-dialog .waffle-range-selection-container .waffle-range-selection-button:hover,.modal-dialog .waffle-range-selection-container .waffle-range-selection-button:focus,.modal-dialog .waffle-range-selection-container .waffle-range-selection-button:hover:focus,.modal-dialog .waffle-range-selection-container .waffle-range-selection-button:active,.waffle-range-selection-container .waffle-range-selection-button{background:transparent!important;border:transparent!important;cursor:pointer;line-height:34px;padding:0;white-space:nowrap}.waffle-range-selection-button{line-height:33px;margin:0;opacity:.70}.waffle-dialog-validation-widget-open-button{border-radius:50%;bottom:8px;box-sizing:border-box;cursor:pointer;height:20px;position:absolute;right:8px;width:20px;z-index:10}.waffle-dialog-formula-editor-container-focus .waffle-dialog-validation-widget-open-button,.waffle-dialog-formula-editor-container-invalid .waffle-dialog-validation-widget-open-button{bottom:7px;right:7px}.waffle-dialog-validation-widget-open-button .waffle-dataconnector-info-icon{height:100%;width:100%}.waffle-dialog-validation-widget-open-button-hover,.waffle-dialog-validation-widget-open-button-focused{background:rgba(66,133,244,0.26)}.waffle-dialog-validation-widget-loading>.waffle-dialog-validation-widget-bar .waffle-dialog-validation-widget-spinner{display:block;height:20px;margin-right:8px;min-width:20px;width:20px}.waffle-dialog-validation-widget-bar .waffle-dialog-validation-widget-spinner,.waffle-dialog-validation-widget-spinner{display:none}.waffle-dialog-validation-widget-loading .waffle-dialog-validation-widget-spinner{display:block}.waffle-dialog-validation-widget-loading .waffle-dialog-validation-widget-spinner .waffle-spinner,.waffle-dialog-validation-widget-loading .waffle-dialog-validation-widget-bar .waffle-dialog-validation-widget-spinner .waffle-spinner{height:18px;width:18px}.waffle-dialog-validation-widget-loading .waffle-dialog-validation-widget-spinner .waffle-spinner-circle,.waffle-dialog-validation-widget-loading .waffle-dialog-validation-widget-bar .waffle-dialog-validation-widget-spinner .waffle-spinner-circle{border-width:2px}.waffle-dialog-validation-widget-bar{display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between;background:rgba(66,133,244,0.12);bottom:0;box-sizing:border-box;color:#4285f4;display:none;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:400;max-height:76px;min-height:40px;padding:8px 8px 8px 16px;position:relative;right:0;width:100%}.waffle-dialog-formula-editor-container-focus .waffle-dialog-validation-widget-bar,.waffle-dialog-formula-editor-container-invalid .waffle-dialog-validation-widget-bar{max-height:75px;min-height:39px;padding:8px 7px 7px 15px}.waffle-dialog-validation-widget-visible>.waffle-dialog-validation-widget-bar{display:flex}.waffle-dialog-validation-widget-visible>.waffle-dialog-validation-widget-open-button{display:none}.waffle-dialog-validation-widget-bar .waffle-dataconnector-error-icon-filled{height:20px;margin-right:8px;min-width:20px;width:20px}.waffle-dialog-validation-widget-valid>.waffle-dialog-validation-widget-bar{background:rgba(15,157,88,0.12);color:#0f9d58}.waffle-dialog-validation-widget-bar .waffle-dataconnector-info-icon{height:20px;margin-right:8px;min-width:20px;width:20px}.waffle-dialog-validation-widget-valid .waffle-dataconnector-info-icon,.waffle-dialog-validation-widget-invalid .waffle-dataconnector-info-icon,.waffle-dialog-validation-widget-loading .waffle-dataconnector-info-icon{display:none}.waffle-dialog-validation-widget .waffle-dataconnector-error-icon-filled{display:none}.waffle-dialog-validation-widget-bar .waffle-dataconnector-error-icon-filled{margin-right:8px}.waffle-dialog-validation-widget .waffle-dataconnector-valid-icon{display:none}.waffle-dialog-validation-widget-bar .waffle-dataconnector-valid-icon{height:20px;margin-right:8px;min-width:20px;width:20px}.waffle-dialog-validation-widget-invalid .waffle-dialog-validation-widget-bar{background:rgba(219,68,55,0.12);color:#db4437}.waffle-dialog-validation-widget-invalid .waffle-dataconnector-error-icon-filled{display:block}.waffle-dialog-validation-widget-valid .waffle-dataconnector-valid-icon{display:block}.waffle-dialog-validation-widget-message{line-height:20px;max-height:60px;max-width:calc(100% - 30px);overflow:auto}.waffle-dialog-validation-widget-close-button{border-radius:50%;cursor:pointer;height:24px;margin-left:auto;width:24px}.waffle-dialog-validation-widget-close-button svg{height:20px;margin:2px;width:20px}.waffle-dialog-validation-widget .waffle-dataconnector-close-icon polygon{fill:#4285f4}.waffle-dialog-validation-widget-close-button-hover,.waffle-dialog-validation-widget-close-button-focused{background:rgba(66,133,244,0.26);outline:none}.waffle-dialog-validation-widget-invalid .waffle-dialog-validation-widget-close-button-hover,.waffle-dialog-validation-widget-invalid .waffle-dialog-validation-widget-close-button-focused{background:rgba(219,68,55,0.26)}.waffle-dialog-validation-widget-valid .waffle-dialog-validation-widget-close-button-hover,.waffle-dialog-validation-widget-valid .waffle-dialog-validation-widget-close-button-focused{background:rgba(15,157,88,0.26)}.waffle-dialog-validation-widget-valid .waffle-dataconnector-close-icon polygon{fill:#0f9d58}.waffle-dialog-validation-widget-invalid .waffle-dataconnector-close-icon polygon{fill:#db4437}.waffle-name-box-container{background-color:#fff;display:inline-flex;height:24px}.waffle-name-box{border:none;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;height:19px;margin:2px 0 2px 2px;padding:0 8px 0 6px;width:69px}.waffle-name-box:disabled,.waffle-name-box-menu-active .waffle-name-box:focus,.waffle-name-box-container:hover .waffle-name-box:focus,.waffle-name-box-container:hover .waffle-name-box:disabled,.waffle-name-box-container:hover .waffle-name-box:disabled+.name-box-dropdown,.waffle-name-box-menu-active.waffle-name-box-container:hover .waffle-name-box:focus{background:#fff}.waffle-name-box:focus{border:2px solid #4d90fe;margin:0;padding:0 6px}.name-box-dropdown.goog-toolbar-menu-button{cursor:pointer;height:18px;margin:2px 2px 2px 0;opacity:1}.name-box-dropdown.goog-toolbar-menu-button .goog-toolbar-menu-button-dropdown{margin-top:6px}.name-box-dropdown.goog-toolbar-menu-button:focus{background:#e8eaed}.goog-menu.waffle-named-box-menu{padding:2px 0 0 0;width:340px}.waffle-named-box-menu-open-sidebar-button-container{padding:4px 0}.waffle-named-box-menu-open-sidebar-button-focus,.waffle-named-box-menu-open-sidebar-button-hover,.waffle-name-box-menu-item-active{background:#f5f5f5}.waffle-named-box-menu-open-sidebar-button{color:#5f6368;cursor:pointer;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;padding:8px 0 6px 32px}.waffle-named-box-menu-open-sidebar-button:focus{outline:none}.waffle-named-box-menu-open-sidebar-button-disabled{background:white;cursor:default;opacity:0.38}.waffle-name-box-menu-open-sidebar-button-title{padding-bottom:4px}.waffle-name-box-menu-open-sidebar-button-subtext{color:#80868b;font-size:12px;letter-spacing:0.3px;line-height:16px;padding-right:4px}.goog-menu.waffle-named-box-menu .waffle-function-autocomplete-row{width:auto}.goog-menu.waffle-named-box-menu .waffle-function-autocomplete-row-name,.goog-menu.waffle-named-box-menu .waffle-named-range-autocomplete-row-content{color:#5f6368;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;overflow:hidden}.goog-menu.waffle-named-box-menu .waffle-function-autocomplete-row-description{color:#80868b;display:flex;font-size:12px;padding:7px 0 4px}.goog-menu.waffle-named-box-menu .waffle-named-range-autocomplete-row-icon-container{margin:4px}.goog-menu.waffle-named-box-menu .waffle-named-range-autocomplete-row-content{margin:4px 0}.waffle-named-box-menu-scrollable-wrapper{max-height:324px;overflow-y:auto}.waffle-name-box-menu-open-sidebar-button-separator{border-top:1px solid #dadce0;margin-left:30px}.waffle-name-box-container:hover .waffle-name-box,.waffle-name-box-container:hover .name-box-dropdown,.waffle-name-box-menu-active .waffle-name-box,.waffle-name-box-menu-active .name-box-dropdown,.waffle-name-box-menu-active.waffle-name-box-container:hover .waffle-name-box,.waffle-name-box-menu-active.waffle-name-box-container:hover .name-box-dropdown,.waffle-name-box-menu-active .name-box-dropdown.goog-toolbar-menu-button:focus,.waffle-name-box-container:hover .name-box-menu-separator-container,.waffle-name-box-menu-active .name-box-menu-separator-container,.waffle-name-box-menu-active.waffle-name-box-container:hover .name-box-menu-separator-container{background:#f5f5f5;display:inline-flex}.waffle-name-box-container:hover .waffle-name-box,.waffle-name-box-menu-active .waffle-name-box{width:67px}.waffle-histogram-grouping-box-input{background:white;border:1px solid #dadce0;border-radius:2px;box-sizing:border-box;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;height:28px;width:105px}.waffle-histogram-grouping-box-input-with-label{display:inline-block;margin:0 4px;vertical-align:top}.waffle-histogram-grouping-box-container{padding:8px 12px}.waffle-histogram-grouping-box-input-caption{color:#5f6368;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:11px;line-height:13px;padding-bottom:4px}.waffle-histogram-grouping-box-button-container{display:flex;justify-content:flex-end;padding-top:8px}.waffle-histogram-grouping-box-min-max-row{padding-top:8px}.waffle-histogram-grouping-box-input-error{color:#d93025;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;min-height:15px;padding-top:4px}.waffle-histogram-grouping-box-button-container .waffle-histogram-grouping-box-remove-button .docs-icon{height:24px;width:24px}.waffle-histogram-grouping-box-button-container .waffle-histogram-grouping-box-remove-button .docs-material-button{border-radius:18px;height:36px;margin:0;padding:2px 5px;width:36px}.waffle-histogram-grouping-box-button-container .waffle-histogram-grouping-box-remove-button .docs-material-button.docs-material-button-focused,.waffle-histogram-grouping-box-button-container .waffle-histogram-grouping-box-remove-button .docs-material-button.docs-material-button-no-focus-border{border:none;line-height:36px;padding:0 5px}.waffle-histogram-grouping-box-button-container .waffle-histogram-grouping-box-remove-button .docs-material-button.docs-material-button-focused{background-color:rgba(0,0,0,0.12)}.waffle-db-column-insights-menuitem{-webkit-align-items:center;align-items:center;height:auto;line-height:20px;white-space:nowrap}.waffle-db-column-insights-menuitem-accel{color:#9e9e9e;margin-left:auto;text-align:left}.waffle-db-column-insights-menuitem-refreshquery-info-progress{font-style:italic}.waffle-db-column-insights-menuitem-refreshquery-info-error-button{color:#db4437;text-decoration:underline}.waffle-material-labeledinput{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;position:relative}.waffle-material-labeledinput-inputwrapper{height:46px;position:relative}.waffle-material-labeledinput-inputrow{display:flex;bottom:6px;color:rgba(0,0,0,0.87);height:20px;left:0;position:absolute;vertical-align:top;width:100%;z-index:100}.waffle-material-labeledinput-input{-webkit-box-flex:100;box-flex:100;-ms-flex-positive:100;-webkit-flex-grow:100;flex-grow:100;background:transparent;border:none;color:rgba(0,0,0,0.87);display:block;font-size:13px;height:18px;line-height:18px;outline:none;vertical-align:top}.waffle-material-labeledinput-label{transition:transform 0.2s cubic-bezier(0.4,0.0,1,1);bottom:6px;color:rgba(0,0,0,0.54);font-size:13px;position:absolute;transform-origin:left bottom;width:100%}.waffle-material-labeledinput-errorcontainer{font-size:11px;height:11px;line-height:11px;margin-top:3px;text-align:right}.waffle-material-labeledinput-underline{background:rgba(0,0,0,.42);bottom:3px;height:1px;padding:0;position:absolute;width:100%}.waffle-material-labeledinput-accentunderline{transition:transform 0.2s cubic-bezier(0.4,0.0,1,1);background:#4285f4;bottom:2px;height:2px;padding:0;position:absolute;transform:scaleX(.6);visibility:hidden;width:100%}.waffle-material-labeledinput.waffle-material-labeledinput-focus .waffle-material-labeledinput-accentunderline{transform:scaleX(1);visibility:visible}.waffle-material-labeledinput.waffle-material-labeledinput-focus .waffle-material-labeledinput-label{color:#4285f4}.waffle-material-labeledinput.waffle-material-labeledinput-float .waffle-material-labeledinput-label{transform:translateY(-21px) scale(.846,.846)}.waffle-material-labeledinput.waffle-material-labeledinput-error .waffle-material-labeledinput-accentunderline{background:#db4437;transform:scaleX(1);visibility:visible}.waffle-material-labeledinput.waffle-material-labeledinput-error .waffle-material-labeledinput-label,.waffle-material-labeledinput-errormessage{color:#db4437}.waffle-material-labeledinput-embedded-control{position:relative}.waffle-material-selectioninput .waffle-range-selection-container{border:none;color:rgba(0,0,0,0.87);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;height:33px;line-height:33px;outline:none;padding:0;position:relative;width:100%}.waffle-material-selectioninput .waffle-range-selection-container:after{background-color:rgba(0,0,0,0.12);content:'';height:1px;left:0;position:absolute;top:100%;transition:background-color 0.3s ease;width:100%}.waffle-material-selectioninput:hover .waffle-range-selection-container:after{background-color:rgba(0,0,0,0.38)}.waffle-material-selectioninput .waffle-range-selection-container-focus.waffle-range-selection-container:after{background-color:#4285f4;height:2px}.waffle-material-selectioninput .waffle-range-selection-container.waffle-range-selection-container-focus{box-shadow:none;outline:none}.waffle-material-selectioninput .waffle-range-selection-input,.waffle-material-selectioninput .waffle-range-selection-container-focus .waffle-range-selection-input{padding:0!important}.waffle-material-toolbar-menu-button{color:rgba(0,0,0,0.87);cursor:pointer;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;height:26px;line-height:26px;margin:4px;outline:0}.waffle-material-toolbar-menu-button-disabled{color:rgba(0,0,0,0.12);cursor:default}.waffle-material-toolbar-menu-button-outer-box{border-radius:2px;height:26px;line-height:26px}.waffle-material-toolbar-menu-button-inner-box{height:100%;opacity:.54;width:100%}.waffle-material-toolbar-menu-button-inner-box svg{height:18px;margin:4px 0 4px 4px;width:18px}.waffle-material-toolbar-menu-button-dropdown svg{margin-left:0}.waffle-material-toolbar-menu-button-caption,.waffle-material-toolbar-menu-button-dropdown{display:inline-block;height:26px;line-height:26px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.waffle-material-toolbar-menu-button-hover .waffle-material-toolbar-menu-button-outer-box,.waffle-material-toolbar-menu-button-focused .waffle-material-toolbar-menu-button-outer-box{background-color:rgba(0,0,0,.06)}.waffle-material-toolbar-menu-button-active .waffle-material-toolbar-menu-button-outer-box{background-color:rgba(0,0,0,.12)}.waffle-material-toolbar-menu-button-hover .waffle-material-toolbar-menu-button-inner-box,.waffle-material-toolbar-menu-button-focused .waffle-material-toolbar-menu-button-inner-box,.waffle-material-toolbar-menu-button-active .waffle-material-toolbar-menu-button-inner-box{opacity:0.87}.jfk-bubble.jfk-bubble-promo.waffle-promo-bubble{box-shadow:0px 3px 4px 0px rgba(0,0,0,0.14),0px 3px 3px -2px rgba(0,0,0,0.12),0px 1px 8px 0px rgba(0,0,0,0.2);background:#eeeeee;border:none;color:rgba(0,0,0,0.87);font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;max-width:265px;padding:18px 30px}.jfk-bubble.jfk-bubble-promo.waffle-promo-bubble .jfk-bubble-arrowimplbefore{border-color:transparent #eeeeee}.jfk-bubble.jfk-bubble-promo.waffle-promo-bubble .jfk-bubble-arrowimplafter{border-color:transparent #eeeeee}.waffle-promo-bubble-icon{background:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNHB4IiBoZWlnaHQ9IjI0cHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0iIzAwMDAwMCI+PHBhdGggZD0iTTIzIDEybC0yLjQ0LTIuNzguMzQtMy42OC0zLjYxLS44Mi0xLjg5LTMuMThMMTIgMyA4LjYgMS41NCA2LjcxIDQuNzJsLTMuNjEuODEuMzQgMy42OEwxIDEybDIuNDQgMi43OC0uMzQgMy42OSAzLjYxLjgyIDEuODkgMy4xOEwxMiAyMWwzLjQgMS40NiAxLjg5LTMuMTggMy42MS0uODItLjM0LTMuNjhMMjMgMTJ6bS0xMCA1aC0ydi0yaDJ2MnptMC00aC0yVjdoMnY2eiIvPjwvc3ZnPg==');display:inline-block;height:24px;margin-right:8px;position:relative;top:6px;width:24px}.waffle-promo-bubble-header{display:inline-block;font-size:18px;font-weight:500;line-height:14px}.waffle-promo-bubble-description{font-size:14px;line-height:22px}.waffle-promo-bubble-content .jfk-button{transition:color 200ms cubic-bezier(0.4,0.0,0.2,1);cursor:pointer;font-size:14px;letter-spacing:0.04em;padding-right:15px;padding-top:5px;text-transform:uppercase}.jfk-button.waffle-promo-bubble-close{color:rgba(0,0,0,0.54)}.jfk-button-hover.waffle-promo-bubble-close{color:rgba(0,0,0,0.87)}.jfk-button.waffle-promo-bubble-continue{color:rgba(66,133,244,0.87);font-weight:500}.jfk-button-hover.waffle-promo-bubble-continue{color:rgba(66,133,244,1)}.docs-colormenuitems .goog-menuitem.goog-inline-block.waffle-colormenuitems-scheme-header-edit-button{border-radius:4px;border-width:1px 0;height:22px;margin-left:4px;padding:0;width:24px}.goog-menuitem.goog-inline-block.waffle-colormenuitems-scheme-header-edit-button.goog-menuitem-highlight{border-width:0}.waffle-ui-floating-toast{box-shadow:0px 2px 2px 0px rgba(0,0,0,0.14),0px 3px 1px -2px rgba(0,0,0,0.12),0px 1px 5px 0px rgba(0,0,0,0.2);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;bottom:60px;color:rgba(255,255,255,0.87);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;left:15px;line-height:20px;padding:14px 24px}.waffle-ui-floating-toast-action{transition:opacity 250ms cubic-bezier(0.4,0.0,0.2,1);color:#a1c2fa;font-weight:400;opacity:0.87;text-transform:uppercase}.waffle-ui-floating-toast-action:hover{opacity:1}.waffle-function-filtered-menu .goog-menu-filter{display:flex;border-bottom:1px solid #dadce0;padding:4px 4px 10px 7px}.waffle-function-filtered-menu .goog-menu-filter:before{content:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNHB4IiBoZWlnaHQ9IjI0cHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0iIzc1NzU3NSI+CiAgICA8cGF0aCBkPSJNMTUuNSAxNGgtLjc5bC0uMjgtLjI3QzE1LjQxIDEyLjU5IDE2IDExLjExIDE2IDkuNSAxNiA1LjkxIDEzLjA5IDMgOS41IDNTMyA1LjkxIDMgOS41IDUuOTEgMTYgOS41IDE2YzEuNjEgMCAzLjA5LS41OSA0LjIzLTEuNTdsLjI3LjI4di43OWw1IDQuOTlMMjAuNDkgMTlsLTQuOTktNXptLTYgMEM3LjAxIDE0IDUgMTEuOTkgNSA5LjVTNy4wMSA1IDkuNSA1IDE0IDcuMDEgMTQgOS41IDExLjk5IDE0IDkuNSAxNHoiLz4KICAgIDxwYXRoIGQ9Ik0wIDBoMjR2MjRIMHoiIGZpbGw9Im5vbmUiLz4KPC9zdmc+Cg==');height:24px;margin-right:7px;transform:scale(0.75);width:24px}.waffle-function-filtered-menu .goog-menu-filter input{border:0;color:#202124;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;line-height:24px;min-width:0;outline:0;padding:0}.waffle-function-filtered-menu-item{border-bottom:1px solid #dadce0;padding:10px 10px 10px 15px}.waffle-function-filtered-menu-item:hover,.waffle-function-filtered-menu-item.goog-menuitem-highlight{border-top-width:0}.waffle-function-filtered-menu-item .waffle-filterable-by-text-contains-menu-item-label{color:#3c4043;display:block;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500}.waffle-function-filtered-menu-item .waffle-function-filtered-menu-item-description{color:#80868b;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:400}.waffle-function-filtered-menu-item .waffle-filterable-by-text-contains-menu-item-match{font-weight:700}.waffle-function-filtered-menu-item .waffle-function-filtered-menu-item-description-match{font-weight:500}.waffle-function-filtered-menu::-webkit-scrollbar-thumb{min-height:70px}.waffle-insert-function-row>.goog-menuitem-content{min-width:125px}.waffle-function-category-row{background:#fff;color:#333;cursor:pointer;font-size:13px;font-weight:normal;margin:0;padding:6px 10px;text-overflow:ellipsis;white-space:nowrap;width:250px}.waffle-function-category-row-name,.waffle-function-category-row-description{-ms-flex:1;-webkit-flex:1;flex:1;max-width:95%}.waffle-function-category-row-name{overflow:hidden;text-overflow:ellipsis}.waffle-function-category-row-description{color:#666;display:none;font-size:11px;overflow:hidden;padding:2px 0;text-overflow:ellipsis;white-space:nowrap}.waffle-function-category-active .waffle-function-category-row-description{display:block}.waffle-function-category-active{background:#eee;border-top:1px solid #eee;border-bottom:1px solid #eee;padding:1px 10px}.waffle-info-icon-bubble{border-radius:8px;box-shadow:0 4px 8px 3px rgba(60,64,67,.15);font-size:12px;max-width:200px}.waffle-ui-input-with-edit-button-container{border:1px solid #dadce0;border-radius:4px;box-sizing:border-box;color:#3c4043;padding:1px 8px;font-size:14px;height:36px;margin:8px 0;align-items:center;background:#fff;display:flex;height:24px;margin:0;min-width:20px;padding:1px;width:100%}.waffle-ui-input-with-edit-button-input,.waffle-ui-input-with-edit-button-input:focus{background:transparent;border:none;box-shadow:none;box-sizing:border-box;color:#3c4043;font-size:12px;padding:4px 0 4px 8px;text-overflow:ellipsis;width:calc(100% - 24px)}.waffle-ui-input-with-edit-button-button-container{overflow:hidden;padding:0;text-align:right;width:24px}.waffle-ui-input-with-edit-button-button:hover,.waffle-ui-input-with-edit-button-button:focus{opacity:0.9}.waffle-ui-input-with-edit-button-container.waffle-ui-input-with-edit-button-container-focus{padding:0}.waffle-input-with-edit-button-button-container{box-sizing:border-box;height:24px;padding:2px;width:24px}.waffle-ui-input-with-edit-button-container .waffle-ui-input-with-edit-button-button,.waffle-ui-input-with-edit-button-container .waffle-ui-input-with-edit-button-button:hover,.waffle-ui-input-with-edit-button-container .waffle-ui-input-with-edit-button-button:focus,.waffle-ui-input-with-edit-button-container .waffle-ui-input-with-edit-button-button:hover:focus,.waffle-ui-input-with-edit-button-container .waffle-ui-input-with-edit-button-button:active,.waffle-ui-input-with-edit-button-container .waffle-ui-input-with-edit-button-button{box-shadow:none;cursor:pointer;height:20px;line-height:20px;min-width:20px;padding:0;white-space:nowrap;width:20px}.waffle-ui-input-with-edit-button-container .waffle-ui-input-with-edit-button-button .jfk-button{height:20px;line-height:20px;margin:0;min-width:20px;opacity:.70;width:20px}.waffle-ui-input-with-edit-button-button .waffle-dataconnector-edit-outline-icon{height:20px;width:20px}.waffle-legacy-mnemonics-toast{background-color:#323232;border-radius:2px;bottom:70px;box-shadow:2px 2px 10px 0 rgba(0,0,0,0.4);color:white;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:15px;left:60px;padding:17px 24px;position:absolute}.waffle-legacy-mnemonics-toast-container{display:-webkit-inline-box;display:-moz-inline-box;display:-ms-inline-flexbox;display:-webkit-inline-flex;display:inline-flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row}.waffle-legacy-mnemonics-toast-content{display:-webkit-inline-box;display:-moz-inline-box;display:-ms-inline-flexbox;display:-webkit-inline-flex;display:inline-flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row}.waffle-legacy-mnemonics-toast-text{font-weight:bold;padding-left:4px}.waffle-legacy-mnemonics-toast-cancel{color:#1a73e8;cursor:pointer;font-weight:bold;padding-left:35px;text-transform:uppercase}.waffle-progress-bar.progress-bar-horizontal{background:#c6dafc;height:100%}.waffle-progress-bar>.progress-bar-thumb{background:#4285f4;height:100%}.waffle-indeterminate-progress-bar>.progress-bar-thumb{-webkit-animation:waffle-indeterminate-progress-bar-animation 2s linear infinite;-moz-animation:waffle-indeterminate-progress-bar-animation 2s linear infinite;-o-animation:waffle-indeterminate-progress-bar-animation 2s linear infinite;animation:waffle-indeterminate-progress-bar-animation 2s linear infinite;position:relative;transition:width .2s cubic-bezier(.4,0,.2,1)}@keyframes waffle-indeterminate-progress-bar-animation{0%{left:0%;width:0}50%{left:25%;width:75%}75%{left:100%;width:0%}}.waffle-printing-select-list{background-color:#fafafa;box-shadow:0 0 8px 0 rgba(0,0,0,0.12),0 8px 8px 0 rgba(0,0,0,0.24);border-radius:0 2px 2px 0 2px 2px;left:0;overflow-y:auto;padding:18px 32px;position:absolute;top:0;width:204px;z-index:1003}.waffle-printing-select-list>div{outline:none}.waffle-printing-select-list-checkboxes{margin-bottom:10px}.waffle-printing-select-list-checkboxes .waffle-printing-checkbox-label{line-height:28px;margin-left:12px}.waffle-printing-select-list-cancel{margin-left:0}.goog-menu.waffle-sidebar-draglist-menu{border:none;border-radius:none;box-shadow:none;height:calc(100% - 13px);padding-bottom:12px;padding-top:0;width:160px;z-index:0}.goog-menu.waffle-sidebar-draglist-menu .goog-menu-filter::before{margin-left:2px;margin-right:1px;transform:scale(0.75)}.goog-menu.waffle-sidebar-draglist-menu .goog-menu-filter{padding-bottom:8px;padding-top:8px}.goog-menu.waffle-sidebar-draglist-menu .goog-menu-filter input{line-height:18px}.goog-menu.waffle-sidebar-draglist-menu .goog-menu-content{margin-top:8px;width:100%}.goog-menu.waffle-sidebar-draglist-menu .goog-menuitem{box-sizing:border-box;border-radius:16px;cursor:move;margin:0 4px;overflow:hidden;padding-left:8px;padding-right:8px;margin-bottom:2px;max-width:160px}.waffle-sidebar-draglist-menu .goog-menuitem-highlight{background:#f8f9fa;border-radius:16px;box-shadow:0 1px 2px 0px rgba(60,64,67,.3),0 1px 3px 1px rgba(60,64,67,.15)}.goog-menu.waffle-sidebar-draglist-menu .goog-menuitem-content,.goog-menu.waffle-sidebar-draglist-menu .goog-menuitem-content span{-ms-flex:1;-webkit-flex:1;flex:1;color:#3c4043;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;line-height:18px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.goog-menu.waffle-sidebar-draglist-menu .goog-menuitem-content>div{display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-webkit-justify-content:flex-start;justify-content:flex-start}.goog-menu.waffle-sidebar-draglist-menu .goog-menuitem-icon{margin:0 8px 0 0;position:relative;top:0}.waffle-column-error-button{background:white;border:none;border-radius:2px;box-shadow:0 -1px 5px rgba(128,134,139,0.09),0 3px 5px rgba(128,134,139,0.06),0 1px 2px rgba(60,64,67,0.3),0 1px 3px rgba(60,64,67,0.15);box-sizing:border-box;cursor:pointer;list-style:none;outline:none;overflow:hidden;padding:0;position:absolute;z-index:7}.waffle-column-error-button .waffle-view-icons-error-filled{height:100%;transform:scale(.9);width:100%;z-index:2}.waffle-column-error-button-shim{border-radius:50%;background-color:#fff;height:100%;position:absolute;transform:scale(.5);width:100%}.waffle-column-error-button-ripple{border-radius:50%;background-color:#d93025;height:100%;position:absolute;transform:scale(.5);transition:transform 0.5s;width:100%}.waffle-column-error-button-hover{box-shadow:0 4px 8px 3px rgba(60,64,67,.15)}.waffle-column-error-button-hover>.waffle-column-error-button-ripple{transform:scale(1.5)}.waffle-column-error-button-active>.waffle-column-error-button-ripple{background-color:#c5221f}.waffle-column-error-button-active>.waffle-column-error-button-icon{fill:#c5221f}.docs-charts-component:focus{outline:none}.docs-charts-component-canvas{direction:ltr}.docs-charts-tooltip{box-shadow:0px 2px 2px 0px rgba(0,0,0,0.14),0px 3px 1px -2px rgba(0,0,0,0.12),0px 1px 5px 0px rgba(0,0,0,0.2);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;background-color:#ffffff;border:1px solid #c1c1c1;border-radius:2px;color:rgba(0,0,0,0.87);cursor:default;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;font-weight:500;padding:3px 12px;pointer-events:none;position:absolute}.docs-charts-tooltip-label,.docs-charts-tooltip-value{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.docs-charts-tooltip-entry{margin-bottom:3px;margin-top:3px}.docs-charts-tooltip-symbol-value{white-space:nowrap}.docs-charts-tooltip-entry .docs-charts-tooltip-label{color:rgba(0,0,0,0.54)}.docs-charts-tooltip-entry .docs-charts-tooltip-symbol{margin-right:6px}.docs-charts-tooltip-entry .docs-charts-tooltip-symbol .docs-charts-tooltip-symbol-icon{height:12px;stroke:rgba(0,0,0,0.54);stroke-width:1px;width:12px}.docs-charts-tooltip-entry-single .docs-charts-tooltip-label{margin-bottom:3px}.docs-charts-tooltip-entry-single .docs-charts-tooltip-value{font-size:1.1em;font-weight:700}.docs-charts-tooltip-entry-domain .docs-charts-tooltip-value{color:rgba(0,0,0,0.54)}.docs-charts-tooltip-entry-range .docs-charts-tooltip-value{font-weight:700}.docs-charts-tooltip-entry-range .docs-charts-tooltip-symbol .docs-charts-tooltip-symbol-icon{margin-bottom:-1px}.prof-feedback-bank-xframe-docos-autocomplete-row{box-sizing:border-box;padding:8px 4px;word-wrap:break-word}.docs-ml-icon{direction:ltr;display:inline-block;text-align:left;overflow:hidden;position:relative;vertical-align:middle}.docs-ml-img:before{content:url("//ssl.gstatic.com/docs/common/mobileweb_sprite1.png")}.docs-ml-img-container{height:156px;position:absolute;width:36px}.docs-ml-docs-logo-icon{left:0;top:-36px}.docs-ml-sheets-logo-icon{left:0;top:0}.docs-ml-slides-logo-icon{left:0;top:-96px}.docs-ml-arrow-back-icon{left:0;top:-132px}.docs-ml-edit-icon{left:0;top:-72px}@media screen and (-webkit-min-device-pixel-ratio:2.0){.docs-ml-img{content:url(//ssl.gstatic.com/docs/common/mobileweb_sprite1.png)}.docs-ml-img-container{height:156px;position:absolute;width:36px}.docs-ml-docs-logo-icon{left:0;top:-36px}.docs-ml-sheets-logo-icon{left:0;top:0}.docs-ml-slides-logo-icon{left:0;top:-96px}.docs-ml-arrow-back-icon{left:0;top:-132px}.docs-ml-edit-icon{left:0;top:-72px}}.docs-ml-header{background:#fafafa;border-bottom:1px solid #cbcbcb;box-shadow:0 1px 1px rgba(0,0,0,.1);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;font-family:Roboto,"Helvetica Neue",Helvetica,Arial,sans-serif;padding:4px 0;position:fixed;left:0;top:0;width:100%}.docs-ml-header-icon{height:24px;opacity:0.6;width:24px}.docs-ml-header-icon-container{padding:12px}.docs-ml-header-item{display:inline-block;vertical-align:middle}.docs-ml-header-drive-link{padding-left:4px}body[dir="rtl"] .docs-ml-arrow-back-dir{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.docs-ml-header-document-title{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;line-height:24px;padding:0 12px;width:60%;width:calc(100% - 104px)}.docs-ml-header-document-title-text{font-size:20px;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.docs-ml-header-edit-button{float:right;padding-right:4px}.docs-ml-promotion{background:white;bottom:0;box-shadow:0 4px 12px rgba(0,0,0,0.4);font-family:Arial,Helvetica,sans-serif;left:0;position:fixed;width:100%}.docs-ml-promotion-off-screen{-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}.docs-ml-promotion-shown{-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0);-webkit-transition:-webkit-transform 333ms cubic-bezier(0.4,0.0,0.2,1);transition:transform 333ms cubic-bezier(0.4,0.0,0.2,1)}.docs-ml-promotion-dismissed{-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%);box-shadow:none}.docs-ml-promotion-no-horizontal-scroll{overflow-x:hidden}.docs-ml-promotion-header{display:table;padding:24px 24px 0 24px}.docs-ml-promotion-app-icon-container{display:table-cell}.docs-ml-promotion-app-icon{height:36px;width:36px}@media (min-width:600px){.docs-ml-promotion-app-icon{-webkit-transform:scale(1.33);-moz-transform:scale(1.33);-ms-transform:scale(1.33);-o-transform:scale(1.33);transform:scale(1.33)}}.docs-ml-promotion-text{display:table-cell;padding-left:20px;vertical-align:top}.docs-ml-promotion-text-heading{color:rgba(0,0,0,0.87);font-size:16px;font-weight:bold;padding-bottom:7px}.docs-ml-promotion-text-body{color:rgba(0,0,0,0.87);font-size:14px}.docs-ml-promotion-action-row{float:right;margin-top:6px;padding:8px 24px}.docs-ml-promotion-action-row-desktop{margin-top:6px}.docs-ml-promotion-action-container{display:inline-block;height:48px;margin:6px 4px;vertical-align:middle}.docs-ml-promotion-action-button{display:inline-block;font-size:14px;font-weight:500;padding:9px 12px;vertical-align:middle}.docs-ml-promotion-action-button-wrapper:focus{outline-color:#d6d6d6}.docs-ml-promotion-action-button.docs-ml-promotion-yes-button{background-color:#4285f4;border-radius:4px;color:#fafafa;border:1px solid transparent}.docs-ml-promotion-action-button.docs-ml-promotion-yes-button:active{background-color:#1967d2}.docs-ml-promotion-action-button.docs-ml-promotion-no-button{background-color:#fafafa;color:#5f6368;border-radius:4px;border:1px solid #dadce0}.docs-ml-promotion-action-button.docs-ml-promotion-no-button:active{background-color:#f5f5f5}.docs-ml-promotion.desktop{text-align:center}@media (orientation:portrait){.docs-ml-promotion.desktop{padding-top:56px;padding-bottom:80px}}@media (orientation:landscape){.docs-ml-promotion.desktop{padding-top:36px;padding-bottom:56px}}.docs-ml-promotion-heading-desktop{font-family:'Google Sans';font-size:18px;font-weight:bold;color:#202124;padding-top:18px;padding-bottom:10px;line-height:1.5;max-width:360px;margin:0px auto}@media (orientation:landscape){.docs-ml-promotion-heading-desktop{padding-top:0px;max-width:none}}.docs-ml-promotion-text-body-desktop{font-size:14px;line-height:1.5;color:#5f6368;padding-bottom:10px}.docs-icon.docs-ml-promotion-desktop-icon{height:40px;width:40px;-webkit-transform:scale(2.5);-moz-transform:scale(2.5);-ms-transform:scale(2.5);-o-transform:scale(2.5);transform:scale(2.5);-webkit-transform-origin:top;-moz-transform-origin:top;-ms-transform-origin:top;-o-transform-origin:top;transform-origin:top}.docs-icon-ml-promotion-icon-container-desktop{height:100px;width:100px;margin-left:auto;margin-right:auto}@media (orientation:landscape){.docs-icon-ml-promotion-icon-container-desktop{display:inline-block;vertical-align:top}.docs-ml-promotion-description-desktop{display:inline-block;vertical-align:top;text-align:left;padding-left:39px;max-width:645px}}@media (orientation:landscape){.docs-ml-promotion-action-row-desktop{margin-left:-8px}}.docs-ml-promotion-action-row-desktop .docs-ml-promotion-action-container{margin:6px 8px;font-family:'Google Sans'}.docs-ml-promotion-action-row-desktop .docs-ml-promotion-action-button-wrapper:focus{outline:none}.docs-ml-promotion-action-button.docs-ml-promotion-yes-button.docs-ml-promotion-app-themed{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff}.docs-ml-promotion-action-button.docs-ml-promotion-yes-button.docs-ml-promotion-app-themed:active{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff}.docs-ml-promotion-action-button.docs-ml-promotion-no-button.docs-ml-promotion-app-themed{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:white;border:1px solid #dadce0!important;color:#188038}.docs-ml-promotion-action-button-wrapper:focus .docs-ml-promotion-action-button.docs-ml-promotion-yes-button.docs-ml-promotion-app-themed{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#4f9e67;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15)}.docs-ml-promotion-action-button-wrapper:focus .docs-ml-promotion-action-button.docs-ml-promotion-no-button.docs-ml-promotion-app-themed{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#e7f5eb;border:1px solid #bbe2c6!important}.docs-ml-promotion{z-index:1002}.docs-ml-header{z-index:1002}.ess-button{cursor:pointer;display:inline-block}.ess-disabled-button{opacity:0.25;filter:alpha(opacity=25);display:inline-block}.ess-button,.ess-disabled-button{margin:6px;vertical-align:middle}.ess-icon{width:32px;height:32px;background-image:url(//ssl.gstatic.com/docs/documents/share/images/ess-icons-4.png);background-repeat:no-repeat}.ess-gplus-icon{background-position:0 0}.ess-gmail-icon{background-position:-34px 0}.ess-facebook-icon{background-position:-68px 0}.ess-twitter-icon{background-position:-102px 0}.scope-icon-default-group{background-repeat:no-repeat;background-position:0 -24px}.scope-icon-default-user{background-repeat:no-repeat;background-position:0 -342px}.scope-icon-default{display:inline-block}.scope-icon-default{width:21px;height:21px;opacity:0.55;filter:alpha(opacity=55);margin-top:4px;margin-left:4px}.scope-icon-holder{display:inline-block}.scope-icon-holder{background-color:#f5f5f5;height:29px;width:29px;vertical-align:middle}.scope-icon-invite-holder{background-color:#fff}.scope-icon-custom{width:29px;height:29px;vertical-align:middle}.scope-icon-disabled{opacity:0.25;filter:alpha(opacity=25)}.scope-icon-unused-invite{background-position:0 -770px}.scope-icon-used-invite{background-position:0 -417px}.scope-icon-unused-invite,.scope-icon-used-invite{width:29px;height:29px;vertical-align:middle;margin-top:0px;margin-left:0px;background-repeat:no-repeat;opacity:1;filter:alpha(opacity=100)}.vo-public-icon,.vo-unlisted-icon,.vo-domain-public-icon,.vo-domain-unlisted-icon,.vo-privately-shared-icon,.vo-private-icon{width:21px;height:21px;background-repeat:no-repeat;margin-right:4px;vertical-align:bottom}.vo-public-icon{background-position:0 -671px}.vo-unlisted-icon{background-position:0 -294px}.vo-domain-public-icon{background-position:0 -850px}.vo-domain-unlisted-icon{background-position:0 -551px}.vo-privately-shared-icon{background-position:0 -72px}.vo-private-icon{background-position:0 -575px}.waffle-filterbox-content{border:none;height:130px;margin:0px 4px;overflow-y:auto}.waffle-filterbox-content>.goog-menuitem-content{font-size:12px}.waffle-filterbox-content>.goog-menuitem{padding:1px 7em 1px 26px}.waffle-filterbox-content>.goog-menuitem-highlight{border:0px;background-color:#d0d0d0}.waffle-filterbox-action-link,.waffle-filterbox-dash{color:#15c;text-decoration:none}.waffle-filterbox-action-link:hover{text-decoration:underline}.waffle-filterbox-input{margin-right:-23px;padding-right:23px;width:221px}.waffle-filterbox-input-icon{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -205px -62px;display:inline-block;margin-top:2px;height:12px;width:12px}.waffle-filterbox-label{padding-left:6px}div.waffle-filterbox-label-icon{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -283px -73px;float:right;height:16px;margin-left:18px;width:16px}.waffle-filterbox-label>div,.waffle-filterbox-label>a{display:inline;font-size:12px;margin-right:3px}.waffle-filterbox-menu-spinner{text-align:center}.waffle-filterbox-menu .goog-menu-filter input{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#fff;border:1px solid #dadce0!important;font-weight:normal}.waffle-filterbox-ok-button .goog-imageless-button-content{font-weight:500;padding:0 15px}.waffle-autofilter-border{border-color:#188038;line-height:0}.filtered-incelldropdown-button{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -791px -13px;cursor:pointer;list-style:none;outline:none}.filtered-incelldropdown-button-disabled{cursor:default;filter:alpha(opacity=30);opacity:0.3}.filtered-incelldropdown-button-hover,.filtered-incelldropdown-button-checked,.filtered-incelldropdown-button-focused{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -137px -46px}.waffle-autovis-lightbox{background-color:rgba(0,0,0,0.7);height:100%;left:0;position:absolute;top:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;width:100%;z-index:1000}.waffle-autovis-lightbox-container{height:100%;width:100%}.waffle-autovis-lightbox-chart{height:100%;width:100%}.waffle-autovis-lightbox-content{bottom:0;left:0;margin:auto;position:absolute;right:0;top:60px}.waffle-autovis-lightbox-content-inner{position:relative;white-space:nowrap}.waffle-autovis-lightbox-previous.jfk-button-disabled,.waffle-autovis-lightbox-next.jfk-button-disabled{color:grey;cursor:default}.waffle-autovis-lightbox-page-count{color:white;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:16px;margin-top:35px;text-align:center;width:100%}.waffle-autovis-lightbox-button{background-color:transparent;background-image:none;border:0;color:white;cursor:pointer;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;margin:0;outline:0;padding:0}.waffle-autovis-lightbox-button:focus{border:none;padding:0}.waffle-autovis-lightbox-previous,.waffle-autovis-lightbox-next{bottom:0;color:white;cursor:pointer;height:50px;line-height:50px;margin:auto;position:absolute;text-align:center;top:0;width:50px}.waffle-autovis-lightbox-previous{margin-right:25px;right:100%}.waffle-autovis-lightbox-next{left:100%;margin-left:25px}.waffle-autovis-lightbox-readonly .waffle-autovis-lightbox-readonly-hidden{display:none}.waffle-autovis-lightbox-header{background-color:rgba(0,0,0,0.7);height:60px;width:100%}.waffle-autovis-lightbox-buttons-wrapper{color:white;font-weight:500;line-height:60px;margin-left:auto;margin-right:auto;text-align:center;width:100%}.waffle-autovis-lightbox-close{cursor:pointer;position:absolute;right:20px;top:19px}.goog-date-picker-wday,.goog-date-picker table tbody td{width:22px!important;height:17px;text-align:center;vertical-align:middle;padding:0}.goog-date-picker-btn{border:0;display:block;float:left;width:12px;cursor:pointer;font:9px Verdana;font-weight:500;text-align:center;margin:0;padding:0}* html .goog-date-picker table{margin-left:-1px}.goog-date-picker-menu{position:absolute;background:threedface;-moz-user-focus:normal;border-style:solid;border-width:1px}.goog-date-picker-menu ul{list-style:none;margin:0;padding:0}.goog-date-picker-menu ul li{float:none;cursor:default}.goog-date-picker,.goog-date-picker-wday{background-color:#d9e6f7}.goog-date-picker-btn{background-color:transparent;color:#069}.goog-date-picker-wkend-start,.goog-date-picker-wkend-end{background-color:#e8eef7}#goog-dp-0,#goog-dp-1,#goog-dp-2,#goog-dp-3,#goog-dp-4,#goog-dp-5,#goog-dp-6{border-top:1px solid #a2bbdd}#goog-dp-0,#goog-dp-7,#goog-dp-14,#goog-dp-21,#goog-dp-28,#goog-dp-35{border-left:1px solid #a2bbdd}#goog-dp-6,#goog-dp-13,#goog-dp-20,#goog-dp-27,#goog-dp-34,#goog-dp-41{border-right:1px solid #fff}.waffle-date-picker,.waffle-date-picker *{box-sizing:border-box;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:400}.waffle-date-picker{position:absolute;width:188px;z-index:1000}.goog-date-picker{-moz-user-focus:normal;-moz-user-select:none;background-color:#fff;border:1px solid #dadce0;border-radius:4px;box-shadow:0 2px 6px 2px rgba(60,64,67,.15);outline:none;padding:0 10px 8px 10px;position:relative;user-select:none;width:188px}.goog-date-picker table{empty-cells:hide;outline:none;width:100%}.goog-date-picker table,.goog-date-picker-head td{background-color:transparent}.goog-date-picker table tbody tr th:first-of-type{display:none}.goog-date-picker table tbody:focus{outline:none;background-color:#e6f4ea}.goog-date-picker-head{color:#80868b;font-size:11px;height:40px}.goog-date-picker-monthyear{letter-spacing:0.2px;padding-left:7px;text-align:left;width:63px}.goog-date-picker-button{border:0;border-radius:50%;cursor:pointer;display:block;font-size:10px;height:20px;left:2px;line-height:20px;margin:0 auto;padding-left:0;position:relative;text-align:center;width:20px;background-color:rgba(0,0,0,0);transition:background-color 100ms linear}.goog-date-picker-button:hover{background-color:#f1f3f4;transition:background-color 100ms linear}.goog-date-picker-button:focus{outline:none}.goog-date-picker-button:active{background-color:#dadce0;transition:background-color 100ms linear}.goog-date-picker-nextMonth,.goog-date-picker-previousMonth{background:url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNiIgaGVpZ2h0PSI4IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogICAgPGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgPHBhdGggZmlsbD0iIzc1NzU3NSIgZD0iTS43MjY2NjY2NyA3LjA2TDMuNzggNCAuNzI2NjY2NjcuOTRsLjk0LS45NEw1LjY2NjY2NjcgNCAxLjY2NjY2NjY3IDh6Ii8+CiAgICAgIDxwYXRoIGQ9Ik0tNS00aDE2djE2SC01eiIvPgogICAgPC9nPgogIDwvc3ZnPg==") center no-repeat}[dir="rtl"] .goog-date-picker-nextMonth{transform:rotate(180deg)}.goog-date-picker-previousMonth{transform:rotate(180deg)}[dir="rtl"] .goog-date-picker-previousMonth{transform:rotate(0deg)}.goog-date-picker-foot{display:none}.goog-date-picker-wday,.goog-date-picker .goog-date-picker-date{font-size:10px;font-weight:400;height:20px;line-height:20px;margin:auto;position:relative;text-align:center;width:24px}.goog-date-picker-wday{background-color:transparent;color:#80868b}.goog-date-picker-date{color:#202124;cursor:pointer;background-color:transparent;z-index:1}.goog-date-picker-date:focus{outline:none}.goog-date-picker-date::before{border-radius:50%;content:"";display:block;height:20px;left:2px;position:absolute;top:0;width:20px;z-index:-1;background-color:rgba(0,0,0,0);transition:background-color 100ms linear}.goog-date-picker-date::after{content:"";display:block;height:20px;left:0;position:absolute;top:0;width:24px;z-index:2}.goog-date-picker-date:hover::before{background-color:#dadce0;transition:background-color 100ms linear}.goog-date-picker-other-month{color:#80868b}.goog-date-picker-other-month:hover::before{background-color:#f1f3f4;transition:background-color 100ms linear}.goog-date-picker-selected{background-color:transparent!important;color:#fff!important;font-weight:400!important}.goog-date-picker-selected,.goog-date-picker-selected:hover{color:#fff}.goog-date-picker-selected::before,.goog-date-picker-selected:hover::before{background-color:#188038;transition:background-color 100ms linear}.docs-ui-toast{bottom:74px}.docs-butterbar-container{z-index:1003}.waffle-ellipses{display:inline-block;height:12px;position:relative;width:25px}.waffle-ellipses-message-container{height:0;overflow:hidden;position:absolute;width:0}.waffle-ellipses-container{height:100%;overflow:hidden;width:100%}.waffle-ellipses-sprite{display:block;position:relative}.waffle-ellipses.waffle-ellipses-active svg.waffle-ellipses-sprite{-webkit-animation:waffle-ellipses-sprite-cycle 1000ms steps(5) infinite reverse;-moz-animation:waffle-ellipses-sprite-cycle 1000ms steps(5) infinite reverse;-o-animation:waffle-ellipses-sprite-cycle 1000ms steps(5) infinite reverse;animation:waffle-ellipses-sprite-cycle 1000ms steps(5) infinite reverse}@keyframes waffle-ellipses-sprite-cycle{from{left:0}to{left:-125px}}.waffle-filter-menu{max-height:400px;overflow:auto}.waffle-filter-bar{display:flex;color:#fff;margin-left:35px;height:30px}.waffle-filter-bar-header{font-weight:500;margin-left:10px}.waffle-filter-bar-name-label,.waffle-filter-bar-range-label{padding:7px 0}.waffle-filter-bar-name-input,.waffle-filter-bar-range-input{background-color:transparent;border:1px solid transparent;box-shadow:none;color:#fff;height:19px;margin-top:2.5px}.waffle-filter-bar-name-input:hover,.waffle-filter-bar-range-input:hover{background-color:#6b6b6b}.waffle-filter-bar-name-input:focus,.waffle-filter-bar-range-input:focus{background:#fff;border:1px solid #4d90fe;color:black}.waffle-filter-bar-range-readonly,.waffle-filter-bar-name-readonly{border:1px dotted transparent;margin:0 3px 0 6px;outline:none;overflow:hidden;padding:6px 4px;text-overflow:ellipsis;white-space:nowrap;vertical-align:bottom}.waffle-filter-bar-range-readonly:focus,.waffle-filter-bar-name-readonly:focus{border-color:#ccc}.waffle-filter-bar-options{margin-top:4px}.waffle-filter-bar-close{margin-top:4px}.waffle-filter-bar .goog-flat-button{background-color:transparent;border:none;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;outline:none}.waffle-filter-bar .goog-flat-button:focus,.waffle-filter-bar .goog-flat-button:hover{background-color:#5f6368}.waffle-filter-bar .goog-flat-button.goog-flat-button-open,.waffle-filter-bar .goog-flat-button:active{background-color:#202124}.waffle-slidingdialog-filterbar{background-color:#3c4043;border-bottom:1px solid black;border-left:none;border-right:none;border-top:1px solid black;padding:4px 12px}.waffle-filter-bar-name-inputbox{display:inline}.waffle-filter-bar-name-inputbox,.waffle-filter-bar-name-readonly{width:175px}.waffle-filter-bar-promo-container{display:inline;margin-left:32px;margin-top:30px;position:absolute}.waffle-filter-bar-align-right{float:right}.waffle-filter-bar-promo{font-size:11px;width:200px}.waffle-filter-bar-range-filter-pills-container{display:flex;-webkit-flex-shrink:1;-ms-flex-negative:1;flex-shrink:1;-moz-flex-wrap:wrap;-ms-flex-wrap:wrap;-webkit-flex-wrap:wrap;flex-wrap:wrap;margin:0 10px;overflow-y:scroll}.waffle-filter-bar-add-range-filter-button{-webkit-border-radius:25px;-moz-border-radius:25px;border-radius:25px;color:white;margin-top:5px;white-space:nowrap}.waffle-filter-bar-rangepill{-webkit-border-radius:25px;-moz-border-radius:25px;border-radius:25px;background-color:white;margin-right:5px;margin-top:2.5px;min-width:100px;height:25px}.waffle-filter-bar-rangepill-range{background-color:transparent;color:black;margin-left:10px;min-width:60px;padding:5px 0}.waffle-filter-bar .waffle-filter-bar-rangepill .waffle-filter-bar-rangepill-close:focus,.waffle-filter-bar .waffle-filter-bar-rangepill .waffle-filter-bar-rangepill-close:hover{background:transparent}.waffle-filter-bar-rangepill-close{margin:0}.waffle-filter-bar-range-pill-input{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;height:25px}.waffle-filter-bar-range-section,.waffle-filter-bar-range-section-container{display:flex;-ms-flex:1;-webkit-flex:1;flex:1;overflow:hidden}.waffle-filter-bar-range-section-space-eater{-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1}.waffle-slidingdialog-formbar{background-color:#424242;border-left:none;border-right:none;padding:4px 16px 4px 55px}.waffle-form-bar{color:#fff;height:30px}.waffle-form-bar-forms-icon{position:relative;top:5px}.waffle-form-bar-forms-text{font-family:Roboto,Arial,sans-serif;font-size:14px;font-weight:500;margin-left:16px;padding:7px 0}.waffle-form-bar-right-all-buttons{float:right}.waffle-form-bar-right-all-buttons button{background-color:transparent;border-radius:2px;border:0;color:white;cursor:pointer;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:500;margin-right:8px;min-width:88px;padding:3px 8px;position:relative;text-transform:uppercase;top:-7px}.waffle-form-bar-right-all-buttons button.goog-button-disabled{color:rgba(255,255,255,0.3);cursor:default}.waffle-form-bar-more-options{margin-left:8px;margin-top:4px}.waffle-form-bar .goog-flat-button{background-color:transparent;border:none;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;outline:none}.waffle-form-bar .goog-flat-button:focus,.waffle-form-bar .goog-flat-button-hover,.waffle-form-bar-right-all-buttons button:focus,.waffle-form-bar-right-all-buttons button:hover{background-color:rgba(204,204,204,0.15);outline-width:0}.waffle-form-bar .goog-flat-button.goog-flat-button-open,.waffle-form-bar .goog-flat-button:active,.waffle-form-bar-right-all-buttons button:active{background-color:rgba(204,204,204,0.25);outline-width:0}.waffle-arguments-help-popup{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background-color:white;border:1px solid rgba(0,0,0,.2);box-shadow:0 1px 3px 1px rgba(60,64,67,.15);color:#222;font-size:11px;line-height:15px;position:absolute;width:calc(340px + 2*10px);word-wrap:break-word;z-index:1000}.waffle-arguments-help-title{-webkit-border-radius:4px 4px 0px 0px;-moz-border-radius:4px 4px 0px 0px;border-radius:4px 4px 0px 0px;display:flex;background-color:#f5f5f5;color:#3c4043;direction:ltr;line-height:16px;padding:8px 12px}.waffle-arguments-help-function-name{text-decoration:inherit}.waffle-arguments-help-body{border-top:1px solid #ebebeb}.waffle-arguments-help-content{padding-bottom:2px}.waffle-arguments-help-section{padding:5px 10px}.waffle-arguments-help-section-title{font-size:11px;color:#666;line-height:18px}.formulas-arguments-help-info-title .waffle-arguments-help-section-title{color:#80868b;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;letter-spacing:.8px;text-transform:uppercase}.formulas-arguments-help-info-title.waffle-arguments-help-section{padding:8px 12px 3px}.waffle-arguments-help-content .formulas-arguments-help-info-title.waffle-arguments-help-section{padding-bottom:12px;padding-top:4px}.waffle-arguments-parameter-help-section{padding:12px 0px}.waffle-arguments-parameter-help-section .waffle-arguments-help-section-title{color:#3c4043;font-family:'Roboto Mono','Consolas',monospace;font-size:13px;line-height:20px;transition:0.218s ease-in}.waffle-arguments-parameter-help-section .waffle-arguments-help-section-active .waffle-arguments-help-section-title{color:#188038;font-weight:bold}.waffle-arguments-parameter-help-section .waffle-arguments-help-section{padding:0 12px 4px}.waffle-arguments-parameter-help-section .waffle-arguments-help-section:last-of-type{padding-bottom:0}.waffle-arguments-help-parameter-content{color:#3c4043;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px}.waffle-arguments-help-section-inactive .waffle-arguments-help-parameter-content,.waffle-arguments-help-section.waffle-arguments-help-section-inactive .waffle-arguments-help-section-title{color:#80868b}.waffle-arguments-help-section-active .waffle-arguments-help-parameter-content,.formulas-arguments-help-info-title .waffle-arguments-help-parameter-content{color:#3c4043}.waffle-arguments-parameter-help-section .waffle-arguments-help-parameter-content{transition:0.218s ease-in}.waffle-arguments-help-formula{-ms-flex:1;-webkit-flex:1;flex:1;direction:ltr;font-family:'Roboto Mono','Consolas',monospace;font-size:13px;overflow:hidden;padding:0}.waffle-arguments-help-formula .waffle-arguments-parameter-holder{overflow-wrap:anywhere}.waffle-arguments-help-example-holder{line-height:13px;text-align:left}.waffle-arguments-help-footer{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;padding:0 12px 12px}.waffle-arguments-help-parameter{border-radius:4px;display:inline-block;padding-left:1px;transition:0.218s ease-in}.waffle-arguments-help-parameter-active{background-color:transparent;color:#188038;font-weight:bold}#waffle-arguments-help-learn-more{color:#15c;text-decoration:none}#waffle-arguments-help-learn-more:hover{text-decoration:underline}.waffle-arguments-help-send-feedback{color:#c53929;float:right;text-decoration:none}.waffle-arguments-help-send-feedback:hover,.waffle-arguments-help-send-feedback:focus{text-decoration:underline}.waffle-arguments-help-code{background-color:transparent;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif}.waffle-arguments-help-button-container{margin-right:0}.waffle-arguments-help-button{display:inline-block;margin:-4px;opacity:1;padding:0}.waffle-arguments-help-button:first-of-type{margin-right:8px}.waffle-arguments-help-button:hover{opacity:1}.waffle-arguments-help-button .docs-icon-img:before{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_grey_medium.svg)}.waffle-arguments-help-button-hover .docs-icon-img:before{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_grey_dark.svg)}.waffle-arguments-help-arg-suggestions-title-container .waffle-arguments-help-button{opacity:1}.waffle-arguments-help-toggle-icon{transition:400ms ease-out;-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.waffle-arguments-help-toggle-icon-flipped{-webkit-transform:rotate(0);-moz-transform:rotate(0);-ms-transform:rotate(0);-o-transform:rotate(0);transform:rotate(0)}.waffle-formula-help-button-hover-container{padding-left:1px;padding-top:1px}.waffle-formula-help-button-hover-container:hover,.waffle-arguments-help-button.waffle-arguments-help-button-focused{background-color:#dadce0;border-radius:50%;outline:none}.waffle-arguments-help-arg-suggestions-section{-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;display:flex;background:#e6f4ea;font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;padding:10px;padding-bottom:14px;padding-right:12px}.waffle-arguments-help-arg-suggestions-v1-ui.waffle-arguments-help-arg-suggestions-section{background:#0f9d58;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif}.waffle-arguments-help-arg-suggestions-title-container{display:flex;color:#188038;font-size:13px}.waffle-arguments-help-arg-suggestions-v1-ui .waffle-arguments-help-arg-suggestions-title-container{color:#fff}.waffle-arguments-help-arg-suggestions-title{-webkit-align-items:center;align-items:center;display:flex;-ms-flex:1;-webkit-flex:1;flex:1}.waffle-arguments-help-arg-suggestions-title-text{font-weight:500;text-transform:capitalize}.waffle-arguments-help-arg-suggestions-v1-ui .waffle-arguments-help-arg-suggestions-title-text{font-weight:700;text-transform:uppercase}.waffle-arguments-help-arg-suggestions-selection-message{font-size:12px;font-weight:400}.waffle-arguments-help-arg-suggestions-chips{margin-top:8px;margin-right:10px}.waffle-arguments-help-arg-suggestions-chips-container{-webkit-align-items:center;align-items:center;display:flex}.waffle-arguments-help-arg-suggestions-chip{box-shadow:0 1px 2px 0 rgba(60,64,67,0.30),0 1px 3px 1px rgba(60,64,67,0.15);background:#fff;border:1px solid transparent;border-radius:8px;color:#5f6368;cursor:pointer;font-size:13px;font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;height:16px;line-height:16px;margin-right:8px;max-width:100px;overflow:hidden;padding:7px;text-overflow:ellipsis;white-space:nowrap}.waffle-arguments-help-arg-suggestions-v1-ui .waffle-arguments-help-arg-suggestions-chip{box-shadow:0px 2px 2px 0px rgba(0,0,0,0.14),0px 3px 1px -2px rgba(0,0,0,0.12),0px 1px 5px 0px rgba(0,0,0,0.2);background:#fff;border-radius:4px;border:1px solid #e0e0e0;color:rgba(0,0,0,0.87);font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;min-width:60px;text-align:center}.waffle-arguments-help-arg-suggestions-v2-ui .waffle-arguments-help-arg-suggestions-chip.goog-button-hover,.waffle-arguments-help-arg-suggestions-v2-ui .waffle-arguments-help-arg-suggestions-chip.goog-button-focused{box-shadow:0 1px 1px 0 rgba(52,168,83,0.50),0 1px 3px 1px rgba(52,168,83,0.50);-webkit-transform:scale(1.05);-moz-transform:scale(1.05);-ms-transform:scale(1.05);-o-transform:scale(1.05);transform:scale(1.05);border:1px solid #1e8e3e;outline:none}.waffle-arguments-help-arg-suggestions-v1-ui .waffle-arguments-help-arg-suggestions-chip.goog-button-hover,.waffle-arguments-help-arg-suggestions-v1-ui .waffle-arguments-help-arg-suggestions-chip.goog-button-focused{-webkit-transform:scale(1.05);-moz-transform:scale(1.05);-ms-transform:scale(1.05);-o-transform:scale(1.05);transform:scale(1.05);outline:none}.waffle-arguments-help-arg-suggestions-chip.waffle-suggested-arg-chip-selected{box-shadow:0 1px 1px 0 rgba(52,168,83,0.50),0 1px 3px 1px rgba(52,168,83,0.50);background:rgba(52,168,83,0.04);border:1px solid #1e8e3e;color:#1e8e3e}.waffle-arguments-help-arg-suggestions-v1-ui .waffle-arguments-help-arg-suggestions-chip.waffle-suggested-arg-chip-selected{box-shadow:0px 2px 2px 0px rgba(0,0,0,0.14),0px 3px 1px -2px rgba(0,0,0,0.12),0px 1px 5px 0px rgba(0,0,0,0.2);background:#4285f4;border:1px solid #4285f4;font-weight:700;color:#fff}.waffle-arguments-help-arg-suggestions-chip-icon{display:inline-block;float:left;margin-right:7px;height:16px;width:16px}.waffle-arguments-help-arg-suggestions-v1-ui .waffle-arguments-help-arg-suggestions-chip-icon,.waffle-arguments-help-arg-suggestions-v2-ui-no-chip-icon .waffle-arguments-help-arg-suggestions-chip-icon{display:none}.waffle-arguments-help-arg-suggestions-chip-value{line-height:17px;margin-left:-1px}.waffle-formula-autocomplete-renderer .waffle-ac-active{background:#f5f5f5}.waffle-formula-autocomplete-renderer{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;box-shadow:0 1px 3px 1px rgba(60,64,67,.15);width:calc(340px + 2*10px)}.waffle-function-autocomplete-row{text-overflow:ellipsis;width:340px}.waffle-function-autocomplete-row-name,.waffle-function-autocomplete-row-formula{-ms-flex:1;-webkit-flex:1;flex:1;color:#202124;direction:ltr;font-size:14px;font-family:Inconsolata,monospace,arial,sans,sans-serif;margin:-2px 0}.waffle-function-autocomplete-row-name{overflow:hidden;text-overflow:ellipsis}.waffle-formula-autocomplete-row-primary-content .waffle-function-autocomplete-row-formula{margin:0;overflow:hidden}.waffle-function-autocomplete-row-description{color:#5f6368;display:none;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.waffle-ac-active .waffle-function-autocomplete-row-description{display:block}.waffle-function-autocomplete-row-shortcut,.waffle-function-autocomplete-row-simplified-shortcut{color:#666;direction:ltr}.waffle-actionable-autocomplete-row,.waffle-contextual-formula-autocomplete-row,.waffle-named-range-autocomplete-row{-webkit-align-items:flex-start;align-items:flex-start;display:flex;cursor:pointer;direction:ltr}.waffle-ac-row.waffle-ac-actionable-row{padding:1px 10px}.waffle-ac-row.waffle-ac-named-range-row,.waffle-ac-row.waffle-ac-contextual-row{padding-top:1px}.waffle-ac-active.active.waffle-ac-row:first-of-type{border-top-left-radius:4px;border-top-right-radius:4px}.waffle-ac-active.active.waffle-ac-row:last-of-type{border-bottom-left-radius:4px;border-bottom-right-radius:4px}.waffle-ac-actionable-row{border-bottom:1px solid rgba(0,0,0,0.12);border-top:1px solid rgba(0,0,0,0.12)}.waffle-function-autocomplete-row-icon-container,.waffle-named-range-autocomplete-row-icon-container{display:flex;margin-right:3px;width:25px}.waffle-ac-actionable-row .waffle-function-autocomplete-row-icon-container{opacity:0.4}.waffle-ac-contextual-row .waffle-function-autocomplete-row-icon-container{margin:1px 2px 2px 1px}.waffle-actionable-formula-autocomplete-row-content,.waffle-contextual-formula-autocomplete-row-content,.waffle-named-range-autocomplete-row-content{-ms-flex:1;-webkit-flex:1;flex:1;direction:ltr;padding-top:2px;white-space:normal;width:calc(340px - 25px)}.waffle-actionable-formula-autocomplete-row-content,.waffle-contextual-formula-autocomplete-row-content{word-wrap:break-word}.waffle-named-range-autocomplete-row-content{word-wrap:ellipsis}.waffle-formula-autocomplete-row-primary-content{-webkit-align-items:center;align-items:center;display:flex;direction:ltr}.waffle-contextual-formula-autocomplete-row .waffle-formula-autocomplete-row-primary-content{margin:-2px 0}.waffle-ac-close-autocomplete-row{border:none!important}.waffle-ac-close-autocomplete-row{cursor:default!important;background:rgba(0,0,0,0.15)}.waffle-close-autocomplete-row-content{-webkit-align-items:center;align-items:center;display:flex;-webkit-justify-content:flex-end;justify-content:flex-end;-ms-flex:1;-webkit-flex:1;flex:1}.waffle-close-autocomplete-row-close-button{cursor:pointer;opacity:0.3}.waffle-close-autocomplete-row-close-button:hover,.waffle-close-autocomplete-row-close-button:focus{opacity:0.5}.waffle-close-autocomplete-row-message{-ms-flex:1;-webkit-flex:1;flex:1;color:#000;font-weight:500;overflow:hidden;overflow-wrap:break-word;white-space:normal}.waffle-arguments-help-popup hr{background-color:#dadce0;border:0;height:1px;margin:0 12px}.waffle-sidebar-container.waffle-pivot-sidebar{display:block;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif!important;width:300px}.waffle-sidebar-container.waffle-pivot-sidebar:focus{outline:1px solid #4285f4}#waffle-pivot-aggr{display:inline;font-weight:normal;margin-right:5px}#waffle-pivot-aggr .docs-material-select-outer-box{display:flex;border-bottom:none}#waffle-pivot-aggr-select{font-size:12px}.waffle-pivot-container{border:none;padding:12px 16px 0}.waffle-pivot-label{color:rgba(0,0,0,0.87);font-weight:bold;padding:0 0 14px 2px;position:relative}#waffle-pivot-aggr-label{color:rgba(0,0,0,0.87);font-size:13px;font-weight:500;text-decoration:none}.waffle-pivot-label,#waffle-pivot-aggr-label{color:#202124;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;letter-spacing:0.2px;padding-bottom:18px}.waffle-pivot-add-button{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:white;border:1px solid #dadce0!important;color:#188038;height:24px;padding:3px 12px 5px;border:transparent;color:#188038;cursor:pointer;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;letter-spacing:.25px;margin:0;padding:3px 11px 1px 13px;position:absolute;right:0;text-transform:none;top:-3px}.waffle-pivot-add-button:hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#f8fcf9;border:1px solid #c8e7d1!important;height:24px;padding:3px 12px 5px;padding:3px 11px 1px 13px}.waffle-pivot-add-button:focus{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#e7f5eb;border:1px solid #bbe2c6!important;height:24px;padding:3px 12px 5px;background-color:rgba(66,133,244,.12);border:transparent;padding:3px 11px 1px 13px}.hc-enabled .waffle-pivot-add-button:focus{outline:1px solid}.waffle-pivot-add-button:hover:focus{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#dff2e4;border:1px solid #b5e0c1!important;height:24px;padding:3px 12px 5px;padding:3px 11px 1px 13px}.waffle-pivot-add-button:active{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#dff2e4;border:1px solid transparent!important;box-shadow:0 2px 6px 2px rgba(60,64,67,.15);height:24px;padding:3px 12px 5px;padding:3px 11px 1px 13px}.waffle-pivot-add-button-disabled{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:white;border:1px solid #f1f3f4!important;color:#3c4043;opacity:0.38;height:24px;padding:3px 12px 5px;color:rgba(0,0,0,.12);cursor:default;padding:3px 11px 1px 13px}.waffle-pivot-rangepicker-container{padding:8px 16px 8px}#waffle-pivot-range-selection{padding-bottom:8px}#waffle-pivot-range-selection .waffle-range-selection-button{border-radius:50%;margin:0;padding:4px 2px 4px 0}#waffle-pivot-range-selection .waffle-range-selection-button:focus{background-color:rgba(0,0,0,.12)!important}.waffle-pivot-rangepicker-error-label{color:#db4437;font-size:13px}.waffle-pivot-drop-target{height:auto;margin-bottom:-22px;margin-top:-24px;padding-bottom:24px;padding-top:24px}.waffle-pivot-pill{background-color:#fff;border:none;border-radius:2px;box-shadow:0 1px 3px 1px rgba(60,64,67,.15);cursor:move;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif!important;margin-bottom:16px;transition:max-height 0.25s cubic-bezier(0.4,0.0,0.2,1)}.waffle-pivot-pill:focus{outline-color:#4285f4}.hc-enabled .waffle-pivot-pill:focus{outline:1px solid}.waffle-pivot-pill-disabled{cursor:default}.waffle-pivot-pill-checkbox-label{color:#5f6368;font-size:12px;letter-spacing:.13px;margin-left:10px;vertical-align:middle}.waffle-pivot-pill-align-middle{vertical-align:middle}.waffle-pivot-pill-close{color:#8d8d8d;cursor:pointer;float:right;font-size:14px;transform:translateY(-15%)}.waffle-pivot-pill-close .jfk-button{border:transparent;border-radius:50%;font-size:18px;outline:none;width:20px}.waffle-pivot-pill-close .jfk-button:focus{background-color:rgba(0,0,0,.12)}.waffle-pill-during-dragging{height:33px}.waffle-pill-during-dragging .waffle-pivot-pill-section{display:none}.waffle-pivot-pill-close-disabled{color:rgba(0,0,0,.12)}.waffle-pivot-pill-section{box-sizing:border-box;display:inline-block;margin:8px 0;padding:0 8px;vertical-align:top;width:50%}.hc-enabled .waffle-pivot-pill-section .docs-material-gm-select.waffle-pivot-pill-nodrag:focus{outline:1px solid}#waffle-pivot-filter .waffle-pivot-pill-section,.waffle-pill-section-checkbox,.waffle-pivot-date-grouping-section{width:100%}#waffle-pivot-filter .waffle-pivot-filter-pill-select{padding-bottom:2px;padding-top:2px;width:100%}.hc-enabled .waffle-pivot-pill-section .waffle-pivot-filter-pill-select:focus{outline:1px solid}#waffle-pivot-filter .waffle-pivot-filter-pill-select .goog-flat-menu-button-caption{font-size:12px}.waffle-pivot-date-grouping-section{margin-top:4px}.waffle-pill-section-checkbox{margin-top:0}.waffle-pivot-pill-main-table{background:none;border-bottom:none;min-height:16px;padding:10px 8px 6px 12px}.waffle-pivot-pill-main-table-text{float:left;max-width:185px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.waffle-pivot-pill-title{color:#202124;font-size:14px;font-weight:500;letter-spacing:.25px;overflow:hidden;white-space:nowrap}.waffle-pivot-pill-nodrag{cursor:pointer}.waffle-pivot-pill-type-icon{float:left;margin-right:8px;opacity:1!important;position:relative;top:-1px}.waffle-pivot-pill-type-icon.docs-hc-ie{background-color:white;-ms-high-contrast-adjust:none}.waffle-pivot-pill-type-icon.docs-hc-gecko{filter:invert(1)}.waffle-pivot-pill-limit-combobox.docs-material-gm-select{height:26px}.waffle-pivot-pill-limit-combobox .docs-material-gm-select-input.jfk-textinput{background:transparent}.waffle-pivot-pill-limit-combobox.docs-material-gm-select-open .docs-material-gm-select-input.jfk-textinput{background:white;border:2px solid #1a73e8}.waffle-pivot-pill-limit-combobox .docs-material-gm-select-input.jfk-textinput{border:0;font-size:12px;height:20px;margin:0;max-width:100%;width:83px}.waffle-pivot-multi-select{background:#efefef;background-color:#f1f3f4;border:1px solid #d7d7d7;border-color:transparent;border-radius:4px;display:block;margin:3px 0 0 0;padding:3px;position:relative}.waffle-pivot-multi-select .docs-material-gm-select{margin-bottom:4px}.waffle-pivot-multi-select .docs-material-gm-select:last-child{margin-bottom:0}.waffle-pivot-multi-select .docs-material-gm-select-outer-box{background-color:white}.waffle-pivot-pill-sort-by{vertical-align:top;width:100%}.waffle-pivot-multi-select .waffle-pivot-select-caption{color:#555}.waffle-pivot-select-divider{color:#555;margin:0 3px}.waffle-pivot-checkbox{vertical-align:middle}.waffle-pivot-feedback-section{float:right;margin-right:10px;margin-top:5px;position:relative}#waffle-pivot-feedback{padding-left:10px}.waffle-pivot-add-field-menu{overflow-y:auto}.waffle-pivot-add-field-label{display:inline-block;letter-spacing:0.2px;padding-top:2px}.waffle-pivot-aggr-select-container{display:inline-block;height:20px;margin-top:-5px}#waffle-pivot-aggr-select{border-bottom:2px solid transparent}#waffle-pivot-aggr-select:focus{border-color:#4d90fe}.waffle-pivot-select-label{color:#5f6368;font-size:11px;padding-bottom:3px;padding-left:2px}.waffle-pivot-calculated-input{border:1px solid #dadce0;border-radius:4px;box-sizing:border-box;color:#3c4043;font-size:12px;padding:4px 0px 4px 8px;width:100%}.waffle-pivot-calculated-input:focus{outline-color:#4d90fe}.waffle-pill-section-formula{margin-bottom:0;width:100%}.waffle-pill-section-formula .waffle-pivot-pill-nodrag{padding-top:0}.waffle-pill-section-formula .waffle-pivot-pill-nodrag{padding-top:8px}#waffle-pivot-filter{min-height:20px}.waffle-pivot-recommendation-header{outline:none}.waffle-pivot-recommendation-box .waffle-pivot-container{padding:12px 0 0 16px}.waffle-pivot-curr-drag-item{max-height:30px}.waffle-pivot-recommendation-box.legacy .waffle-pivot-container{border-top:1px solid #efefef;height:auto;padding:8px 8px 0px;padding-bottom:12px}.waffle-pivot-recommendation-box.legacy .waffle-pivot-label{font-size:13px;font-weight:500;margin:0;padding-top:2px;padding-bottom:6px}.waffle-pivot-recommendation-header .waffle-pivot-recommendation-toggle-icon{float:right;transition:200ms ease-out;-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.goog-zippy-expanded .waffle-pivot-recommendation-toggle-icon{-webkit-transform:rotate(0);-moz-transform:rotate(0);-ms-transform:rotate(0);-o-transform:rotate(0);transform:rotate(0);border:1px solid transparent}.waffle-pivot-recommendation-header:focus .waffle-pivot-recommendation-toggle-icon{border:1px solid #5e97f6!important;outline:none}.waffle-pivot-recommendation-toggle-icon-disabled{opacity:0.24}.waffle-pivot-recommendation-error{margin-left:2px}.waffle-pivot-recommendation-error,.waffle-pivot-recommendation-container{opacity:0.7}.waffle-pivot-recommendation-container{-webkit-align-items:flex-start;align-items:flex-start;display:flex;background-color:transparent;color:black;cursor:pointer}.waffle-pivot-recommendation-container:hover,.waffle-pivot-recommendation-container:hover .waffle-pivot-recommendation-icon{opacity:1.0}.waffle-pivot-recommendation-body{display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column}.waffle-pivot-recommendation-content{-webkit-align-items:flex-start;align-items:flex-start;display:flex;-ms-flex:1;-webkit-flex:1;flex:1;background-color:transparent;overflow-wrap:break-word;overflow:hidden;padding:4px 0}.waffle-pivot-recommendation-text{-ms-flex:1;-webkit-flex:1;flex:1;color:rgba(0,0,0,0.87);line-height:21px;padding-left:5px;white-space:normal}.waffle-pivot-recommendation-preview-btn{box-shadow:0px 2px 2px 0px rgba(0,0,0,0.14),0px 3px 1px -2px rgba(0,0,0,0.12),0px 1px 5px 0px rgba(0,0,0,0.2);background-color:white;display:none;opacity:0.7;padding:4px;position:absolute;right:0}.waffle-pivot-recommendation-preview-btn-visible,.waffle-pivot-recommendation-container:hover .waffle-pivot-recommendation-preview-btn{cursor:pointer;display:block;opacity:0.9}.waffle-pivot-recommendation-content:focus,.waffle-pivot-recommendation-content:hover{background-color:#f5f5f5;outline:none}.waffle-recommendation-box-spinner-container{-webkit-align-self:center;align-self:center;height:40px;width:40px}.waffle-recommendation-box-spinner-container .waffle-spinner{height:25px;width:25px}.waffle-pivot-recommendation-error-container{display:flex}.waffle-pivot-recommendation-error-image{opacity:0.5}.waffle-pivot-recommendation-error-content{margin-left:10px}.waffle-pivot-rangepicker-label{color:rgba(0,0,0,0.54)}.waffle-pivot-sidebar .docs-material-gm-select-caption{color:#3c4043;font-size:12px;padding-left:8px}.waffle-pivot-sidebar .docs-material-gm-select-outer-box{padding:0}.waffle-pivot-sidebar .docs-material-gm-checkbox{display:inline-block}.waffle-sidebar-container.waffle-pivot-sidebar-column-names-enabled{width:460px}.waffle-sidebar-container.waffle-pivot-sidebar.waffle-pivot-sidebar-column-names-enabled:focus{outline:none}.waffle-pivot-sidebar-column-names-enabled .waffle-sidebar-content{display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;overflow:hidden}.waffle-pivot-sidebar-column-names-enabled #waffle-pivot-sidebar{border-right:1px solid #dadce0;height:100%;overflow-y:auto;width:300px}.waffle-pivot-sidebar-column-names-enabled #waffle-pivot-sidebar .waffle-pivot-container{box-sizing:border-box;max-width:284px;padding-right:0}.waffle-pivot-sidebar-column-names-enabled .waffle-pivot-recommendation-list{position:relative}.waffle-pivot-sidebar-column-names-enabled .waffle-pivot-column-names-container{display:block;height:100%;overflow-y:auto;width:160px}.waffle-pivot-sidebar-column-names-enabled .waffle-pivot-pill{background:#f1f3f4;border:1px solid #f1f3f4;border-radius:8px;box-shadow:none;margin-left:2px;margin-right:2px}.waffle-pivot-sidebar-column-names-enabled .waffle-pivot-pill:focus{box-shadow:0 1px 3px 1px rgba(60,64,67,.15);outline:none}.waffle-pivot-sidebar-column-names-enabled .waffle-pivot-pill-main-table{padding:6px 8px}.waffle-pivot-pill-type-icon{top:1px}.waffle-pivot-sidebar-column-names-enabled .waffle-pivot-pill-main-table-text,.waffle-pivot-sidebar-column-names-enabled .waffle-pivot-pill-title{line-height:20px}.waffle-pivot-sidebar-column-names-enabled .waffle-pivot-pill-title{color:#3c4043;font-weight:500}.waffle-pivot-sidebar-column-names-enabled .waffle-pivot-pill-close{transform:translateX(4px)}.waffle-pivot-sidebar-column-names-enabled .waffle-pivot-pill-close:focus{background-color:#dadce0}.waffle-pivot-sidebar-column-names-enabled .waffle-pivot-pill-close .jfk-button{color:#5f6368;font-size:14px;height:20px;vertical-align:middle;width:20px}.hc-enabled .waffle-pivot-pill-close .jfk-button-flat:focus{outline:1px solid}.waffle-pivot-sidebar-column-names-enabled.waffle-pill-during-dragging{background:#f8f9fa;border-radius:16px;box-shadow:0 4px 4px 0px rgba(60,64,67,.3),0 8px 12px 6px rgba(60,64,67,.15);opacity:0.9}.waffle-pivot-sidebar-column-names-enabled.waffle-pill-during-dragging .waffle-pivot-pill-close{display:none}.waffle-pivot-sidebar-column-names-enabled .docs-material-gm-select{background:white;border-radius:4px}.waffle-pivot-sidebar-column-names-enabled #waffle-pivot-sidebar .waffle-pivot-pill.waffle-pivot-pill-highlight{background:#ceead6;border-color:#34a853}.waffle-pivot-sidebar-column-names-enabled.waffle-pill-during-dragging.goog-menuitem{box-sizing:border-box;border-radius:16px;cursor:move;margin:0 4px;overflow:hidden;padding-left:8px;padding-right:8px;background:#f8f9fa;box-shadow:0 4px 4px 0px rgba(60,64,67,.3),0 8px 12px 6px rgba(60,64,67,.15);opacity:0.9}.waffle-pivot-sidebar-column-names-enabled.waffle-pill-during-dragging.goog-menuitem .goog-menuitem-content,.waffle-pivot-sidebar-column-names-enabled.waffle-pill-during-dragging.goog-menuitem .goog-menuitem-content span{-ms-flex:1;-webkit-flex:1;flex:1;color:#3c4043;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;line-height:18px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:500}.waffle-pivot-sidebar-column-names-enabled.waffle-pill-during-dragging.goog-menuitem .goog-menuitem-content>div{display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-webkit-justify-content:flex-start;justify-content:flex-start}.waffle-pivot-sidebar-column-names-enabled.waffle-pill-during-dragging.goog-menuitem .goog-menuitem-icon{margin:0 8px 0 0;position:relative;top:0}.waffle-printing-pane{left:0;outline:none;position:absolute;height:100%;top:0;width:100%}.waffle-printing-fullscreen-cover{background:rgba(0,0,0,.54);bottom:0;left:0;position:absolute;right:0;top:0}.waffle-printing-loader-message{color:#fff;font:13px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;line-height:60px;text-align:center;width:100%}.waffle-printing-indeterminate-loader{height:4px;left:0;position:absolute;right:0;top:60px}.waffle-printing-body-wrapper{bottom:0;left:0;position:absolute;right:0;top:60px}.waffle-printing-header-bar{background-color:#424242;height:60px;line-height:60px;width:100%}.waffle-printing-header-bar-left{margin-left:12px}.waffle-printing-header-bar-right{margin-right:12px}.waffle-printing-header-bar-middle{height:100%;line-height:60px;overflow:hidden;text-align:center;width:auto}.waffle-printing-top-level-header-left{float:left;height:60px}.waffle-printing-top-level-header-left>div{vertical-align:middle}.waffle-printing-header-title{color:white;display:inline-block;font:18px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;margin-left:28px;margin-right:16px}.waffle-printing-page-counter{color:white;display:inline-block;font:13px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500}.waffle-printing-header-page-total{font-weight:400}.waffle-printing-cancel-button,.waffle-printing-cancel-button.docs-material-button-focused.docs-material-button-no-focus-border{padding-left:4px}.waffle-printing-cancel-button.docs-material-button-focused{padding-left:3px}.waffle-printing-cancel-button .docs-icon{margin:-4px 8px 0 0}.waffle-printing-header-button-set,.waffle-printing-custom-headers-footers-confirm,.waffle-printing-custom-page-breaks-confirm{float:right}.waffle-printing-header-button-set,.waffle-printing-custom-headers-footers-confirm,.waffle-printing-custom-page-breaks-confirm,.waffle-printing-custom-headers-footers-cancel,.waffle-printing-custom-page-breaks-cancel{margin-top:14px;margin-bottom:14px}.waffle-printing-print-button,.waffle-printing-top-level-cancel-button{float:right}.waffle-printing-float-clear{clear:both}.waffle-printing-preview-pane{background-color:#d1d1d1;height:100%;overflow:hidden;position:relative;width:auto}.waffle-printing-preview-outer{height:100%}.waffle-printing-preview-inner{height:100%;overflow-x:auto;overflow-y:scroll}.waffle-printing-preview-card-wrapper{margin:41px 20px 20px 36px}.waffle-printing-preview-card{background-color:#fff;box-shadow:0 8px 10px 1px rgba(0,0,0,0.14),0 3px 14px 3px rgba(0,0,0,0.12),0 4px 5px 0 rgba(0,0,0,0.20);margin:auto;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;width:100%}.waffle-printing-preview-card>canvas{height:100%;width:100%}.waffle-printing-preview-spinner{position:absolute;left:50%;top:50%;transform:translate(-14px,-14px)}.waffle-printing-preview-page-counter-outer{bottom:22px;margin:0 10%;pointer-events:none;position:absolute;width:80%}.waffle-printing-preview-page-counter-inner{background-color:rgba(0,0,0,0.7);border-radius:12px;color:#fff;display:table;font:16px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;margin:auto;padding:20px 32px;text-align:center}.waffle-printing-preview-page-counter-ellipses{max-height:19px}.waffle-printing-options-pane{background-color:#fff;color:#474747;float:right;height:100%;overflow-y:auto;width:300px}.waffle-printing-options-top-section{padding:8px 16px}.waffle-printing-options-section{border-bottom:1px solid #d2d2d2}.waffle-printing-options-wrapper .docs-charts-editor-collapsible-header{font:16px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500}.waffle-printing-options-wrapper .docs-charts-editor-collapsible-title{width:auto}.waffle-printing-options-wrapper .docs-charts-editor-collapsible-summary{display:none}.waffle-printing-options-wrapper h2{color:rgba(0,0,0,.87);font-size:13px;font-weight:normal;margin:20px 0 0}.waffle-printing-options-wrapper h3,.waffle-printing-options-wrapper .docs-material-labeled-select-label,.waffle-printing-options-wrapper .docs-material-gm-labeled-select-label{color:rgba(0,0,0,.54);font:11px Roboto,RobotoDraft,Helvetica,Arial,sans-serif}.waffle-printing-options-wrapper h3,.waffle-printing-options-wrapper .docs-material-labeled-select,.waffle-printing-options-wrapper .docs-material-gm-labeled-select{margin:20px 0 0}.waffle-printing-options-wrapper .waffle-printing-fine-grained-selection-header{margin-bottom:8px}.waffle-printing-options-wrapper .waffle-material-labeledinput{margin:16px 0 0}.waffle-printing-options-wrapper .waffle-material-labeledinput-underline,.waffle-printing-options-wrapper .waffle-material-labeledinput-accentunderline{bottom:0}.waffle-printing-options-wrapper .waffle-material-labeledinput-input{bottom:3px}.waffle-printing-options-pane .docs-charts-editor-material-menu-button-caption{font-size:16px}.waffle-printing-full-size{display:block;padding:0}.waffle-printing-custom-paper-height-wrapper{float:left;width:120px}.waffle-printing-custom-paper-width-wrapper{float:right;width:120px}.waffle-printing-scale .docs-charts-editor-material-text-input{margin-top:12px}.waffle-printing-custom-scale{float:right;margin-left:20px;width:33%}.waffle-printing-scale-wrapper{overflow:hidden;width:auto}.waffle-printing-page-breaks-edit-button{float:right;margin-right:-8px}.waffle-printing-page-breaks-button-and-toggle{line-height:32px;margin:18px 0}.waffle-printing-page-breaks-toggle-wrapper{color:rgba(0,0,0,0.87);vertical-align:middle;float:left;width:auto}.waffle-printing-page-breaks-toggle{display:inline-block;margin-left:12px;position:relative;top:3px}.waffle-printing-page-breaks-toggle-ie{top:5px}.waffle-printing-page-breaks-toggle-label{display:inline-block}.docs-charts-editor-collapsible-content>div.waffle-printing-formatting-section{padding-bottom:16px}.waffle-printing-horizontal-alignment,.waffle-printing-vertical-alignment{float:left;width:118px}.waffle-printing-horizontal-alignment{margin-right:20px}.waffle-printing-options-section.waffle-printing-repeat-header-cells-section{border-bottom:none}.waffle-printing-options-section.waffle-printing-repeat-header-cells-section h2{margin-bottom:10px}.waffle-printing-options-section.waffle-printing-repeat-header-cells-section h3{margin:0 0 16px}.waffle-printing-rfs-columns,.waffle-printing-rfs-rows,.waffle-printing-rfs-columns .docs-charts-editor-labeledcheckbox,.waffle-printing-rfs-rows .docs-charts-editor-labeledcheckbox{display:inline}.waffle-printing-zoom-wrapper{position:absolute;right:22px;bottom:10px;z-index:1}.waffle-printing-zoom-in-button .jfk-button,.waffle-printing-zoom-out-button .jfk-button{background:#fff;border-radius:20px;box-shadow:0 2px 2px 0 rgba(0,0,0,0.14),0 1px 5px 0 rgba(0,0,0,0.12),0 3px 1px -2px rgba(0,0,0,0.2);height:15px;min-width:0;padding:12.5px;position:relative;margin:0 0 12px 0;right:-80px;transition:.2s right;width:15px}.waffle-printing-zoom-in-button .jfk-button .waffle-printing-zoom-icon-wrapper,.waffle-printing-zoom-out-button .jfk-button .waffle-printing-zoom-icon-wrapper{line-height:0;opacity:.54}.waffle-printing-zoom-out-button .jfk-button{transition-delay:.1s}.waffle-printing-preview-pane:hover .waffle-printing-zoom-in-button .jfk-button{right:0}.waffle-printing-preview-pane:hover .waffle-printing-zoom-out-button .jfk-button,.waffle-printing-zoom-out-button .jfk-button-focused{right:0;transition-delay:.1s}.waffle-printing-zoom-force-visible.jfk-button{right:0;transition:none}.waffle-printing-zoom-in-button .jfk-button.jfk-button-hover,.waffle-printing-zoom-in-button .jfk-button.jfk-button-focused,.waffle-printing-zoom-out-button .jfk-button.jfk-button-hover,.waffle-printing-zoom-out-button .jfk-button.jfk-button-focused{box-shadow:0 4px 5px 0 rgba(0,0,0,0.14),0 1px 10px 0 rgba(0,0,0,0.12),0 2px 4px -1px rgba(0,0,0,0.4)}.waffle-printing-zoom-in-button .jfk-button.jfk-button-hover .waffle-printing-zoom-icon-wrapper,.waffle-printing-zoom-in-button .jfk-button.jfk-button-focused .waffle-printing-zoom-icon-wrapper,.waffle-printing-zoom-out-button .jfk-button.jfk-button-hover .waffle-printing-zoom-icon-wrapper,.waffle-printing-zoom-out-button .jfk-button.jfk-button-focused .waffle-printing-zoom-icon-wrapper{opacity:.87}.waffle-printing-zoom-in-button .jfk-button.jfk-button-active,.waffle-printing-zoom-in-button .jfk-button:active,.waffle-printing-zoom-out-button .jfk-button.jfk-button-active,.waffle-printing-zoom-out-button .jfk-button:active{background:#aaa;border-color:#aaa}.waffle-printing-margins-control{outline:none;position:absolute;top:0;left:0}.waffle-printing-margins-control-top,.waffle-printing-margins-control-bottom{cursor:ns-resize;height:5px;left:0;position:absolute;right:0}.waffle-printing-margins-control-right,.waffle-printing-margins-control-left{bottom:0;cursor:ew-resize;position:absolute;top:0;width:5px}.waffle-printing-margins-control-top{border-bottom:2px dashed #4285f4;margin-top:-7px}.waffle-printing-margins-control-top:hover,.waffle-printing-margins-control-top.waffle-printing-margins-control-active{border-bottom:2px solid #4285f4}.waffle-printing-margins-control-bottom{border-top:2px dashed #4285f4;margin-bottom:-7px}.waffle-printing-margins-control-bottom:hover,.waffle-printing-margins-control-bottom.waffle-printing-margins-control-active{border-top:2px solid #4285f4}.waffle-printing-margins-control-right{border-left:2px dashed #4285f4;margin-right:-7px}.waffle-printing-margins-control-right:hover,.waffle-printing-margins-control-right.waffle-printing-margins-control-active{border-left:2px solid #4285f4}.waffle-printing-margins-control-left{border-right:2px dashed #4285f4;margin-left:-7px}.waffle-printing-margins-control-left:hover,.waffle-printing-margins-control-left.waffle-printing-margins-control-active{border-right:2px solid #4285f4}.waffle-printing-margins-control-top-wrapper,.waffle-printing-margins-control-bottom-wrapper,.waffle-printing-margins-control-right-wrapper,.waffle-printing-margins-control-left-wrapper{background:#fff;border:2px dashed #4285f4;height:34px;padding:16px;width:60px}.waffle-printing-margins-control-top:hover .waffle-printing-margins-control-top-wrapper,.waffle-printing-margins-control-active .waffle-printing-margins-control-top-wrapper,.waffle-printing-margins-control-bottom:hover .waffle-printing-margins-control-bottom-wrapper,.waffle-printing-margins-control-active .waffle-printing-margins-control-bottom-wrapper,.waffle-printing-margins-control-right:hover .waffle-printing-margins-control-right-wrapper,.waffle-printing-margins-control-active .waffle-printing-margins-control-right-wrapper,.waffle-printing-margins-control-left:hover .waffle-printing-margins-control-left-wrapper,.waffle-printing-margins-control-active .waffle-printing-margins-control-left-wrapper{border:2px solid #4285f4}.waffle-printing-margins-control-top-title,.waffle-printing-margins-control-bottom-title,.waffle-printing-margins-control-right-title,.waffle-printing-margins-control-left-title{font:11px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;color:rgba(0,0,0,.54);margin-left:-1px}.waffle-printing-margins-control-top-wrapper,.waffle-printing-margins-control-top:hover .waffle-printing-margins-control-top-wrapper,.waffle-printing-margins-control-active .waffle-printing-margins-control-top-wrapper{border-radius:0 0 2px 2px;border-top:none;box-shadow:0 4px 4px 0 rgba(0,0,0,0.25);left:50%;position:absolute;top:5px;transform:translateX(-50%)}.waffle-printing-margins-control-bottom-wrapper,.waffle-printing-margins-control-bottom:hover .waffle-printing-margins-control-bottom-wrapper,.waffle-printing-margins-control-active .waffle-printing-margins-control-bottom-wrapper{border-bottom:none;border-radius:2px 2px 0 0;box-shadow:0 -4px 4px 0 rgba(0,0,0,0.25);bottom:5px;left:50%;position:absolute;transform:translateX(-50%)}.waffle-printing-margins-control-right-wrapper,.waffle-printing-margins-control-right:hover .waffle-printing-margins-control-right-wrapper,.waffle-printing-margins-control-active .waffle-printing-margins-control-right-wrapper{border-radius:2px 0 0 2px;border-right:none;box-shadow:-4px 0 4px 0 rgba(0,0,0,0.25);position:absolute;right:5px;top:50%;transform:translateY(-50%)}.waffle-printing-margins-control-left-wrapper,.waffle-printing-margins-control-left:hover .waffle-printing-margins-control-left-wrapper,.waffle-printing-margins-control-active .waffle-printing-margins-control-left-wrapper{border-left:none;border-radius:0 2px 2px 0;box-shadow:4px 0 4px 0 rgba(0,0,0,0.25);left:5px;position:absolute;top:50%;transform:translateY(-50%)}.waffle-printing-radio-button-wrapper{float:left;margin-top:6px;width:50%}.waffle-printing-radio-button-wrapper .jfk-radiobutton-label{color:rgba(0,0,0,.87);font:13px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;line-height:18px;margin-left:23px}.waffle-printing-radio-button-wrapper .jfk-radiobutton-label label{margin-left:0}.waffle-printing-radio-button-wrapper .jfk-radiobutton-radio,.waffle-printing-radio-button-wrapper .jfk-radiobutton-hover .jfk-radiobutton-radio{border:2px solid #bebebe;height:16px;left:2px;width:16px}.waffle-printing-radio-button-wrapper .jfk-radiobutton-radio::after{background:#4285f4;border:none;height:8px;left:2px;top:2px;width:8px}.waffle-printing-custom-headers-footers-entry-button,.waffle-printing-page-breaks-entry-button{margin-top:8px;margin-left:-8px}.waffle-printing-custom-headers-footers-cancel,.waffle-printing-custom-page-breaks-cancel{float:left}.waffle-printing-custom-headers-footers-body,.waffle-printing-custom-page-breaks-body{background-color:#d1d1d1;bottom:0;left:0;position:absolute;overflow:hidden;right:0;top:60px}.waffle-printing-custom-headers-footers-overlay{background-color:rgba(255,255,255,0.54);outline:none;position:absolute;top:0;left:0}.waffle-printing-custom-headers-footers-content-area{color:rgba(0,0,0,0.24);font:36px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;text-align:center;overflow:hidden;width:100%}.waffle-printing-custom-headers-footers-overlay-group{border-spacing:12px 0;direction:ltr;position:absolute;table-layout:fixed}.waffle-printing-custom-headers-footers-section-wrapper{width:33.3333%}.waffle-printing-custom-headers-footers-section{background-color:white;height:100%;overflow:hidden;padding:0 8px;transition:border-color 0.2s ease;-webkit-user-select:auto;-moz-user-select:auto;-ms-user-select:auto;white-space:nowrap}.waffle-printing-custom-headers-footers-section-inactive{border:1px dotted #bdbdbd}.waffle-printing-custom-headers-footers-section-inactive:hover{border-color:transparent;border-bottom:1px solid rgba(0,0,0,.87);cursor:pointer}.waffle-printing-custom-headers-footers-section-active{border-bottom:2px solid #4285f4}.waffle-printing-custom-headers-footers-section-content{box-sizing:border-box;color:rgba(0,0,0,.87);height:100%;overflow:hidden}.waffle-printing-custom-headers-footers-section-placeholder{color:rgba(0,0,0,.54)}.waffle-printing-custom-header-footer-section-header-left,.waffle-printing-custom-header-footer-section-footer-left{text-align:left}.waffle-printing-custom-header-footer-section-header-right,.waffle-printing-custom-header-footer-section-footer-right{text-align:right}.waffle-printing-custom-header-footer-section-header-middle,.waffle-printing-custom-header-footer-section-footer-middle{text-align:center}.waffle-printing-custom-headers-footers-section:focus,.waffle-printing-custom-headers-footers-section-content:focus{outline:none}.waffle-printing-custom-headers-footers-pill{-webkit-user-select:all;-moz-user-select:all;-ms-user-select:all}.waffle-printing-custom-headers-footers-pill-select{background-color:#fafafa;border-radius:2px;box-shadow:0 2px 2px 0 rgba(0,0,0,0.14),0 1px 5px 0 rgba(0,0,0,0.12),0 3px 1px -2px rgba(0,0,0,0.2);height:34px;min-width:195px;position:absolute;z-index:1003}.waffle-printing-custom-headers-footers-pill-select:focus{outline:none}.waffle-printing-custom-headers-footers-pill-select .goog-toolbar-separator{height:34px;margin:0}.waffle-printing-custom-page-breaks-header-middle{color:white;font:13px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;margin:14px 0}.waffle-printing-custom-page-breaks-scale{display:inline-block;margin-right:8px;position:relative;top:1px}.waffle-printing-custom-page-breaks-scale .waffle-ellipses{padding-left:4px;top:2px}.waffle-printing-custom-page-breaks-scale-label{font-weight:500}.waffle-printing-custom-page-breaks-reset{margin-left:8px}.waffle-printing-custom-page-breaks-waffle{bottom:0;left:0;position:absolute;right:0;top:0}.waffle-printing-custom-page-breaks-canvas-wrapper{left:0;overflow:hidden;position:absolute;top:0;z-index:1}.waffle-printing-custom-page-breaks-dragger-container{position:absolute}.waffle-printing-custom-page-breaks-overlay{border:2px solid #4285f4;box-shadow:0 8px 10px 1px rgba(0,0,0,0.14),0 3px 14px 3px rgba(0,0,0,0.12),0 4px 5px 0 rgba(0,0,0,0.20);position:absolute}.waffle-printing-snapping-dragger,.waffle-printing-snapping-dragger-handle,.waffle-printing-snapping-dragger-handle-bar{border-width:0;box-sizing:border-box;position:absolute}.waffle-printing-snapping-dragger-handle-horizontal .waffle-printing-page-breaks-rounded-corner{left:-24px;top:-11px;transform:rotate(-90deg)}.waffle-printing-snapping-dragger-rtl .waffle-printing-snapping-dragger-handle-horizontal .waffle-printing-page-breaks-rounded-corner{transform:rotate(90deg)}.waffle-printing-snapping-dragger-rtl .waffle-printing-snapping-dragger-handle-horizontal .waffle-printing-page-breaks-rounded-corner-ie{transform:rotate(-90deg)}.waffle-printing-snapping-dragger-handle-vertical .waffle-printing-page-breaks-rounded-corner{left:-11px;top:-24px}.waffle-printing-snapping-dragger-handle-horizontal,.waffle-printing-snapping-dragger-handle-bar-horizontal{height:5px;transform:translateY(-1px)}.waffle-printing-snapping-dragger-handle-bar-horizontal{border-top:2px dashed #4285f4;cursor:row-resize}.waffle-printing-snapping-dragger-handle-vertical,.waffle-printing-snapping-dragger-handle-bar-vertical{transform:translateX(-1px);width:5px}.waffle-printing-snapping-dragger-handle-bar-vertical{border-left:2px dashed #4285f4;cursor:col-resize}.waffle-printing-snapping-dragger-rtl .waffle-printing-snapping-dragger-handle-vertical,.waffle-printing-snapping-dragger-rtl .waffle-printing-snapping-dragger-handle-bar-vertical{transform:translateX(1px)}.waffle-printing-hard-break .waffle-printing-snapping-dragger-handle-bar{border-style:solid}.waffle-printing-snapping-dragger-active .waffle-printing-snapping-dragger-handle-bar,.waffle-printing-snapping-dragger-highlight .waffle-printing-snapping-dragger-handle-bar{border-color:transparent}.waffle-printing-page-breaks-rounded-corner,.waffle-printing-custom-page-breaks-delete{display:block;position:absolute;z-index:1}.waffle-printing-snapping-dragger-hover-bar{background:#4285f4;border:1px solid white;box-shadow:0 8px 10px 1px rgba(0,0,0,0.14),0 3px 14px 3px rgba(0,0,0,0.12),0 4px 5px 0 rgba(0,0,0,0.20);position:absolute;display:none}.waffle-printing-snapping-dragger-hover .waffle-printing-snapping-dragger-hover-bar,.waffle-printing-snapping-dragger-active .waffle-printing-snapping-dragger-hover-bar{display:block}.waffle-printing-snapping-dragger-hover-bar-horizontal{border-left:none;border-right:none;height:2px;left:0;top:-2px;width:100%}.waffle-printing-snapping-dragger-hover-bar-vertical{border-bottom:none;border-top:none;height:100%;left:-2px;top:0;width:2px}.waffle-printing-custom-page-breaks-delete{background-color:transparent;border:none;box-shadow:none;cursor:pointer;fill:#4285f4;height:24px;margin:0;min-width:0;padding:0;transform:scale(0.4);transition:200ms;width:24px}.waffle-printing-custom-page-breaks-delete-horizontal{left:-16px;top:-13px}.waffle-printing-custom-page-breaks-delete-vertical{left:-12px;top:-17px}.waffle-printing-custom-page-breaks-delete .waffle-printing-custom-page-breaks-delete-background{fill:#4285f4;transition:200ms}.waffle-printing-snapping-dragger-hover .waffle-printing-custom-page-breaks-delete,.waffle-printing-snapping-dragger-active .waffle-printing-custom-page-breaks-delete{fill:#000;transform:scale(1.0)}.waffle-printing-snapping-dragger-hover .waffle-printing-custom-page-breaks-delete-horizontal,.waffle-printing-snapping-dragger-active .waffle-printing-custom-page-breaks-delete-horizontal{left:-24px;top:-12px}.waffle-printing-snapping-dragger-hover .waffle-printing-custom-page-breaks-delete-vertical,.waffle-printing-snapping-dragger-active .waffle-printing-custom-page-breaks-delete-vertical{left:-11px;top:-24px}.waffle-printing-snapping-dragger-hover .waffle-printing-custom-page-breaks-delete-background,.waffle-printing-snapping-dragger-active .waffle-printing-custom-page-breaks-delete-background{opacity:0.0}.waffle-printing-custom-page-breaks-delete-icon{background-color:transparent;opacity:0.54;transition:0s}.waffle-printing-custom-page-breaks-delete.jfk-button-hover .waffle-printing-custom-page-breaks-delete-icon,.waffle-printing-custom-page-breaks-delete.jfk-button-focused .waffle-printing-custom-page-breaks-delete-icon{opacity:0.87}.waffle-printing-custom-page-breaks-delete.jfk-button-active,.waffle-printing-custom-page-breaks-delete:active,.waffle-printing-custom-page-breaks-delete.jfk-button-focused,.waffle-printing-custom-page-breaks-delete:focus{border:none;box-shadow:none;outline:none}.waffle-printing-pane .docs-charts-editor-material-menu-button-caption{color:rgba(0,0,0,.87);font-size:13px}.waffle-printing-pane .docs-charts-editor-collapsible-header{color:rgba(0,0,0,.87);font-size:13px;font-weight:normal}.waffle-printing-pane .waffle-printing-headers-and-footers-section h2{color:rgba(0,0,0,.87);font-size:13px;font-weight:normal;margin-top:16px}.waffle-printing-pane .waffle-printing-headers-and-footers-section h3{font-weight:normal;margin-bottom:11px;margin-top:9px}.waffle-printing-pane-base .docs-material-button-content{display:inline-block;min-width:54px}.apps-promo{z-index:21}.apps-promo-popup{width:300px}.apps-promo-buttons{display:none}#waffle-promo-button .goog-custom-button-inner-box{font-weight:500}.waffle-promo{background:#188038!important;border-radius:8px!important;box-shadow:0px 2px 6px rgba(60,64,67,0.15),0px 1px 2px rgba(0,64,67,0.3)!important;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif!important;width:300px!important}.waffle-promo .docs-promo-container{padding:24px!important}.waffle-promo .docs-promo-text-container{width:252px!important}.waffle-promo .docs-promo-header{color:#fff!important;font-weight:700}.waffle-promo .docs-promo-body{color:#fff!important;padding-top:8px}.waffle-promo .docs-promo-action-row{padding-top:16px;padding-right:0;padding-bottom:0}.waffle-promo .docs-promo-action-container{color:#fff!important;font-weight:500;text-transform:lowercase;display:inline-block}.waffle-promo .docs-promo-action-container::first-letter{text-transform:uppercase}.waffle-promo .jfk-bubble-arrowdown .jfk-bubble-arrowimplbefore,.waffle-promo .jfk-bubble-arrowdown .jfk-bubble-arrowimplafter,.waffle-promo .jfk-bubble-arrowup .jfk-bubble-arrowimplbefore,.waffle-promo .jfk-bubble-arrowup .jfk-bubble-arrowimplafter{border-color:#188038 transparent!important}.waffle-promo .jfk-bubble-arrowleft .jfk-bubble-arrowimplbefore,.waffle-promo .jfk-bubble-arrowleft .jfk-bubble-arrowimplafter,.waffle-promo .jfk-bubble-arrowright .jfk-bubble-arrowimplbefore,.waffle-promo .jfk-bubble-arrowright .jfk-bubble-arrowimplafter{border-color:transparent #188038!important}.waffle-shortcut-override-inside-promo{border:240px solid #0f9d58;border-radius:100%;bottom:-260px;height:95px;position:absolute;right:60px;width:95px;background-color:#fff;z-index:500}.waffle-legacy-shortcut-override-inside-promo{border-radius:100%;bottom:-20px;box-shadow:175px 0 0 190px #0f9d58;height:90px;position:absolute;right:435px;width:80px;z-index:500}[dir="rtl"] .waffle-legacy-shortcut-override-inside-promo{box-shadow:-175px 0 0 190px #0f9d58;left:220px}.waffle-shortcut-override-inside-promo-content,.waffle-legacy-shortcut-override-inside-promo-content{color:white;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;left:-100px;line-height:22px;position:absolute;text-align:left;top:-125px;width:275px}.waffle-legacy-shortcut-override-inside-promo-content{left:100px}.waffle-legacy-shortcut-override-dismiss-button{cursor:pointer;color:white;font:500 15px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;margin:25px 0 0 0;min-width:0;outline:none;padding:0;right:5px;text-transform:uppercase;width:0}.waffle-shortcut-override-inside-promo-header{font:500 21px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;line-height:27px;margin-bottom:16px}.waffle-shortcut-override-inside-promo-description{font-size:15px;opacity:0.87}.apps-ui-material-slide-toggle-container{z-index:1000}.waffle-shortcut-override-outside-promo{background-color:#fafafa;bottom:80px;box-shadow:rgba(255,255,255,.9) 0 1px 0 inset,rgba(0,0,0,.03) 0 -1px 0 inset,rgba(0,0,0,.15) 0 15px 10px,rgba(0,0,0,.3) 0 8px 36px;position:absolute;right:40px;width:380px;z-index:1000}.waffle-shortcut-override-outside-promo-header{font-size:16px;font-weight:500;opacity:0.87;padding:22px 25px 0 25px}.waffle-shortcut-override-outside-promo-description{color:#666;line-height:20px;padding:15px 25px}.waffle-shortcut-override-outside-promo-button-container{padding:0 24px 16px;text-align:right}.waffle-shortcut-override-outside-promo-continue-button,.waffle-shortcut-override-outside-promo-dismiss-button{align-items:center;cursor:pointer;display:inline-flex;font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;justify-content:center;text-transform:uppercase}.waffle-shortcut-override-outside-promo-continue-button{background-color:#4285f4;color:white;padding:6px 15px}.waffle-shortcut-override-outside-promo-dismiss-button{color:#4285f4;margin-right:16px}.waffle-sidebar-container{overflow:hidden;box-shadow:-3px 0px 6px -3px rgba(60,64,67,.15),3px 0px 6px -3px rgba(60,64,67,.15);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;border-left:0;outline:none;position:absolute;right:0;top:0;width:300px}.waffle-sidebar-content{background-color:#fff;font-size:100%;overflow-x:hidden;overflow-y:auto;position:relative}.waffle-sidebar-footer-container{bottom:0;position:absolute;width:100%}.waffle-sidebar-header-container{width:100%}.waffle-sidebar-spinner-container{background-color:#fff;height:100%;position:absolute;width:100%}.waffle-sidebar-spinner-container>.waffle-spinner{left:50%;margin-left:-14px;margin-top:-14px;position:absolute;top:50%}.waffle-sidebar-title{display:flex;align-items:center;color:#202124;background-color:#fff;height:56px;padding:0 16px;border-bottom:1px solid #dadce0;border-top:1px solid #dadce0;font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:16px;z-index:1}.waffle-sidebar-title-text{font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:16px;font-weight:500;line-height:24px;position:relative;left:auto}.waffle-sidebar-title-close.docs-sidebar-close-button{cursor:pointer;position:absolute;right:5px;top:7px}.waffle-sidebar-container .jfk-textinput{border:1px solid #dadce0;border-radius:4px;box-sizing:border-box;color:#3c4043;padding:1px 8px;font-size:14px;height:36px;margin:8px 0}.waffle-sidebar-container .jfk-textinput:focus{border:2px solid #1a73e8;box-shadow:none;padding:0px 7px}.waffle-sidebar-container .jfk-select .goog-flat-menu-button-dropdown{margin-top:0px}.waffle-sidebar-container .goog-flat-menu-button.jfk-select{padding-left:8px!important}.waffle-range-selection-holder .docs-icon-grid,.waffle-range-selection-holder .docs-icon-grid:before,.waffle-sidebar-title .docs-gm-sidebar-icon .docs-icon-sheets-table-24,.waffle-sidebar-title .docs-gm-sidebar-icon .docs-icon-sheets-table-24:before,.waffle-sidebar-title .docs-gm-sidebar-icon .docs-icon-filter-control,.waffle-sidebar-title .docs-gm-sidebar-icon .docs-icon-filter-control:before,.waffle-sidebar-title .docs-gm-sidebar-icon .docs-icon-database,.waffle-sidebar-title .docs-gm-sidebar-icon .docs-icon-database:before{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_green.svg)}.waffle-sidebar-container .goog-flat-menu-button{border:1px solid #dadce0;border-radius:4px;box-sizing:border-box;cursor:pointer;padding:8px 6px 8px 8px;width:100%;align-items:center;background:none;box-sizing:border-box;color:#3c4043;display:inline-flex;justify-content:space-between;outline:none;position:relative;width:auto;width:unset}.waffle-sidebar-container .goog-flat-menu-button-disabled{color:#5f6368;opacity:.38;cursor:default}.waffle-sidebar-container .goog-flat-menu-button:active{background-color:#fff;border:1px solid transparent;box-shadow:0 2px 6px 2px rgba(60,64,67,.15)}.waffle-sidebar-container .goog-flat-menu-button-hover{background-color:rgba(60,64,67,0.04);border:1px solid #dadce0;box-shadow:none}.waffle-sidebar-container .goog-flat-menu-button-focused{background-color:rgba(60,64,67,0.06);border:1px solid #dadce0}.waffle-sidebar-container .goog-flat-menu-button-open{background-color:rgba(60,64,67,0.04);border:1px solid transparent}.waffle-sidebar-container .goog-flat-menu-button-hover.goog-flat-menu-button-open{background-color:rgba(60,64,67,0.06)}.waffle-sidebar-container .goog-flat-menu-button-focused.goog-flat-menu-button-open{background-color:rgba(60,64,67,0.08)}.waffle-sidebar-container .goog-flat-menu-button-disabled{border:1px solid #dadce0;box-shadow:none;cursor:default}.waffle-sidebar-container .goog-flat-menu-button-caption{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;color:#202124;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;height:20px;line-height:20px;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.waffle-sidebar-container .goog-flat-menu-button-dropdown{background:no-repeat url(//ssl.gstatic.com/docs/common/material_common_sprite222_grey_medium.svg) -40px -732px;height:18px;width:18px;border:none;margin-top:0;position:relative;right:0;top:0}.waffle-sidebar-container .goog-flat-menu-button-open .goog-flat-menu-button-dropdown{-moz-transform:rotate(180deg);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.waffle-sidebar-container .docs-flatcolormenubutton .goog-flat-menu-button-caption{height:22px;width:22px;border-radius:50%;border:1px solid #dadce0;margin:0;outline:none}.waffle-sidebar-container .docs-flatcolormenubutton.goog-flat-menu-button{padding:6px 0 6px 6px}.waffle-sidebar-container .jfk-button-action{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff}.waffle-sidebar-container .jfk-button-action.jfk-button-hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#2a8947;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15)}.waffle-sidebar-container .jfk-button-action.jfk-button-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#4f9e67;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15)}.waffle-sidebar-container .jfk-button-action.jfk-button-hover.jfk-button-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#62a877;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15)}.waffle-sidebar-container .jfk-button-action.jfk-button-active,.waffle-sidebar-container .jfk-button-action.jfk-button-focus.jfk-button-active{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#62a877;box-shadow:0 2px 6px 2px rgba(52,168,83,0.15)}.waffle-sidebar-container .jfk-button-action.jfk-button-disabled{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#f1f3f4;color:#3c4043;opacity:0.38}.waffle-sidebar-container .jfk-button-standard{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:white;border:1px solid #dadce0!important;color:#188038}.waffle-sidebar-container .jfk-button-standard.jfk-button-hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#f8fcf9;border:1px solid #c8e7d1!important}.waffle-sidebar-container .jfk-button-standard.jfk-button-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#e7f5eb;border:1px solid #bbe2c6!important}.waffle-sidebar-container .jfk-button-standard.jfk-button-hover.jfk-button-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#dff2e4;border:1px solid #b5e0c1!important}.waffle-sidebar-container .jfk-button-standard.jfk-button-active,.waffle-sidebar-container .jfk-button-standard.jfk-button-focus.jfk-button-active{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#dff2e4;border:1px solid transparent!important;box-shadow:0 2px 6px 2px rgba(60,64,67,.15)}.waffle-sidebar-container .jfk-button-standard.jfk-button-disabled{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:white;border:1px solid #f1f3f4!important;color:#3c4043;opacity:0.38}.waffle-sidebar-container .jfk-button-standard.waffle-range-selection-button,.waffle-sidebar-container .jfk-button-standard.jfk-button-hover.waffle-range-selection-button,.waffle-sidebar-container .jfk-button-standard.jfk-button-focused.waffle-range-selection-button,.waffle-sidebar-container .jfk-button-standard.jfk-button-hover.jfk-button-focused.waffle-range-selection-button{border:none!important;padding:8px 0px 0px!important}.docs-sidebar-toggle-tabs{background-color:white;border-bottom:0;height:40px;margin-top:0;width:100%}.docs-sidebar-toggle-tabs .jfk-button.docs-sidebar-toggle-tab>div{display:inline-block;position:relative}.docs-sidebar-toggle-tabs .jfk-button.docs-sidebar-toggle-tab-active{color:#188038;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;text-transform:none;border-bottom:none;line-height:calc(40px - 8px);height:calc(40px - 8px);margin-top:8px}.docs-sidebar-toggle-tabs .jfk-button.docs-sidebar-toggle-tab-inactive{color:#5f6368;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;text-transform:none;border-bottom:none;line-height:calc(40px - 8px);height:calc(40px - 8px);margin-top:8px}.docs-sidebar-toggle-tabs .jfk-button.docs-sidebar-toggle-tab-inactive:hover{color:#202124;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;text-transform:none;border-bottom:none;line-height:calc(40px - 8px);height:calc(40px - 8px);margin-top:8px}.docs-sidebar-toggle-tabs .jfk-button.docs-sidebar-toggle-tab-active>div:after{border-bottom:3px solid #188038;border-radius:3px 3px 0 0;bottom:0;content:'';display:block;height:0;left:-4px;position:absolute;width:calc(100% + 8px)}.docs-sidebar-toggle-tabs .jfk-button-focused.docs-sidebar-toggle-tab-inactive>div:after{border-bottom:3px dotted #188038;border-radius:3px 3px 0 0;bottom:0;content:'';display:block;height:0;left:-4px;position:absolute;width:calc(100% + 8px)}.docs-sidebar-toggle-tabs .jfk-button-active.jfk-button-focused.docs-sidebar-toggle-tab-inactive>div:after{border-top:none}.waffle-slicer-overlay,.waffle-embedded-object-container,.waffle-slicer-container{border-radius:20px}.waffle-slicer-container{-webkit-align-items:center;align-items:center;display:flex;direction:ltr;height:inherit;min-height:100%;min-width:100%}.waffle-slicer-filter-box-container .goog-menu-filter{display:flex;-webkit-align-items:center;align-items:center;position:relative}.waffle-slicer-filter-box-container .waffle-filterbox-input{-ms-flex:1;-webkit-flex:1;flex:1;margin-right:0!important;width:100%}.waffle-slicer-filter-box-container .waffle-filterbox-input-icon{height:18px;position:absolute;right:8px;top:5px;width:18px}.waffle-slicer-filter-box-container .waffle-filterbox-label-icon-jfk{display:none}.waffle-slicer-filter-box-container .waffle-filterbox-content{height:auto!important;margin:3px 0;max-height:320px}.waffle-slicer-filter-box-container .goog-menuitem .goog-menuitem-content{margin:0 6px}.waffle-slicer-filter-container{box-shadow:0px 1px 1px 0px rgba(0,0,0,0.14),0px 2px 1px -1px rgba(0,0,0,0.12),0px 1px 3px 0px rgba(0,0,0,0.2);background:white;direction:ltr;margin-top:4px;overflow-y:auto;padding-top:8px;position:absolute;right:0;left:0;z-index:1000}.waffle-slicer-filter-container .waffle-filterbox-button-container{display:flex;justify-content:flex-end;min-width:200px}.waffle-slicer-filter-container{border-radius:8px}.waffle-slicer-icon-container{height:24px;padding:5px}.waffle-slicer-icon-filtered{border-radius:50%}.waffle-slicer-row{-webkit-align-items:center;align-items:center;display:flex;-ms-flex:1;-webkit-flex:1;flex:1;margin:0 30px 0 5px;overflow:hidden}.waffle-slicer-row-enabled{cursor:pointer}.waffle-slicer-header{display:flex;-ms-flex:1;-webkit-flex:1;flex:1;max-height:100%;overflow:hidden}.waffle-slicer-title-container{-ms-flex:1;-webkit-flex:1;flex:1;margin:0 10px;overflow:hidden;padding:2px 0;text-overflow:ellipsis;white-space:nowrap}.waffle-slicer-status-container{display:flex;-webkit-flex-shrink:1;-ms-flex-negative:1;flex-shrink:1;border-radius:10%;max-width:100px;overflow:hidden;padding:2px 5px 2px 10px;text-overflow:ellipsis;white-space:nowrap}.waffle-slicer-status-icon-container{-webkit-align-items:center;align-items:center;display:flex;-ms-flex:1;-webkit-flex:1;flex:1}.waffle-slicer-icon-container:hover{border-radius:50%}.waffle-slicer-filter-box-container .waffle-conditionalformat-condition-type-select .goog-flat-menu-button,.waffle-slicer-filter-box-container .waffle-conditionalformat-condition-date-select .goog-flat-menu-button,.waffle-slicer-filter-box-container .waffle-conditionalformat-range-args-holder{width:100%}.waffle-slicer-filter-box-container .waffle-conditionalformat-range-args-holder .waffle-conditionalformat-arg1{margin-right:0;padding:10px;width:100%}.waffle-slicer-filter-box-container .waffle-conditionalformat-arg-separator{margin:0 5px}.waffle-slicer-filter-box-container .waffle-conditionalformat-range-args-holder .waffle-conditionalformat-arg2{padding:10px}.waffle-slicer-help-icon-container{margin:0 3px 0 3px;padding:5px;background-color:transparent}.waffle-spinner{display:inline-block;position:relative;width:28px;height:28px}.waffle-spinner-message-container{position:absolute;width:0;height:0;overflow:hidden}.waffle-spinner-container{width:100%;height:100%}.waffle-spinner.waffle-spinner-active .waffle-spinner-container{-webkit-animation:waffle-spinner-container-rotate 1568ms linear infinite;animation:waffle-spinner-container-rotate 1568ms linear infinite}.waffle-spinner-layer{position:absolute;width:100%;height:100%;opacity:0}.waffle-spinner-color-one{border-color:#4285f4}.waffle-spinner-color-two{border-color:#db4437}.waffle-spinner-color-three{border-color:#f4b400}.waffle-spinner-color-four{border-color:#0f9d58}.waffle-spinner.waffle-spinner-active .waffle-spinner-layer.waffle-spinner-color-one{-webkit-animation:waffle-spinner-fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,waffle-spinner-blue-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both;animation:waffle-spinner-fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,waffle-spinner-blue-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both}.waffle-spinner.waffle-spinner-active .waffle-spinner-layer.waffle-spinner-color-two{-webkit-animation:waffle-spinner-fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,waffle-spinner-red-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both;animation:waffle-spinner-fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,waffle-spinner-red-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both}.waffle-spinner.waffle-spinner-active .waffle-spinner-layer.waffle-spinner-color-three{-webkit-animation:waffle-spinner-fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,waffle-spinner-yellow-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both;animation:waffle-spinner-fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,waffle-spinner-yellow-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both}.waffle-spinner.waffle-spinner-active .waffle-spinner-layer.waffle-spinner-color-four{-webkit-animation:waffle-spinner-fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,waffle-spinner-green-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both;animation:waffle-spinner-fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,waffle-spinner-green-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both}.waffle-spinner-gap-patch{position:absolute;box-sizing:border-box;top:0;left:45%;width:10%;height:100%;overflow:hidden;border-color:inherit}.waffle-spinner-gap-patch .waffle-spinner-circle{width:1000%;left:-450%}.waffle-spinner-circle-clipper{display:inline-block;position:relative;width:50%;height:100%;overflow:hidden;border-color:inherit}.waffle-spinner-circle-clipper .waffle-spinner-circle{width:200%}.waffle-spinner-circle{position:absolute;top:0;right:0;bottom:0;left:0;box-sizing:border-box;height:100%;border-width:3px;border-style:solid;border-color:inherit;border-bottom-color:transparent;border-radius:50%;-webkit-animation:none;animation:none}.waffle-spinner-circle-clipper.waffle-spinner-left .waffle-spinner-circle{border-right-color:transparent;-webkit-transform:rotate(129deg);transform:rotate(129deg)}.waffle-spinner-circle-clipper.waffle-spinner-right .waffle-spinner-circle{left:-100%;border-left-color:transparent;-webkit-transform:rotate(-129deg);transform:rotate(-129deg)}.waffle-spinner.waffle-spinner-active .waffle-spinner-circle-clipper.waffle-spinner-left .waffle-spinner-circle{-webkit-animation:waffle-spinner-left-spin 1333ms cubic-bezier(0.4,0.0,0.2,1) infinite both;animation:waffle-spinner-left-spin 1333ms cubic-bezier(0.4,0.0,0.2,1) infinite both}.waffle-spinner.waffle-spinner-active .waffle-spinner-circle-clipper.waffle-spinner-right .waffle-spinner-circle{-webkit-animation:waffle-spinner-right-spin 1333ms cubic-bezier(0.4,0.0,0.2,1) infinite both;animation:waffle-spinner-right-spin 1333ms cubic-bezier(0.4,0.0,0.2,1) infinite both}.waffle-spinner.waffle-spinner-isWarmdown .waffle-spinner-container{-webkit-animation:waffle-spinner-container-rotate 1568ms linear infinite,waffle-spinner-fade-out 400ms cubic-bezier(0.4,0.0,0.2,1);animation:waffle-spinner-container-rotate 1568ms linear infinite,waffle-spinner-fade-out 400ms cubic-bezier(0.4,0.0,0.2,1)}@keyframes waffle-spinner-container-rotate{to{transform:rotate(360deg)}}@keyframes waffle-spinner-fill-unfill-rotate{12.5%{transform:rotate(135deg)}25%{transform:rotate(270deg)}37.5%{transform:rotate(405deg)}50%{transform:rotate(540deg)}62.5%{transform:rotate(675deg)}75%{transform:rotate(810deg)}87.5%{transform:rotate(945deg)}to{transform:rotate(1080deg)}}@keyframes waffle-spinner-blue-fade-in-out{from{opacity:0.99}25%{opacity:0.99}26%{opacity:0}89%{opacity:0}90%{opacity:0.99}100%{opacity:0.99}}@keyframes waffle-spinner-red-fade-in-out{from{opacity:0}15%{opacity:0}25%{opacity:0.99}50%{opacity:0.99}51%{opacity:0}}@keyframes waffle-spinner-yellow-fade-in-out{from{opacity:0}40%{opacity:0}50%{opacity:0.99}75%{opacity:0.99}76%{opacity:0}}@keyframes waffle-spinner-green-fade-in-out{from{opacity:0}65%{opacity:0}75%{opacity:0.99}90%{opacity:0.99}100%{opacity:0}}@keyframes waffle-spinner-left-spin{from{transform:rotate(130deg)}50%{transform:rotate(-5deg)}to{transform:rotate(130deg)}}@keyframes waffle-spinner-right-spin{from{transform:rotate(-130deg)}50%{transform:rotate(5deg)}to{transform:rotate(-130deg)}}@keyframes waffle-spinner-fade-out{from{opacity:0.99}to{opacity:0}}.row-header-wrapper{overflow:hidden;border-width:0;margin:0;padding:0}.column-headers-background,.row-headers-background{z-index:1}.selected-row-headers-background{position:absolute;background-color:#c8c8c8;width:45px;z-index:2}.selected-column-headers-background{position:absolute;background-color:#c8c8c8;height:23px;z-index:2}.waffle td,.grid-fixed-table td{overflow:hidden;border:1px #e5e5e5 solid;border-color:rgba(0,0,0,0.15);border-width:0 1px 1px 0;vertical-align:bottom;line-height:inherit;background-color:#fff;padding:0 3px}.waffle .softmerge{overflow:visible}.softmerge-inner{white-space:nowrap;overflow:hidden;text-overflow:hidden;position:relative}.waffle-ltr td,.grid-fixed-table-ltr td{border-width:0 1px 1px 0}.waffle-rtl td,.grid-fixed-table-rtl td{border-width:0 0 1px 1px}.waffle th,.grid-fixed-table th{font-weight:normal;background:transparent;text-align:center;vertical-align:middle;font-size:8pt;color:#222;height:23px;border:solid 1px #ccc;border-width:0 1px 1px 0;overflow:hidden;padding:0}.waffle-ltr th,.grid-fixed-table-ltr th{border-width:0 1px 1px 0}.waffle-rtl th,.grid-fixed-table-rtl th{border-width:0 0 1px 1px}.no-grid td{border:solid 1px rgb(255,255,255);border:solid 1px rgba(204,204,204,0);border-width:0 1px 1px 0}td.empty{font-size:0!important}th.row-header{background-color:#eee;width:45px;text-align:center;vertical-align:middle;font-size:8pt;color:#333;line-height:inherit;overflow:hidden}th.tall-row,td.tall-row{vertical-align:top}th.row-header-shim,td.row-header-shim{width:0;margin:0;overflow:hidden}div.column-headers-background{position:absolute;height:23px;background:#eee}th.column-headers-background{background:#eee;position:relative}div.row-headers-background{position:absolute;width:45px;background:#eee}th.row-headers-background{background:#eee;position:relative}tr.column-header-row{height:23px}th.selected,td.selected{background-color:#c8c8c8;border-bottom:1px solid #9fc2fd}td.header-shim,th.header-shim{border-width:0 1px 0 0;height:0;margin:0}td.freezebar-cell,th.freezebar-cell{border-color:#dadfe8!important;background-color:#dadfe8;padding:0;border-width:0}th.freezebar-origin-rtl{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -305px -62px}th.freezebar-origin-ltr{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -205px 0}th.freezebar-origin-ltr,th.freezebar-origin-rtl{background-color:#eee;position:relative}th.frozen-column-cell{width:4px}td.freezebar-hidden,th.freezebar-hidden{height:0px;width:0px;display:none}td.frozen-row-cell,th.frozen-row-cell{height:4px}.grid-fixed-table tr{height:10px}.row-header,.row-header-shim{background:#f8f9fa}div.column-headers-background,th.column-headers-background,div.row-headers-background,th.row-headers-background{background:#f8f9fa;color:#5f6368;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif}.waffle-current-theme{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;line-height:16px;padding-left:15px}.waffle-current-theme-bar{background:#fff;border-bottom:1px solid #dadce0;z-index:1}.waffle-current-theme-bar-shadow{box-shadow:0px 1px 1px 0px rgba(0,0,0,0.14),0px 2px 1px -1px rgba(0,0,0,0.12),0px 1px 3px 0px rgba(0,0,0,0.2)}.waffle-current-theme-common-content{display:flex;-webkit-align-items:center;align-items:center}.waffle-current-theme-preview{padding-bottom:20px}.waffle-current-theme-title-section{-ms-flex:1;-webkit-flex:1;flex:1;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;margin:16px 0;overflow:hidden}.waffle-custom-theme-warning-message{background:#f4f4f4;height:32px;margin:auto;padding:10px}.waffle-theme-thumbnail.waffle-theme-active{box-shadow:0px 2px 2px 0px rgba(0,0,0,0.14),0px 3px 1px -2px rgba(0,0,0,0.12),0px 1px 5px 0px rgba(0,0,0,0.2);border:1px solid #34a853}.waffle-theme-button{outline:none}.waffle-theme-container-element{background:#fff;padding-top:16px;outline:none}.waffle-theme-container-element-focus .waffle-theme-thumbnail{border-color:#1a73e8}.waffle-theme-editor-content{display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;height:100%}.waffle-theme-editor-send-feedback-container{text-align:end;padding:10px}.waffle-theme-editor-themes-container{overflow:auto}.waffle-theme-edit-panel-color{display:flex;margin:5px 0}.waffle-theme-edit-panel-color-text{-ms-flex:1;-webkit-flex:1;flex:1;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;line-height:40px;overflow:hidden;text-overflow:ellipsis}.waffle-theme-edit-panel-font-family{margin-top:5px;margin-bottom:25px}.waffle-theme-editor-edit-panel{font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;overflow:auto;padding:25px}.waffle-theme-edit-panel-color-picker{height:32px;margin:auto}.waffle-theme-edit-panel-title{font-weight:500;overflow:hidden;text-overflow:ellipsis}.waffle-theme-title.waffle-current-theme-title{line-height:20px}.waffle-theme-title{color:#3c4043;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;line-height:32px;overflow:hidden;padding:0px 15px;text-overflow:ellipsis;white-space:nowrap}.waffle-theme-thumbnail{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;cursor:pointer;border:1px solid #dadce0;height:154px;margin:auto;width:250px}.waffle-filterbox-container{padding-top:4px;padding-bottom:0;width:300px}.waffle-filtermenu,.waffle-db-filter-by-value-container{background-color:#fff;padding-left:17px;padding-right:20px;letter-spacing:0.2px}.waffle-filterbox-boolean-condition-picker{background-color:#fff;padding-left:17px;padding-right:20px;letter-spacing:0.2px}.waffle-filterbox-with-condition:focus{outline:none}.waffle-autofilter-sort{padding-left:20px;margin:3px 0px 3px 0px}.waffle-autofilter-sort.waffle-datasourcesheet-sort-selected.hc-enabled-focus{outline:1px solid}.waffle-autofilter-sort.waffle-datasourcesheet-sort-selected{background-color:#e8eaed}.goog-menu.waffle-datasourcesheet-filterbox-container .goog-menuitem{padding-left:17px}.waffle-datasourcesheet-filterbox-container .goog-menuseparator{margin-left:17px;margin-right:20px}.waffle-filterbox-container.waffle-datasourcesheet-filterbox-container .waffle-conditionalformat-condition-type-select .goog-flat-menu-button{width:100%}.waffle-filterbox-content{padding:3px 8px 2px 8px}.waffle-filterbox-content>.goog-menuitem{padding:6px 0px 6px 22px}.waffle-filterbox-label{margin-top:15px;margin-bottom:13px}.waffle-filterbox-with-condition .waffle-filterbox-label{margin-top:0}.waffle-filterbox-label-icon-jfk{background:none;float:right}.waffle-filterbox-button-container{padding:14px 0 14px 20px;text-align:right}.waffle-filterbox-with-condition{overflow-y:auto}.waffle-filterbox-input-icon{background:none}.waffle-action-menu{max-height:400px;overflow:auto}.waffle-recording-toast{background-color:#fff;border-bottom:1px solid rgba(0,0,0,0.14);border-radius:8px;bottom:52px;box-shadow:0 4px 8px 3px rgba(60,64,67,.15);color:#3c4043;font:14px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;outline:none;position:absolute}.waffle-recording-toast-top{height:64px;min-width:454px;overflow:hidden;position:relative}.waffle-recording-toast-bottom{background-color:#fff;border-radius:0 0 8px 8px;border-top:1px solid rgba(0,0,0,0.14);box-sizing:border-box;color:#3c4043;font-size:14px;font-weight:500;width:100%}.waffle-recording-toast-relativity-split .jfk-radiobutton{max-width:232px;padding:12px 12px}.waffle-recording-toast-new-content.waffle-recording-toast-slide-in{-webkit-animation:waffle-recording-toast-new-message 2.1s cubic-bezier(0.4,0,0.2,1) forwards;-moz-animation:waffle-recording-toast-new-message 2.1s cubic-bezier(0.4,0,0.2,1) forwards;-o-animation:waffle-recording-toast-new-message 2.1s cubic-bezier(0.4,0,0.2,1) forwards;animation:waffle-recording-toast-new-message 2.1s cubic-bezier(0.4,0,0.2,1) forwards;opacity:1}.waffle-recording-toast-new-content{overflow:hidden;position:absolute;text-overflow:ellipsis;top:-42px;white-space:nowrap}@keyframes waffle-recording-toast-new-message{0%{top:-42px}14%,86%{top:0}100%{top:42px}}.waffle-recording-toast-content{display:inline-block;height:64px;line-height:64px;margin:0 4px 0 16px}.waffle-recording-toast-content,.waffle-recording-toast-new-content,.waffle-recording-toast-default-content{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:205px}.waffle-recording-toast-default-content{opacity:1;transition:opacity 0.3s cubic-bezier(0.4,0,0.2,1)}.waffle-recording-toast-relativity-split{width:50%;display:inline-block;vertical-align:top}.waffle-recording-toast-label-description{color:#3c4043;font-size:12px;font-weight:normal;margin-top:4px}.waffle-recording-toast-right{float:right}.waffle-recording-toast-expand-section{display:inline-block;border-left:1px solid rgba(0,0,0,0.14);box-sizing:border-box;height:64px;padding:20px 5px;vertical-align:bottom}.waffle-recording-toast-expand{border:none;border-radius:2px;display:inline-block;outline:none;padding:3px}.waffle-recording-toast .goog-flat-button{background-color:transparent;border:none;border-radius:2px;color:#5f6368;display:inline-block;font:14px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;height:16px;margin:14px 0;padding:10px}.waffle-recording-toast-cancel,.waffle-recording-toast-stop{text-transform:none}.waffle-recording-toast .waffle-recording-toast-stop{margin:14px 16px}.waffle-recording-toast-close-button{background-color:transparent;border:none;cursor:pointer;display:inline-block;margin:0;padding:0}.waffle-recording-toast-relativity{display:inline-block;padding-left:12px}.waffle-recording-toast-relativity-label{display:inline-block;padding-left:24px}.waffle-edit-actions-dialog,.waffle-import-custom-function-actions-dialog,.waffle-record-script-dialog{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif}.waffle-record-script-dialog-gm.modal-dialog{width:286px}.waffle-record-script-dialog.modal-dialog{border:none;box-shadow:0 4px 16px 0 rgba(0,0,0,.4);min-height:239px;padding:0;width:334px}.waffle-record-script-dialog .modal-dialog-content{line-height:1em;padding:0 24px}.waffle-record-script-dialog .modal-dialog-title{color:rgba(0,0,0,0.87);font-size:19px;font-weight:500;margin:0;padding:21px 24px 16px 24px}.waffle-record-script-dialog .modal-dialog-buttons{float:right;margin:33px 0 14px 0}.waffle-record-script-dialog-label{color:rgba(0,0,0,0.54);font-size:11px;padding-top:3px}.waffle-record-script-dialog-gm .waffle-record-script-dialog-label{color:#3c4043;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;padding:0 0 4px 0}.waffle-record-script-dialog-name-section{margin-bottom:16px}.waffle-record-script-dialog .docs-charts-editor-material-text-input,.waffle-record-script-dialog .docs-charts-editor-material-text-input input{font-size:13px}.waffle-record-script-dialog-gm .waffle-record-script-name-input{width:100%}.waffle-record-script-shortcut input{margin-left:8px;text-align:center;width:60px}.waffle-record-script-dialog-gm .waffle-record-script-shortcut label{margin-right:8px}.waffle-record-script-dialog-gm .waffle-record-script-shortcut input{width:74px}.waffle-recording-toast .jfk-radiobutton-label{margin-left:28px}.waffle-recording-toast .jfk-radiobutton-radio,.waffle-recording-toast .jfk-radiobutton-hover .jfk-radiobutton-radio{border:2px solid #bebebe;height:16px;left:8px;top:12px;width:16px}.waffle-recording-toast .jfk-radiobutton-radio::after{background:#188038;border:4px solid #188038;box-sizing:border-box;height:8px;left:2px;top:2px;width:8px}.waffle-recording-toast .jfk-radiobutton-checked .jfk-radiobutton-radio{border:2px solid #188038}.waffle-recording-toast-relativity-split .jfk-radiobutton-focused .jfk-radiobutton-radio{border:2px solid #188038}.waffle-recording-toast-relativity-split .jfk-radiobutton-checked.jfk-radiobutton-focused .jfk-radiobutton-radio{border:2px solid #0d652d}.waffle-recording-toast-relativity-split .jfk-radiobutton-checked.jfk-radiobutton-focused .jfk-radiobutton-radio::after{background-color:#0d652d;border:4px solid #0d652d}.waffle-recording-toast-icon{color:#ea4335;display:inline-block;height:16px;margin-bottom:24px;margin-left:16px;margin-top:24px;width:16px}.waffle-recording-toast-outer-circle{border:2px solid #ff5959;border-radius:50%;box-sizing:border-box;height:16px;position:relative;width:16px}.waffle-recording-toast-inner-circle{-webkit-animation:waffle-recording-toast-recording-cycle 1333ms steps(1) infinite;-moz-animation:waffle-recording-toast-recording-cycle 1333ms steps(1) infinite;-o-animation:waffle-recording-toast-recording-cycle 1333ms steps(1) infinite;animation:waffle-recording-toast-recording-cycle 1333ms steps(1) infinite;border:4px solid #ff5959;border-radius:50%;box-sizing:border-box;height:8px;left:2px;position:relative;top:2px;width:8px}@keyframes waffle-recording-toast-recording-cycle{0%{border:4px solid #ff5959}50%{border:0}100%{border:4px solid #ff5959}}.waffle-recording-toast-expand-icon{height:18px;width:18px}.waffle-recording-toast-expand-icon::after{content:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgdmlld0JveD0iMCAwIDE4IDE4Ij48ZyBzdHlsZT0iZmlsbDpub25lO3N0cm9rZS13aWR0aDoxO3N0cm9rZTpub25lIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSg5IDkpc2NhbGUoMSAtMSl0cmFuc2xhdGUoLTkgLTkpIj48cmVjdCB3aWR0aD0iMTgiIGhlaWdodD0iMTgiLz48cG9seWdvbiBwb2ludHM9IjkgNSAzIDExIDQuNCAxMi40IDkgNy44IDEzLjYgMTIuNCAxNSAxMSIgZmlsbD0iIzVmNjM2OCIvPjwvZz48L2c+PC9zdmc+")}.goog-zippy-collapsed .waffle-recording-toast-expand-icon{transform:rotate(-180deg)}.waffle-recording-toast-relativity-info{color:white;display:inline-block;float:right;font-weight:500;height:20px;text-align:center;width:20px}.waffle-recording-toast-info-circle{border:2px solid white;border-radius:50%;height:16px;left:-2px;position:relative;top:-2px;width:16px}.waffle-edit-actions-dialog.modal-dialog{box-shadow:0 4px 16px 0 rgba(0,0,0,.4);border:none;padding:0px;width:441px}.waffle-edit-actions-dialog .modal-dialog-title{color:rgba(0,0,0,0.87);font-size:18px;font-weight:500;margin-bottom:16px;padding:24px 24px 0 24px}.waffle-import-custom-function-actions-dialog .modal-dialog-title .title-action-number{color:rgba(0,0,0,0.54);font-size:18px;font-weight:400;margin-left:5px}.waffle-edit-actions-dialog .modal-dialog-buttons{float:right;margin-bottom:14px;margin-top:8px}.waffle-edit-actions-dialog .modal-dialog-buttons button,.waffle-record-script-dialog .modal-dialog-buttons button{background-color:white;background-image:none;border:none;border-radius:2px;color:rgba(0,0,0,0.54);font-size:13px;font-weight:500;height:32px;margin-right:8px;min-width:64px;padding-left:8px;padding-right:8px;text-transform:uppercase}.waffle-edit-actions-dialog .modal-dialog-buttons .goog-buttonset-default,.waffle-record-script-dialog .modal-dialog-buttons .goog-buttonset-default,.waffle-recording-toast .waffle-recording-toast-stop{color:#4285f4}.waffle-edit-actions-dialog .modal-dialog-buttons button:hover:enabled,.waffle-record-script-dialog .modal-dialog-buttons button:hover:enabled,.waffle-recording-toast .goog-flat-button-hover,.waffle-recording-toast-expand:hover{background-color:rgba(0,0,0,0.12)}.waffle-edit-actions-dialog .modal-dialog-buttons button:focus,.waffle-record-script-dialog .modal-dialog-buttons button:focus,.waffle-recording-toast .goog-flat-button-focused,.waffle-recording-toast-expand:focus{background-color:#ddd;background-image:none;border:none}.waffle-edit-actions-dialog .modal-dialog-buttons button:active:enabled,.waffle-record-script-dialog .modal-dialog-buttons button:active:enabled,.waffle-recording-toast .goog-flat-button-active,.waffle-recording-toast-expand:active{background-color:rgba(0,0,0,0.12);color:rgba(0,0,0,0.87)}.waffle-edit-actions-dialog .modal-dialog-buttons button.goog-buttonset-default:hover:enabled,.waffle-record-script-dialog .modal-dialog-buttons button.goog-buttonset-default:hover:enabled,.waffle-recording-toast .waffle-recording-toast-stop.goog-flat-button-hover{background-color:rgba(66,133,244,0.12)}.waffle-edit-actions-dialog .modal-dialog-buttons button.goog-buttonset-default:active:enabled,.waffle-record-script-dialog .modal-dialog-buttons button.goog-buttonset-default:active:enabled,.waffle-recording-toast .waffle-recording-toast-stop.goog-flat-button-active,.waffle-recording-toast .waffle-recording-toast-stop.goog-flat-button-enabled{background-color:rgba(66,133,244,0.32);color:#3367d6}.waffle-import-custom-function-add-function .goog-flat-button,.waffle-recording-toast-stop.goog-flat-button{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:white;color:#188038;outline:none;text-transform:none}.waffle-import-custom-function-add-function .goog-flat-button-hover,.waffle-recording-toast-stop.goog-flat-button-hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#f8fcf9;color:#188038}.waffle-import-custom-function-add-function .goog-flat-button-focused,.waffle-recording-toast-stop.goog-flat-button-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#e7f5eb;color:#188038}.waffle-import-custom-function-add-function .goog-flat-button-active,.waffle-recording-toast-stop.goog-flat-button-active{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#dff2e4;color:#188038;box-shadow:0 2px 6px 2px rgba(60,64,67,.15)}.waffle-import-custom-function-view-script .goog-flat-button,.waffle-recording-toast-cancel.goog-flat-button{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:white;color:#5f6368;outline:none;text-transform:none}.waffle-import-custom-function-view-script .goog-flat-button-hover,.waffle-recording-toast-cancel.goog-flat-button-hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#f8fcf9;color:#5f6368}.waffle-import-custom-function-view-script .goog-flat-button-focused,.waffle-recording-toast-cancel.goog-flat-button-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#e7f5eb;color:#5f6368}.waffle-import-custom-function-view-script .goog-flat-button-active,.waffle-recording-toast-cancel.goog-flat-button-active{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#dff2e4;color:#5f6368;box-shadow:0 2px 6px 2px rgba(60,64,67,.15)}.waffle-recording-toast-expand:hover{background-color:#f8fcf9}.waffle-recording-toast-expand:focus{background-color:#e7f5eb}.waffle-recording-toast-expand:focus:hover{background-color:#dff2e4}.waffle-recording-toast-expand:active{background-color:#dff2e4;box-shadow:0 2px 6px 2px rgba(60,64,67,.15)}.waffle-edit-actions-dialog .waffle-edit-actions-row{padding-bottom:10px;padding-top:10px}.waffle-edit-actions-row{color:rgba(0,0,0,0.87);font-size:13px;font-weight:400;height:30px}.waffle-edit-actions-row-name{float:left;margin-right:10px;width:175px}.waffle-edit-actions-row-shortcut-prefix{display:inline-block;margin-right:5px;padding-top:4px}.waffle-edit-actions-row-shortcut{display:inline-block;width:32px}.waffle-edit-actions-row-shortcut-input{max-width:100%;text-align:center}.waffle-edit-actions-row-name input:disabled{color:rgba(0,0,0,0.87);border:none}.waffle-edit-actions-row-name input{max-width:100%}.waffle-edit-actions-dialog .modal-dialog-title-close{margin-right:7px;padding:24px 17px 24px 24px}.waffle-edit-actions-dialog-scroll{max-height:346px;min-height:160px;overflow-y:auto;padding:10px 24px 10px 24px}.waffle-edit-actions-dialog-gm .waffle-edit-actions-dialog-scroll{padding:0 4px}.waffle-edit-actions-options{float:right}.waffle-edit-actions-row-menu{display:inline-block;margin-left:10px}.waffle-edit-actions-options .goog-menuitem{padding-right:30px}.waffle-edit-actions-row .goog-menu{display:inline-block;overflow:hidden}.waffle-edit-actions-shortcut-conflict-message{clear:left;color:#db4437;font-size:11px}.waffle-edit-actions-undo-remove-toast{z-index:1003}.waffle-edit-actions-dialog .modal-dialog-buttons button:disabled{opacity:0.38}.waffle-import-custom-function-title-description{color:rgba(0,0,0,0.54);font-size:11px;font-weight:400}.waffle-import-custom-functions-row-container{padding-top:8px}.waffle-import-custom-function-actions-dialog.modal-dialog{border:none;box-shadow:0 4px 16px 0 rgba(0,0,0,.4);padding:24px 12px;width:451px}.waffle-import-custom-function-actions-dialog .modal-dialog-title{color:rgba(0,0,0,0.87);font-size:18px;font-weight:500;margin-bottom:16px;padding:0 12px}.waffle-import-custom-function-actions-title-separator{border-bottom:1px solid rgba(0,0,0,0.12);margin:0 12px}.waffle-import-custom-function-actions-dialog-scroll{max-height:381px;min-height:185px;overflow-y:scroll;padding:0 1px 10px 2px}.waffle-import-custom-function-row{margin-top:8px;padding-left:10px}.waffle-import-custom-function-add-function{display:inline-block;float:right}.waffle-import-custom-function-add-function button{background-color:white;border:none;border-radius:2px;color:#4285f4;font:500 15px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;height:32px;padding:8px;text-transform:uppercase}.waffle-import-custom-function-add-function button:hover{background-color:rgba(66,133,244,0.12)}.waffle-import-custom-function-add-function button:active{background-color:rgba(66,133,244,0.32);color:#3367d6}.waffle-import-custom-function-name{color:rgba(0,0,0,0.87);font-weight:500;font-size:13px}.waffle-import-custom-function-metadata{color:rgba(0,0,0,0.54);font-size:11px;font-weight:400;margin-top:6px}.waffle-import-custom-function-description-label{font-weight:500}.waffle-import-custom-function-project-name{display:inline-block}.waffle-import-custom-function-file-name{display:inline-block;margin-left:16px}.waffle-import-custom-function-view-script{display:inline-block}.waffle-import-custom-function-view-script button{background-color:white;background-image:none;border:none;border-radius:2px;color:rgba(0,0,0,0.6);font:500 15px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;height:32px;margin-left:-8px;text-transform:uppercase;padding:8px;line-height:1em}.waffle-import-custom-function-view-script button:hover{background-color:rgba(0,0,0,0.12)}.waffle-import-custom-function-view-script button:active{background-color:rgba(0,0,0,0.12);color:rgba(0,0,0,0.87)}.function-description-seperator{padding-left:5px}.waffle-import-custom-function-actions-status-toast{z-index:1003}.waffle-import-custom-function-actions-checkmark{height:24px;width:24px}.waffle-import-custom-function-actions-checkmark::after{content:url("data:image/svg+xml;base64,PHN2ZyB4bWxuczp4bGluaz0naHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluaycgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB2ZXJzaW9uPScxLjEnIHdpZHRoPScyNHB4JyBoZWlnaHQ9JzI0cHgnIHZpZXdCb3g9JzAgMCAxNSAxNSc+PHBhdGggZmlsbD0nZ3JleScgZmlsbC1ydWxlPSdldmVub2RkJyBkPSdNNywxNCBDMTAuODY1OTkzMiwxNCAxNCwxMC44NjU5OTMyIDE0LDcgQzE0LDMuMTM0MDA2NzUgMTAuODY1OTkzMiwwIDcsMCBDMy4xMzQwMDY3NSwwIDAsMy4xMzQwMDY3NSAwLDcgQzAsMTAuODY1OTkzMiAzLjEzNDAwNjc1LDE0IDcsMTQgWiBNMi4yNSw3LjUgTDMuMzA3NSw2LjQ0MjUgTDUuNSw4LjYyNzUgTDEwLjY5MjUsMy40MzUgTDExLjc1LDQuNSBMNS41LDEwLjc1IEwyLjI1LDcuNSBaJz48L3BhdGg+PC9zdmc+")}.waffle-edit-actions-empty{color:rgba(0,0,0,0.54);font-size:15px;font-weight:400;line-height:160px;text-align:center}.docs-ui-toast-content .waffle-ellipses{left:4px;top:3px}.grid-shim-bottom{border-top:1px solid #d9d9d9}.grid-shim-end-ltr{border-left:1px solid #d9d9d9}.grid-shim-end-rtl{border-right:1px solid #d9d9d9}.row-freezebar-extension{background-color:#dadfe8;border-top:1px solid #d9d9d9;border-bottom:1px solid #dbdbdb;position:relative}.grid-bottom-bar{border-top:1px solid #d9d9d9}.grid-bottom-bar{border-top:1px solid #aaa}.column-freezebar-extension{height:100%;background-color:#dadfe8;border-left:1px solid #d9d9d9;border-right:1px solid #dbdbdb;position:relative}.mimic-overlay::-webkit-scrollbar{background-color:rgba(255,255,255,1.0)}.mimic-overlay::-webkit-scrollbar-corner{background-color:rgba(255,255,255,1.0)}.scroll-container::-webkit-scrollbar:vertical{width:12px}.scroll-container::-webkit-scrollbar:horizontal{height:12px}.scroll-container::-webkit-scrollbar-button:start{display:none}.scroll-container::-webkit-scrollbar-button:end{display:block}.scroll-container::-webkit-scrollbar-button{border:1px solid #d9d9d9}.scroll-container::-webkit-scrollbar-button:horizontal{border-width:1px 0 0 0}.scroll-container-ltr::-webkit-scrollbar-button:vertical{border-width:0 0 0 1px}.scroll-container-rtl::-webkit-scrollbar-button:vertical{border-width:0 1px 0 0}.scroll-container::-webkit-scrollbar-button:horizontal:increment{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -663px -13px;width:15px;padding-left:1px;background-clip:border-box;border:1px solid #d9d9d9;border-width:1px 0 0 0;box-shadow:none;background-color:#f8f8f8}.scroll-container::-webkit-scrollbar-button:horizontal:increment:hover{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -395px -62px}.scroll-container::-webkit-scrollbar-button:horizontal:increment:active{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -679px -13px}.scroll-container::-webkit-scrollbar-button:horizontal:decrement{border-left:1px solid #d9d9d9;border-right:1px solid #d9d9d9;background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -283px -62px;width:17px}.scroll-container::-webkit-scrollbar-button:horizontal:hover{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -145px -70px}.scroll-container::-webkit-scrollbar-button:horizontal:active{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -552px 0}.scroll-container::-webkit-scrollbar-button:vertical:increment{padding-top:1px;background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -531px -24px;height:15px}.scroll-container::-webkit-scrollbar-button:vertical:increment:hover{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -570px -42px}.scroll-container::-webkit-scrollbar-button:vertical:increment:active{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -83px -46px}.scroll-container::-webkit-scrollbar-button:vertical:decrement{border-top:1px solid #d9d9d9;border-bottom:1px solid #d9d9d9;background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -631px -27px;height:17px}.scroll-container::-webkit-scrollbar-button:vertical:decrement:hover{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -180px -58px}.scroll-container::-webkit-scrollbar-button:vertical:decrement:active{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -776px -28px}.scroll-container::-webkit-scrollbar-track:vertical{background-clip:border-box;border:1px solid #d9d9d9;box-shadow:none;background-color:#f8f8f8}.scroll-container-ltr::-webkit-scrollbar-track:vertical{border-width:0 0 0 1px}.scroll-container-rtl::-webkit-scrollbar-track:vertical{border-width:0 1px 0 0}.scroll-container::-webkit-scrollbar-track:horizontal{background-clip:border-box;border:1px solid #d9d9d9;border-width:1px 0 0 0;box-shadow:none;background-color:#f8f8f8}.scroll-container::-webkit-scrollbar-track:hover{background:none;box-shadow:none}.native-scrollbar::-webkit-scrollbar-track:hover{border-width:0;background:none;box-shadow:none}.scroll-container::-webkit-scrollbar-track:horizontal:hover,.scroll-container::-webkit-scrollbar-track:vertical:hover{box-shadow:none;background-clip:border-box;border:1px solid #d9d9d9;border-width:1px 0 0 0;box-shadow:none;background-color:#f8f8f8}.scroll-container::-webkit-scrollbar-track:horizontal:hover{border-width:1px 0 0 0}.scroll-container::-webkit-scrollbar-track:vertical:hover{border-width:0 1px 0 1px}.scroll-container::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.2);background-clip:padding-box;border:solid transparent;min-height:28px;padding:none;box-shadow:none;border-width:1px 1px 1px 1px}.scroll-container::-webkit-scrollbar-thumb:horizontal{box-shadow:none;border-width:2px 1px 1px 1px}.scroll-container::-webkit-scrollbar-thumb:vertical{padding:1px 1px 1px 1px;box-shadow:none}.scroll-container-ltr::-webkit-scrollbar-thumb:vertical{border-width:1px 1px 1px 2px}.scroll-container-rtl::-webkit-scrollbar-thumb:vertical{border-width:1px 2px 1px 1px}.scroll-container::-webkit-scrollbar-thumb:hover{box-shadow:none}.native-scrollbar::-webkit-scrollbar-thumb:hover{background:none;background-color:#bdc1c6;box-shadow:none}.native-scrollbar::-webkit-scrollbar-thumb:active{background-color:#80868b}.docs-gm .native-scrollbar::-webkit-scrollbar-track:vertical,.docs-gm .native-scrollbar::-webkit-scrollbar-track:horizontal,.docs-gm .native-scrollbar::-webkit-scrollbar-track:horizontal:hover,.docs-gm .native-scrollbar::-webkit-scrollbar-track:vertical:hover{background-color:#fff}.scroll-container::-webkit-scrollbar-corner{border:1px solid #d9d9d9}.scroll-container-rtl::-webkit-scrollbar-corner{border-width:1px 1px 0 0}.scroll-container-ltr::-webkit-scrollbar-corner{border-width:1px 0 0 1px}.native-scrollbar::-webkit-scrollbar:vertical{width:12px}.native-scrollbar::-webkit-scrollbar:horizontal{height:12px}.native-scrollbar::-webkit-scrollbar-button:start{display:none}.native-scrollbar::-webkit-scrollbar-button:end{display:block}.native-scrollbar::-webkit-scrollbar-button{border:1px solid #d9d9d9}.native-scrollbar::-webkit-scrollbar-button:horizontal{border-width:1px 0 0 0}.native-scrollbar-ltr::-webkit-scrollbar-button:vertical{border-width:0 0 0 1px}.native-scrollbar-rtl::-webkit-scrollbar-button:vertical{border-width:0 1px 0 0}.native-scrollbar::-webkit-scrollbar-button:horizontal:increment{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -663px -13px;width:15px;padding-left:1px;background-clip:border-box;border:1px solid #d9d9d9;border-width:1px 0 0 0;box-shadow:none;background-color:#f8f8f8}.native-scrollbar::-webkit-scrollbar-button:horizontal:increment:hover{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -395px -62px}.native-scrollbar::-webkit-scrollbar-button:horizontal:increment:active{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -679px -13px}.native-scrollbar::-webkit-scrollbar-button:horizontal:decrement{border-left:1px solid #d9d9d9;border-right:1px solid #d9d9d9;background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -283px -62px;width:17px}.native-scrollbar::-webkit-scrollbar-button:horizontal:hover{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -145px -70px}.native-scrollbar::-webkit-scrollbar-button:horizontal:active{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -552px 0}.native-scrollbar::-webkit-scrollbar-button:vertical:increment{padding-top:1px;background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -531px -24px;height:15px}.native-scrollbar::-webkit-scrollbar-button:vertical:increment:hover{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -570px -42px}.native-scrollbar::-webkit-scrollbar-button:vertical:increment:active{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -83px -46px}.native-scrollbar::-webkit-scrollbar-button:vertical:decrement{border-top:1px solid #d9d9d9;border-bottom:1px solid #d9d9d9;background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -631px -27px;height:17px}.native-scrollbar::-webkit-scrollbar-button:vertical:decrement:hover{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -180px -58px}.native-scrollbar::-webkit-scrollbar-button:vertical:decrement:active{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -776px -28px}.native-scrollbar::-webkit-scrollbar-track{margin:0px}.native-scrollbar::-webkit-scrollbar-track:vertical{background-clip:border-box;border:1px solid #d9d9d9;box-shadow:none;background-color:#f8f8f8}.native-scrollbar-ltr::-webkit-scrollbar-track:vertical{border-width:0 0 0 1px}.native-scrollbar-rtl::-webkit-scrollbar-track:vertical{border-width:0 1px 0 0}.native-scrollbar::-webkit-scrollbar-track:horizontal{background-clip:border-box;border:1px solid #d9d9d9;border-width:1px 0 0 0;box-shadow:none;background-color:#f8f8f8}.native-scrollbar::-webkit-scrollbar-track:horizontal:hover,.native-scrollbar::-webkit-scrollbar-track:vertical:hover{box-shadow:none;background-clip:border-box;border:1px solid #d9d9d9;border-width:1px 0 0 0;box-shadow:none;background-color:#f8f8f8}.native-scrollbar::-webkit-scrollbar-track:horizontal:hover{border-width:1px 0 0 0}.native-scrollbar::-webkit-scrollbar-track:vertical:hover{border-width:0 1px 0 1px}.native-scrollbar::-webkit-scrollbar-thumb:horizontal{box-shadow:none;border-width:2px 1px 1px 1px}.native-scrollbar::-webkit-scrollbar-thumb:vertical{padding:1px 1px 1px 1px;box-shadow:none}.native-scrollbar-ltr::-webkit-scrollbar-thumb:vertical{border-width:1px 1px 1px 2px}.native-scrollbar-rtl::-webkit-scrollbar-thumb:vertical{border-width:1px 2px 1px 1px}.native-scrollbar::-webkit-scrollbar-thumb{background-clip:padding-box;background-color:#dadce0;border:solid transparent;border-width:1px 1px 1px 1px;box-shadow:none;min-height:28px;padding:none}.native-scrollbar::-webkit-scrollbar-corner{border:1px solid #d9d9d9}.native-scrollbar-rtl::-webkit-scrollbar-corner{border-width:1px 1px 0 0}.native-scrollbar-ltr::-webkit-scrollbar-corner{border-width:1px 0 0 1px}.native-scrollbar-x{overflow-x:scroll;overflow-y:hidden;border:1px solid #d9d9d9;border-width:0 1px 0 0}.native-scrollbar-y{overflow-x:hidden;overflow-y:scroll;border:1px solid #d9d9d9;border-width:0 0 1px 0}.waffle-verbal-title{text-align:center}.waffle-verbal-wrapper{height:0;overflow:hidden;position:absolute;width:0}.waffle-verbal-highlights-container{background-color:white;border:1px solid #9e9e9e;border-left:4px solid #009e55;font-family:Roboto,Arial,sans-serif;font-size:13px;margin:3px -1px 0 -1px;min-width:400px;padding:20px 20px 15px 20px;white-space:normal}.waffle-verbal-highlights-icon{margin-right:4px}.waffle-verbal-highlights-header{color:#009e55;font-weight:500;margin-bottom:10px}.waffle-verbal-highlights-header-left{float:left}.waffle-verbal-highlights-title-icon{display:inline-block;padding-bottom:2px;padding-right:4px;margin-left:-2px}.waffle-verbal-highlights-title{display:inline-block;vertical-align:bottom}.waffle-verbal-highlights-close{float:right;opacity:0.46}.waffle-verbal-highlights-close.goog-flat-button{position:static;border:none;margin:-4px -4px 0 0;padding:0;background-color:transparent}.waffle-verbal-highlights-bullet{color:#515151;font-family:Roboto,Arial,sans-serif;font-size:13px;margin-top:10px;white-space:pre-wrap}.waffle-verbal-highlights-empty-notice{color:#9e9e9e;margin-bottom:25px;text-align:center}.waffle-verbal-highlights-pager{float:right}.waffle-verbal-highlights-viewall.goog-flat-button{color:#009e55;background-color:transparent;border:none;display:inline-block;float:left;font-family:Roboto,Arial,sans-serif;font-size:13px;padding:0}.waffle-verbal-highlights-previous.goog-flat-button,.waffle-verbal-highlights-next.goog-flat-button{color:#009e55;background-color:transparent;border:none;display:inline-block;font-family:Roboto,Arial,sans-serif;font-size:13px;padding:0}.waffle-verbal-highlights-previous.goog-flat-button-disabled,.waffle-verbal-highlights-next.goog-flat-button-disabled{color:#ccc}.waffle-verbal-highlights-counter{color:#9e9e9e;display:inline-block;font-family:Roboto,Arial,sans-serif;font-size:13px;text-align:center;width:70px}.waffle-verbal-highlights-floatclear{clear:both}.waffle-verbal-highlights-one-option-footer{margin:15px 0}.waffle-verbal-highlights-footer{margin:15px 0 0 0}.waffle-verbal-highlights-viewall-footer.goog-flat-button{background-color:transparent;border:none;margin:15px 0 0 -5px;padding:0}.waffle-verbal-highlights-viewall-back-label{color:#009e55;display:inline-block;font-family:Roboto,Arial,sans-serif;font-size:13px;margin-left:5px;vertical-align:middle}.waffle-overflow-menu-material{transition:opacity 250ms cubic-bezier(0.4,0.0,0.2,1);cursor:pointer;height:18px;opacity:0.54;width:18px}.waffle-overflow-menu-material::after{content:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgdmlld2JveD0iMCAwIDIwIDIwIiBoZWlnaHQ9IjIwIj48cGF0aCBkPSJtMTAgNmMxLjEgMCAyLTAuOSAyLTJzLTAuOS0yLTItMi0yIDAuOS0yIDIgMC45IDIgMiAyem0wIDJjLTEuMSAwLTIgMC45LTIgMnMwLjkgMiAyIDIgMi0wLjkgMi0yLTAuOS0yLTItMnptMCA2Yy0xLjEgMC0yIDAuOS0yIDJzMC45IDIgMiAyIDItMC45IDItMi0wLjktMi0yLTJ6Ii8+PC9zdmc+")}.waffle-overflow-menu-material.waffle-overflow-menu-material-white::after{content:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgdmlld2JveD0iMCAwIDIwIDIwIj48cGF0aCBkPSJNMTAgNmMxLjEgMCAyLTAuOSAyLTJzLTAuOS0yLTItMlM4IDIuOSA4IDQgOC45IDYgMTAgNnpNMTAgOGMtMS4xIDAtMiAwLjktMiAyczAuOSAyIDIgMiAyLTAuOSAyLTJTMTEuMSA4IDEwIDh6TTEwIDE0Yy0xLjEgMC0yIDAuOS0yIDJzMC45IDIgMiAyIDItMC45IDItMlMxMS4xIDE0IDEwIDE0eiIgZmlsbD0iI2ZmZiIvPjwvc3ZnPg==")}.waffle-overflow-menu-material:hover{opacity:0.70}.goog-modalpopup-bg,.modal-dialog-bg{z-index:1002}.goog-modalpopup,.modal-dialog{z-index:1003}.waffle-dialog-header{font-weight:500;font-size:14px;line-height:2.25em}.menuMainLink{border-style:none;border-width:0px;font-size:12px;color:#15c;text-decoration:underline;cursor:pointer;padding:2px 0 0 6px;vertical-align:middle}.dlgImportDisabled{color:#666}div.uploadBox{margin-top:8px}div.dlgImportClear{width:100%;height:1px;clear:both}div.dlgImportButterPane,div.dlgRitzImportButterPane{background-color:#ffd969;padding:8px;margin:8px -8px 0 -8px}span.dlgImportButterPane{padding-left:20px}span.dlgRitzImportButterPane{display:block;padding-top:10px}div.dlgImportHeader{font-weight:500;margin-top:10px}.dlgImportError{font-weight:500;color:red}span.waitSpinner{padding-left:5px}#dlgImportCustomOption{display:inline-block}div.dlgImport{width:730px;font-size:10pt;line-height:130%}div.dlgRitzImport{width:310px;font-size:10pt;line-height:130%}#customDelimiter{width:40px}.dlgImport .jfk-radiobutton,.dlgRitzImport .jfk-radiobutton{display:block}.dlgImportPreview{background-color:#eee;height:300px;width:360px;border:1px solid #ccc;display:table-cell;text-align:center;vertical-align:middle;overflow:scroll}div.dlgImportPreviewMessage{color:gray}table.dlgImport{width:376px;border:0px;padding:0px}.waffle-alert-dialog-inner{width:376px;font-size:10pt}.pub-dialog-wrap{width:500px}.pub-dialog-txt{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;font-weight:500}.pub-dialog-content-div{padding:0px 0px 10px 30px}.pub-dialog-checkbox-label{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px}.pub-dialog-url-box{width:450px;font-family:monospace;padding:5px}.pub-dialog-input{width:220px}.pub-dialog-date-label{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;color:#afafaf;padding:0px 0px 0px 3px}.pub-dialog-input-div{padding:0px 0px 6px 0px}.pub-dialog-helpertext{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;color:#afafaf}.pub-dialog-hr{background-color:#bfbfbf;color:#bfbfbf;height:1px;width:96%}.pub-dialog-hr-div{padding:2px 0 2px 0}.pub-dialog-stjw-infotext-span{font-size:11px;padding-left:5px}.pub-dialog-link-options-document-part-menu-button,.pub-dialog-published-content-menu-button{margin-left:0;max-width:150px}.pub-dialog-link-options-document-part-menu-button-content,.pub-dialog-published-content-menu-button-content{overflow:hidden;text-overflow:ellipsis;width:100%}.pub-dialog-link-options-container,.pub-dialog-published-content-container{margin-top:20px}.pub-dialog-link-options-menu,.pub-dialog-published-content-menu{overflow:auto}.pub-dialog-link-options-chart-menu-item,.pub-dialog-published-content-chart-menu-item{max-width:340px;overflow:hidden;padding-left:15px;text-overflow:ellipsis}.pub-dialog-chart-notice{color:#999;font-size:11px;margin-top:5px}.pub-dialog-chart-notice-emphasis{color:#666;font-weight:500}.dialog-publishobject-div{border:1px solid #ccc;background-color:#efefef;font-family:inherit;font-size:12px;max-height:500px;overflow:auto;padding:15px;width:350px}.dialog-publishobject-msg{font-size:12px}.waffle-selection-dialog-content{margin-right:0;max-height:400px;overflow-x:auto;overflow-y:overlay;width:314px}.waffle-selection-dialog-editbox{margin:5px 0;width:260px}.waffle-selection-dialog-active-editbox,.waffle-flat-multi-range-active-editbox{border:none;box-shadow:none}.waffle-selection-dialog-remove,.waffle-flat-multi-range-remove{color:#999;cursor:pointer;display:inline;margin:0 0 0 8px}.waffle-selection-dialog-remove .docs-icon{width:24px;height:24px;margin:0}.waffle-flat-multi-range-remove-table{display:inline-block}.waffle-selection-dialog-error{color:#212121;font-size:13px}.waffle-dv-trrules .waffle-range-selection-container{width:160px}.waffle-dv-recs-title-bar{font-size:13px;margin:25px 0 9px 3px}.waffle-dv-rec-wrapper{background-color:#eee;margin:0 -42px;min-height:42px;overflow:hidden;padding:5px 38px;position:relative;white-space:nowrap;width:570px}.waffle-dv-rec-description{color:#404040;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.waffle-dv-rec-range{color:#3b80f4;float:right;margin-left:6px}.waffle-dv-rec-chip{background-color:#fff;border:1px solid #e0e0e0;border-radius:8px;float:left;font-size:13px;font-weight:normal;height:auto;line-height:21px;margin:5px;max-width:241px;padding:3px 16px 5px}.waffle-dv-rec-chip.jfk-button-focused{box-shadow:none;border:1px solid rgba(0,0,0,.4)}.waffle-dv-rec-chip.jfk-button-hover{box-shadow:0 1px 2px rgba(0,0,0,.25)}.waffle-dv-rec-chip.waffle-dv-rec-chip-selected{box-shadow:0 2px 2px rgba(0,0,0,.2);border:1px solid #3b80f4}@media screen and (-ms-high-contrast:active){.waffle-dv-rec-chip.waffle-dv-rec-chip-selected{border:2px solid #3b80f4}}.waffle-dv-no-suggestions{color:#757575;font-style:italic;padding-left:10px;position:absolute;top:50%;transform:translateY(-50%)}.waffle-dv-rec-spinner-container{height:100%;text-align:center}.waffle-dv-rec-spinner-container .waffle-spinner{top:7px}.waffle-dv-table-with-suggestions{padding-top:10px}.waffle-dv-feedback-link{float:right;font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif;text-decoration:none;text-transform:uppercase}.waffle-range-selection-error{border:1px solid #dd4b39}.input-selection-button-div{margin-top:-1px;margin-left:4px}.waffle-flat-range-select-done{margin-top:3px}.waffle-flat-multi-range-row .waffle-range-selection-holder{width:168px;display:inline-block}.waffle-flat-multi-range-select-done{margin-top:10px}.waffle-flat-range-select-message,.waffle-flat-multi-range-select-message{display:none;margin-top:3px;width:110px}.waffle-flat-range-select-listening .waffle-flat-range-select-message,.waffle-flat-multi-range-select-listening .waffle-flat-multi-range-select-message{display:inline-block}.waffle-flat-range-select-listening,.waffle-flat-multi-range-select-listening{background-color:#fbf2cd;margin:0 -20px 0;padding:10px 20px}.waffle-flat-multi-range-add-another{display:block}.waffle-notification-listrule-container{padding:5px}.waffle-notification-rule-row{display:inline-block;margin-bottom:10px;width:100%}.waffle-notification-rule-text{font-size:10pt}.waffle-notification-rule-description{float:left}.waffle-notification-rulerow-buttons-container{float:right}.waffle-notification-rulerow-edit-container{float:left}.waffle-notification-rulerow-delete-container{float:right}.waffle-notification-rule-disabled{font-size:8pt;color:lightgray!important}.waffle-dialog-notifications-list{width:100%;vertical-align:top}.waffle-dialog-notifications{width:100%;padding:6px 8px 8px 2px;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;vertical-align:top}.waffle-dialog-notifications-gap{padding-left:25px}.waffle-dialog-notifications-input .disabled{color:lightgray!important}.waffle-dialog-notifications-label .disabled{color:lightgray!important}.waffle-dialog-notifications-text{vertical-align:top;padding-left:20px;color:#676767;font-size:8pt;width:150px}.waffle-notifications-add{font-weight:500;display:block}.waffle-notification-rule-area-separator{padding:5px}.waffle-notification-listrule-container{padding:0!important}.waffle-dialog-notifications-bounds{border:1px solid #999;border-color:#dadce0;border-radius:8px;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;height:250px;max-width:672px;min-width:464px;overflow:auto;padding:10px;width:auto;width:unset;vertical-align:top}.waffle-notification-buttons-container{text-align:right}.waffle-notification-addbutton-container{align-self:flex-end;border:none;padding-bottom:6px}.waffle-notifications-dialog .goog-link-button{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:white;color:#188038;height:24px;padding:3px 12px 5px;text-decoration:none}.waffle-dialog-notifications-input{padding-left:0;vertical-align:top}.waffle-notifications-dialog .jfk-radiobutton{left:-7px}.waffle-dialog-notifications-toplabel{font-weight:500;padding-bottom:5px}.waffle-dialog-notifications-label{font-weight:500;padding-bottom:5px}.waffle-notifications-dialog .modal-dialog-buttons{justify-content:space-between}.waffle-notifications-dialog .waffle-notification-addbutton-container .goog-link-button{padding-left:0}.waffle-notification-rule-separator{border-bottom:1px solid #dadce0;clear:both;padding-top:10px}.waffle-notification-helpbutton-container{float:right;margin-right:34px}.waffle-notification-helpbutton-container .goog-link-button{color:#1a73e8}.waffle-notification-bottom-group{padding-bottom:2px}.waffle-notification-end-button{margin-right:0}.sketchy-dialog,.sketchy-dialog-fg{z-index:1003}.waffle-find-replace-dialog-label{padding-right:8px}.waffle-find-replace-dialog-border{border-color:#8cc474;border-style:solid;line-height:0}.waffle-find-replace-dialog-display-message{display:inline-block;line-height:20px;max-width:375px;min-height:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.waffle-findandreplacedialog-checkbox-label{vertical-align:bottom;padding-left:8px}.waffle-find-replace-find-scope-select{margin:8px 8px 8px 0;width:126px}.waffle-find-replace-selection-input{margin-top:8px;vertical-align:top;width:150px}.waffle-find-replace-dialog{min-width:464px}.waffle-find-replace-dialog .modal-dialog-buttons{margin-top:7px}.waffle-find-replace-dialog .find-replace-regex-help{display:inline-block;font:14px Roboto,RobotoDraft,Helvetica,Arial,sans-serif;line-height:16px;margin-left:8px;padding:3px 0;width:auto}.waffle-dv-trrules .waffle-range-selection-container{width:160px}.waffle-dv-table{border-spacing:3px;width:562px}.waffle-dv-table .jfk-checkbox{margin-bottom:1px;margin-left:7px}.waffle-dv-table td{white-space:nowrap}.waffle-dv-helptext{width:310px;margin-left:5px}.waffle-dv-errortext{color:red;font-weight:500}.waffle-dv-smalltext{font-size:10px}.waffle-dv-editbox-number{text-align:right;width:60px}.waffle-dv-editbox-text{width:150px}.waffle-dv-editbox-date{text-align:right;width:100px}.waffle-dv-list-options-textarea{padding-top:5px;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;-webkit-appearance:textfield;width:180px}.waffle-dv-table .jfk-select{float:left;margin-right:10px}.waffle-dv-trrules{height:41px}.waffle-dv-trrules-appearance,.waffle-dv-trrules-showitems{height:26px}.waffle-dv-trrules>td,.waffle-table-dialog-trrules>td{padding-bottom:7px;vertical-align:top}.waffle-dv-trrules>td .input-selection,.waffle-table-dialog-trrules>td .input-selection{margin-left:2px}.waffle-cf-tr-rules .jfk-checkbox{margin-bottom:1px}.waffle-dv-show-dropdown{padding-top:5px;padding-bottom:1px}.waffle-dv-customcheckboxlabel{width:80px;padding-top:11px}.waffle-dv-label{padding-top:5px;padding-left:2px;width:96px;white-space:nowrap}.waffle-dv-label-disabled{color:#d3d3d3}.waffle-dv-separator{margin-left:5px;margin-right:5px}.waffle-dv-highlight-styled-rect{background-color:#0f9d58;opacity:0.06;pointer-events:none}.range-border.waffle-dv-highlight-styled-border{border-color:#0f9d58;border-style:dashed}.waffle-sd-tr-rules{padding-top:7px}.waffle-sd-td-rules{white-space:nowrap;width:50px}.waffle-sd-td-ascending{white-space:nowrap}.waffle-sd-column-selector{width:120px}.waffle-sd-delete{color:#999;cursor:pointer;margin-right:5px;width:10px;text-decoration:none}.waffle-sd-row-separator{border-bottom:1px solid #dadce0;margin-bottom:4px;margin-top:4px}.waffle-sd-add{padding-top:12px;font-weight:500;display:block}.waffle-sd-menu-item{padding-right:30px}.script-gui-dialog-content{padding:0px}.waffle-custom-decimals-error-div{padding-left:.7em;color:#dd4b39}textarea.waffle-input-error:focus,input.waffle-input-error:focus,.waffle-input-error{border:1px solid #dd4b39}.waffle-input-error-butter-container{width:100%;position:absolute;margin-top:-25px;left:0;text-align:center}.waffle-input-error-butter-wrap{display:inline-block;line-height:normal}.dialog-settings-text{max-width:300px;padding-left:25px}.dialog-settings-sep-td{padding:14px 0 9px 0}.dialog-settings-sep{border-top-color:#e8eaed;border-top-style:solid;border-width:1px 0 0 0;color:#bfbfbf;height:0}.jfk-radiobutton-checked .jfk-radiobutton-radio::after{background:#188038;border:4px solid #188038;height:8px;left:0;margin:2px;top:0;width:8px}.jfk-radiobutton-radio{height:16px;width:16px}.jfk-radiobutton-checked.jfk-radiobutton:hover .jfk-radiobutton-radio{border:2px solid #188038}.jfk-radiobutton-checked .jfk-radiobutton-radio{border:2px solid #188038}.jfk-radiobutton:focus .jfk-radiobutton-radio{border:2px solid #188038}.jfk-radiobutton-checked.jfk-radiobutton:focus .jfk-radiobutton-radio{border:2px solid #0d652d}.jfk-radiobutton-checked.jfk-radiobutton:focus .jfk-radiobutton-radio::after{background-color:#0d652d;border:4px solid #0d652d}.dialog-settings-general-settings-div{padding:10px 0 18px 0}.dialog-settings-english-name-div{padding-top:10px}#waffle-settings-dialog-english-name-checkbox-label{padding-left:3px}.waffle-prompt-dialog{width:340px}.waffle-prompt-dialog .modal-dialog-userInput{width:300px;margin:4px}.waffle-spellcheck-cell-display{font-weight:500}.waffle-resize-option{margin:7px}.waffle-resize-inset-input{margin-left:30px}.waffle-resize-row-input-container{margin-left:30px}.waffle-resize-row-input{width:70px}.waffle-resize-row-input-label{margin-left:10px}#waffle-resize-input-error-butter-container{margin-top:-15px}.waffle-confirm-suppress-checkbox{margin-top:8px}.waffle-confirm-learn-more{margin-top:2px}.waffle-slidingdialogbar-wrapper{outline:none;overflow:hidden;width:100%}.waffle-pivot-histogram-errorable-input{display:inline-block;margin:4px;vertical-align:top;width:120px}.waffle-pivot-histogram-dialog-caption{color:rgba(0,0,0,0.54);font-size:11px;padding-top:3px}.waffle-pivot-histogram-dialog-error{color:#db4437;height:15px;margin-top:6px}.waffle-rd-section{padding:8px 0}.waffle-rd-section-title{font-weight:500}.waffle-rd-columns-container{margin-left:-12px;max-height:300px;overflow-x:hidden;overflow-y:auto;padding-top:6px}.waffle-rd-expand-to-range{color:#188038;cursor:pointer;padding-top:2px;text-decoration:underline}.waffle-rd-dialog-gm{min-width:312px}.waffle-rd-ignore-headers{padding-top:6px}.waffle-rd-columns-checkbox{padding-left:12px;position:relative}.waffle-rd-ignore-headers .docs-material-gm-labeled-checkbox,.waffle-rd-columns-checkbox .docs-material-gm-labeled-checkbox{padding:6px 0}.waffle-rd-checkbox-label{display:inline-block;padding-left:5px}.waffle-sort-dialog-gm{min-width:464px}.waffle-sort-dialog-radio-option{display:inline-block;padding-left:8px}.waffle-sd-delete .docs-icon{width:24px;height:24px;margin:0 4px 0 0}.waffle-sd-row-separator{margin-top:16px;margin-bottom:16px}.waffle-sort-dialog-data-header{margin-bottom:25px;overflow:hidden}.waffle-sort-dialog-data-header .docs-material-gm-labeled-checkbox{padding:0}.docs-dialog .modal-dialog-title-close{top:-1px}.modal-dialog.jfk-confirm .modal-dialog-title-close.docs-hc-ie{-ms-high-contrast-adjust:none}.modal-dialog.jfk-confirm .modal-dialog-title-close.docs-hc-gecko:after{background-color:white;filter:invert(1)}.docs-dialog .goog-flat-menu-button{padding-top:7px;padding-bottom:7px}.importThemeLabel{padding:0px 3px}.importThemeOption{padding:5px 7px}.importThemeWarningMessage{color:#9e9e9e;padding:0px 25px}.waffle-dialog-range-suggestion-pill{display:flex;border-radius:20px;cursor:pointer;padding:10px;width:240px}.waffle-dialog-range-suggestion-pill:hover{background:lightgray}.waffle-dialog-range-suggestion-pill-icon{margin-right:9px;min-width:21px}.waffle-dialog-range-suggestion-pill-sheet-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.waffle-dialog-range-suggestion-section{margin-top:24px}.waffle-dialog-range-suggestion-section-header{color:#3c4043;font-family:GoogleSans-Medium,Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;letter-spacing:0.25px;line-height:20px}.goog-palette-cell-selected .goog-palette-colorswatch{background:url("//ssl.gstatic.com/docs/spreadsheets/MainMenuVerSprite007.png") transparent no-repeat;background-position:0px -15px}.goog-palette-cell{border:1px #666 solid}.trix-palette .goog-palette-cell{border:0}.trix-palette .goog-palette-table{border:0;border-spacing:2px;border-collapse:separate;margin:0 4px}.trix-palette .goog-palette-cell-hover{background:#eee}.trix-palette .toolbar-icon,.trix-palette .docs-common-icon{margin:0}.docs-toolbar-menu-button .goog-toolbar-menu-button-caption{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.docs-toolbar-menu-button .goog-toolbar-menu-button-icon{margin-left:3px;margin-right:6px;opacity:1}.docs-toolbar-menu-button .goog-toolbar-menu-button-inner-box{text-align:left}#docs-access-level-indicator.goog-flat-menu-button{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;cursor:pointer;height:24px;line-height:20px;margin:6px 0 6px 8px;padding:0 1px;user-select:none}#docs-access-level-indicator.goog-flat-menu-button-hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#2a8947;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15);cursor:pointer;height:24px;line-height:20px;margin:6px 0 6px 8px;padding:0 1px;user-select:none}#docs-access-level-indicator.goog-flat-menu-button-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#4f9e67;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15);cursor:pointer;height:24px;line-height:20px;margin:6px 0 6px 8px;padding:0 1px;user-select:none}#docs-access-level-indicator.goog-flat-menu-button-hover.goog-flat-menu-button-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#62a877;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15);cursor:pointer;height:24px;line-height:20px;margin:6px 0 6px 8px;padding:0 1px;user-select:none}#docs-access-level-indicator.goog-flat-menu-button-disabled{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;cursor:pointer;height:24px;line-height:20px;margin:6px 0 6px 8px;padding:0 1px;user-select:none;cursor:default;opacity:.38}#docs-access-level-indicator.goog-flat-menu-button-pressed,#docs-access-level-indicator.goog-flat-menu-button:active,#docs-access-level-indicator.goog-flat-menu-button-open,#docs-access-level-indicator.goog-flat-menu-button-hover.goog-flat-menu-button-open,#docs-access-level-indicator.goog-flat-menu-button-focused.goog-flat-menu-button-open{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#62a877;box-shadow:0 2px 6px 2px rgba(52,168,83,0.15);cursor:pointer;height:24px;line-height:20px;margin:6px 0 6px 8px;padding:0 1px;user-select:none}#docs-access-level-indicator .docs-access-level-indicator-icon-container{margin:2px 4px 4px 6px}#docs-access-level-indicator .goog-flat-menu-button-caption{margin-right:20px;font-size:12px;font-weight:500;line-height:21px}#docs-access-level-indicator .goog-flat-menu-button-dropdown{border-bottom-color:#fff;border-top-color:#fff;right:7px;top:10px}.goog-menu.docs-access-level-indicator-menu{border-radius:8px;max-width:272px;padding:22px 24px 24px 24px}.docs-access-level-indicator-menu .docs-access-level-indicator-menu-text{padding:0;font-size:14px;color:#3c4043;line-height:20px;width:196px}.docs-access-level-indicator-menu .docs-access-level-indicator-request-access-button{height:24px;margin:16px 0 0 0;padding:4px 12px;text-transform:none}#docs-approvals-status-indicator-toolbar-separator{margin-right:0px}.docs-gm #docs-primary-toolbars #docs-approvals-locked-menu-button.goog-toolbar-menu-button{cursor:pointer;height:24px;line-height:24px;margin:6px 0 6px 4px;padding:0 4px;user-select:none}#docs-approvals-locked-menu-button .goog-toolbar-menu-button-dropdown{margin-left:2px}.docs-gm #docs-primary-toolbars .docs-approval-status-indicator{cursor:pointer;color:#188038;font-size:14px;font-weight:500;height:26px;letter-spacing:.25px;margin:5px 0px 5px 4px;min-width:unset;padding:0px 12px 0px 9px;user-select:none}.docs-gm #docs-primary-toolbars .docs-approval-status-indicator .docs-icon-img{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_green.svg);cursor:default;margin:-1px 2px 4px 0px}.docs-approval-status-indicator-text{line-height:23px}.docs-icon-inputtools-button-inner{margin:2px 0}.docs-icon-inputtools-menuitem-inner{margin:1px 0;opacity:.70}.docs-icon.docs-icon-inputtools-menuitem-outter,.docs-material .docs-icon.docs-icon-inputtools-menuitem-outter{margin:0 10px 0 12px}.docs-material .docs-icon.docs-icon-inputtools-menuitem-outter,.docs-material #inputToolsToggleButton .docs-icon{width:21px;height:21px}@media print{.docs-ui-unprintable{display:none!important}#docs-editor-container.docs-ui-unprintable{display:none!important}}.docs-fontmenu-icon{left:16px}.docs-fontmenu-text{padding-left:23px}.docs-fontmenu-newlyadded{background-color:#fffecc}.goog-menuitem-highlight.docs-menuitem-add-fonts{border:none;padding-top:6px;padding-bottom:6px}.goog-menuitem-highlight.docs-fontmenu-newlyadded,.goog-menuitem-hover.docs-fontmenu-newlyadded{background-color:#eee}#docs-font-family .goog-toolbar-menu-button-caption{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:70px}.docs-fontmenu .docs-submenuitem{border:none;height:18px;padding:6px 8em 6px 30px}.docs-fontmenu .docs-submenuitem-splitbutton{height:28px;line-height:28px}.docs-fontmenu .docs-submenuitem .goog-menuitem-content{height:17px;line-height:normal}.docs-fontmenu .docs-submenuitem .goog-menuitem-checkbox{height:21px;top:3px}.docs-fontmenu .docs-submenuitem::before{content:'\0025ba';position:absolute;right:0;color:#6e6e6e;width:34px;text-align:center;font-size:70%;line-height:30px;top:0}body[dir="rtl"] .docs-fontmenu .docs-submenuitem::before{content:'\0025c4'}.docs-fontmenu .docs-halfhovermenuitem .goog-submenu-arrow{display:none}#contain-402{bottom:10px;position:fixed;right:50px;z-index:1002}.docs-hats-survey-followup-card{bottom:10px;position:fixed;right:50px;z-index:1002;background-color:#fafafa;border:none;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;box-shadow:rgba(255,255,255,.9) 0 1px 0 inset,rgba(0,0,0,.03) 0 -1px 0 inset,rgba(0,0,0,.15) 0 15px 10px,rgba(0,0,0,.3) 0 8px 36px;padding:20px 26px 10px 16px;width:350px}.docs-hats-survey-followup-card-text{color:#3c4043;font:14px/20px Roboto-Medium,sans-serif;height:46px;padding:12px;width:304px}.docs-hats-survey-followup-card-button-container{text-align:right}.docs-hats-survey-followup-card-button{border-radius:2px;cursor:pointer;display:inline-block;font:14px/20px Roboto-Medium,sans-serif;height:36px;line-height:36px;text-align:center;width:127px}.docs-hats-survey-followup-card-cancel-button{color:#4285f4}.docs-hats-survey-followup-card-survey-button{background-color:#4285f4;color:#fff}.sketchy-dialog.modal-dialog{padding:0}.sketchy-dialog .modal-dialog-title{margin:24px 44px 14px 44px;position:relative}.docs-gm .sketchy-dialog .modal-dialog-title{margin:24px}.sketchy-dialog-title-close{margin-right:0;position:absolute;right:0;top:-8px}.docs-gm .sketchy-dialog-title-close{top:-5px}.sketchy-dialog-title-autosave{color:#999;font-weight:normal;font-size:12px;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;margin-left:24px}.docs-gm .sketchy-dialog-title-autosave{color:#80868b}.waffle-comment-anchor{width:282px}.docos-mole{bottom:28px}.waffle-docos-target-cell-border{border-color:#f4b400}.waffle-docos-target-cell-rect{background-color:#ffe168;opacity:.5;pointer-events:none}.waffle-docos-target-cell-resolved-rect{background-color:#d9d9d9;opacity:.5;pointer-events:none}th.waffle-docos-target-cell-header{background-color:#fcfac6}.waffle-objwrap-gvizchart{background-color:white;height:100%;z-index:18;overflow:hidden}.waffle-embedded-object-overlay{outline:0;position:absolute;z-index:10}.waffle-obj-menu-open{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -763px -13px;border:none;color:#15c;float:right;height:13px;margin:10px;padding:0;text-decoration:none;width:13px}.waffle-obj-menu-open-active,.waffle-obj-menu-open:hover{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -618px -27px}.waffle-obj-message-div{padding:15px 0 15px 15px;font-size:12pt}.waffle-borderless-embedded-object-overlay{border:1px solid #999;margin:0;outline:none;position:absolute;z-index:10;user-select:none;pointer-events:all}.waffle-borderless-embedded-object-container{position:relative}.waffle-borderless-embedded-object-container .waffle-objwrap-gvizchart{background-color:transparent;z-index:15}.waffle-obj-control{position:absolute;z-index:18}.waffle-obj-glasspane-control.waffle-obj-control{z-index:17}.waffle-obj-glasspane-control{left:0;position:absolute;top:0}.waffle-obj-gviz-control{border:1px solid #999;position:absolute;right:-48px;top:-1px}.waffle-obj-drag-component{position:absolute;border:none;background-color:#0096fd}.waffle-selectionbox-background{display:none}.docs-charts-tooltip{z-index:3}.waffle-charts-alert{box-shadow:0px 2px 2px 0px rgba(0,0,0,0.14),0px 3px 1px -2px rgba(0,0,0,0.12),0px 1px 5px 0px rgba(0,0,0,0.2);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;background:rgba(0,0,0,0.87);border-radius:2px;bottom:0;line-height:16px;margin:4px;max-height:93%;max-width:99%;padding:10px 14px;position:absolute;white-space:nowrap;z-index:1000}.waffle-charts-alert-text{color:#fff;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;white-space:normal}.waffle-charts-alert-link-div{float:right;padding-left:35px}a.waffle-charts-alert-link{transition:opacity 250ms cubic-bezier(0.4,0.0,0.2,1);color:#a1c2fa;cursor:pointer;text-decoration:none;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;opacity:0.87;text-transform:uppercase}a.waffle-charts-alert-link:hover{opacity:1}a.waffle-charts-alert-link-close{color:white;margin-left:15px}.waffle-charts-overflow-legend{background-color:#ffffff;border:1px solid #999;position:absolute}.waffle-charts-overflow-legend-scrollbar{position:absolute;top:0;width:10px}.waffle-obj-menu-control{right:5px;top:5px}.waffle-obj-menu-button{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -763px -13px;cursor:pointer;height:13px;width:13px}.waffle-obj-menu-button.waffle-obj-menu-control-active,.waffle-obj-menu-button:hover{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -618px -27px}.waffle-obj-menu-control-material{right:6px;top:6px}.waffle-obj-menu-control-table-chart{right:20px}.waffle-chart-filter-indicator-control{right:6px;top:6px}.waffle-borderless-embedded-object-overlay-focused .waffle-chart-filter-indicator-control{right:24px}.waffle-chart-filter-indicator-control-table-chart{right:20px}.waffle-borderless-embedded-object-overlay-focused .waffle-chart-filter-indicator-control-table-chart{right:38px}.waffle-objwrap-gvizchart div[id^='google-visualization-errors-all-']{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSIjRTBFMEUwIj48cGF0aCBkPSJNOSAxN0g3di03aDJ2N3ptNCAwaC0yVjdoMnYxMHptNCAwaC0ydi00aDJ2NHptMi41IDJoLTE1VjVoMTV2MTR6bTAtMTZoLTE1Yy0xIDAtMiAxLTIgMnYxNGMwIDEgMSAyIDIgMmgxNWMxIDAgMi0xIDItMlY1YzAtMS0xLTItMi0yeiIvPjxwYXRoIGZpbGw9Im5vbmUiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L3N2Zz4="),url("data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgNjAwIDM3MSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMCAxdjFoNjAwVjF6bTAgOTB2MWg2MDB2LTF6bTAgOTF2MWg2MDB2LTF6bTAgOTF2MWg2MDB2LTF6IiBmaWxsPSIjZWVlIi8+PHBhdGggZD0iTTAgMzY2djJoNjAwdi0yeiIgZmlsbD0iI2NmY2ZjZiIvPjwvc3ZnPgo=");background-position:center,0 0;background-repeat:no-repeat,repeat-x;background-size:100px 100px,auto 100%;height:100%;width:100%;white-space:normal}.waffle-objwrap-gvizchart div[id^='google-visualization-errors-all-']>div{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif!important;font-size:14px!important;padding-top:15px;text-align:center}.waffle-objwrap-gvizchart div[id^='google-visualization-errors-all-']>div>span{background-color:transparent!important;color:#db4437!important;display:block}.waffle-objwrap-gvizchart div[id^='google-visualization-errors-all-']>div>span:before{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNiAxNiI+PHBhdGggZmlsbD0iI0RCNDQzNyIgZD0iTTggMEMzLjYgMCAwIDMuNiAwIDhzMy42IDggOCA4IDgtMy42IDgtOC0zLjYtOC04LTh6bS44IDEySDcuMnYtMS42aDEuNlYxMnptMC0zLjJINy4yVjRoMS42djQuOHoiLz48L3N2Zz4K");background-position:0 0;background-repeat:no-repeat;background-size:16px 16px;content:'';display:inline-block;height:16px;margin-right:10px;vertical-align:sub;width:16px}div.ac-datavalidation-renderer{z-index:1001;overflow:auto;box-shadow:1px 2px 5px rgba(0,0,0,0.4)}div.ac-datavalidation-renderer-upside-down{z-index:1001;overflow:auto;box-shadow:1px 0 5px rgba(0,0,0,0.4)}.waffle-ac-renderer{margin:0px 0px;padding:0;z-index:85;overflow:visible;position:absolute;white-space:nowrap;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:normal;line-height:22px;border:1px solid rgba(0,0,0,0.2);background:#fff;box-shadow:0 2px 4px rgba(0,0,0,.2)}.waffle-ac-row{margin:0;cursor:pointer;padding:2px 10px;color:#666666}.waffle-ac-active{background:#f5f5f5;color:#000;border-top:1px solid #ebebeb;border-bottom:1px solid #ebebeb;padding:1px 10px}.waffle-ac-highlighted{font-weight:500}#docs-chrome{zoom:1}.docs-toolbar .goog-menuitem-highlight{background-color:#e0edfe}.ie8 .goog-toolbar-button-disabled .toolbar-icon,.ie8 .goog-toolbar-button-disabled .docs-icon-img,.ie8 .goog-toolbar-button-disabled .goog-toolbar-button-inner-box,.ie8 .goog-toolbar-menu-button-disabled .toolbar-icon,.ie8 .goog-toolbar-menu-button-disabled .docs-icon-img,.ie8 .goog-toolbar-menu-button-disabled .goog-toolbar-menu-button-caption,.ie8 .goog-toolbar-menu-button-disabled .goog-color-menu-button-indicator,.ie8 .goog-toolbar-menu-button-disabled .goog-toolbar-menu-button-dropdown{filter:alpha(opacity=30)}.close-icon-small{width:12px;background-position:-720px 2px}.docs-icon.goog-menuitem-icon{position:absolute}.goog-clipboard{width:16px}#chart-toolbar-container{width:100%}.chart-toolbar-container-with-omnibox{display:inline-block}#chart-toolbar{border:none;padding:0 30px 0 0;position:absolute;right:0;top:0}#datasheet-toolbar{background:none;border-width:0!important;display:inline;min-height:35px;padding:0}.chart-toolbar-with-omnibox#chart-toolbar{right:40px}.docs-material .chart-toolbar-with-omnibox{background:none}#chart-toolbar-title{padding-top:3px}.chart-toolbar-title-with-omnibox{display:inline-block;vertical-align:middle}#chart-toolbar-title.sheet-toolbar-title{line-height:normal}.sheet-toolbar{min-height:22px}.object-toolbar-secondary{margin-right:13px!important}.sheet-toolbar-title{font-weight:500;vertical-align:middle;line-height:20px;padding:0 6px 0 4px}.goog-color-menu-button-indicator{border-bottom:4px solid #f0f0f0}#num-fmt-currency{margin-top:-250px}#num-fmt-date{margin-top:-100px}.num-fmt{clear:both;height:1em;width:180px}.num-fmt b{display:block;font-weight:normal;float:left}.num-fmt span{display:block;float:right;color:#666;font-size:85%}.currency-fmt{width:120px;font-size:92%;height:0.9em}.date-fmt{width:140px;font-size:92%;height:0.9em}.cond-fmt .goog-color-menu-button-indicator{border-bottom-style:double}#formula-bar{padding:4px 0;background:#e5e5e5;margin-right:auto}#formula-bar table{width:100%;border-spacing:0}#t-formula-bar-label{vertical-align:middle;color:#444;padding:0 8px}#t-formula-bar-label.waffle-formulabar-label-disabled{color:#9fa4b3}#t-formula-bar-input-container{width:100%;padding:0}#t-formula-bar-input{resize:none;border:1px #7f9db9 solid;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;background-color:#ffffff}#t-formula-bar-input.waffle-formulabar-input-disabled{background-color:#eee;border-color:#c0c0c0}#t-formula-bar-input .cell-input{word-wrap:break-word;-webkit-nbsp-mode:space;-webkit-line-break:after-white-space}#t-formula-bar-input .waffle-rich-text-link{color:black;text-decoration:none}.ie8 .goog-toolbar-button-disabled .toolbar-icon,.ie8 .goog-toolbar-button-disabled .docs-icon-img,.ie8 .goog-toolbar-button-disabled .goog-toolbar-button-inner-box,.ie8 .goog-toolbar-menu-button-disabled .toolbar-icon,.ie8 .goog-toolbar-menu-button-disabled .docs-icon-img,.ie8 .goog-toolbar-menu-button-disabled .goog-toolbar-menu-button-caption,.ie8 .goog-toolbar-menu-button-disabled .goog-color-menu-button-indicator,.ie8 .goog-toolbar-menu-button-disabled .goog-toolbar-menu-button-dropdown{filter:alpha(opacity=30)}.docs-toolbar-small-separator+div.goog-toolbar-select{margin-left:-4px}#t-text-rotation-palette .goog-palette-table{border-right:1px solid #dadce0}.waffle-text-rotation-combobox{border-color:transparent}.docs-gm .goog-toolbar-combo-button.waffle-text-rotation-combobox{margin:1px}.waffle-text-rotation-combobox.goog-toolbar-combo-button-hover{background:transparent}.docs-material .waffle-text-rotation-combobox.goog-toolbar-combo-button-hover{background:rgba(0,0,0,.06)}.waffle-text-rotation-combobox .goog-toolbar-combo-button-input{height:28px;width:25px}.waffle-revisions-frame{border-style:none}.waffle-revisions-older-text{color:#676767}.waffle-revisions-container{background-color:#fff;z-index:15;overflow:hidden;position:absolute;left:0}#revisions-toolbar{padding:2px 0}#t-revisions-back{margin-left:6px}#t-revisions-revert,#t-revisions-label{margin:0 8px;font-weight:500}#t-revisions-label{line-height:180%}#t-revisions-highlighted-label{position:absolute;right:6px;top:0;line-height:217%}#t-revisions-highlighted{border:2px solid #ffa82d;background-color:#ffd396;padding:2px}#t-revisions-menu{overflow-y:auto;max-height:75%;width:290px}#t-revisions-menu .goog-menuitem{padding:4px 0px;width:268px;clear:both;height:1em}#t-revisions-menu em{display:block;float:left;white-space:nowrap;text-align:right;font-style:normal;width:134px}#t-revisions-menu span{display:block;float:left;white-space:nowrap;color:#666;width:134px}.waffle-spellcheck-target-cell-rect{background-color:#f8b39b;opacity:.5;pointer-events:none}div.sheet-toolbar{width:100%;background-image:none;min-height:35px;border-bottom:1px solid #d9d9d9;padding:0}.docs-material #docs-toolbar-wrapper{padding-left:30px}.docs-material #docs-toolbar-wrapper.docs-hub-appbar{border-bottom:1px solid #d9d9d9;padding-left:21px}.sheet-toolbar-button{margin:3px 2px 0 0}.sheet-toolbar-title{line-height:35px;padding:0 44px 0 44px}.toolbar-decimal-icon{margin-bottom:-7px}.docs-material .docs-icon.toolbar-decimal-icon{margin-bottom:-4px}.docs-material #t-num-fmt-currency,.docs-material #t-num-fmt-percent{font-size:13px}#formula-bar{background:#fff;border-bottom:1px solid #c0c0c0;height:23px;padding:0;position:relative}#t-formula-bar-input{border:none;bottom:4px;left:0;line-height:13px;position:absolute;right:0;top:4px}.name-box-enabled #t-formula-bar-input{height:100%;line-height:23px;top:0}.formula-bar-with-name-box-wrapper{background-color:#eee;display:flex}#t-formula-bar-input.waffle-formulabar-input-disabled{background-color:#fff;border:none}#t-formula-bar-label{align-items:center;display:flex;float:left;justify-content:center;opacity:.55;padding:0;position:relative;text-align:center;width:45px}.docs-icon-insert-formula{margin-top:-1px}.docs-material .docs-icon-insert-formula{margin-top:0;opacity:.70}.formulabar-disabled#formula-bar{background-color:#f8f8f8}.formulabar-disabled #t-formula-bar-label{color:#9fa4b3;opacity:.4}.formulabar-disabled #t-formula-bar-input{background-color:#f8f8f8!important}.formulabar-disabled .default-formula-text-color{color:#777}#t-formula-bar-input-container{height:100%;padding:0 10px;overflow:hidden;width:auto}.name-box-enabled #t-formula-bar-input-container,.name-box-enabled #t-formula-bar-input-container>div{width:100%}#t-formula-bar-input-container>div{height:100%;overflow-x:hidden;overflow-y:auto;position:relative}#t-formula-bar-progress-bar{float:right;margin-top:7px;padding:0;width:161px}#t-formula-bar-progress-bar .progress-bar-horizontal{width:146px;height:5px;border:1px solid #999;padding:1px;background-color:#fff}#t-formula-bar-progress-bar .progress-bar-thumb{background-color:#ccc}.name-box-enabled .formula-bar{display:inline-flex;width:100%}.formula-bar-separator,.name-box-menu-separator{float:left;width:1px;height:100%;position:relative}.name-box-menu-separator-container{background:#f5f5f5;display:none;margin:1px 1px 2px 0}.formula-bar-separator-container,.waffle-name-box-container:hover .name-box-menu-separator-container{display:inline-flex}.formula-bar-separator>div,.name-box-menu-separator>div{background-color:#ccc;bottom:3px;left:0;position:absolute;right:0;top:3px;width:1px}#formula-bar-dragger{border-bottom:1px solid #c0c0c0;height:4px;margin-top:-5px;position:absolute;width:100%}#formula-bar-dragger.formula-bar-hoverable{cursor:ns-resize}#formula-bar-dragger.formula-bar-hoverable:hover{border-bottom:1px solid #a0a0a0}div.formula-bar-disabled{background-color:#ccc}.waffle-formulabar-cellinput-disabled{background-color:#ccc}#t-merge-menu{margin-right:2px}.docs-material #t-merge-menu{margin-right:1px}.goog-toolbar-color-menu-button .goog-toolbar-menu-button-dropdown{margin-top:9px}.goog-menuitem-mnemonic-separator{font-weight:normal}.docos-actionmenu-outer{width:11px;height:11px}.docos-actionmenu-outer>.docos-docomenu-dropdown{width:11px;height:11px;margin:auto;vertical-align:top;cursor:pointer}.docs-gm .docos-actionmenu-outer>.docos-docomenu-dropdown{background-color:transparent}.docos-actionmenu-outer .goog-toolbar-menu-button-dropdown{width:11px;height:11px;margin:0;padding:0}.docos-actionmenu-outer .goog-toolbar-menu-button-inner-box,.docos-actionmenu-outer .goog-toolbar-menu-button-outer-box{width:11px;min-width:11px;height:11px;min-height:11px}.docos-actionmenu>.goog-menuitem{padding-left:10px;padding-right:10px}.docs-gm .docos-actionmenu>.goog-menuitem{padding-left:15px;padding-right:15px}.docos{color:black;font-family:Arial,sans-serif,sans;font-family:var(--docs-material-font-family,Arial,sans-serif,sans);font-size:13px;white-space:normal}.docs-gm .docos{font-size:14px}.docos .jfk-button{font-family:Arial,sans-serif,sans;font-family:var(--docs-material-header-font-family,Arial,sans-serif,sans);font-weight:700;font-weight:var(--docs-material-font-weight-bold,700)}.docs-gm .docos .jfk-button{margin:0 8px 0 0;min-width:24px;vertical-align:middle}.docs-gm .docos .jfk-button-hover{box-shadow:none;background-color:rgba(0,0,0,.06);background-image:none;cursor:pointer;border-color:transparent!important;border-radius:2px;border-width:1px}.docs-gm .docos .jfk-button-active{box-shadow:none;background-color:rgba(0,0,0,0.12);background-image:none;cursor:pointer;border-color:transparent!important;border-radius:2px;border-width:1px}.docos.docs-gm .jfk-button.jfk-button-standard{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:white;border:1px solid #dadce0!important;color:#188038;height:24px;padding:3px 12px 5px}.docos.docs-gm .jfk-button.jfk-button-standard.jfk-button-disabled{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:white;border:1px solid #f1f3f4!important;color:#3c4043;opacity:0.38;height:24px;padding:3px 12px 5px}.docos.docs-gm .jfk-button.jfk-button-standard.jfk-button-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#e7f5eb;border:1px solid #bbe2c6!important;height:24px;padding:3px 12px 5px}.docos.docs-gm .jfk-button.jfk-button-standard.jfk-button-hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#f8fcf9;border:1px solid #c8e7d1!important;height:24px;padding:3px 12px 5px}.docos.docs-gm .jfk-button.jfk-button-standard.jfk-button-focused.jfk-button-hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#dff2e4;border:1px solid #b5e0c1!important;height:24px;padding:3px 12px 5px}.docos.docs-gm .jfk-button.jfk-button-standard.jfk-button-focused.jfk-button-active{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#dff2e4;border:1px solid transparent!important;box-shadow:0 2px 6px 2px rgba(60,64,67,.15);height:24px;padding:3px 12px 5px}.docos.docs-gm .jfk-button.jfk-button-action{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;height:24px;padding:3px 12px 5px}.docos.docs-gm .jfk-button.jfk-button-action.jfk-button-disabled{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#f1f3f4;color:#3c4043;opacity:0.38;height:24px;padding:3px 12px 5px}.docos.docs-gm .jfk-button.jfk-button-action.jfk-button-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#4f9e67;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15);height:24px;padding:3px 12px 5px}.docos.docs-gm .jfk-button.jfk-button-action.jfk-button-hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#2a8947;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15);height:24px;padding:3px 12px 5px}.docos.docs-gm .jfk-button.jfk-button-action.jfk-button-focused.jfk-button-hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#62a877;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15);height:24px;padding:3px 12px 5px}.docos.docs-gm .jfk-button.jfk-button-action.jfk-button-focused.jfk-button-active{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#188038;color:#fff;background:#62a877;box-shadow:0 2px 6px 2px rgba(52,168,83,0.15);height:24px;padding:3px 12px 5px}.docos .modal-dialog-buttons{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-family:var(--docs-material-header-font-family,Roboto,RobotoDraft,Helvetica,Arial,sans-serif)}.docos .modal-dialog-buttons button{font-weight:500}.docos .modal-dialog-title{font-size:16px}.docs-gm .docos .modal-dialog-title{font-size:22px}.docos .modal-dialog-title-text{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-family:var(--docs-material-header-font-family,Roboto,RobotoDraft,Helvetica,Arial,sans-serif);font-weight:normal}.docs-gm .doco-modal.modal-dialog{width:300px}.docs-gm .doco-modal .modal-dialog-title-text{display:block;width:220px;word-wrap:break-word}.docos.docs-gm .jfk-button.jfk-button-standard{color:#188038}.docos.docs-gm .jfk-button.jfk-button-standard.jfk-button-focused{background-color:#e7f5eb;border-color:#bbe2c6!important}.docos.docs-gm .jfk-button.jfk-button-standard.jfk-button-hover{background-color:#f8fcf9;border-color:#c8e7d1!important}.docos.docs-gm .jfk-button.jfk-button-standard.jfk-button-focused.jfk-button-hover{background-color:#dff2e4;border-color:#b5e0c1!important}.docos.docs-gm .jfk-button.jfk-button-standard.jfk-button-active{background-color:#dff2e4;color:#188038}.docos.docs-gm .jfk-button.jfk-button-action{background-color:#188038;color:#fff}.docos.docs-gm .jfk-button.jfk-button-action.jfk-button-focused{background-color:#4f9e67;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15);color:#fff}.docos.docs-gm .jfk-button.jfk-button-action.jfk-button-hover{background-color:#2a8947;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15);color:#fff}.docos.docs-gm .jfk-button.jfk-button-action.jfk-button-focused.jfk-button-hover{background-color:#62a877;box-shadow:0 1px 3px 1px rgba(52,168,83,0.15);color:#fff}.docos.docs-gm .jfk-button.jfk-button-action.jfk-button-active{background-color:#62a877;box-shadow:0 2px 6px 2px rgba(52,168,83,0.15);color:#fff}.docos.docs-gm .docs-material-gm-checkbox.docs-material-gm-checkbox-checked,.docos.docs-gm .docs-material-gm-checkbox.docs-material-gm-checkbox-checked.docs-material-gm-checkbox-focused{background-color:#188038}.docos.docs-gm .docs-material-gm-checkbox.docs-material-gm-checkbox-checked,.docos.docs-gm .docs-material-gm-checkbox.docs-material-gm-checkbox-focused{border-color:#188038}.docos-anchoreddocoview{background-color:#f5f5f5;cursor:pointer;direction:ltr;position:relative;width:240px;border:none;box-shadow:0 1px 3px rgba(0,0,0,0.3);border-radius:2px}.docs-gm .docos-anchoreddocoview{background-color:#fff;border:1px solid rgba(60,64,67,.15);box-shadow:none;width:282px}.docs-gm .docos-anchoreddocoview:hover{border-color:transparent;box-shadow:0 1px 3px 1px rgba(60,64,67,.15)}.docs-gm .docos-anchoreddocoview.docos-docoview-active,.docs-gm .docos-anchoreddocoview.docos-docoview-active:hover{border-color:transparent;box-shadow:0 2px 6px 2px rgba(60,64,67,.15)}.docs-gm .docos-anchoreddocoview-internal,.docs-gm .docos-anchoreddocoview{border-radius:8px}.docos-docoview-active.docos-anchoreddocoview{cursor:default}.docos-presenceindicator{height:12px;font-size:11px;color:#787878;padding-top:8px}.unfocused-presenceindicator{padding-left:8px;padding-bottom:8px;background-color:white}.docos-anchoreddocoview:focus,.docos-anchoreddocoview:active{outline:0}.docos-anchoreddocoview-internal{max-height:inherit;overflow-y:auto;overflow-x:hidden}.docos-anchoreddocoview-content{overflow-y:auto;overflow-x:hidden}.docos-anchoreddocoview .docos-anchoreddocoview-input-pane{border:none;display:none;padding:8px}.docos-anchoreddocoview .docos-anchoreddocoview-input-pane.docos-draftdiscussionview-input-pane{padding-top:0}.docos-anchoreddocoview .docos-draftdiscussionview-input-pane{background:#fff}.docos-docoview-active.docos-anchoreddocoview .docos-anchoreddocoview-input-pane{display:block}.docos-anchoreddocoview-input-pane .docos-input-textarea{display:block;height:26px}.docos-anchoreddocoview-input-pane .docos-input-buttons{text-align:left}.docos-draftdiscussionview-input-pane{border-top:none!important;padding-top:0}.docos-anchoreddocoview .docos-input-at-reply-message,.docos-anchoreddocoview .docos-input-acl-fixer-message,.docos-anchoreddocoview .docos-input-assignment-message,.docos-anchoreddocoview .docos-input-static-message{color:#777;font-size:12px;font-family:Arial,sans-serif,sans;font-family:var(--docs-material-header-font-family,Arial,sans-serif,sans);margin-top:8px}.docs-gm .docos-anchoreddocoview .docos-input-at-reply-message,.docs-gm .docos-anchoreddocoview .docos-input-acl-fixer-message,.docs-gm .docos-anchoreddocoview .docos-input-assignment-message,.docs-gm .docos-anchoreddocoview .docos-input-static-message{color:#3c4043;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;letter-spacing:0.3px;line-height:16px}.docos-layout-anchored .docos-anchoreddocoview{position:absolute;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;z-index:500}.docos-layout-anchored .docos-docomenu-visible.docos-anchoreddocoview{z-index:502}.docos-layout-anchored .docos-docoview-active.docos-anchoreddocoview{z-index:501}.docos-layout-anchored-shadows .docos-anchoreddocoview{box-shadow:0 2px 4px rgba(0,0,0,0.2)}.docos-anchoreddocoview .docos-input-post{margin-right:10px}.docs-gm .docos-layout-vertical .docos-anchoreddocoview .docos-anchoreddocoview-arrow-inner.docos-assignee-you{background-color:#188038}.docos-anchoredreplyview .docos-find-match{background-color:rgba(140,196,116,0.5)}.docos-anchoredreplyview .docos-selected-find-match{background-color:rgba(140,196,116,1)}.docos-anchoredreplyview:focus{outline:none}.docos-anchoredreplyview,.docos-showrepliesbutton{border:none;border-bottom:1px solid #e5e5e5;padding:3px 8px 5px 8px;zoom:1;background:#f5f5f5;position:static}.docos-anchoreddocoview.docos-docoview-active{box-shadow:0px 3px 6px rgba(0,0,0,0.2)}.docs-gm .docos-anchoredreplyview,.docs-gm .docos-showrepliesbutton,.docs-gm .docos-anchoreddocoview-input-pane{background-color:#fff;border-bottom:none;border-top:1px solid #dadce0}.docs-gm .docos-showrepliesbutton{border-top:none;margin:0px 16px 16px 16px;padding-left:0}.docs-gm .docos-anchoreddocoview-show-replies-on-border .docos-showrepliesbutton{color:#1a73e8;letter-spacing:0.2px;margin:0 8px;padding:0;position:relative;text-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-justify-content:center;justify-content:center}.docs-gm .docos-anchoreddocoview-show-replies-on-border .docos-showrepliesbutton:not([style*="display: none"])+.docos-anchoredreplyview:not([style*="display: none"]),.docs-gm .docos-anchoreddocoview-show-replies-on-border .docos-showrepliesbutton:not([style*="display: none"])~.docos-anchoredreplyview[style*="display: none"]+.docos-anchoredreplyview:not([style*="display: none"]){border-top:none}.docs-gm .docos-anchoreddocoview .docos-anchoredreplyview{padding:8px 0;margin:0 12px}.docs-gm .docos-anchoreddocoview .docos-replyview-first.docos-anchoredreplyview{border-bottom:none;padding:12px 12px 8px 12px;margin:0}.docs-gm .docos-anchoreddocoview-input-pane{padding:12px}.docs-gm .docos-input-buttons{padding-top:8px}.docs-gm .docos-anchoreddocoview.docos-docoview-active{border-radius:8px;box-shadow:0 2px 6px 2px rgba(60,64,67,.15)}.docos-anchoreddocoview .docos-anchoreddocoview-content>.docos-anchoredreplyview:last-of-type,.docos-anchoreddocoview .docos-docoview-rootreply:only-child .docos-anchoredreplyview{padding-bottom:12px}.docos-anchoreddocoview .docos-replyview-first.docos-anchoredreplyview{padding:8px;border-bottom:1px solid #ddd;background:#fff;min-height:36px}.docos-docoview-resolved .docos-anchoredreplyview,.docos-docoview-resolved .docos-showrepliesbutton,.docos-anchoreddocoview.docos-docoview-resolved .docos-replyview-first.docos-anchoredreplyview{background:#eee}.docos-anchoreddocoview .docos-anchoreddocoview-draft .docos-replyview-first.docos-anchoredreplyview{border:none}.docos-anchoredreplyview .docos-anchoredreplyview-avatar{left:0!important;display:block}.docos-anchoredreplyview.docos-replyview-first{border-top:none!important}.docos-anchoredreplyview-header .docos-anchoredreplyview-author{margin:0;margin-top:2px;color:#333;font-family:Arial,sans-serif,sans;font-family:var(--docs-material-header-font-family,Arial,sans-serif,sans);font-size:13px;font-weight:normal;font-weight:var(--docs-material-font-weight-bold,normal);height:18px}.docs-gm .docos-anchoredreplyview-header .docos-anchoredreplyview-author{color:#3c4043;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;letter-spacing:0.25px;line-height:20px;margin-top:0}.docos-anchoreddocoview .docos-anchoreddocoview-input-pane .docos-input-textarea,.docos-anchoredreplyview .docos-anchoredreplyview-body .docos-anchoredreplyview-origin{line-height:1.4}.docs-gm .docos-anchoreddocoview .docos-anchoreddocoview-input-pane .docos-input-textarea{line-height:20px}.docos-anchoredreplyview .docos-anchoredreplyview-body{word-wrap:break-word;color:#333;padding:0}.docs-gm .docos-anchoredreplyview .docos-anchoredreplyview-body{color:#3c4043;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;letter-spacing:0.2px;line-height:20px}.docs-gm .docos-anchoredreplyview .docos-anchoredreplyview-body a{color:#1a73e8}.docos-anchoredreplyview-header .docos-anchoredreplyview-timestamp{margin:0;color:#777;font-size:11px}.docs-gm .badging-enabled-doco .docos-anchoredreplyview-header .docos-anchoredreplyview-timestamp{-webkit-align-items:center;align-items:center;display:-webkit-inline-box;display:-moz-inline-box;display:-ms-inline-flexbox;display:-webkit-inline-flex;display:inline-flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row}.docs-gm .docos-anchoredreplyview-header .docos-anchoredreplyview-timestamp{color:#3c4043;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;line-height:16px;letter-spacing:0.3px}.docs-gm .docos-anchoredreplyview .docos-new-tag{-ms-flex:none;-webkit-flex:none;flex:none;align-items:center;background-color:#1a73e8;border-radius:9px;border:1px solid white;color:white;height:16px;justify-content:center;margin:auto 0 auto 0;overflow:hidden;transform-origin:left;transition:transform 0.2s ease-out,color 0.1s ease-in,border-radius 0.2s ease}.docs-gm .docos-anchoredreplyview .docos-new-tag:not(:hover){border-radius:50%;color:transparent;width:6px;transform:scale(0.375)}.docs-gm .docos-anchoredreplyview span+.docos-new-tag{margin-left:4px}.docos-new-tag{font-weight:600;display:inline-block;font-size:0.75rem;font-family:'Roboto',sans-serif;padding:0 5px}.docos-anchoredreplyview .docos-replyview-resolve-button-plus-one,.docos-anchoredreplyview .docos-accept-suggestion,.docos-anchoredreplyview .docos-reject-suggestion{min-width:28px;width:28px;opacity:0.2}.docos-anchoredreplyview .docos-vote-button,.docos-anchoredreplyview .docos-like-button,.docos-anchoredreplyview .docos-replyview-resolve-button-plus-one,.docos-anchoredreplyview .docos-accept-suggestion,.docos-anchoredreplyview .docos-reject-suggestion{height:28px;margin:0;position:relative;top:auto;right:auto;display:inline-block;vertical-align:middle}.docos-anchoredreplyview .docos-vote-button,.docos-anchoredreplyview .docos-replyview-resolve-button-plus-one,.docos-anchoredreplyview .docos-accept-suggestion,.docos-anchoredreplyview .docos-reject-suggestion{padding:0}.docos-anchoredreplyview .docos-accept-suggestion{right:-1px}.docos-anchoredreplyview .docos-accept-suggestion div,.docos-anchoredreplyview .docos-reject-suggestion div{margin:auto;margin-top:1px}.docos-accept-suggestion{border-radius:3px 0 0 3px}.docos-reject-suggestion{border-radius:0 3px 3px 0}.docos.docs-gm .docos-accept-suggestion path,.docos.docs-gm .docos-reject-suggestion path{fill:#188038}.docos.docs-gm .docos-accept-suggestion.jfk-button-disabled path,.docos.docs-gm .docos-reject-suggestion.jfk-button-disabled path{fill:#3c4043}.docos.docs-gm .docos-accept-suggestion.jfk-button-disabled,.docos.docs-gm .docos-reject-suggestion.jfk-button-disabled{background-color:white;opacity:.38}.docos-accept-suggestion.jfk-button-disabled,.docos-reject-suggestion.jfk-button-disabled{background-color:#f9f9f9}.docos-docoview-active.docos-anchoreddocoview .docos-replyview-control,.docos-docoview-active.docos-showrepliesbutton .docos-replyview-control{display:block}.docos-showrepliesbutton-collapsed{word-wrap:break-word;color:#15c}.docos-showrepliesbutton-collapsed:hover,.docos-anchoreddocoview:hover .docos-showrepliesbutton-collapsed{text-decoration:underline}.docos-anchoreddocoview-show-replies-on-border:hover .docos-showrepliesbutton-collapsed-internal,.docos-anchoreddocoview-show-replies-on-border .docos-showrepliesbutton-collapsed:hover .docos-showrepliesbutton-collapsed-internal,.docos-anchoreddocoview-show-replies-on-border .docos-showrepliesbutton-collapsed-internal:hover{text-decoration:underline}.docs-gm .docos-anchoreddocoview-show-replies-on-border .docos-showrepliesbutton-collapsed{position:relative;width:100%}.docos-anchoreddocoview-show-replies-on-border .docos-showrepliesbutton-line{border-top:1px solid #dadce0;height:50%;position:absolute;top:50%;width:100%}.docs-gm .docos-anchoreddocoview-show-replies-on-border .docos-showrepliesbutton-collapsed-internal{background-color:#fff;display:inline-block;margin:0 20px;overflow-wrap:break-word;padding:0 8px;position:relative;word-wrap:break-word;word-break:break-word}.docos-collapsible-replyview{position:relative;margin:6px 0;padding:0}.docs-gm .docos-collapsible-replyview{margin-bottom:0}.docos-collapsible-replyview.docos-collapsible-replyview-empty{margin:0}.docos-anchoredreplyview .docos-collapsed-replyview{height:78px;overflow:hidden}.docos-show-more,.docos-show-less{color:#15c;display:none;opacity:1;width:100%;outline:none}.docos-show-more:focus,.docos-show-less:focus{text-decoration:underline}.docos-show-more{bottom:0;padding-top:16px;position:absolute;right:0}.docos-anchoreddocoview .docos-show-less,.docos-anchoreddocoview .docos-show-more{cursor:pointer;font-size:11px}.docos-anchoreddocoview .docos-show-less{background:#f5f5f5;padding:2px 0}.docos-anchoreddocoview .docos-show-more{padding:7px 0 2px 0}.docos-anchoreddocoview .docos-replyview-first .docos-show-less{background:#fff}.docos-show-more:hover,.docos-show-less:hover{text-decoration:underline}.docos-anchoreddocoview .docos-show-more{background:#f5f5f5;-ms-filter:none;filter:none}.docos-anchoreddocoview .docos-replyview-first .docos-show-more{background:#fff}.docos-anchoreddocoview.docos-docoview-tesla-conflict:hover .docos-show-more{background:#f5f5f5;-ms-filter:none;filter:none}.docos-anchoreddocoview.docos-docoview-tesla-conflict:hover .docos-replyview-first .docos-show-more{background:#fff}.docos-anchoreddocoview.docos-docoview-active .docos-show-more,.docos-anchoreddocoview.docos-docoview-active:hover .docos-show-more{background:#f5f5f5;-ms-filter:none;filter:none}.docs-gm .docos-anchoreddocoview .docos-show-more,.docs-gm .docos-anchoreddocoview .docos-show-less,.docs-gm .docos-anchoreddocoview.docos-docoview-active .docos-show-more,.docs-gm .docos-anchoreddocoview.docos-docoview-active .docos-show-less,.docs-gm .docos-replyview-first .docos-show-more,.docs-gm .docos-anchoreddocoview.docos-docoview-tesla-conflict:hover .docos-show-more{background:#fff}.docos-anchoreddocoview.docos-docoview-active .docos-replyview-first .docos-show-more,.docos-anchoreddocoview.docos-docoview-active:hover .docos-replyview-first .docos-show-more{background:#fff}.docos-collapsed-replyview>.docos-replyview-static>.docos-show-more{display:block}.docos-anchoreddocoview.docos-docoview-active .docos-show-less{background:#f5f5f5}.docos-anchoreddocoview.docos-docoview-active .docos-replyview-first .docos-show-less{background:#fff}.docos-anchoredreplyview-header{margin:6px 0;height:38px;white-space:nowrap;display:flex}.docs-gm .docos-anchoredreplyview-header{margin-top:0}.docos-replyview-first .docos-anchoredreplyview-header{margin:0;margin-bottom:8px}.docos-anchoreddocoview-draft .docos-replyview-first .docos-anchoredreplyview-header{margin:0}.docos-anchoredreplyview-buttonholder{white-space:nowrap}.docos-anchoreddocoview:hover .docos-reject-suggestion,.docos-anchoreddocoview.docos-docoview-active .docos-reject-suggestion,.docos-anchoreddocoview.docos-docomenu-visible .docos-reject-suggestion,.docos-anchoreddocoview:hover .docos-accept-suggestion,.docos-anchoreddocoview.docos-docoview-active .docos-accept-suggestion,.docos-anchoreddocoview.docos-docomenu-visible .docos-accept-suggestion,.docos-anchoreddocoview:hover .docos-mark-done-button-black,.docos-anchoreddocoview.docos-docoview-active .docos-mark-done-button-black,.docos-anchoreddocoview.docos-docomenu-visible .docos-mark-done-button-black,.docos-anchoreddocoview:hover .docos-replyview-resolve-button,.docos-anchoreddocoview.docos-docoview-active .docos-replyview-resolve-button,.docos-anchoreddocoview.docos-docomenu-visible .docos-replyview-resolve-button,.docos-anchoreddocoview:hover .docos-overflowmenu-outer>.docos-docomenu-dropdown,.docos-anchoreddocoview.docos-docoview-active .docos-overflowmenu-outer>.docos-docomenu-dropdown,.docos-anchoreddocoview.docos-docomenu-visible .docos-overflowmenu-outer>.docos-docomenu-dropdown{opacity:0.7}.docos-anchoreddocoview:hover .docos-mark-done-button-white,.docos-anchoreddocoview.docos-docoview-active .docos-mark-done-button-white,.docos-anchoreddocoview.docos-docomenu-visible .docos-mark-done-button-white{border:1px solid rgba(255,255,255,.7)}.docos-overflowmenu-outer .goog-menu{z-index:600}.docos-anchoredreplyview-buttonholder:hover .docos-reject-suggestion,.docos-anchoredreplyview-buttonholder:hover .docos-replyview-resolve-button{border-top-right-radius:0;border-bottom-right-radius:0}.docos-anchoredreplyview-buttonholder>.docos-reject-suggestion:hover,.docos-anchoredreplyview-buttonholder>.docos-replyview-resolve-button:hover{border-top-right-radius:2px;border-bottom-right-radius:2px}.docos-replyview-first .docos-anchoredreplyview-buttonholder{padding:4px 0 4px 4px}.docos-accept-suggestion{margin-right:-1px}.docos-anchoredreplyview-authortimestamp{padding-left:10px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;-webkit-box-flex:1;box-flex:1;-ms-flex-positive:1;-webkit-flex-grow:1;flex-grow:1}.badging-enabled-doco .docos-anchoredreplyview-authortimestamp span{overflow:hidden;text-overflow:ellipsis}.docs-gm .docos-anchoredreplyview-authortimestamp{display:flex;-webkit-align-items:start;align-items:start;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;-webkit-justify-content:center;justify-content:center}.docos-anchoredreplyview-authortimestamp>*{overflow:hidden;text-overflow:ellipsis}.docs-gm .docos-anchoredreplyview-authortimestamp>*{align-self:stretch}.docos-anchoredreplyview-avatar-holder{max-width:32px}.docs-gm .docos-anchoredreplyview-avatar-holder{height:38px;margin-top:2px;max-width:36px;width:36px}.docos-anchoredreplyview-header .docos-avatar{position:relative}.docs-gm .docos-anchoredreplyview-header .docos-avatar{margin-left:2px;margin-top:2px}.docos-user-presence{width:32px;height:6px}.docs-gm .docos-user-presence{width:36px;height:36px;border-radius:50%;margin-top:-34px;margin-left:0}.docos-replyview-resolve-button-original{display:inline-block;margin:0;opacity:0.2;padding-left:2px;position:relative;padding:0 4px 0 4px;min-width:50px;height:28px;vertical-align:top}.docs-gm .docos-replyview-resolve-button-original{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:white;border:1px solid #dadce0!important;color:#188038;height:24px;padding:3px 12px 5px}.docs-gm .docos-replyview-resolve-button-original:hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#f8fcf9;border:1px solid #c8e7d1!important;height:24px;padding:3px 12px 5px}.docs-gm .docos-replyview-resolve-button{border-radius:3px 0 0 3px;display:inline-block;margin:auto;margin-top:1px;padding:0;position:relative;top:auto;right:auto;vertical-align:middle;width:28px;height:28px}.docs-gm .docos-anchoreddocoview:hover .docos-replyview-resolve-button,.docs-gm .docos-anchoreddocoview.docos-docoview-active .docos-replyview-resolve-button{opacity:1}.docos-anchoredreplyview .docos-replyview-edit{margin-left:0}.docos-anchoredreplyview-origin{word-wrap:break-word;color:#777;margin:8px -8px 0 -8px;padding:8px 8px 4px 8px;border-color:#e5e5e5;border-top-style:solid;border-top-width:1px;font-size:11px;font-style:italic}.docs-gm .docos-anchoredreplyview-origin{color:#80868b;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;line-height:16px}.docos-anchoredreplyview .docos-action-text{color:#707070;font-style:italic;word-wrap:break-word;-ms-word-wrap:break-word;overflow-wrap:break-word}.docs-gm .docos-anchoredreplyview .docos-action-text{color:#80868b;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;letter-spacing:0.2px;line-height:20px}.docos-action-text-bottom-wrapper{padding:8px 0 3px 0;position:relative}.docos-anchoreddocoview .docos-anchoredreplyview:last-of-type .docos-action-text-bottom-wrapper{padding:8px 0 0 0}.docos-assigneeview{border-bottom:solid #dddddd 1px;padding:7px 10px 7px 8px}.docs-gm .docos-assigneeview{border-bottom:solid #dadce0 1px;padding:12px}.docos-assigneeview table{border-spacing:0;width:100%}.docos-assigneeview.docos-assignee-other{background-color:#f2f2f2;color:#333333}.docs-gm .docos-assigneeview.docos-assignee-other{background-color:#e6f4ea;color:#3c4043}.docos-assigneeview.docos-assignee-you{background-color:#4285f4;color:white}.docos.docs-gm .docos-assigneeview.docos-assignee-you{background-color:#188038;color:#fff}.docs-gm .docos-assigneeview-avatar-container{padding:2px}.docos-assigneeview-avatar.docos-avatar{position:relative;display:block}.docos-assigneeview-assigneeinfo{padding:0px 0px 0px 10px;width:100%;max-width:135px}.docs-gm .docos-assigneeview-label{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;letter-spacing:0.3px;line-height:16px}.docos-assigneeview-assignee-text{font-weight:700;font-weight:var(--docs-material-font-weight-bold,700);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.docs-gm .docos-assigneeview-assignee-text{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;letter-spacing:0.25px;line-height:20px}.docos-assigneeview .docos-icon-checkmark-black{margin-top:1px}.docos-assigneeview .docos-icon-checkmark-white{margin-top:6px}.docs-gm .docos-assigneeview .docos-icon-checkmark-white{margin-top:1px}.docos-assigneeview .docos-mark-done-button{width:28px;height:28px;min-width:28px;padding:0px;margin:0px;background:none}.docos-assigneeview .docos-mark-done-button-black{opacity:0.2}.docos.docs-gm .docos-assigneeview .docos-mark-done-button-black{opacity:1}.docos-assigneeview .docos-mark-done-button-white{border:1px solid rgba(255,255,255,.38);opacity:0.7}.docos-assigneeview .docos-mark-done-button-white:hover{border:1px solid rgba(255,255,255,1);opacity:1;background:none}.docs-gm .docos-assigneeview .docos-mark-done-button-white{border:none;opacity:1}.CSS_ASSISTED_WRITING_TAB_ICON{align-items:center;background-color:#f9f9f9;border:.0625em solid #bababa;border-radius:.2em;bottom:.1em;box-sizing:border-box;display:inline-flex;height:1.1em;justify-content:center;margin-left:.3em;position:relative;width:1.8em}.CSS_ASSISTED_WRITING_TAB_ICON_TEXT{color:#bababa;font-size:.6em;font-weight:bold}.CSS_ASSISTED_WRITING_TYPEAHEAD_CONTAINER{color:#80868b!important}.docos-ac{background:#fff;border:1px solid #c8c8c8;font-family:Arial,sans-serif,sans;font-family:var(--docs-material-font-family,Arial,sans-serif,sans);margin:0px 0px;padding:4px 0px 4px 0px;position:absolute;z-index:900}.docs-gm .docos-ac{border-color:transparent;border-radius:8px;box-shadow:0 1px 3px 1px rgba(60,64,67,.15);padding:9px 0px 9px 0px}.docos-ac div{cursor:pointer}.docos-ac .ac-row{height:auto;padding:0px}.docos-ac .ac-active{background-color:#eee}.docos-ac div.active{background-color:#eee}.docs-gm .docos-ac .ac-active,.docs-gm .docos-ac div.active{background-color:#f1f3f4}.docos-ac-highlighted{font-weight:bold}.docos-availability-banner{width:268px;background-color:#fef7e0;left:-12px;padding:8px 0 8px 14px;margin:12px 0 8px 0;display:flex;align-items:center}.availability-icon-size{width:18px;height:18px;margin:1px 2px 2px 1px}.docos-availability-banner-text{width:221px;font-size:12px;padding-left:11px}.docos-avatar{left:0;position:absolute;object-fit:cover}.docs-gm .docos-avatar{border-radius:50%}.docos-avatar-unverified{opacity:0.4}.docs-gm .docos-avatar-unverified{background-color:white;opacity:1}.docos-build-info{font-family:Arial,sans-serif,sans;font-family:var(--docs-material-font-family,Arial,sans-serif,sans);font-size:10px/12px;color:#bbb;text-align:right;padding-right:30px}.docos-build-info a{color:#bbb}.docos-calltoactionview{min-height:36px}.docos-calltoactionview-container{background:#f2f2f2;padding:8px}.docs-gm .docos-calltoactionview-container{background:white;padding:16px}.docos-calltoactionview-headertext{color:#3c4043;line-height:20px;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;vertical-align:top;width:100%}.docos-calltoactionview-body{padding:12px 0}.docos-calltoactionview-collapsible{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;overflow:hidden}.docos-calltoactionview-body a{color:#1a73e8}.docos-calltoactionview-checkbox-container{border-bottom:1px solid #dadce0;margin-bottom:16px;padding-bottom:16px;padding-top:4px}.docos-calltoactionview-checkbox-container .docs-material-gm-checkbox{cursor:pointer}.docos-calltoactionview-dont-show-again-checkbox{margin-bottom:10px}.docos-calltoactionview-dont-show-again-label{color:#3c4043;padding-left:10px;position:relative;top:2px}.docos-calltoactionview-show-more,.docos-calltoactionview-show-less{color:#15c;cursor:pointer;font-size:11px;outline:none;padding-top:4px}.docos-calltoactionview-show-more:hover,.docos-calltoactionview-show-less:hover{text-decoration:underline}.docos-contact-row{height:32px;color:rgb(0,0,0);padding:4px 8px;font-family:Arial,sans-serif,sans;font-family:var(--docs-material-font-family,Arial,sans-serif,sans)}.docs-gm .docos-contact-row{height:36px;padding:6px 8px}.docos-contact-row .docos-avatar{float:left;left:initial;position:relative;padding-right:8px}.docs-gm .docos-contact-row .docos-avatar{padding-right:0;margin-right:8px;margin-top:2px}.docos-contact-row-name,.docos-contact-row-email{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.docos-contact-row-email{color:#777;font-size:0.9em}.docs-gm .docos-contact-row-name{color:#3c4043;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;line-height:20px}.docs-gm .docos-ac-highlighted{font-weight:700}.docs-gm .docos-contact-row-email{color:#3c4043;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;line-height:16px}.docos-delete-dialog{font-size:14px;white-space:normal;width:472px}.docos-delete-dialog .docos-delete-dialog-subtitle{width:424px}.docos-delete-dialog span.docs-material-button-content{font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif}.docos-icon{overflow:hidden;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.docos-icon-img:before{content:url(//ssl.gstatic.com/docs/common/d-icons30.png)}.docos-icon-img-hdpi:before{transform:scale(0.5);transform-origin:0 0;display:inline-block;image-rendering:optimizeSpeed;image-rendering:-moz-crisp-edges;image-rendering:-o-crisp-edges;image-rendering:-webkit-optimize-contrast;image-rendering:optimize-contrast;-ms-interpolation-mode:nearest-neighbor}.docos-icon-img{*background:url(//ssl.gstatic.com/docs/common/d-icons30.png)}.docos-icon-img-container{position:absolute}.docos-icon-thumb-black{top:-88px;left:-4px}.docos-icon-thumb-green{top:-106px;left:-4px}.docos-icon-thumb-size{height:18px;width:18px}.docos-icon-bell{top:-25px;left:-25px}.docos-icon-bell-size{height:13px;width:11px}.docos-icon-insert-comment{top:-48px;left:-1px}.docos-icon-accept-checkmark-black{left:0px;top:0px}.docos-icon-accept-checkmark-white{top:-140px;left:-49px}.docos-icon-accept-checkmark-size{height:21px;width:21px}.docs-gm .docos-icon-accept-checkmark-black{left:-42px;top:-24px}.docs-gm .docos-icon-accept-checkmark-white{top:0;left:-42px}.docs-gm .docos-icon-accept-checkmark-size{height:24px;width:24px}.docos-icon-reject-suggestion-cross{top:-45px;left:-21px}.docos-icon-reject-suggestion-cross-size{height:21px;width:21px}.docs-gm .docos-icon-reject-suggestion-cross-size{height:24px;width:24px}.docos-icon-insert-comment-size{height:14px;width:18px}.docos-icon-overflow-three-dots{left:-25px;top:0px}.docos-icon-overflow-three-dots-size{height:21px;width:14px}.docs-gm .docos-icon-overflow-three-dots{left:0;top:-164px}.docs-gm .docos-icon-overflow-three-dots-size{height:24px;width:14px}.docos-icon-explore{top:-64px;left:-2px}.docos-icon-explore-size{height:21px;width:21px}.docos-hc-edge .docos-icon-img,.docos-hc-gecko .docos-icon-img{filter:invert(100%)}.docos-hc-ie .docos-icon-img{-ms-high-contrast-adjust:none;background-color:white}.docos-icon-instant-docos-ltr{top:-48px;left:12px;height:14px;width:18px;position:absolute;clip:rect(48px,20px,72px,0px)}.docos-icon-instant-docos-rtl{top:-48px;left:60px;height:14px;width:18px;position:absolute;clip:rect(48px,-28px,63px,-48px)}.docos-hc-edge .jfk-checkbox-checked .jfk-checkbox-checkmark::before,.docos-hc-gecko .jfk-checkbox-checked .jfk-checkbox-checkmark::before{content:url(//ssl.gstatic.com/docs/common/d-icons30.png);position:absolute;left:-50px;top:-124px;width:15px;height:15px;clip:rect(125px,65px,140px,51px)}.docs-material>.docos-new-comment-icon>.docos-icon-add-comment{top:-125px;left:-4px}.docs-material>.docos-icon-add-comment-size{height:18px;width:18px}.docs-material .docos-icon-instant-docos-ltr{top:-125px;left:11px;height:18px;width:18px;clip:rect(125px,20px,145px,0px)}.docs-material .docos-icon-instant-docos-rtl{top:-125px;left:59px;height:18px;width:18px;clip:rect(125px,-28px,145px,-48px)}.docs-suggestion-button:not(.jfk-button-disabled) .docs-material .docs-icon-img,.docs-suggestion-button:not(.jfk-button-disabled) .docs-material .docs-icon-img::before{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_green.svg)}.docs-suggestion-button.jfk-button-disabled .docs-material .docs-icon-img,.docs-suggestion-button.jfk-button-disabled .docs-material .docs-icon-img::before{opacity:.38}.docos-input{position:relative;outline:none;zoom:1}.docos-input.docos-input-nohide{display:block!important}.docos-input-contenteditable{cursor:text;text-align:start;word-wrap:break-word}.docos-input-contenteditable:empty:before{color:#80868b;content:attr(placeholder);display:block;pointer-events:none}.docos-input-contenteditable p{margin:0}.docos-input-textarea{box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;-webkit-box-sizing:border-box;color:#999;font-family:Arial,sans-serif,sans;font-family:var(--docs-material-font-family,Arial,sans-serif,sans);font-size:13px;margin:0;overflow-x:hidden;overflow-y:hidden;outline-width:0!important;padding:4px;resize:none;width:100%;border:1px solid #c8c8c8}.docs-gm .docos-input-textarea{border:1px solid #dadce0;border-radius:4px;box-sizing:border-box;color:#3c4043;font-size:14px;line-height:20px;min-height:36px;padding:8px}.docs-gm .docos-input-textarea:focus{border:2px solid #1a73e8;box-shadow:none;padding:7px}.docos-input-textarea:disabled{background-color:#eee!important}*:first-child+html .docos-input-textarea{width:95%}.docos-input-buttons{display:none;zoom:1}.docos-input-buttons-post{font-weight:700;font-weight:var(--docs-material-font-weight-bold,700)}.docos-input-typing>.docos-input-textarea{color:#000}.docs-gm .docos-input-typing>.docos-input-textarea{color:#3c4043}.docos-input-typing>.docos-input-buttons{display:block}.docos-input-assign-to-text{color:#616161;font-style:italic;padding:5px 0 3px 0;word-wrap:break-word}.docos-input-assignment-panel{padding:6px 8px 4px 8px;background-color:#f5f5f5;border-style:solid;border-width:0 1px 1px 1px;border-color:#c8c8c8;margin-bottom:8px;cursor:pointer}.docs-gm .docos-input-assignment-panel{padding:6px 8px 11px 0;background-color:#fff;border:1px solid transparent;border-bottom:1px solid #dadce0;margin-bottom:18px;cursor:pointer}.docos-input-assignment-box{margin:2px 10px 0 0;float:left;width:11px}.docos-anchoreddocoview .docos-input-assignee-text{margin-top:1px}.docos-input-assignee-text{text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:13px;font-family:Arial,sans-serif,sans;font-family:var(--docs-material-font-family,Arial,sans-serif,sans);color:#707070;font-weight:normal;display:inline-block;width:calc(100% - 51px)}.docos-input-assignee-text.docos-input-assignee-text-no-chevron{width:calc(100% - 23px)}.docs-gm .docos-input-assignee-text{margin-top:6px;margin-left:8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:14px;font-family:Arial,sans-serif,sans;font-family:var(--docs-material-font-family,Arial,sans-serif,sans);color:#3c4043;font-weight:normal;display:inline-block;width:calc(100% - 57px)}.docs-gm .docos-input-assignee-text.docos-input-assignee-text-no-chevron{width:calc(100% - 29px)}.docos-streamdocoview .docos-input-assignee-select{margin-top:0px}.docos-assignee-select-focus{border:1px solid #4d90fe!important;border-radius:2px}.docos-input-assignee-select{border:none;-moz-box-shadow:none;-webkit-box-shadow:none;background:none;box-shadow:none;cursor:pointer;float:right;width:24px;height:15px;margin:2px}.docs-gm .docos-anchoreddocoview .docos-input-assignee-select{margin-top:6px}.docos-input-assignee-select .goog-menu-button-caption{padding:0px}.docos-input-assignee-select .goog-menu-button-inner-box{margin:0px}.docos-assignee-select-item{padding:0px;border-width:0px}.docos-assignee-select-item.goog-menuitem-highlight{background-color:#f2f2f2}.goog-menu.goog-menu-vertical.docos-assignee-select-menu{padding:4px 0 4px 0;max-height:222px;overflow-y:auto;box-sizing:border-box}.goog-menu.goog-menu-vertical.docs-gm.docos-assignee-select-menu{padding:8px 0 8px 0}.goog-menu.goog-menu-vertical.docs-gm.docos-assignee-select-menu .docos-assignee-select-item,.goog-menu.goog-menu-vertical.docs-gm.docos-assignee-select-menu .docos-assignee-select-item.goog-menu-item-highlight{border:none;padding:0}.docos-input-assignment-panel .goog-menu-button-dropdown{width:24px;background:url(//ssl.gstatic.com/images/icons/material/system/2x/arrow_drop_down_black_24dp.png) center no-repeat;background-size:24px;opacity:0.54;box-sizing:border-box}.docos-input-assignment-panel .goog-menu-button-dropdown:hover{opacity:0.87}.docos-input-assignment-panel .goog-menu-button-outer-box,.docos-input-assignment-panel .goog-menu-button-inner-box{border-style:none;padding:0}.docos-instant-button-bubble-icon{margin-left:-3px;margin-top:13px}.docs-material .docos-instant-button-bubble-icon{margin-top:11px}.docos-vote-button{font-size:14px;min-width:38px;background-color:rgba(245,245,245,0.2);border-color:rgba(0,0,0,0.01880392);background-image:-moz-linear-gradient(top,rgba(245,245,245,0.2),rgba(241,241,241,0.2));background-image:-ms-linear-gradient(top,rgba(245,245,245,0.2),rgba(241,241,241,0.2));background-image:-o-linear-gradient(top,rgba(245,245,245,0.2),rgba(241,241,241,0.2));background-image:linear-gradient(top,rgba(245,245,245,0.2),rgba(241,241,241,0.2));background-image:-webkit-linear-gradient(top,rgba(245,245,245,0.2),rgba(241,241,241,0.2))}.docos-anchoreddocoview:hover .docos-vote-button,.docos-anchoreddocoview.docos-docoview-active .docos-vote-button,.docos-anchoreddocoview.docos-docomenu-visible .docos-vote-button{background-color:rgba(245,245,245,0.7);border-color:rgba(0,0,0,0.0686274);background-image:-webkit-linear-gradient(top,rgba(245,245,245,0.7),rgba(241,241,241,0.7));background-image:-moz-linear-gradient(top,rgba(245,245,245,0.7),rgba(241,241,241,0.7));background-image:-ms-linear-gradient(top,rgba(245,245,245,0.7),rgba(241,241,241,0.7));background-image:-o-linear-gradient(top,rgba(245,245,245,0.7),rgba(241,241,241,0.7));background-image:linear-gradient(top,rgba(245,245,245,0.7),rgba(241,241,241,0.7))}.docos-vote-button.jfk-button-hover{border:1px solid rgba(198,198,198,0.7)!important}.vote-button-text{color:rgb(51,51,51);opacity:0.2}.docos-anchoreddocoview:hover .vote-button-text,.docos-anchoreddocoview.docos-docoview-active .vote-button-text,.docos-anchoreddocoview.docos-docomenu-visible .vote-button-text{opacity:0.6}.post-has-votes-no-current-user-vote,.jfk-button-hover .vote-button-text,.current-user-has-up-vote{opacity:1!important}.vote-button-text.current-user-has-up-vote{color:#0f9d58}.docos-like-button{padding:0px 4px 0px 4px;min-width:20px;background-color:rgba(245,245,245,0.2);border-color:rgba(0,0,0,0.01880392);background-image:-moz-linear-gradient(top,rgba(245,245,245,0.2),rgba(241,241,241,0.2));background-image:-ms-linear-gradient(top,rgba(245,245,245,0.2),rgba(241,241,241,0.2));background-image:-o-linear-gradient(top,rgba(245,245,245,0.2),rgba(241,241,241,0.2));background-image:linear-gradient(top,rgba(245,245,245,0.2),rgba(241,241,241,0.2));background-image:-webkit-linear-gradient(top,rgba(245,245,245,0.2),rgba(241,241,241,0.2))}.docos-anchoreddocoview:hover .docos-like-button,.docos-anchoreddocoview.docos-docoview-active .docos-like-button,.docos-anchoreddocoview.docos-docomenu-visible .docos-like-button{background-color:rgba(245,245,245,0.7);border-color:rgba(0,0,0,0.0686274);background-image:-webkit-linear-gradient(top,rgba(245,245,245,0.7),rgba(241,241,241,0.7));background-image:-moz-linear-gradient(top,rgba(245,245,245,0.7),rgba(241,241,241,0.7));background-image:-ms-linear-gradient(top,rgba(245,245,245,0.7),rgba(241,241,241,0.7));background-image:-o-linear-gradient(top,rgba(245,245,245,0.7),rgba(241,241,241,0.7));background-image:linear-gradient(top,rgba(245,245,245,0.7),rgba(241,241,241,0.7))}.docos-like-button.jfk-button-hover{border:1px solid rgba(198,198,198,0.7)!important}.docos-like-button .jfk-button-img{margin-top:0px}.docos-like-button .docos-icon{opacity:0.2}.docos-anchoreddocoview:hover .docos-icon,.docos-anchoreddocoview.docos-docoview-active .docos-icon,.docos-anchoreddocoview.docos-docomenu-visible .docos-icon{opacity:0.6}.post-has-votes-no-current-user-vote,.jfk-button-hover .docos-icon,.current-user-has-up-vote{opacity:1!important}.like-button-text{font-size:12px;display:inline-block;vertical-align:middle;color:rgb(51,51,51);opacity:1;margin-left:2px;font-weight:normal}.like-button-text.no-votes{display:none}.docos-spinner{height:100px;overflow:hidden;position:relative}.docos-quantum-spinner{height:28px;left:50%;margin-left:-14px;position:absolute;top:36px;width:28px}.docos-notificationdialog-content{width:500px}.docos-notificationdialog-label{padding:0 3px 0 8px}.docos-notificationdialog-control{padding-left:3px;margin-bottom:12px}.docos-notificationdialog-header{font-weight:700;font-weight:var(--docs-material-font-weight-bold,700);margin-bottom:12px}.docos-notificationdialog-help{position:absolute;right:20px}.docos-overflowmenu-outer{display:inline-block}.docos-overflowmenu-outer>.docos-docomenu-dropdown{border:1px solid transparent;width:14px;height:28px;margin:auto;position:relative;left:-1px;opacity:0.2}.docs-gm .docos-overflowmenu-outer>.docos-docomenu-dropdown{transition:opacity 250ms cubic-bezier(0.4,0.0,0.2,1);border:none;cursor:pointer}.docos-overflowmenu-outer>.docos-docomenu-dropdown:hover,.docos-overflowmenu-outer>.docos-docomenu-dropdown:focus{border:1px solid #4d90fe;border-top-left-radius:0;border-bottom-left-radius:0}.docs-gm .docos-overflowmenu-outer>.docos-docomenu-dropdown:hover,.docs-gm .docos-overflowmenu-outer>.docos-docomenu-dropdown:focus{border:none;background:none;box-shadow:none;opacity:1.0}.docos-overflowmenu-outer .goog-toolbar-menu-button-inner-box,.docos-overflowmenu-outer .goog-toolbar-menu-button-outer-box{min-width:14px;margin:0;padding:0}.docos-overflowmenu-outer .docos-icon{vertical-align:middle;opacity:0.7}.docos-overflowmenu-outer .goog-toolbar-menu-button-dropdown{display:none}.docos-overflowmenu .goog-menuitem,.docs-gm .docos-overflowmenu.goog-menu .goog-menuitem{padding-right:15px;padding-left:15px}.drive-quantum-spinner.active{-webkit-animation:container-rotate 1568ms linear infinite;animation:container-rotate 1568ms linear infinite}@-webkit-keyframes container-rotate{to{-webkit-transform:rotate(360deg)}}@keyframes container-rotate{to{transform:rotate(360deg)}}.spinner-layer{position:absolute;width:100%;height:100%;opacity:0}.spinner-blue{border-color:#4285f4}.spinner-red{border-color:#db4437}.spinner-yellow{border-color:#f4b400}.spinner-green{border-color:#0f9d58}.drive-quantum-spinner.active .spinner-layer.spinner-blue{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,blue-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,blue-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both}.drive-quantum-spinner.active .spinner-layer.spinner-red{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,red-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,red-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both}.drive-quantum-spinner.active .spinner-layer.spinner-yellow{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,yellow-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,yellow-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both}.drive-quantum-spinner.active .spinner-layer.spinner-green{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,green-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,green-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both}@-webkit-keyframes fill-unfill-rotate{12.5%{-webkit-transform:rotate(135deg)}25%{-webkit-transform:rotate(270deg)}37.5%{-webkit-transform:rotate(405deg)}50%{-webkit-transform:rotate(540deg)}62.5%{-webkit-transform:rotate(675deg)}75%{-webkit-transform:rotate(810deg)}87.5%{-webkit-transform:rotate(945deg)}to{-webkit-transform:rotate(1080deg)}}@keyframes fill-unfill-rotate{12.5%{transform:rotate(135deg)}25%{transform:rotate(270deg)}37.5%{transform:rotate(405deg)}50%{transform:rotate(540deg)}62.5%{transform:rotate(675deg)}75%{transform:rotate(810deg)}87.5%{transform:rotate(945deg)}to{transform:rotate(1080deg)}}@-webkit-keyframes blue-fade-in-out{from{opacity:1}25%{opacity:1}26%{opacity:0}89%{opacity:0}90%{opacity:1}100%{opacity:1}}@keyframes blue-fade-in-out{from{opacity:1}25%{opacity:1}26%{opacity:0}89%{opacity:0}90%{opacity:1}100%{opacity:1}}@-webkit-keyframes red-fade-in-out{from{opacity:0}15%{opacity:0}25%{opacity:1}50%{opacity:1}51%{opacity:0}}@keyframes red-fade-in-out{from{opacity:0}15%{opacity:0}25%{opacity:1}50%{opacity:1}51%{opacity:0}}@-webkit-keyframes yellow-fade-in-out{from{opacity:0}40%{opacity:0}50%{opacity:1}75%{opacity:1}76%{opacity:0}}@keyframes yellow-fade-in-out{from{opacity:0}40%{opacity:0}50%{opacity:1}75%{opacity:1}76%{opacity:0}}@-webkit-keyframes green-fade-in-out{from{opacity:0}65%{opacity:0}75%{opacity:1}90%{opacity:1}100%{opacity:0}}@keyframes green-fade-in-out{from{opacity:0}65%{opacity:0}75%{opacity:1}90%{opacity:1}100%{opacity:0}}.spinner-gap-patch{position:absolute;box-sizing:border-box;top:0;left:45%;width:10%;height:100%;overflow:hidden;border-color:inherit}.spinner-gap-patch .spinner-circle{width:1000%;left:-450%}.spinner-circle-clipper{display:inline-block;position:relative;width:50%;height:100%;overflow:hidden;border-color:inherit}.spinner-circle-clipper .spinner-circle{width:200%}.spinner-circle{box-sizing:border-box;height:100%;border-width:3px;border-style:solid;border-color:inherit;border-bottom-color:transparent!important;border-radius:50%;-webkit-animation:none;animation:none}.spinner-circle-clipper.spinner-left .spinner-circle{border-right-color:transparent!important;-webkit-transform:rotate(129deg);transform:rotate(129deg)}.spinner-circle-clipper.spinner-right .spinner-circle{left:-100%;border-left-color:transparent!important;-webkit-transform:rotate(-129deg);transform:rotate(-129deg)}.drive-quantum-spinner.active .spinner-circle-clipper.spinner-left .spinner-circle{-webkit-animation:left-spin 1333ms cubic-bezier(0.4,0.0,0.2,1) infinite both;animation:left-spin 1333ms cubic-bezier(0.4,0.0,0.2,1) infinite both}.drive-quantum-spinner.active .spinner-circle-clipper.spinner-right .spinner-circle{-webkit-animation:right-spin 1333ms cubic-bezier(0.4,0.0,0.2,1) infinite both;animation:right-spin 1333ms cubic-bezier(0.4,0.0,0.2,1) infinite both}@-webkit-keyframes left-spin{from{-webkit-transform:rotate(130deg)}50%{-webkit-transform:rotate(-5deg)}to{-webkit-transform:rotate(130deg)}}@keyframes left-spin{from{transform:rotate(130deg)}50%{transform:rotate(-5deg)}to{transform:rotate(130deg)}}@-webkit-keyframes right-spin{from{-webkit-transform:rotate(-130deg)}50%{-webkit-transform:rotate(5deg)}to{-webkit-transform:rotate(-130deg)}}@keyframes right-spin{from{transform:rotate(-130deg)}50%{transform:rotate(5deg)}to{transform:rotate(-130deg)}}.spinner-fit{position:absolute;top:0;bottom:0;right:0;left:0}.docos-quantum-spinner.active{-webkit-animation:container-rotate 1568ms linear infinite;animation:container-rotate 1568ms linear infinite}.active .spinner-layer.spinner-blue{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,blue-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,blue-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both}.active .spinner-layer.spinner-red{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,red-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,red-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both}.active .spinner-layer.spinner-yellow{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,yellow-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,yellow-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both}.active .spinner-layer.spinner-green{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,green-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,green-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both}.active .spinner-circle-clipper.spinner-left .spinner-circle{-webkit-animation:left-spin 1333ms cubic-bezier(0.4,0.0,0.2,1) infinite both;animation:left-spin 1333ms cubic-bezier(0.4,0.0,0.2,1) infinite both}.active .spinner-circle-clipper.spinner-right .spinner-circle{-webkit-animation:right-spin 1333ms cubic-bezier(0.4,0.0,0.2,1) infinite both;animation:right-spin 1333ms cubic-bezier(0.4,0.0,0.2,1) infinite both}.docos-readonly .hide-on-readonly{display:none!important}.show-on-readonly{display:none}.docos-readonly .show-on-readonly{display:inline-block!important}.docos-resolve-highlight{border:1px solid rgba(0,0,0,0.2)}.docos-resolve-animation{-webkit-transition:all 270ms ease-out;-moz-transition:all 270ms ease-out;-o-transition:all 270ms ease-out;transition:all 270ms ease-out;-webkit-transform:scale(0.3);-moz-transform:scale(0.3);-o-transform:scale(0.3);transform:scale(0.3);-webkit-transform-origin:center top;-moz-transform-origin:center top;-o-transform-origin:center top;transform-origin:center top;opacity:0.3}#docos-shadow-wrapper{position:relative}#docos-shadow{background:#000;background:rgba(0,0,0,0.7);color:#fff;position:absolute;z-index:700;left:0;top:0}#docos-shadow,.docos-shadow-table{height:100%;width:100%}#docos-shadow-description{font-weight:700;font-weight:var(--docs-material-font-weight-bold,700)}#docos-shadow-confirm,#docos-shadow-delete{margin:2px 7px}.docos-smarttodoview{min-height:36px}.docos-smarttodoview-container{padding:8px;background:#f2f2f2}.docs-gm .docos-smarttodoview-container{background:white;padding:16px}.docos-smarttodoview .docos-icon-explore-container{display:inline-block;padding:3px 2px 0px 2px;width:20px;height:20px;opacity:.54}.docos-gm-sidebars .docos-smarttodoview .docos-icon-explore-container{padding-top:5px}.docos-smarttodoview-header{height:38px}.docos-smarttodoview-header table{border-spacing:0}.docos-smarttodoview-headertext{padding-left:8px;width:100%;vertical-align:top}.docos-smarttodoview-headertext-outer{position:relative}.docos-smarttodoview-headertext-inner{position:absolute;padding-top:4px;width:100%;color:#616161;font-weight:700;font-weight:var(--docs-material-font-weight-bold,700);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.docs-gm .docos-smarttodoview-headertext-inner{color:#3c4043;line-height:20px;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:700}.docos-smarttodoview-body{color:#333;padding-bottom:4px;word-wrap:break-word}.docs-gm .docos-smarttodoview-body{border-bottom:1px solid #dadce0;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;margin-bottom:10px;padding-bottom:16px}.docos-gm-sidebars .docos-smarttodoview .docos-input-assign-to-text{color:#3c4043;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:500;line-height:20px}.docos-smarttodoview-showfeedbackdialog-container{display:inline-block;margin-top:8px}.docos-smarttodoview-showfeedbackdialog-button{color:#616161;font-size:12px}.docos-smarttodoview-showfeedbackdialog-button:hover,.docos-smarttodoview-showfeedbackdialog-button:focus{text-decoration:underline;cursor:pointer;outline:none}.docos-smarttodoview-feedback{padding:13px 8px 10px 8px;border-top:1px solid #ddd;background-color:#fff}.docos-smarttodoview-feedback-headertext{color:#333;font-weight:700;font-weight:var(--docs-material-font-weight-bold,700)}.docos-smarttodoview-feedback-checkboxlist{margin:7px 0 7px 0}.docos-smarttodoview-feedback-checkbox-container{margin:4px 0 3px 0}.docos-smarttodoview-feedback-checkbox-container label{cursor:pointer}.docos-smarttodoview-feedback-checkbox-container .jfk-checkbox{border:1px solid rgba(0,0,0,.54);cursor:pointer}.docos-smarttodoview-feedback-checkbox-container .jfk-checkbox-focused{border:1px solid #4d90fe}.docos-smarttodoview-feedback-checkbox-container .jfk-checkbox-hover{border:1px solid #333}.docos-smarttodoview-feedback-checkbox-container .jfk-checkbox-clearOutline{border:1px solid rgba(0,0,0,.54)}.docos-smarttodoview-feedback-checkbox{margin:0 8px 0 4px}.docos-smarttodoview-feedback-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#333;display:inline-block;vertical-align:middle}.docos-smarttodoview-writefeedback-link{margin:2px 0 5px 0;color:#4285f4;cursor:pointer}.docos-streamdocoview{border-top:1px solid #e8e8e8;font-family:Arial,sans-serif,sans;font-family:var(--docs-material-font-family,Arial,sans-serif,sans);font-size:12px;font-size:var(--docs-material-font-size-normal,12px);padding:18px 0 7px 0;position:relative;outline:none;zoom:1}.docs-gm .docos-streamdocoview{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;padding:16px}.docs-gm .docos-streampanemargin-legacy{border:1px solid #dadce0;border-radius:4px;margin:16px 0}.docs-gm .docos-streamdocoview-avatar{left:16px}.docos:not(.docs-gm) .docos-streamdocoview:last-child{padding-bottom:0}.docos:not(.docs-gm) .docos-streamdocoview:last-child .docos-streamdocoview-controls{padding-bottom:0}.docos-streamdocoview .docos-docoview-rootreply{min-height:48px}.docos-streamrootreplyview{margin-right:12px;min-height:51px;padding:0 6px;position:relative;top:-3px}.docs-gm .docos-streamrootreplyview{margin-bottom:8px;padding:0;top:0}.docos:not(.docs-gm) .docos-docoview-resolved .docos-streamrootreplyview{background-color:#f6f6f6}.docos:not(.docs-gm) .docos-docoview-active .docos-streamrootreplyview{background-color:#fffbe1}.docs-gm .docos-streamdocoview.docos-docoview-resolved{background-color:#f1f3f4}.docos.docs-gm .docos-streamdocoview.docos-docoview-active{background-color:#fffbe1}.docos.docs-gm .docos-streamdocoview.docos-docoview-active-experiment{background-color:#e6f4ea}.docos-streamdocoview-content{margin-left:60px;position:relative}.docs-gm .docos-streamdocoview-content{margin-left:40px}.docos-streamdocoview-authorname{font-weight:700;font-weight:var(--docs-material-font-weight-bold,700);font-family:Arial,sans-serif,sans;font-family:var(--docs-material-header-font-family,Arial,sans-serif,sans)}.docs-gm .badging-enabled-doco .docos-streamdocoview-authorname{-webkit-align-items:center;align-items:center;display:-webkit-inline-box;display:-moz-inline-box;display:-ms-inline-flexbox;display:-webkit-inline-flex;display:inline-flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row}.docs-gm .docos-streamdocoview-authorname .docos-new-tag{-ms-flex:none;-webkit-flex:none;flex:none;align-items:center;background-color:#1a73e8;border-radius:9px;border:1px solid white;color:white;height:16px;justify-content:center;margin:auto 0 auto 0;overflow:hidden;transform-origin:left;transition:transform 0.2s ease-out,color 0.1s ease-in,border-radius 0.2s ease;line-height:16px}.docs-gm .docos-streamdocoview-authorname .docos-new-tag:not(:hover){border-radius:50%;color:transparent;transform:scale(0.375);width:6px}.docs-gm .docos-streamdocoview-authorname span+.docos-new-tag{margin-left:4px}.docos-streamdocoview-body{color:#333;word-wrap:break-word;top:-7px;zoom:1}.docos-streamdocoview-timestamp,.docos-streamdocoview-comments-off{color:#5f6368;font-size:11px;font-size:var(--docs-material-font-size-12,11px);padding:0}.docos-streamdocoview-timestamp,.docos-streamdocoview-reopen-control{right:2px}.docos-streamdocoview-bullet{color:#ccc;font-size:12px;line-height:100%;padding:0 2px}.docos-streamdocoview-controls{font-family:Arial,sans-serif,sans;font-family:var(--docs-material-header-font-family,Arial,sans-serif,sans);font-weight:normal;font-weight:var(--docs-material-font-weight-bold,normal);padding:4px 0}.docos-streamdocoview-timestamp:hover{text-decoration:underline;cursor:pointer}.docos-streamdocoview-input-pane{padding-right:6px;margin-left:30px}.docs-gm .docos-streamdocoview-input-pane{margin-left:40px;padding-right:0}.docos-streamdocoview-input-pane .docos-input-textarea{background-color:#fff;border:1px solid #c9d4ec;height:23px;font-size:12px}.docs-gm .docos-streamdocoview-input-pane .docos-input-textarea{border:1px solid #dadce0;border-radius:4px;box-sizing:border-box;color:#3c4043;font-size:14px;line-height:20px;min-height:36px;padding:8px;height:unset}.docs-gm .docos-streamdocoview-input-pane .docos-input-textarea:focus{border:2px solid #1a73e8;box-shadow:none;padding:7px}.docos-streamdocoview-input-pane.docos-input-typing .docos-input-textarea{background-color:#fff}.docos-streamdocoview-edit-pane .docos-input-textarea{height:36px}.docos-streamdocoview-inputcontainer,.docos-streamdocoview-replycontainer{margin:4px 12px 3px 0}.docs-gm .docos-streamdocoview-inputcontainer,.docs-gm .docos-streamdocoview-replycontainer{margin:0}.docos-streamdocoview-inputcontainer{background-color:#eff2f9;-moz-border-radius:0 0 6px 6px;-webkit-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;padding:6px 0 2px 6px;position:relative;zoom:1}.docs-gm .docos-streamdocoview-inputcontainer{background-color:white;border:1px solid #dadce0;-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;padding:16px}.docos-docoview-resolved .docos-streamdocoview-inputcontainer{background-color:#f6f6f6}.docs-gm .docos-docoview-resolved .docos-streamdocoview-inputcontainer{background-color:white}.docos-streamdocoview-details{position:absolute;right:0;top:0}.docos-streamdocoview.docos-docoview-resolved .docos-streamdocoview-details{right:4px}.docos-streamdocoview .docos-actionmenu-outer{position:absolute;right:-12px;top:3px}.docos-streamdocoview-reopen-control{display:inline}.docos-streamdocoview-reopen-control>.docos-docoview-reopen{font-family:Arial,sans-serif,sans;font-family:var(--docs-material-header-font-family,Arial,sans-serif,sans);font-size:11px;font-size:var(--docs-material-font-size-12,11px);font-weight:normal;font-weight:var(--docs-material-font-weight-bold,normal);color:#15c}.docos-streamdocoview-comment-control>.docos-docoview-comment,.docos-streamdocoview-resolve-control>.docos-docoview-resolve{color:#999;line-height:100%}.docos-streamdocoview-comment-control>.docos-docoview-comment:hover,.docos-streamdocoview-reopen-control>.docos-docoview-reopen:hover,.docos-streamdocoview-resolve-control>.docos-docoview-resolve:hover{text-decoration:underline;cursor:pointer}.docos-streamrootreplyview:hover .docos-docoview-comment,.docos-streamrootreplyview:hover .docos-docoview-resolve,.docos-docoview-active .docos-docoview-comment,.docos-docoview-active .docos-docoview-resolve{color:#15c}.docos-streampane .docos-input-buttons{padding-bottom:6px}.docos-streampane .docos-input-post{margin:0 4px 0 0}.docos-streampane .docos-input-cancel{background:none}.docos-streampane-container{line-height:140%;outline:none}.docos-streampane-content{position:relative}.docos-streampane-notificationslink{color:#15c;cursor:pointer;font-size:12px;position:absolute;right:0;top:-3px}.docos-streampane-notificationslink:hover{text-decoration:underline}.docos-offline .docos-streampane-notificationslink{color:#999;cursor:default}.docos-offline .docos-streampane-notificationslink:hover{text-decoration:none}.docos-streampane-feedbacklink{bottom:-10px;color:#15c;cursor:pointer;font-size:12px;padding-right:5px;padding-top:5px;position:absolute;right:5px;text-decoration:none}.docos-offline .docos-streampane-feedbacklink{display:none}.docos-streampane-readonlytext{color:#333;padding:12px 0 12px 20px}.docos-streampane-bannertext{background-color:#fef7e0;border-top:1px solid #dadce0;border-bottom:1px solid #dadce0;color:#5f6368;font-weight:500;padding:12px 20px 12px 20px;position:relative}.docos-streampane-bannerlink,.docos-streampane-bannerlink:visited{color:#1a73e8;font-weight:400;margin-left:8px}.docs-gm .docos-streampane-bannertext{border-top:0px}.docos-streampane-entryarea{margin:6px 29px 10px 20px;position:relative;zoom:1}.docos-streampane-entryarea-content{margin-left:61px;position:relative;zoom:1}.docos-streampane-username{font-size:12px;font-weight:700;font-weight:var(--docs-material-font-weight-bold,700);margin-bottom:3px;top:-3px}.docos-streampane-title{font-size:1.2em;margin:20px 5px 2px}.docos-streampane-input-pane{top:-4px}.docos-streampane-input-pane .docos-input-post{font-weight:700;font-weight:var(--docs-material-font-weight-bold,700)}.docos-streampane-input-pane .docos-input-textarea{font-size:12px;height:30px}.docos-streamdocoview-inputcontainer .docos-input-at-reply-message,.docos-streamdocoview-inputcontainer .docos-input-acl-fixer-message,.docos-streamdocoview-inputcontainer .docos-input-assignment-message,.docos-streamdocoview-inputcontainer .docos-input-static-message{color:#777;line-height:normal;margin-top:8px}.docos-streampane-error{background-color:#dd4b39;border:1px solid #602019;border-radius:4px;color:#fff;margin:6px;padding:6px;text-align:center}.docos-streampane-header{overflow:hidden;padding:10px 29px 10px 20px;background-color:#f5f5f5}.docs-gm .docos-streampane-header{background-color:white;border-bottom:1px solid #dadce0}.docos-streampane-header .docos-notification-settings,.docos-streampane-header .docos-new-comment-button,.docos-streampane-header .docos-feedback-button,.docos-streampane-header .docos-priority-checkbox{display:inline-block;float:right}.docos-streampane-header .goog-flat-menu-button,.docos-streampane-header .jfk-button{border-color:transparent;background-color:transparent;background-image:none}.docos-streampane-header .goog-flat-menu-button-hover,.docos-streampane-header .goog-flat-menu-button-active,.docos-streampane-header .goog-flat-menu-button-open,.docos-streampane-header .goog-flat-menu-button-focused,.docos-streampane-header .jfk-button-hover,.docos-streampane-header .jfk-button-active,.docos-streampane-header .jfk-button-focused{border-color:#c6c6c6;background-color:#f8f8f8;background-image:-webkit-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-moz-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-ms-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-o-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:linear-gradient(top,#f8f8f8,#f1f1f1)}.docos-streampane-header .goog-flat-menu-button-dropdown{visibility:hidden}.docos-streampane-header .goog-flat-menu-button-hover .goog-flat-menu-button-dropdown,.docos-streampane-header .goog-flat-menu-button-active .goog-flat-menu-button-dropdown,.docos-streampane-header .goog-flat-menu-button-open .goog-flat-menu-button-dropdown,.docos-streampane-header .goog-flat-menu-button-focused .goog-flat-menu-button-dropdown{visibility:visible}.docos-streampane-header .goog-flat-menu-button-disabled .docos-ns-caption-icon{opacity:0.3}.docos-streampane-header .jfk-button-disabled .docos-new-comment-icon{opacity:0.15}.docos-streampane-header .docos-new-comment-button,.docos-streampane-header .docos-feedback-button{margin-left:12px;margin-right:0}.docos-enable-docs-header .docos-stream-view-legacy{padding:0 29px 0 20px}.docos-enable-docs-header .docos-stream-view{position:relative;overflow:auto}.docos-enable-docs-header .docos-stream-view-height{max-height:369px}.docos-enable-docs-header .docos-stream-view-height-legacy{max-height:450px}.docos-enable-docs-header:not(.docs-gm) .docos-stream-view>.docos-streamdocoview:first-child{border-top-color:transparent}.docos-new-comment-icon{display:inline-block;vertical-align:middle;margin:4px 5px 5px 2px;opacity:0.65}.docs-gm .docos-new-comment-icon{opacity:1}.docs-gm .docos-new-comment-button,.docs-gm .docos-notification-settings .goog-flat-menu-button,.docs-gm .docos-priority-checkbox .docs-material-gm-labeled-checkbox .docs-material-gm-labeled-checkbox-label{box-shadow:none;background-color:white;background-image:none;cursor:pointer;border-color:transparent!important;border-radius:2px;border-width:1px;border:none;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;line-height:16px;padding-bottom:1px;padding-left:6px;padding-right:6px;padding-top:2px}.docs-gm .docos-notification-settings .goog-flat-menu-button{margin-right:8px}.docs-gm .docos-notification-settings .goog-flat-menu-button-caption{font-weight:500;vertical-align:middle}.docs-gm .docos-notification-settings .goog-flat-menu-button-dropdown{display:none}.docs-gm .docos-new-comment-button,.docs-gm .docos-notification-settings .goog-flat-menu-button,.docs-gm .docos-priority-checkbox .docs-material-gm-labeled-checkbox-label{background-color:white;color:#188038}.docs-gm .docos-priority-checkbox .docs-material-gm-labeled-checkbox{padding:5px 0}.docs-gm .docos-priority-checkbox .docs-material-gm-labeled-checkbox .docs-material-gm-labeled-checkbox-checkbox{border-color:#188038}.docs-gm .docos-priority-checkbox .docs-material-gm-labeled-checkbox-circle{display:none}.docs-gm .docos-priority-checkbox .docs-material-gm-labeled-checkbox-content{margin-left:0}.docs-gm .docos-new-comment-button.jfk-button-hover,.docs-gm .docos-new-comment-button.jfk-button-focused,.docs-gm .docos-notification-settings .goog-flat-menu-button.goog-flat-menu-button-hover,.docs-gm .docos-notification-settings .goog-flat-menu-button.goog-flat-menu-button-focused,.docs-gm .docos-priority-checkbox .docs-material-gm-labeled-checkbox-hover,.docs-gm .docos-priority-checkbox .docs-material-gm-labeled-checkbox-focused,.docs-gm .docos-priority-checkbox .docs-material-gm-labeled-checkbox-hover .docs-material-gm-labeled-checkbox-label,.docs-gm .docos-priority-checkbox .docs-material-gm-labeled-checkbox-focused .docs-material-gm-labeled-checkbox-label{box-shadow:none;background-color:#e6f4ea;background-image:none;cursor:pointer;border-color:transparent!important;border-radius:2px;border-width:1px}.docs-gm .docos-new-comment-button.jfk-button-active,.docs-gm .docos-notification-settings .goog-flat-menu-button.goog-flat-menu-button-open{box-shadow:none;background-color:#ceead6;background-image:none;cursor:pointer;border-color:transparent!important;border-radius:2px;border-width:1px}.docos-notification-settings .goog-option-selected{background-image:none}.docos-notification-settings .goog-option-selected .goog-menuitem-checkbox{content:url(//ssl.gstatic.com/ui/v1/menu/checkmark.png);margin-left:-3px;margin-top:3px}.docos-notification-settings .goog-menuitem-highlight.goog-option-selected .goog-menuitem-checkbox{margin-top:2px}.docs-gm .docos-new-comment-button.jfk-button-disabled{background-color:white;color:#f1f3f4;cursor:default}.docs-gm .docos-streampane-content .docos-streampane-submit-feedback-container{max-height:369px;overflow:auto}.docs-gm .docos-streampane-content .docos-streampane-submit-feedback-container .docos-stream-view-height{max-height:none;overflow:visible}.docs-gm .docos-streampane-content .docos-streampane-submit-feedback{box-shadow:none;background-color:#f1f3f4;background-image:none;cursor:pointer;border-color:transparent!important;border-radius:2px;border-width:1px;border-radius:1000px;color:#3c4043;font-weight:500;margin:16px;padding:5px 15px}.docs-gm .docos-streampane-content .docos-stream-view-legacy .docos-streampane-submit-feedback{margin-bottom:0;margin-left:0;margin-right:0}.docs-gm .docos-streampane-content .docos-streampane-submit-feedback.jfk-button-hover,.docs-gm .docos-streampane-content .docos-streampane-submit-feedback.jfk-button-focused{box-shadow:none;background-color:#e8eaed;background-image:none;cursor:pointer;border-color:transparent!important;border-radius:2px;border-width:1px;border-radius:1000px}.docos-ns-caption-icon{display:inline-block;vertical-align:middle;margin:4px 5px 5px 2px}.docs-gm .docos-ns-caption-icon{margin-left:0}.docos-gm-notification-icon-path,.docos-new-comment-icon-path{fill:#188038}.jfk-button-disabled .docos-new-comment-icon-path{fill:#f1f3f4}.docos-ns-caption{text-align:left}.docs-gm .docos-ns-caption{height:27px}.docos-ns-caption-text{display:inline-block;height:17px}.docs-gm .docos-ns-caption-text{line-height:16px;height:16px}.docos-ns-caption-placeholder{visibility:hidden}.docos-streamreplyview{background-color:#eff2f9;color:#666;font-size:12px;padding:6px 6px 0 6px;position:relative;margin-bottom:3px;min-height:24px}.docos-streamreplyview,.docos-streamrootreplyview{outline:none}.docs-gm .docos-streamreplyview{background-color:white;border:1px solid #dadce0;border-radius:4px;font-size:14px;margin-bottom:8px;padding:16px}.docos-docoview-resolved .docos-streamreplyview{background-color:#f6f6f6}.docs-gm .docos-docoview-resolved .docos-streamreplyview{background-color:white}.docos-streamreplyview-avatar{left:6px}.docs-gm .docos-streamreplyview-avatar{left:16px}.docos-streamreplyview-content{padding-left:30px}.docs-gm .docos-streamreplyview-content{padding-left:40px}.docos-streamreplyview-author{color:black;font-weight:700;font-weight:var(--docs-material-font-weight-bold,700)}.docos:not(.docs-gm) .docos-streamreplyview-author{left:-2px;margin:0 4px;right:-2px}.docs-gm .badging-enabled-doco .docos-streamreplyview-author{-webkit-align-items:center;align-items:center;display:-webkit-inline-box;display:-moz-inline-box;display:-ms-inline-flexbox;display:-webkit-inline-flex;display:inline-flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row}.docs-gm .docos-streamreplyview-author{color:#3c4043;letter-spacing:0.25px;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;line-height:20px;padding-right:8px}.docs-gm .docos-streamreplyview .docos-new-tag{-ms-flex:none;-webkit-flex:none;flex:none;align-items:center;background-color:#1a73e8;border-radius:9px;border:1px solid white;color:white;height:16px;justify-content:center;margin:auto 0 auto 0;overflow:hidden;transform-origin:left;transition:transform 0.2s ease-out,color 0.1s ease-in,border-radius 0.2s ease;line-height:16px}.docs-gm .docos-streamreplyview .docos-new-tag:not(:hover){border-radius:50%;color:transparent;transform:scale(0.375);width:6px}.docs-gm .docos-streamreplyview span+.docos-new-tag{margin-left:4px}.docos-streamreplyview-body{color:#333;margin:0;top:-4px;width:100%;word-wrap:break-word}.docos-streamreplyview-text,.docos-streamreplyview-timestamp{position:relative;top:-3px}.docos-streamreplyview-text{width:100%}.docos-streamreplyview-origin{padding-bottom:4px;font-style:italic}.docos-streamreplyview-origin,.docos-streamreplyview-timestamp{color:#999;font-size:11px;white-space:pre}.docos-streamdocoview .docos-streamreplyview .docos-replyview-control{display:inline;top:-3px}.docos-streamreplyview-edit-pane .docos-input-textarea{height:23px}.docos-streamdocoview .docos-replyview-quote{border-left:1px solid #ccc;font-style:italic;font-size:12px;padding:3px 10px 3px 10px;position:relative;zoom:1;word-wrap:break-word}.docs-gm .docos-streamdocoview .docos-replyview-quote{margin:8px 0;padding:0 8px 0 16px;border-left-width:3px}.docs-gm .docos-streamdocoview .docos-replyview-quote{border-left-color:#188038}.docos-replyview-quote-caption{font-size:11px;font-weight:normal;font-weight:var(--docs-material-font-weight-bold,normal);color:#999;margin-right:2px;padding:0}.docs-gm .docos-replyview-quote-caption{color:#3c4043;letter-spacing:0.8px;line-height:21px;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;text-transform:uppercase}.docos-replyview-quote-collapsed{overflow:hidden;height:18px;padding-left:3px}.docs-gm .docos-replyview-quote-collapse{height:21px;padding-left:0}.docos-replyview-quote-expand{background:#fff;padding:3px 5px 0 5px;position:absolute;right:0;top:0}.docs-gm .docos-replyview-quote-expand{padding:0 5px 0 8px}.docos-replyview-quote-collapse,.docos-replyview-quote-expand{color:#15c;visibility:hidden}.docs-gm .docos-replyview-quote-collapse,.docs-gm .docos-replyview-quote-expand{color:#1a73e8}.docos-docoview-active .docos-replyview-quote-collapse,.docos-docoview-active .docos-replyview-quote-expand{visibility:visible}.docos-docoview-active .docos-replyview-quote-expand{background:#fffbe1}.docos-replyview-quote-collapse:hover,.docos-replyview-quote-expand:hover{cursor:pointer;text-decoration:underline}.docos-streamrootreplyview .docos-action-text,.docos-streamreplyview .docos-action-text{color:#777;font-style:italic;word-wrap:break-word;-ms-word-wrap:break-word;overflow-wrap:break-word}.docs-gm .docos-streamrootreplyview .docos-action-text,.docs-gm .docos-streamreplyview .docos-action-text{color:#3c4043;opacity:0.7}.docos-streamrootreplyview .docos-action-text{display:inline-block}.docos-streamdocoview-content .docos-input-assignment-panel{margin-top:-5px}.docos-textarea{margin:0;padding:2px;font-family:Arial,sans-serif,sans;font-family:var(--docs-material-font-family,Arial,sans-serif,sans);outline-width:0!important;resize:none}.docos-replyview-delete,.docos-replyview-edit{color:#15c;font-size:11px;margin:0 2px}.docos-replyview-delete:hover,.docos-replyview-edit:hover{text-decoration:underline;cursor:pointer}.docos-input-cancel{margin:0 0}.docos-input-post{margin:8px 7px 0 0}.docos-root-reply-action-text-wrapper{padding:8px 0 0 0;position:relative}.docos-hc-ie .jfk-checkbox{-ms-high-contrast-adjust:none!important;background-color:white!important}.peoplekitComponentsListImplList{list-style:none;margin:0;padding:0}.peoplekitComponentsListImplList:focus{outline:none}.peoplekitComponentsAvatarImplAvatar{-webkit-border-radius:50%;border-radius:50%;overflow:hidden}.peoplekitComponentsAvatarImplContainer{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-direction:row;flex-direction:row;height:inherit;width:inherit}.peoplekitComponentsAvatarImplColumn{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-direction:column;flex-direction:column;-webkit-box-flex:1;-webkit-flex:1;flex:1;overflow:hidden;height:inherit;-webkit-align-items:stretch;align-items:stretch}.peoplekitComponentsAvatarImplRow{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-flex:1;-webkit-flex:1;flex:1;overflow:hidden}.peoplekitComponentsAvatarImplDivider{margin:1px}.peoplekitComponentsAvatarImplImageRoot{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-direction:column;flex-direction:column;-webkit-box-flex:auto;-webkit-flex:auto;flex:auto;-webkit-align-items:center;align-items:center;justify-items:center;-webkit-transition:background 50ms ease-in-out;transition:background 50ms ease-in-out}.isLoading.peoplekitComponentsAvatarImplImageRoot{background-clip:padding-box;background-color:#5f6368}.peoplekitComponentsAvatarImplImage{opacity:1;display:block;-webkit-transition:opacity 50ms ease-in-out;transition:opacity 50ms ease-in-out}.isLoading .peoplekitComponentsAvatarImplImage{opacity:0}.peoplekitComponentsResultlistitemResultListItem{background-color:#fff;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-direction:column;flex-direction:column;height:64px;-webkit-justify-content:center;justify-content:center}.peoplekitComponentsResultlistitemResultListItem.comfortableDensity{height:52px}.peoplekitComponentsResultlistitemResultListItem.compactDensity{height:44px}.peoplekitComponentsResultlistitemResultListItem.isActive{background-color:#e8eaed}.peoplekitComponentsResultlistitemResultListItem.isOutOfOffice{background-color:papayawhip}.peoplekitComponentsResultlistitemResultListItemRow{-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;padding-left:12px;padding-right:12px}.peoplekitComponentsResultlistitemLeft{-webkit-box-flex:initial;-webkit-flex:initial;flex:initial}.peoplekitComponentsResultlistitemCenter{-webkit-box-flex:auto;-webkit-flex:auto;flex:auto;overflow:hidden}.peoplekitComponentsResultlistitemRight{-webkit-box-flex:initial;-webkit-flex:initial;flex:initial}.peoplekitComponentsResultlistitemLabelContainer{-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:flex-start;align-items:flex-start;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;margin-left:12px;margin-right:0}.peoplekitComponentsResultlistitemLabelRow{-webkit-box-flex:initial;-webkit-flex:initial;flex:initial;width:100%}.peoplekitComponentsResultlistitemLabel{letter-spacing:.00625em;font-family:Roboto,Arial,sans-serif;font-size:1rem;font-weight:400;line-height:1.5rem;color:#3c4043;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.peoplekitComponentsResultlistitemResultListItem.comfortableDensity .peoplekitComponentsResultlistitemLabel{line-height:1.375rem}.peoplekitComponentsResultlistitemResultListItem.compactDensity .peoplekitComponentsResultlistitemLabel{letter-spacing:.01428571em;font-family:Roboto,Arial,sans-serif;font-size:.875rem;font-weight:400;line-height:1.125}.peoplekitComponentsResultlistitemSublabel{letter-spacing:.01428571em;font-family:Roboto,Arial,sans-serif;font-size:.875rem;font-weight:400;line-height:1.25rem;color:#5f6368;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.peoplekitComponentsResultlistitemResultListItem.comfortableDensity .peoplekitComponentsResultlistitemSublabel{line-height:1.125rem}.peoplekitComponentsResultlistitemResultListItem.compactDensity .peoplekitComponentsResultlistitemSublabel{letter-spacing:.025em;font-family:Roboto,Arial,sans-serif;font-size:.75rem;font-weight:400;line-height:.875rem}.peoplekitComponentsResultlistitemResultListItem.isDisabled .peoplekitComponentsResultlistitemLabel,.peoplekitComponentsResultlistitemResultListItem.isDisabled .peoplekitComponentsResultlistitemSublabel{color:#3c4043;opacity:.38}.peoplekitComponentsResultlistitemAvatar{position:relative}.peoplekitComponentsResultlistitemResultListItem.isDisabled .peoplekitComponentsResultlistitemAvatar{opacity:.5}.peoplekitComponentsResultlistitemAvatarContainer{height:inherit;width:inherit;position:relative}.peoplekitComponentsResultlistitemAvatarSelectionOverlay{background-color:#1a73e8;-webkit-border-radius:50%;border-radius:50%;height:100%;left:0;opacity:0;position:absolute;top:0;-webkit-transform:scale(0);transform:scale(0);-webkit-transition:transform .15s ease-out;transition:transform .15s ease-out;width:100%}.peoplekitComponentsResultlistitemResultListItem.isSelected .peoplekitComponentsResultlistitemAvatarSelectionOverlay{opacity:1;-webkit-transform:scale(1);transform:scale(1)}.peoplekitComponentsResultlistitemWhiteCheck{fill:#fff;margin:8px}.peoplekitComponentsResultlistitemOutOfOffice{letter-spacing:.01428571em;font-family:Roboto,Arial,sans-serif;font-size:.875rem;font-weight:400;line-height:1.25rem;color:#5f6368;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:none}.peoplekitComponentsResultlistitemDisabledDisableReasonContainer{-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:flex}.peoplekitComponentsResultlistitemDisabledTextIndicator{letter-spacing:.00625em;font-family:Roboto,Arial,sans-serif;font-size:1rem;font-weight:400;line-height:1.5rem;color:#5f6368}.peoplekitComponentsResultlistitemDisabledIconIndicator{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;background-color:#f1f3f4;-webkit-border-radius:50px;border-radius:50px;width:32px;height:32px;margin-left:16px;margin-right:calc(16px - 12px)}.peoplekitComponentsResultlistitemDisabledSelectedIcon{fill:#5f6368}.peolekitUiResultlistHeader{letter-spacing:.07272727em;font-family:Roboto,Arial,sans-serif;font-size:.6875rem;font-weight:500;line-height:1rem;text-transform:uppercase;color:#3c4043;padding-bottom:4px;padding-left:24px;padding-right:0;padding-top:16px}.peolekitUiResultlistGroup{letter-spacing:.01785714em;font-family:Roboto,Arial,sans-serif;font-size:.875rem;font-weight:500;line-height:1.25rem;padding-bottom:4px;padding-top:8px;padding-left:24px;padding-right:0}.peoplekitComponentsAutocompleteInlineContainer,.peoplekitComponentsAutocompleteInlineListContainer{height:100%;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-direction:column;flex-direction:column;overflow:hidden}.isLoading .peoplekitComponentsAutocompleteInlineListContainer,.peoplekitComponentsAutocompleteInlineCircularProgress{display:none}.isLoading .peoplekitComponentsAutocompleteInlineCircularProgress{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-justify-content:center;justify-content:center;-webkit-align-items:center;align-items:center;height:100%}.isLoading .peoplekitComponentsAutocompleteInlineCircularProgress:before,.isLoading .peoplekitComponentsAutocompleteInlineCircularProgress:after{-webkit-box-flex:auto;-webkit-flex:auto;flex:auto}.peoplekitComponentsCircularprogressCircularProgress{display:inline-block;height:40px;position:relative;width:40px}.peoplekitComponentsCircularprogressMessageContainer{height:0;overflow:hidden;position:absolute;width:0}.peoplekitComponentsCircularprogressCircularProgressContainer{width:100%;height:100%}.peoplekitComponentsCircularprogressCircularProgress.isActive .peoplekitComponentsCircularprogressCircularProgressContainer{-webkit-animation:circular-progress-container-rotate 1568ms linear infinite;-webkit-animation:circular-progress-container-rotate 1568ms linear infinite;animation:circular-progress-container-rotate 1568ms linear infinite}.peoplekitComponentsCircularprogressCircularProgressLayer{height:100%;opacity:0;position:absolute;width:100%}.peoplekitComponentsCircularprogressColorOne{border-color:#4285f4}.peoplekitComponentsCircularprogressColorTwo{border-color:#ea4335}.peoplekitComponentsCircularprogressColorThree{border-color:#fbbc04}.peoplekitComponentsCircularprogressColorFour{border-color:#34a853}.peoplekitComponentsCircularprogressCircularProgress.isActive .peoplekitComponentsCircularprogressCircularProgressLayer.peoplekitComponentsCircularprogressColorOne{-webkit-animation:circular-progress-fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,circular-progress-blue-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both;-webkit-animation:circular-progress-fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,circular-progress-blue-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both;animation:circular-progress-fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,circular-progress-blue-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both}.peoplekitComponentsCircularprogressCircularProgress.isActive .peoplekitComponentsCircularprogressCircularProgressLayer.peoplekitComponentsCircularprogressColorTwo{-webkit-animation:circular-progress-fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,circular-progress-red-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both;-webkit-animation:circular-progress-fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,circular-progress-red-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both;animation:circular-progress-fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,circular-progress-red-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both}.peoplekitComponentsCircularprogressCircularProgress.isActive .peoplekitComponentsCircularprogressCircularProgressLayer.peoplekitComponentsCircularprogressColorThree{-webkit-animation:circular-progress-fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,circular-progress-yellow-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both;-webkit-animation:circular-progress-fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,circular-progress-yellow-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both;animation:circular-progress-fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,circular-progress-yellow-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both}.peoplekitComponentsCircularprogressCircularProgress.isActive .peoplekitComponentsCircularprogressCircularProgressLayer.peoplekitComponentsCircularprogressColorFour{-webkit-animation:circular-progress-fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,circular-progress-green-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both;-webkit-animation:circular-progress-fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,circular-progress-green-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both;animation:circular-progress-fill-unfill-rotate 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both,circular-progress-green-fade-in-out 5332ms cubic-bezier(0.4,0.0,0.2,1) infinite both}.peoplekitComponentsCircularprogressGapPatch{position:absolute;-webkit-box-sizing:border-box;box-sizing:border-box;top:0;left:45%;width:10%;height:100%;overflow:hidden;border-color:inherit}.peoplekitComponentsCircularprogressGapPatch .peoplekitComponentsCircularprogressCircle{width:1000%;left:-450%}.peoplekitComponentsCircularprogressCircleClipper{display:inline-block;position:relative;width:50%;height:100%;overflow:hidden;border-color:inherit}.peoplekitComponentsCircularprogressCircleClipper .peoplekitComponentsCircularprogressCircle{width:200%}.peoplekitComponentsCircularprogressCircle{position:absolute;top:0;right:0;bottom:0;left:0;-webkit-box-sizing:border-box;box-sizing:border-box;height:100%;border-width:3px;border-style:solid;border-color:inherit;border-bottom-color:transparent;-webkit-border-radius:50%;border-radius:50%;-webkit-animation:none;-webkit-animation:none;animation:none}.peoplekitComponentsCircularprogressCircleClipper.peoplekitComponentsCircularprogressLeft .peoplekitComponentsCircularprogressCircle{border-right-color:transparent;-webkit-transform:rotate(129deg);-webkit-transform:rotate(129deg);transform:rotate(129deg)}.peoplekitComponentsCircularprogressCircleClipper.peoplekitComponentsCircularprogressRight .peoplekitComponentsCircularprogressCircle{left:-100%;border-left-color:transparent;-webkit-transform:rotate(-129deg);-webkit-transform:rotate(-129deg);transform:rotate(-129deg)}.peoplekitComponentsCircularprogressCircularProgress.isActive .peoplekitComponentsCircularprogressCircleClipper.peoplekitComponentsCircularprogressLeft .peoplekitComponentsCircularprogressCircle{-webkit-animation:circular-progress-left-spin 1333ms cubic-bezier(0.4,0.0,0.2,1) infinite both;-webkit-animation:circular-progress-left-spin 1333ms cubic-bezier(0.4,0.0,0.2,1) infinite both;animation:circular-progress-left-spin 1333ms cubic-bezier(0.4,0.0,0.2,1) infinite both}.peoplekitComponentsCircularprogressCircularProgress.isActive .peoplekitComponentsCircularprogressCircleClipper.peoplekitComponentsCircularprogressRight .peoplekitComponentsCircularprogressCircle{-webkit-animation:circular-progress-right-spin 1333ms cubic-bezier(0.4,0.0,0.2,1) infinite both;-webkit-animation:circular-progress-right-spin 1333ms cubic-bezier(0.4,0.0,0.2,1) infinite both;animation:circular-progress-right-spin 1333ms cubic-bezier(0.4,0.0,0.2,1) infinite both}.peoplekitComponentsCircularprogressCircularProgress.isWarmdown .peoplekitComponentsCircularprogressCircularProgressContainer{-webkit-animation:circular-progress-container-rotate 1568ms linear infinite,circular-progress-fade-out 400ms cubic-bezier(0.4,0.0,0.2,1);-webkit-animation:circular-progress-container-rotate 1568ms linear infinite,circular-progress-fade-out 400ms cubic-bezier(0.4,0.0,0.2,1);animation:circular-progress-container-rotate 1568ms linear infinite,circular-progress-fade-out 400ms cubic-bezier(0.4,0.0,0.2,1)}@keyframes circular-progress-container-rotate{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes circular-progress-container-rotate{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes circular-progress-fill-unfill-rotate{12.5%{-webkit-transform:rotate(135deg);transform:rotate(135deg)}25%{-webkit-transform:rotate(270deg);transform:rotate(270deg)}37.5%{-webkit-transform:rotate(405deg);transform:rotate(405deg)}50%{-webkit-transform:rotate(540deg);transform:rotate(540deg)}62.5%{-webkit-transform:rotate(675deg);transform:rotate(675deg)}75%{-webkit-transform:rotate(810deg);transform:rotate(810deg)}87.5%{-webkit-transform:rotate(945deg);transform:rotate(945deg)}to{-webkit-transform:rotate(1080deg);transform:rotate(1080deg)}}@-webkit-keyframes circular-progress-fill-unfill-rotate{12.5%{-webkit-transform:rotate(135deg);transform:rotate(135deg)}25%{-webkit-transform:rotate(270deg);transform:rotate(270deg)}37.5%{-webkit-transform:rotate(405deg);transform:rotate(405deg)}50%{-webkit-transform:rotate(540deg);transform:rotate(540deg)}62.5%{-webkit-transform:rotate(675deg);transform:rotate(675deg)}75%{-webkit-transform:rotate(810deg);transform:rotate(810deg)}87.5%{-webkit-transform:rotate(945deg);transform:rotate(945deg)}to{-webkit-transform:rotate(1080deg);transform:rotate(1080deg)}}@keyframes circular-progress-blue-fade-in-out{0%{opacity:.99}25%{opacity:.99}26%{opacity:0}89%{opacity:0}90%{opacity:.99}to{opacity:.99}}@-webkit-keyframes circular-progress-blue-fade-in-out{0%{opacity:.99}25%{opacity:.99}26%{opacity:0}89%{opacity:0}90%{opacity:.99}to{opacity:.99}}@keyframes circular-progress-red-fade-in-out{0%{opacity:0}15%{opacity:0}25%{opacity:.99}50%{opacity:.99}51%{opacity:0}}@-webkit-keyframes circular-progress-red-fade-in-out{0%{opacity:0}15%{opacity:0}25%{opacity:.99}50%{opacity:.99}51%{opacity:0}}@keyframes circular-progress-yellow-fade-in-out{0%{opacity:0}40%{opacity:0}50%{opacity:.99}75%{opacity:.99}76%{opacity:0}}@-webkit-keyframes circular-progress-yellow-fade-in-out{0%{opacity:0}40%{opacity:0}50%{opacity:.99}75%{opacity:.99}76%{opacity:0}}@keyframes circular-progress-green-fade-in-out{0%{opacity:0}65%{opacity:0}75%{opacity:.99}90%{opacity:.99}to{opacity:0}}@-webkit-keyframes circular-progress-green-fade-in-out{0%{opacity:0}65%{opacity:0}75%{opacity:.99}90%{opacity:.99}to{opacity:0}}@keyframes circular-progress-left-spin{0%{-webkit-transform:rotate(130deg);transform:rotate(130deg)}50%{-webkit-transform:rotate(-5deg);transform:rotate(-5deg)}to{-webkit-transform:rotate(130deg);transform:rotate(130deg)}}@-webkit-keyframes circular-progress-left-spin{0%{-webkit-transform:rotate(130deg);transform:rotate(130deg)}50%{-webkit-transform:rotate(-5deg);transform:rotate(-5deg)}to{-webkit-transform:rotate(130deg);transform:rotate(130deg)}}@keyframes circular-progress-right-spin{0%{-webkit-transform:rotate(-130deg);transform:rotate(-130deg)}50%{-webkit-transform:rotate(5deg);transform:rotate(5deg)}to{-webkit-transform:rotate(-130deg);transform:rotate(-130deg)}}@-webkit-keyframes circular-progress-right-spin{0%{-webkit-transform:rotate(-130deg);transform:rotate(-130deg)}50%{-webkit-transform:rotate(5deg);transform:rotate(5deg)}to{-webkit-transform:rotate(-130deg);transform:rotate(-130deg)}}@keyframes circular-progress-fade-out{0%{opacity:.99}to{opacity:0}}@-webkit-keyframes circular-progress-fade-out{0%{opacity:.99}to{opacity:0}}.peoplekitComponentsScrollboxScrollbar::-webkit-scrollbar-thumb{background:#ddd;border-bottom:1px solid white;border-left:4px solid white;-webkit-border-radius:8px;border-radius:8px;border-right:4px solid white;border-top:1px solid white;-webkit-box-shadow:none;box-shadow:none;min-height:40px}.peoplekitComponentsScrollboxScrollbar::hover::-webkit-scrollbar-thumb{background:#80868b}.peoplekitComponentsScrollboxScrollbar::-webkit-scrollbar-thumb:hover{background:#80868b}.peoplekitComponentsScrollboxScrollbar::-webkit-scrollbar-thumb:active{background:#5f6368}.peoplekitComponentsScrollboxScrollbar{border:none;outline:none;overflow:auto}.peoplekitComponentsAutocompletePopupContainer{border:0;box-shadow:0 1px 3px 0 rgba(60,64,67,.30),0 4px 8px 3px rgba(60,64,67,.15);background-color:#fff;-webkit-border-radius:4px;border-radius:4px;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-direction:column;flex-direction:column;overflow:hidden;padding-bottom:8px;padding-top:8px;position:absolute;-webkit-user-select:none;z-index:999999}sentinel{}.waffle-banding-sidebar-content{overflow-y:hidden}.waffle-banding-sidebar{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;height:calc(100% - 36px);overflow-y:auto}.waffle-banding-range-picker{border-bottom:1px solid lightgrey;padding:15px 10px}.waffle-banding-range-label{color:#3c4043;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;line-height:20px;padding-bottom:10px}.waffle-banding-header-footer-checkbox-wrapper{border-bottom:1px solid lightgrey;padding:10px 10px 0}.waffle-banding-range-picker,.waffle-banding-header-footer-checkbox-wrapper{border-bottom:0}.waffle-banding-checkbox-wrapper{align-items:flex-start;display:flex;flex-wrap:wrap}.waffle-banding-checkbox-wrapper .docs-material-gm-labeled-checkbox{max-width:none;padding:1px 20px 0 0;width:auto}.waffle-banding-checkbox-wrapper .docs-material-gm-labeled-checkbox:last-child{padding-right:0}.waffle-banding-sidebar-color-picker{padding:15px 10px}.waffle-banding-sidebar-color-picker-label{color:#3c4043;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;font-weight:500;line-height:12px;padding:5px 0}.waffle-banding-color-picker-table,.waffle-banding-color-picker-focused,.waffle-banding-color-picker-hover{border:0;margin:0;outline:none;padding:0;width:0}.waffle-banding-color-picker-table{border-collapse:separate;border-spacing:4px}.waffle-banding-color-picker-cell{border-width:0}.waffle-banding-color-picker-cell:focus{outline:1px solid #5e97f6}.waffle-banding-sidebar-color-tile-wrapper{border:1px solid transparent}.waffle-banding-color-picker-cell-selected .waffle-banding-sidebar-color-tile-wrapper{border:1px solid #4d90fe}.waffle-banding-color-picker-cell-hover .waffle-banding-sidebar-color-tile{border-color:darkgrey}.waffle-banding-sidebar-color-tile{border:1px solid lightgrey;cursor:pointer;height:35px;line-height:35px;margin:1px;vertical-align:middle;width:33px}.waffle-assistant-banding-recommendation .waffle-banding-sidebar-color-tile{width:26px}.waffle-banding-sidebar-color-tile-wrapper .docs-sheet-add .docs-icon{margin-left:7px}.docs-sheet-add .docs-icon-img{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_green.svg)}.waffle-banding-sidebar-color-tile-band{border-bottom:1px solid lightgrey;height:8px;width:100%}.waffle-banding-sidebar-color-tile-band:last-child{border-bottom-width:0}.waffle-banding-sidebar-color-picker-preview{padding:5px}.waffle-banding-sidebar-color-preview{display:flex;padding:5px 0}.waffle-banding-sidebar-color-preview .goog-toolbar-menu-button{margin:0}.waffle-banding-sidebar-color-preview-label{border:1px solid lightgrey;border-radius:4px;box-sizing:border-box;display:inline-block;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;height:36px;letter-spacing:0.25px;line-height:16px;margin-right:5px;padding:9px 24px 11px 24px;text-align:center;vertical-align:middle;width:170px}.waffle-banding-sidebar-color-picker-container{border:1px solid #dadce0;border-radius:4px;margin-top:5px}.waffle-banding-sidebar-custom-color-wrapper{border-bottom:1px solid #dadce0}.waffle-banding-sidebar-color-preview-picker{background-color:#f8f8f8;border-color:#c6c6c6;display:inline-block;margin:0}.waffle-banding-sidebar-color-preview-picker.goog-flat-menu-button-active{background-color:#fff!important}.waffle-banding-sidebar-buttons{margin-bottom:0;padding:0 10px 10px 10px;text-align:right}.waffle-banding-sidebar-buttons .jfk-button{margin-left:16px;margin-right:0}.waffle-named-ranges-edit-buttons{text-align:right}.waffle-banding-sidebar-clear-container{border-top:1px solid lightgrey;bottom:0;left:0;position:absolute;text-align:center;vertical-align:bottom;width:100%}.waffle-banding-sidebar-clear .docs-icon{opacity:1;opacity:unset}.waffle-banding-sidebar-clear .docs-icon-img{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_green.svg)}.waffle-banding-sidebar-clear:hover{background-color:#eee;border-color:darkgrey;color:#424242}.waffle-banding-sidebar-clear-label{padding-left:3px}.waffle-banding-sidebar-color-wrapper{margin-bottom:3px;margin-left:1px}.waffle-banding-sidebar-clear{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:white;color:#188038;border-radius:0!important;cursor:pointer;outline:none}.waffle-banding-sidebar-clear.goog-button-hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#f8fcf9;color:#188038}.waffle-banding-sidebar-clear.goog-button-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#e7f5eb;color:#188038}.waffle-banding-sidebar-clear.goog-button-hover.goog-button-focused{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#dff2e4;color:#188038}.waffle-banding-sidebar-clear.goog-button-active{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#dff2e4;color:#188038;box-shadow:0 2px 6px 2px rgba(60,64,67,.15)}.waffle-conditionalformat-warning{background:#fff;border-bottom:1px solid #bdbdbd;border-left:8px solid #f4b400;box-sizing:border-box;box-shadow:0 1px 4px 0 rgba(0,0,0,0.22);color:#424242;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;line-height:16px;padding:14px 14px 14px 16px;z-index:2}.waffle-conditionalformat-dismiss-warning-button-holder{height:14px;margin-top:6px;width:212px}.waffle-conditionalformat-dismiss-warning-button{color:#3367d6;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;height:14px;line-height:14px;position:absolute;right:14px}.waffle-conditionalformat-scroll-pane{overflow-x:hidden;overflow-y:auto}.jfk-button-clear-outline.waffle-conditionalformat-add-rule-button{border:1px solid #bdbdbd}.waffle-conditionalformat-add-rule-button:focus,.waffle-conditionalformat-add-rule-button:hover{cursor:pointer}.jfk-button-clear-outline.waffle-conditionalformat-add-another-rule-button{border:1px solid #eee}.waffle-conditionalformat-add-another-rule-button:focus,.waffle-conditionalformat-add-another-rule-button:hover{cursor:pointer}.waffle-filterbox-container .waffle-conditionalformat-condition-type-select .goog-flat-menu-button,.waffle-filterbox-container .waffle-conditionalformat-condition-date-select .goog-flat-menu-button,.waffle-filterbox-container .waffle-conditionalformat-arg1,.waffle-filterbox-container .waffle-conditionalformat-arg2,.waffle-filterbox-container .waffle-filterbox-input{width:252px}.waffle-conditionalformat-condition-type-select .goog-flat-menu-button,.waffle-conditionalformat-condition-date-select .goog-flat-menu-button{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#fff;border:1px solid #dadce0!important;font-weight:normal;text-align:left}.waffle-filterbox-boolean-condition-picker-body input{border:1px solid #dadce0;border-radius:4px;box-sizing:border-box;color:#3c4043;padding:1px 8px;font-size:14px;height:36px;margin:8px 0}.waffle-filterbox-boolean-condition-picker-body input:focus{border:2px solid #1a73e8;box-shadow:none;padding:0px 7px}.waffle-conditionalformat-condition-type-select .goog-flat-menu-button,.waffle-conditionalformat-condition-date-select .goog-flat-menu-button{padding-right:8px}.waffle-filterbox-boolean-condition-picker-body{margin:6px 0 8px 0}.waffle-conditionalformat-add-rule-icon{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -83px -24px;height:10px;position:absolute;right:15px;top:18px;width:10px}.waffle-conditionalformat-add-another-rule-icon{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -552px -42px;height:18px;position:absolute;right:18px;top:13px;width:18px}.waffle-conditionalformat-view-pill.waffle-conditionalformat-filter-border{border-left:4px solid #f4b400;padding-left:6px}.waffle-conditionalformat-view-pill:focus,.waffle-conditionalformat-view-pill:hover{background-color:#f3f3f3;outline:none}.waffle-conditionalformat-drag-handle{cursor:move;height:76px;line-height:76px;left:0;position:absolute;top:0;visibility:hidden;width:10px}.waffle-conditionalformat-view-pill:hover .waffle-conditionalformat-drag-handle{visibility:visible}.waffle-conditionalformat-view-pill.waffle-conditionalformat-filter-border .waffle-conditionalformat-drag-handle{left:-4px}.waffle-conditionalformat-drag-handle-icon{background:no-repeat url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png") -716px -17px;height:18px;left:4px;position:absolute;top:29px;width:3px}.waffle-conditionalformat-format-preview{height:54px;line-height:54px;margin-right:10px;position:absolute;text-align:center;width:44px}.waffle-conditionalformat-condition{color:#333;font-size:13px;font-weight:500;line-height:15px;max-height:30px;margin-bottom:4px;overflow:hidden;text-overflow:ellipsis;width:142px}.waffle-conditionalformat-range{color:#555;height:14px;font-size:12px;line-height:14px;overflow:hidden;text-overflow:ellipsis;width:142px}.waffle-conditionalformat-view-pill.waffle-conditionalformat-filter-border .waffle-conditionalformat-delete-button-holder{left:212px}.waffle-conditionalformat-delete-button-holder .waffle-conditionalformat-delete-rule{opacity:0.5}.waffle-conditionalformat-delete-button-holder .waffle-conditionalformat-delete-rule:hover{opacity:1}.waffle-conditionalformat-range-border{border-color:#8cc474;border-style:solid;line-height:0}.waffle-conditionalformat-range-wrapper{color:#444;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px}.waffle-conditionalformat-boolean-format-picker{padding:0 18px}.waffle-conditionalformat-edit-pill-section-label{color:#646464;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:12px;line-height:14px;margin-bottom:6px;margin-top:18px}.waffle-conditionalformat-cancel-button,.waffle-conditionalformat-done-button{cursor:pointer}.waffle-sidebar-content .waffle-conditionalformat-format-button-inner{font-size:13px;font-weight:normal;height:30px;line-height:30px;padding-left:6px;text-align:left}.waffle-conditionalformat-default-style-button,.waffle-conditionalformat-custom-style-button{background:#fff;background-clip:padding-box;cursor:pointer;height:26px;line-height:26px;margin:3px}.waffle-conditionalformat-active-style-check{color:#000;font-weight:500}.waffle-conditionalformat-condition-date-select .jfk-select{margin-top:6px}.waffle-conditionalformat-arg1{margin:6px 6px 0 0;width:196px}.waffle-conditionalformat-arg1-short{width:162px}.waffle-conditionalformat-arg2{margin:6px 6px 0 0;width:162px}.waffle-conditionalformat-multi-arg-content{max-height:135px;overflow:auto}.waffle-filterbox-container .waffle-conditionalformat-multi-arg-content .waffle-conditionalformat-editbox{width:208px}.waffle-conditionalformat-remove{color:#999;cursor:pointer;display:inline;margin:0 0 0 8px}.waffle-conditionalformat-remove .docs-icon{height:24px;margin:0;width:24px}.waffle-filterbox-container .waffle-conditionalformat-editbox{margin:5px 0;width:225px}.waffle-conditionalformat-custom-toolbar{background-color:#fff;border:1px solid #d8d8d8;border-radius:0 0 4px 4px!important;border-top:none;box-sizing:border-box;margin:6px 0;margin-left:-1px;margin-top:0;padding:0 2px;width:100%}.waffle-conditionalformat-gradient-point-holder{margin-bottom:18px}.waffle-conditionalformat-gradient-point-holder-last{margin-bottom:0}.waffle-conditionalformat-gradient-input-holder{margin-right:6px;top:1px;width:90px}.waffle-conditionalformat-gradient-min-input,.waffle-conditionalformat-gradient-mid-input,.waffle-conditionalformat-gradient-max-input{width:66px}.waffle-conditionalformat-gradient-min-input.label-input-label-disabled,.waffle-conditionalformat-gradient-mid-input.label-input-label-disabled,.waffle-conditionalformat-gradient-max-input.label-input-label-disabled{background-color:#ebebe4}.waffle-conditionalformat-gradient-min-color:focus,.waffle-conditionalformat-gradient-mid-color:focus,.waffle-conditionalformat-gradient-max-color:focus{border-color:#4d90fe}.waffle-conditionalformat-gradient-min-color.goog-toolbar-menu-button,.waffle-conditionalformat-gradient-mid-color.goog-toolbar-menu-button,.waffle-conditionalformat-gradient-max-color.goog-toolbar-menu-button{height:27px;margin:0}.jfk-bubble.waffle-error-bubble.waffle-conditionalformat-error-bubble{z-index:1!important}.waffle-conditionalformat-no-suggestions{color:#757575;font-size:12px;font-style:italic;padding-top:12px}.waffle-conditionalformat-suggestion{-ms-flex:1;-webkit-flex:1;flex:1;background-clip:content-box;height:24px;line-height:24px;padding:1px;text-align:center}.waffle-conditionalformat-suggestion-chip{padding-top:14px}.waffle-conditionalformat-suggestion-group{display:flex;-moz-flex-wrap:wrap;-ms-flex-wrap:wrap;-webkit-flex-wrap:wrap;flex-wrap:wrap;border:1px solid #d0d0d0;padding:1px}.waffle-conditionalformat-suggestion-range{font-weight:500}.waffle-conditionalformat-collapsible-suggestions{border-bottom:1px solid #d6d6d6}.waffle-conditionalformat-suggestions-section{padding:18px}.waffle-conditionalformat-suggestion-text{color:#646464;font-size:12px;padding-top:6px}.waffle-conditionalformat-suggestions-title{color:#646464;font-weight:500}.waffle-conditionalformat-suggestions-spinner-container{padding-top:14px;text-align:center}.waffle-conditionalformat-edit-pill-section-header{color:#3c4043;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;margin-bottom:18px;margin-top:25px}.waffle-conditionalformat-range-picker{border-bottom:none;padding:0 18px 18px 18px}.waffle-conditionalformat-boolean-condition-picker,.waffle-conditionalformat-gradient-format-picker{border-top:none;padding:0 18px}.waffle-conditionalformat-slide-pane .waffle-conditionalformat-edit-pill-section-header{margin-top:10px;padding:0 18px}.waffle-conditionalformat-slide-pane .waffle-conditionalformat-edit-pill-button-bar{padding:12px 18px 18px 24px}.waffle-conditionalformat-slide-frame,.waffle-conditionalformat-slide-pane{position:absolute;width:100%}.waffle-conditionalformat-condition-type-select .jfk-select,.waffle-conditionalformat-condition-date-select .jfk-select{margin:0;width:100%}.waffle-conditionalformat-default-boolean-picker{width:100%}.waffle-conditionalformat-arg1-holder,.waffle-conditionalformat-arg2,.waffle-conditionalformat-arg1{width:100%}.waffle-conditionalformat-arg2,.waffle-conditionalformat-arg1{padding-left:8px;padding-right:8px}.waffle-conditionalformat-arg-separator{color:#424242;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;margin:0 7px}.waffle-conditionalformat-twoArgs-holder{align-items:center;display:flex;justify-content:space-evenly}.waffle-sidebar-content .waffle-conditionalformat-format-button{border-radius:4px 4px 0 0!important;font-size:14px;height:36px;left:-1px;margin:0}.waffle-conditionalformat-format-button.goog-flat-menu-button,.waffle-conditionalformat-format-button .goog-flat-menu-button-caption,.waffle-conditionalformat-format-button-inner{width:100%}.waffle-conditionalformat-default-menu .goog-palette-table{width:100%}.waffle-conditionalformat-default-menu{border-radius:4px;width:262px}.waffle-conditionalformat-custom-style-button{padding:0 6px;text-align:left;width:auto}.waffle-conditionalformat-default-style-button{height:31px;line-height:30px;margin-left:1px;margin-right:0;width:69px}.waffle-conditionalformat-default-menu .trix-palette .goog-palette-table{margin:0px}.waffle-conditionalformat-default-menu .goog-palette.trix-palette{padding:5px}.waffle-conditionalformat-default-menu .trix-palette .goog-palette-cell{padding:5px}.waffle-conditionalformat-edit-pill-button-bar{position:relative;text-align:right;padding:0 18px 24px 18px;border-bottom:1px solid #dadce0}.waffle-conditionalformat-done-button{margin-right:0px}.waffle-conditionalformat-add-another-rule-button{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:white;color:#188038;background-color:#fff;padding:16px 24px;text-align:left;width:100%}.waffle-conditionalformat-add-another-rule-plus,.waffle-conditionalformat-add-rule-plus{font-size:24px;font-weight:100;line-height:21px;margin-right:8px;vertical-align:text-bottom}.waffle-conditionalformat-default-gradient-picker{width:100%}.waffle-conditionalformat-gradient-min-color .goog-toolbar-menu-button-inner-box,.waffle-conditionalformat-gradient-mid-color .goog-toolbar-menu-button-inner-box,.waffle-conditionalformat-gradient-max-color .goog-toolbar-menu-button-inner-box{min-width:30px}.waffle-conditionalformat-gradient-min-select .jfk-select,.waffle-conditionalformat-gradient-mid-select .jfk-select,.waffle-conditionalformat-gradient-max-select .jfk-select{margin:0 6px 0 0;text-align:left;width:123px}.waffle-conditionalformat-gradient-input-holder input{width:100%}.waffle-conditionalformat-gradient-point{align-items:center;display:flex;justify-content:flex-start}.waffle-conditionalformat-gradient-point .jfk-select{height:36px;margin-top:1px;width:123px}.waffle-conditionalformat-delete-button-holder{height:56px;left:250px!important;line-height:56px;position:absolute}.waffle-conditionalformat-delete-button-holder .docs-icon{width:21px;height:21px}.waffle-conditionalformat-view-pill{background-color:#fff;border-bottom:1px solid #ccc;cursor:pointer;display:flex;height:56px;padding:10px;position:relative}.waffle-conditionalformat-view-pill-summary{left:56px;margin-bottom:auto;margin-right:8px;margin-top:auto;position:relative;width:142px}.waffle-conditionalformat-add-rule-button{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:white;color:#188038;height:44px;padding-top:17px;text-align:left;width:100%}.waffle-conditionalformat-drag-item{border:1px solid #ccc;width:280px}.waffle-conditionalformat-range-args-holder .waffle-conditionalformat-arg1-holder,.waffle-conditionalformat-range-args-holder .waffle-conditionalformat-arg2-holder,.waffle-conditionalformat-range-args-holder .waffle-conditionalformat-arg1{display:flex;-ms-flex:1;-webkit-flex:1;flex:1;overflow:hidden}.waffle-conditionalformat-range-args-holder .waffle-conditionalformat-arg2{-ms-flex:1;-webkit-flex:1;flex:1;margin-right:0;overflow:hidden}.waffle-conditionalformat-range-slider{margin-top:10px}.waffle-find-replace-active-cell-rect{-webkit-animation-name:waffle-find-replace-pulse;-moz-animation-name:waffle-find-replace-pulse;-o-animation-name:waffle-find-replace-pulse;animation-name:waffle-find-replace-pulse;-webkit-animation-duration:200ms;-moz-animation-duration:200ms;-o-animation-duration:200ms;animation-duration:200ms;-webkit-animation-timing-function:ease-in-out;-moz-animation-timing-function:ease-in-out;-o-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;background-color:rgba(140,196,116,0.5);border:1px solid white;border-radius:1px;box-shadow:0px 0px 0px 2px black,0 2px 3px 0 rgba(60,64,67,0.30),0 6px 10px 4px rgba(60,64,67,0.15);margin:-1px 0 0 -1px;pointer-events:none;position:absolute}.waffle-find-replace-not-active-cell-rect{background-color:rgba(140,196,116,0.25);pointer-events:none;position:absolute}@keyframes waffle-find-replace-pulse{from{-webkit-transform:scale(1.1,1.3);-moz-transform:scale(1.1,1.3);-ms-transform:scale(1.1,1.3);-o-transform:scale(1.1,1.3);transform:scale(1.1,1.3);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}}#waffle-gotobar-button-go{margin-right:8px}.docs-slidingdialog .docs-icon-next{filter:alpha(opacity=40);opacity:.40;-moz-opacity:.40}#waffle-gotobar-input{width:200px}.waffle-gotobar-rangematcher-row-icon{width:20px}.waffle-gotobar-rangematcher-row-suggestion{padding:5px}.waffle-gotobar-rangematcher-row-message{color:#aaa;padding:5px}#waffle-gotobar-error{color:#dd4b39;cursor:default;padding:0 7px 0 0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}#waffle-gotobar-error-icon{background:#dd4b39;-webkit-border-radius:10px;-moz-border-radius:10px;border-radius:10px;color:white;display:inline-block;font-weight:500;padding:0 5px;position:relative;text-decoration:none;top:-1px}#waffle-named-ranges-container{border:none;height:auto;overflow-y:auto}#waffle-named-ranges-add-range{background:white;border-bottom:1px solid #ddd;color:#188038;cursor:pointer;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;line-height:16px;height:auto;padding:13px 10px 13px 10px}.waffle-named-ranges-add-range-active{color:#dd4b39}.waffle-named-ranges-add-range-inactive{color:#15c}.waffle-named-ranges-add-range-icon{margin-top:-1px}.waffle-named-ranges-add-range-icon .docs-icon-img{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_green.svg)}.waffle-named-ranges-pill{border-bottom:1px solid #ddd;cursor:default;padding:10px 20px 10px 20px;position:relative}.waffle-named-ranges-pill:focus,.waffle-named-ranges-pill:hover{background-color:white;outline:none}#waffle-named-ranges-add-range,#waffle-named-ranges-add-range:focus{outline:none}#waffle-named-ranges-add-range:hover{background-color:#f8fcf9}#waffle-named-ranges-add-range:focus,.waffle-named-ranges-pill:not(.waffle-named-ranges-edit-pill):focus{background-color:#e7f5eb}#waffle-named-ranges-add-range:active{background-color:#dff2e4}.waffle-named-ranges-range-name,.waffle-named-ranges-range-rect,.waffle-named-ranges-edit-range-name{overflow:hidden;text-overflow:ellipsis}.waffle-named-ranges-pill:focus .waffle-named-ranges-edit-range-button,.waffle-named-ranges-pill:hover .waffle-named-ranges-edit-range-button{display:inline-block}.waffle-named-ranges-edit-range-button{box-shadow:none;background-color:transparent;background-image:none;cursor:pointer;border-color:transparent!important;border-radius:2px;border-width:1px;color:#15c;cursor:pointer;display:none;position:absolute;right:24px;top:13px}#waffle-named-ranges-edit-delete{box-shadow:none;background-color:white;background-image:none;cursor:pointer;border-color:transparent!important;border-radius:2px;border-width:1px;float:none;margin-left:4px;margin-right:0;top:0}#waffle-named-ranges-edit-delete .docs-icon{height:24px;margin:0;width:24px}.waffle-named-ranges-edit-range-button.jfk-button-hover,#waffle-named-ranges-edit-delete.jfk-button-hover,#waffle-named-ranges-edit-delete.jfk-button-focus{box-shadow:none;background-color:rgba(0,0,0,.06);background-image:none;cursor:pointer;border-color:transparent!important;border-radius:2px;border-width:1px}.waffle-named-ranges-edit-range-button.jfk-button-active,#waffle-named-ranges-edit-delete.jfk-button-active{box-shadow:none;background-color:rgba(0,0,0,0.12);background-image:none;cursor:pointer;border-color:transparent!important;border-radius:2px;border-width:1px}.waffle-named-ranges-range-name{font-size:14px;font-weight:500}.waffle-named-ranges-edit-pill{background-color:#fff;cursor:default}.waffle-named-ranges-edit-title-bar{padding:12px 0}.waffle-named-ranges-edit-range-name{font-size:15px;font-weight:500;margin:0;max-width:190px}.waffle-named-ranges-add-range-name-input{margin:5px 0 10px;position:relative;top:2px;width:calc(100%)}.waffle-named-ranges-add-range-name-input.waffle-named-ranges-add-range-name-input-with-delete{width:calc(100% - 32px)}.waffle-named-ranges-select-error{border-color:#dd4b39}.waffle-named-ranges-range-select-listening{background-color:transparent;background-color:unset;margin:0 -20px 0;padding:10px 20px;padding-top:0}.waffle-named-ranges-edit-range-select-done{margin-top:16px}.waffle-named-ranges-edit-range-select-message{color:#3c4043;display:none;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;font-weight:400;margin-top:3px;width:110px}.waffle-named-ranges-range-select-listening .waffle-named-ranges-edit-range-select-message{display:inline-block}.waffle-named-ranges-edit-done,.waffle-named-ranges-edit-cancel{margin-top:10px}.waffle-named-ranges-edit-buttons{text-align:right}.waffle-named-ranges-edit-buttons .jfk-button{margin-left:16px;margin-right:0}#waffle-named-ranges-edit-validation-error{font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:400;margin-top:10px}#waffle-named-ranges-edit-validation-error-text{color:#dd4b39;padding:0 7px 0 0}#waffle-named-ranges-edit-validation-error-icon{background:#dd4b39;-webkit-border-radius:10px;-moz-border-radius:10px;border-radius:10px;color:white;display:inline-block;font-weight:500;padding:0 5px;position:relative;text-decoration:none;top:-1px}#waffle-named-ranges-promo{border-radius:8px;background-color:#e6f4ea;cursor:default;margin:16px;padding:16px}.waffle-named-ranges-promo-title{align-items:center;color:#188038;display:flex;font-size:14px;font-weight:500;margin-bottom:10px}.waffle-named-ranges-promo-title .docs-icon{margin:0 8px 0 0}.waffle-named-ranges-promo-title-text{font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500}.waffle-named-ranges-promo-content{color:#188038;font-size:12px;letter-spacing:.3px;margin:24px 0}.waffle-named-ranges-promo-example{align-items:center;background-color:#fff;border-radius:4px;color:#202124;display:flex;margin-top:8px;padding:8px}.waffle-named-ranges-promo-example .docs-icon{margin:0 4px 0 0}.waffle-named-ranges-promo-example .docs-icon-img:before{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_grey_dark.svg)}.waffle-named-ranges-promo-example .docs-icon-img{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_grey_dark.svg)}.waffle-named-ranges-promo-separator{background-color:#ddd;border:none;color:#ddd;height:1px;margin:20px 0 20px;width:95%}.waffle-named-ranges-promo-formulabar{border:solid #f3f3f3;border-width:10px 0 10px 0;margin:15px 0 20px}.waffle-named-ranges-promo-footer{display:flex;justify-content:flex-end}.waffle-named-ranges-promo-footer a{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#e6f4ea;color:#188038;display:inline-block}.waffle-named-ranges-promo-footer a:hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#e6f4ea;color:#188038;text-decoration:none}.waffle-named-ranges-promo-footer a:focus,.waffle-named-ranges-promo-footer a:hover:focus{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#ceead6;color:#188038}.waffle-named-ranges-promo-footer a:active,.waffle-named-ranges-promo-footer a:hover:active{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#ceead6;color:#188038;box-shadow:0 1px 3px 1px rgba(60,64,67,.15)}.waffle-named-ranges-promo-lock-container{height:27px;margin-right:12px;overflow:hidden;vertical-align:middle;width:23px}.waffle-named-ranges-promo-lock:before{content:url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png")}.waffle-named-ranges-promo-lock{background:url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png");left:-618px;opacity:.60;position:relative;top:0}.docs-icon.waffle-named-ranges-locked{height:21px;margin-bottom:3px;width:21px}.docs-icon.waffle-named-ranges-unlocked{height:21px;width:21px}#waffle-named-ranges-edit-manage-named-ranges{color:#15c;cursor:pointer;margin-top:5px;padding-bottom:5px}.waffle-named-ranges-border{border-color:#8cc474;border-style:solid;line-height:0}#waffle-ritz-protection-container{border:none;height:auto;overflow-y:auto;width:300px}.waffle-ritz-protection-link-button{background:white;color:#188038;cursor:pointer;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;line-height:16px;height:16px;padding:16px}.docs-icon.waffle-ritz-protection-add-range-icon{margin-top:-1px}.docs-icon.waffle-ritz-protection-add-range-icon .docs-icon-img{content:url(//ssl.gstatic.com/docs/common/material_common_sprite222_green.svg)}#waffle-ritz-protection-add-range{border-bottom:1px solid #ddd}.waffle-ritz-protection-link-button,.waffle-ritz-protection-link-button:focus{outline:none}.waffle-ritz-protection-link-button:hover{background-color:#f8fcf9}.waffle-ritz-protection-link-button:focus{background-color:#e7f5eb}.waffle-ritz-protection-link-button:active{background-color:#dff2e4}.waffle-ritz-protection-pill{border-bottom:1px solid #ddd;cursor:default;padding-bottom:10px;padding-top:10px;position:relative}.waffle-ritz-protection-pill-contents{color:#5f6368;font-size:14px;padding-left:16px;padding-right:16px}.waffle-ritz-protection-edit-permissions{border-top:1px solid #ddd;border-bottom:1px solid #ddd;padding-bottom:15px;padding-top:15px;margin-top:15px}.waffle-ritz-protection-edit-permissions-lock{left:-5px;width:15px}.waffle-ritz-protection-edit-buttons{display:flex;justify-content:flex-end;padding-top:8px}.waffle-ritz-protection-edit-permissions-title{font-size:14px;font-weight:500;word-wrap:break-word}.waffle-ritz-protection-edit-permissions-description{color:gray}.waffle-ritz-protection-range-rect,.waffle-ritz-protection-edit-range-name{overflow:hidden;text-overflow:ellipsis}.waffle-ritz-protection-range-rect-holder{color:#202124;font-weight:500}.waffle-ritz-protection-view-pill{cursor:pointer}.waffle-ritz-protection-view-pill:focus,.waffle-ritz-protection-view-pill:hover{background-color:#f3f3f3}.waffle-ritz-protection-range-name{font-size:14px;font-weight:500;word-wrap:break-word}.waffle-ritz-protection-edit-pill{background-color:#fff;cursor:default}.waffle-ritz-protection-edit-title-bar{padding:12px 0}.waffle-ritz-protection-edit-range-name{font-size:15px;font-weight:500;margin:0;max-width:190px}#waffle-ritz-protection-edit-delete{cursor:pointer;float:right;top:16px}#waffle-ritz-protection-edit-delete .docs-icon{height:24px;margin:0;width:24px}.waffle-ritz-protection-add-description-input{margin:5px 0 10px;position:relative;top:2px;width:100%}.waffle-ritz-protection-edit-description-input{width:236px}.waffle-ritz-protection-select-error{border-color:#dd4b39}#waffle-ritz-protection-edit-sheet-select{margin:0px;text-align:left;width:100%}#waffle-ritz-protection-edit-sheet-select .goog-flat-menu-button-caption{text-overflow:ellipsis;overflow:hidden;width:inherit}#waffle-ritz-protection-edit-sheet-label{font-weight:500;margin:0px 5px;overflow:hidden;text-overflow:ellipsis}.waffle-ritz-protection-holes-checkbox-container{margin-bottom:5px;margin-top:10px}#waffle-ritz-protection-holes-checkbox-label{color:#3c4043;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;line-height:24px;padding-left:8px;vertical-align:middle}.waffle-ritz-protection-edit-done,.waffle-ritz-protection-edit-cancel{margin-top:10px}.waffle-ritz-protection-edit-cancel{margin-right:8px}.waffle-ritz-protection-edit-done{margin-right:0}.waffle-ritz-protection-edit-toggle-range,.waffle-ritz-protection-edit-toggle-sheet{margin:10px 0px;width:85px}.waffle-ritz-protection-tab-separator{border-top:1px solid #dadce0;margin-left:-16px;padding-top:16px;width:300px}#waffle-ritz-protection-edit-validation-error{margin-top:5px}#waffle-ritz-protection-edit-validation-error-text{color:#dd4b39;padding:0 7px 0 0}#waffle-ritz-protection-edit-validation-error-icon{background:#dd4b39;-webkit-border-radius:10px;-moz-border-radius:10px;border-radius:10px;color:white;display:inline-block;font-weight:500;padding:0 5px;position:relative;text-decoration:none;top:-1px}.waffle-ritz-protection-edit-permissions-button{margin-top:10px;padding-right:15px}#waffle-ritz-protection-promo{cursor:default;padding:0 15px 0 15px}.waffle-ritz-protection-promo-content{color:#636363;margin:20px 0 20px}.waffle-ritz-protection-promo-separator{background-color:#ddd;border:none;color:#ddd;height:1px;margin:20px 0 20px;width:95%}.waffle-ritz-protection-promo-lock-container{height:27px;margin-right:12px;overflow:hidden;vertical-align:middle;width:23px}.waffle-ritz-protection-promo-lock:before{content:url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png")}.waffle-ritz-protection-promo-lock{background:url("//ssl.gstatic.com/docs/spreadsheets/waffle_sprite53.png");left:-618px;opacity:.60;position:relative;top:0}#waffle-ritz-protection-edit-manage-ritz-protection{color:#15c;cursor:pointer;margin-top:5px;padding-bottom:5px}.waffle-ritz-protection-border{border-color:#8cc474;border-style:solid;line-height:0}.waffle-ritz-protection-acl-loading{width:400px}.waffle-ritz-protection-acl-loading-spinner,.waffle-ritz-protection-acl-loading-text{display:inline-block;position:relative;transition:left 300ms ease-out;transition:width 300ms ease-out;vertical-align:middle}.waffle-ritz-protection-type-buttons .jfk-radiobutton{display:block;margin-bottom:4px}.waffle-ritz-protection-dropdown{margin:4px 0 24px 27px}.waffle-ritz-protection-dropdown .goog-flat-menu-button-caption{font-size:12px;text-align:left;width:345px}.waffle-ritz-protection-custom-container{margin-left:27px}.waffle-ritz-protection-acl-table-container{border-collapse:collapse;border-top:1px solid #d6d6d6;font-family:arial,sans-serif;font-size:13px;margin-bottom:10px;max-height:230px;overflow:auto;width:373px}.waffle-ritz-protection-acl-header-name,.waffle-ritz-protection-acl-header-edit{color:#616161;display:inline-block;font-family:arial,sans-serif;font-size:11px;font-weight:500}.waffle-ritz-protection-acl-header{margin-bottom:10px}.waffle-ritz-protection-acl-header-edit{text-align:right}.waffle-ritz-protection-acl-scope-col,.waffle-ritz-protection-acl-header-name{width:85%}.waffle-ritz-protection-acl-edit-col,.waffle-ritz-protection-acl-header-edit{width:15%}.waffle-ritz-protection-acl-header-edit-checkbox{margin-right:10px}.waffle-ritz-protection-acl-table{empty-cells:show;width:100%}.waffle-ritz-protection-acl-table td{border-bottom:1px solid #ebebeb;font-size:13px;padding:8px 0px}.waffle-ritz-protection-acl-missing{opacity:0.5}.waffle-ritz-protection-acl-row td{text-overflow:ellipsis}.waffle-ritz-protection-acl-scope{width:313px}.waffle-ritz-protection-acl-text{display:inline-block;margin-left:15px;overflow:hidden;text-overflow:ellipsis;vertical-align:middle;width:239px;white-space:nowrap}.waffle-ritz-protection-acl-email{color:#777;margin-left:5px}.waffle-ritz-protection-acl-checkbox{display:block;margin-left:auto;margin-right:10px}.waffle-ritz-protection-acl-default-icon{display:inline-block;filter:alpha(opacity=55);height:21px;opacity:0.55;margin-left:4px;margin-top:4px;width:21px}.waffle-ritz-protection-acl-icon-container{background-color:#f5f5f5;display:inline-block;height:29px;vertical-align:middle;width:29px}.waffle-ritz-protection-acl-custom-icon{height:29px;vertical-align:middle;width:29px}.waffle-ritz-protection-acl-icon-disabled{filter:alpha(opacity=25);opacity:0.25}.waffle-ritz-protection-add-editors-container{background-color:#f5f5f5;margin-bottom:24px;padding:16px}.waffle-ritz-protection-add-editors-label{font-size:11px;font-weight:500;padding-right:15px}.waffle-ritz-protection-add-editors-input{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding-left:8px;padding-right:8px;transition:height 200ms ease-out;width:100%}.waffle-ritz-protection-ac-renderer{background:#fff;border:1px solid #666;box-shadow:2px 2px 2px rgba(102,102,102,.4);color:#333;font-family:Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;max-height:120px;overflow:hidden;position:absolute;width:369px;white-space:nowrap;z-index:1010}.waffle-ritz-protection-ac-renderer .goog-contacts-ui-autocomplete-new-section{border-top:1px solid #666;padding-top:2px}.waffle-ritz-protection-ac-renderer .ac-row{cursor:pointer;padding:4px 10px 4px 4px}.waffle-ritz-protection-ac-renderer .ac-highlighted{color:#222}.waffle-ritz-protection-ac-renderer .ac-active{background:#eee}.waffle-ritz-protection-list{border-collapse:collapse;border-top:1px solid #ebebeb;font-family:arial,sans-serif;font-size:13px;margin-bottom:24px;margin-left:27px;max-height:200px;outline:transparent;overflow:auto}.waffle-ritz-protection-item{border-bottom:1px solid #ebebeb;padding:5px 0}.waffle-ritz-protection-item-hover{background:#eee}.waffle-ritz-protection-item-name{font-size:13px;font-weight:500;word-wrap:break-word}.waffle-ritz-protection-item-range{color:gray;font-size:12px;word-wrap:break-word}.waffle-ritz-protection-acl-butter{background:#f9edbe;border:1px solid #f0c36d;color:#222;font-family:arial,sans-serif;font-size:13px;margin-bottom:10px;margin-top:10px;max-width:358px;padding:5px;text-align:center;width:100%}.waffle-ritz-protection-acl-butter-text{display:inline-block}.waffle-ritz-protection-acl-butter-href{text-decoration:underline}.waffle-ritz-protection-acl-butter-action{cursor:pointer;color:#15c;display:inline-block}.waffle-flat-multi-range-select-done{margin-top:8px}.waffle-flat-range-select-listening,.waffle-flat-multi-range-select-listening{background-color:transparent;background-color:unset}.waffle-ritz-protection-pill-contents .waffle-flat-multi-range-row{margin-bottom:8px}.waffle-ritz-protection-pill-contents .waffle-flat-multi-range-add-another{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:white;border:1px solid #dadce0!important;color:#188038;height:24px;padding:3px 12px 5px;display:inline-block;margin:0}.waffle-ritz-protection-pill-contents .waffle-flat-multi-range-add-another:focus{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#e7f5eb;border:1px solid #bbe2c6!important;height:24px;padding:3px 12px 5px}.waffle-ritz-protection-pill-contents .waffle-flat-multi-range-add-another:hover{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#f8fcf9;border:1px solid #c8e7d1!important;height:24px;padding:3px 12px 5px}.waffle-ritz-protection-pill-contents .waffle-flat-multi-range-add-another:hover:focus{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#dff2e4;border:1px solid #b5e0c1!important;height:24px;padding:3px 12px 5px}.waffle-ritz-protection-pill-contents .waffle-flat-multi-range-add-another:active,.waffle-ritz-protection-pill-contents .waffle-flat-multi-range-add-another:hover:active{background-image:none;border:1px solid transparent!important;border-radius:4px;box-shadow:none;box-sizing:border-box;font-family:"Google Sans",Roboto,RobotoDraft,Helvetica,Arial,sans-serif;font-weight:500;font-size:14px;height:36px;letter-spacing:0.25px;line-height:16px;padding:9px 24px 11px 24px;background:#dff2e4;border:1px solid transparent!important;box-shadow:0 2px 6px 2px rgba(60,64,67,.15);height:24px;padding:3px 12px 5px}.goog-tab-bar.spreadsheet-settings-dialog-tab-bar .goog-tab.spreadsheet-settings-tab{color:#5f6368;cursor:pointer;font-weight:500;margin:1px 15px 0 0;padding:4px 8px;text-align:center;text-decoration:none;top:1px;width:120px}.goog-tab-bar.spreadsheet-settings-dialog-tab-bar{background:none;border-bottom-color:#e8eaed!important;margin-bottom:20px;padding-left:0!important}.goog-tab-bar.spreadsheet-settings-dialog-tab-bar .goog-tab.spreadsheet-settings-tab.goog-tab-selected,.goog-tab-bar.spreadsheet-settings-dialog-tab-bar .goog-tab.spreadsheet-settings-tab.goog-tab-hover{background:none;border-bottom:2px solid #188038;border-left:none;border-right:none;border-top:none;color:#202124}.dialog-settings .dialog-settings-input{width:210px}.dialog-settings .jfk-select{box-sizing:border-box;max-width:210px}.dialog-settings{width:670px}.dialog-settings-label{padding-bottom:4px;padding-top:4px}.dialog-settings-display-language{padding-top:4px}.dialog-settings .goog-flat-menu-button-caption{text-align:left;text-overflow:ellipsis}.modal-dialog.dialog-settings .jfk-select.goog-flat-menu-button{padding-left:14px}.grid-container {height:100%;width:100%;overflow:auto} \ No newline at end of file diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/compare/tests/compare.rs b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/compare/tests/compare.rs new file mode 100644 index 0000000..294a8d4 --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/compare/tests/compare.rs @@ -0,0 +1,136 @@ +use ahash::RandomState; +use criterion::*; +use farmhash::FarmHasher; +use fnv::FnvBuildHasher; +use fxhash::FxBuildHasher; +use std::hash::{BuildHasher, BuildHasherDefault, Hash, Hasher}; +use xxhash_rust::xxh3::Xxh3Builder; + +fn ahash(k: &K, builder: &RandomState) -> u64 { + let mut hasher = builder.build_hasher(); + k.hash(&mut hasher); + hasher.finish() +} + +fn generic_hash(key: &K, builder: &B) -> u64 { + let mut hasher = builder.build_hasher(); + key.hash(&mut hasher); + hasher.finish() +} + +fn create_string(len: usize) -> String { + let mut string = String::default(); + for pos in 1..=len { + let c = (48 + (pos % 10) as u8) as char; + string.push(c); + } + string +} + +fn compare_ahash(c: &mut Criterion) { + let builder = RandomState::new(); + let test = "compare_ahash"; + for num in &[1, 3, 7, 15, 31, 63, 127, 255, 511, 1023] { + let name = "string".to_owned() + &num.to_string(); + let string = create_string(*num); + c.bench_with_input(BenchmarkId::new(test, &name), &string, |bencher, s| { + bencher.iter(|| black_box(ahash(s, &builder))); + }); + } +} + +fn compare_other(c: &mut Criterion, test: &str, builder: B) { + for num in &[1, 3, 7, 15, 31, 63, 127, 255, 511, 1023] { + let name = "string".to_owned() + &num.to_string(); + let string = create_string(*num); + c.bench_with_input(BenchmarkId::new(test, &name), &string, |bencher, s| { + bencher.iter(|| black_box(generic_hash(&s, &builder))); + }); + } +} + +fn compare_farmhash(c: &mut Criterion) { + let int: u64 = 1234; + let string = create_string(1024); + let builder = BuildHasherDefault::::default(); + compare_other(c, "compare_farmhash", builder) +} + +fn compare_fnvhash(c: &mut Criterion) { + let int: u64 = 1234; + let string = create_string(1024); + let builder = FnvBuildHasher::default(); + compare_other(c, "compare_fnvhash", builder) +} + +fn compare_fxhash(c: &mut Criterion) { + let int: u64 = 1234; + let string = create_string(1024); + let builder = FxBuildHasher::default(); + compare_other(c, "compare_fxhash", builder) +} + +fn compare_highway(c: &mut Criterion) { + let int: u64 = 1234; + let string = create_string(1024); + let builder = highway::HighwayBuildHasher::default(); + compare_other(c, "compare_highway", builder) +} + +fn compare_metro(c: &mut Criterion) { + let int: u64 = 1234; + let string = create_string(1024); + let builder = metrohash::MetroBuildHasher::default(); + compare_other(c, "compare_metro", builder) +} + +fn compare_t1ha(c: &mut Criterion) { + let int: u64 = 1234; + let string = create_string(1024); + let builder = t1ha::T1haBuildHasher::default(); + compare_other(c, "compare_t1ha", builder) +} + +fn compare_sip13(c: &mut Criterion) { + let int: u64 = 1234; + let string = create_string(1024); + let builder = BuildHasherDefault::::default(); + compare_other(c, "compare_sip13", builder) +} + +fn compare_sip24(c: &mut Criterion) { + let int: u64 = 1234; + let string = create_string(1024); + let builder = BuildHasherDefault::::default(); + compare_other(c, "compare_sip24", builder) +} + +fn compare_wyhash(c: &mut Criterion) { + let int: u64 = 1234; + let string = create_string(1024); + let builder = BuildHasherDefault::::default(); + compare_other(c, "compare_wyhash", builder) +} + +fn compare_xxhash(c: &mut Criterion) { + let int: u64 = 1234; + let string = create_string(1024); + let builder = Xxh3Builder::default(); + compare_other(c, "compare_xxhash", builder) +} + +criterion_main!(compare); +criterion_group!( + compare, + compare_ahash, + compare_farmhash, + compare_fnvhash, + compare_fxhash, + compare_highway, + compare_metro, + compare_t1ha, + compare_sip13, + compare_sip24, + compare_wyhash, + compare_xxhash, +); diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/rustfmt.toml b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/rustfmt.toml new file mode 100644 index 0000000..7530651 --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/rustfmt.toml @@ -0,0 +1 @@ +max_width = 120 diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/smhasher/ahash-cbindings/Cargo.toml b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/smhasher/ahash-cbindings/Cargo.toml new file mode 100644 index 0000000..49513b3 --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/smhasher/ahash-cbindings/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "ahash-cbindings" +version = "0.1.2" +authors = ["Tom Kaitchuck "] +edition = "2018" +description = "C bindings for aHash so that it can be invoked by SMHasher to verify quality." + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +[lib] +name = "ahash_c" +crate-type = ["staticlib"] # Creates static lib + +[profile.release] +opt-level = 3 +debug = false +lto = 'fat' +debug-assertions = false + +[dependencies] +ahash = { path = "../../", default-features = false } \ No newline at end of file diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/smhasher/ahash-cbindings/install.sh b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/smhasher/ahash-cbindings/install.sh new file mode 100755 index 0000000..2effe93 --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/smhasher/ahash-cbindings/install.sh @@ -0,0 +1 @@ +RUSTFLAGS="-C opt-level=3 -C target-cpu=native -C codegen-units=1" cargo build --release && sudo cp target/release/libahash_c.a /usr/local/lib/ diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/smhasher/ahash-cbindings/src/lib.rs b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/smhasher/ahash-cbindings/src/lib.rs new file mode 100644 index 0000000..e2e5bdb --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/smhasher/ahash-cbindings/src/lib.rs @@ -0,0 +1,12 @@ +#![feature(build_hasher_simple_hash_one)] + +use ahash::*; +use core::slice; +use std::hash::{BuildHasher}; + +#[no_mangle] +pub extern "C" fn ahash64(buf: *const (), len: usize, seed: u64) -> u64 { + let buf: &[u8] = unsafe { slice::from_raw_parts(buf as *const u8, len) }; + let build_hasher = RandomState::with_seeds(seed, seed, seed, seed); + build_hasher.hash_one(&buf) +} diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/smhasher/ahashOutput.txt b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/smhasher/ahashOutput.txt new file mode 100644 index 0000000..5191a86 --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/smhasher/ahashOutput.txt @@ -0,0 +1,1137 @@ +------------------------------------------------------------------------------- +--- Testing ahash64 "ahash 64bit" GOOD + +[[[ Sanity Tests ]]] + +Verification value 0x74CCCAD5 ....... SKIP (self- or unseeded) +Running sanity check 1 .......... PASS +Running AppendedZeroesTest .......... PASS + +[[[ Speed Tests ]]] + +Bulk speed test - 262144-byte keys +Alignment 7 - 21.075 bytes/cycle - 60295.19 MiB/sec @ 3 ghz +Alignment 6 - 20.741 bytes/cycle - 59341.51 MiB/sec @ 3 ghz +Alignment 5 - 20.881 bytes/cycle - 59741.43 MiB/sec @ 3 ghz +Alignment 4 - 21.013 bytes/cycle - 60117.99 MiB/sec @ 3 ghz +Alignment 3 - 20.976 bytes/cycle - 60012.54 MiB/sec @ 3 ghz +Alignment 2 - 20.998 bytes/cycle - 60074.72 MiB/sec @ 3 ghz +Alignment 1 - 21.026 bytes/cycle - 60154.64 MiB/sec @ 3 ghz +Alignment 0 - 22.039 bytes/cycle - 63054.96 MiB/sec @ 3 ghz +Average - 21.094 bytes/cycle - 60349.12 MiB/sec @ 3 ghz + +Small key speed test - 1-byte keys - 18.00 cycles/hash +Small key speed test - 2-byte keys - 18.00 cycles/hash +Small key speed test - 3-byte keys - 18.00 cycles/hash +Small key speed test - 4-byte keys - 18.00 cycles/hash +Small key speed test - 5-byte keys - 18.00 cycles/hash +Small key speed test - 6-byte keys - 18.00 cycles/hash +Small key speed test - 7-byte keys - 18.00 cycles/hash +Small key speed test - 8-byte keys - 18.00 cycles/hash +Small key speed test - 9-byte keys - 18.00 cycles/hash +Small key speed test - 10-byte keys - 18.19 cycles/hash +Small key speed test - 11-byte keys - 18.00 cycles/hash +Small key speed test - 12-byte keys - 18.00 cycles/hash +Small key speed test - 13-byte keys - 19.00 cycles/hash +Small key speed test - 14-byte keys - 18.97 cycles/hash +Small key speed test - 15-byte keys - 18.73 cycles/hash +Small key speed test - 16-byte keys - 19.41 cycles/hash +Small key speed test - 17-byte keys - 20.00 cycles/hash +Small key speed test - 18-byte keys - 20.00 cycles/hash +Small key speed test - 19-byte keys - 20.00 cycles/hash +Small key speed test - 20-byte keys - 20.41 cycles/hash +Small key speed test - 21-byte keys - 20.00 cycles/hash +Small key speed test - 22-byte keys - 20.00 cycles/hash +Small key speed test - 23-byte keys - 20.00 cycles/hash +Small key speed test - 24-byte keys - 20.59 cycles/hash +Small key speed test - 25-byte keys - 20.12 cycles/hash +Small key speed test - 26-byte keys - 20.16 cycles/hash +Small key speed test - 27-byte keys - 20.00 cycles/hash +Small key speed test - 28-byte keys - 20.00 cycles/hash +Small key speed test - 29-byte keys - 20.31 cycles/hash +Small key speed test - 30-byte keys - 20.33 cycles/hash +Small key speed test - 31-byte keys - 20.15 cycles/hash +Average 19.173 cycles/hash + +[[[ 'Hashmap' Speed Tests ]]] + +std::unordered_map +Init std HashMapTest: 186.422 cycles/op (104334 inserts, 1% deletions) +Running std HashMapTest: 120.371 cycles/op (5.2 stdv) + +greg7mdp/parallel-hashmap +Init fast HashMapTest: 110.249 cycles/op (104334 inserts, 1% deletions) +Running fast HashMapTest: 86.785 cycles/op (3.2 stdv) ....... PASS + +[[[ Avalanche Tests ]]] + +Testing 24-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.634667% +Testing 32-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.600667% +Testing 40-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.627333% +Testing 48-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.656667% +Testing 56-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.599333% +Testing 64-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.690667% +Testing 72-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.812667% +Testing 80-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.678000% +Testing 96-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.670000% +Testing 112-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.728667% +Testing 128-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.717333% +Testing 160-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.681333% +Testing 512-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.922000% +Testing 1024-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.740000% + +[[[ Keyset 'Sparse' Tests ]]] + +Keyset 'Sparse' - 16-bit keys with up to 9 bits set - 50643 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 0.3, actual 0 (0.00x) +Testing collisions (high 19-25 bits) - Worst is 19 bits: 2369/2368 (1.00x) +Testing collisions (low 32-bit) - Expected 0.3, actual 1 (3.35x) (1) ! +Testing collisions (low 19-25 bits) - Worst is 25 bits: 46/38 (1.20x) +Testing distribution - Worst bias is the 13-bit window at bit 24 - 0.505% + +Keyset 'Sparse' - 24-bit keys with up to 8 bits set - 1271626 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 188.2, actual 171 (0.91x) +Testing collisions (high 24-35 bits) - Worst is 28 bits: 3050/3007 (1.01x) +Testing collisions (low 32-bit) - Expected 188.2, actual 193 (1.03x) (5) +Testing collisions (low 24-35 bits) - Worst is 30 bits: 774/752 (1.03x) +Testing distribution - Worst bias is the 17-bit window at bit 51 - 0.087% + +Keyset 'Sparse' - 32-bit keys with up to 7 bits set - 4514873 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 2372.2, actual 2423 (1.02x) (51) +Testing collisions (high 25-38 bits) - Worst is 36 bits: 162/148 (1.09x) +Testing collisions (low 32-bit) - Expected 2372.2, actual 2312 (0.97x) +Testing collisions (low 25-38 bits) - Worst is 38 bits: 42/37 (1.13x) +Testing distribution - Worst bias is the 19-bit window at bit 19 - 0.040% + +Keyset 'Sparse' - 40-bit keys with up to 6 bits set - 4598479 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 2460.8, actual 2483 (1.01x) (23) +Testing collisions (high 25-38 bits) - Worst is 38 bits: 54/38 (1.40x) +Testing collisions (low 32-bit) - Expected 2460.8, actual 2444 (0.99x) (-16) +Testing collisions (low 25-38 bits) - Worst is 38 bits: 43/38 (1.12x) +Testing distribution - Worst bias is the 19-bit window at bit 56 - 0.074% + +Keyset 'Sparse' - 48-bit keys with up to 6 bits set - 14196869 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 23437.8, actual 23188 (0.99x) (-249) +Testing collisions (high 27-42 bits) - Worst is 30 bits: 93748/93442 (1.00x) +Testing collisions (low 32-bit) - Expected 23437.8, actual 23337 (1.00x) (-100) +Testing collisions (low 27-42 bits) - Worst is 39 bits: 187/183 (1.02x) +Testing distribution - Worst bias is the 20-bit window at bit 30 - 0.021% + +Keyset 'Sparse' - 56-bit keys with up to 5 bits set - 4216423 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 2069.0, actual 2107 (1.02x) (39) +Testing collisions (high 25-38 bits) - Worst is 36 bits: 147/129 (1.14x) +Testing collisions (low 32-bit) - Expected 2069.0, actual 2111 (1.02x) (43) +Testing collisions (low 25-38 bits) - Worst is 32 bits: 2111/2068 (1.02x) +Testing distribution - Worst bias is the 18-bit window at bit 57 - 0.046% + +Keyset 'Sparse' - 64-bit keys with up to 5 bits set - 8303633 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8021.7, actual 7994 (1.00x) (-27) +Testing collisions (high 26-40 bits) - Worst is 39 bits: 70/62 (1.12x) +Testing collisions (low 32-bit) - Expected 8021.7, actual 8171 (1.02x) (150) +Testing collisions (low 26-40 bits) - Worst is 39 bits: 66/62 (1.05x) +Testing distribution - Worst bias is the 20-bit window at bit 32 - 0.044% + +Keyset 'Sparse' - 72-bit keys with up to 5 bits set - 15082603 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 26451.8, actual 26737 (1.01x) (286) +Testing collisions (high 27-42 bits) - Worst is 37 bits: 854/827 (1.03x) +Testing collisions (low 32-bit) - Expected 26451.8, actual 26464 (1.00x) (13) +Testing collisions (low 27-42 bits) - Worst is 40 bits: 123/103 (1.19x) +Testing distribution - Worst bias is the 20-bit window at bit 26 - 0.018% + +Keyset 'Sparse' - 96-bit keys with up to 4 bits set - 3469497 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 1401.0, actual 1387 (0.99x) (-13) +Testing collisions (high 25-38 bits) - Worst is 35 bits: 190/175 (1.08x) +Testing collisions (low 32-bit) - Expected 1401.0, actual 1415 (1.01x) (15) +Testing collisions (low 25-38 bits) - Worst is 38 bits: 33/21 (1.51x) +Testing distribution - Worst bias is the 19-bit window at bit 22 - 0.072% + +Keyset 'Sparse' - 160-bit keys with up to 4 bits set - 26977161 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 84546.1, actual 84950 (1.00x) (404) +Testing collisions (high 28-44 bits) - Worst is 44 bits: 28/20 (1.35x) +Testing collisions (low 32-bit) - Expected 84546.1, actual 84446 (1.00x) (-100) +Testing collisions (low 28-44 bits) - Worst is 41 bits: 174/165 (1.05x) +Testing distribution - Worst bias is the 20-bit window at bit 40 - 0.011% + +Keyset 'Sparse' - 256-bit keys with up to 3 bits set - 2796417 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 910.2, actual 973 (1.07x) (63) +Testing collisions (high 25-37 bits) - Worst is 35 bits: 130/113 (1.14x) +Testing collisions (low 32-bit) - Expected 910.2, actual 962 (1.06x) (52) +Testing collisions (low 25-37 bits) - Worst is 36 bits: 68/56 (1.20x) +Testing distribution - Worst bias is the 19-bit window at bit 27 - 0.108% + +Keyset 'Sparse' - 512-bit keys with up to 3 bits set - 22370049 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 58155.4, actual 58209 (1.00x) (54) +Testing collisions (high 28-43 bits) - Worst is 33 bits: 29243/29102 (1.00x) +Testing collisions (low 32-bit) - Expected 58155.4, actual 58026 (1.00x) (-129) +Testing collisions (low 28-43 bits) - Worst is 43 bits: 33/28 (1.16x) +Testing distribution - Worst bias is the 20-bit window at bit 54 - 0.011% + +Keyset 'Sparse' - 1024-bit keys with up to 2 bits set - 524801 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 32.1, actual 31 (0.97x) +Testing collisions (high 22-32 bits) - Worst is 28 bits: 569/512 (1.11x) +Testing collisions (low 32-bit) - Expected 32.1, actual 24 (0.75x) +Testing collisions (low 22-32 bits) - Worst is 29 bits: 285/256 (1.11x) +Testing distribution - Worst bias is the 16-bit window at bit 32 - 0.224% + +Keyset 'Sparse' - 2048-bit keys with up to 2 bits set - 2098177 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.4, actual 506 (0.99x) (-6) +Testing collisions (high 24-36 bits) - Worst is 34 bits: 144/128 (1.12x) +Testing collisions (low 32-bit) - Expected 512.4, actual 510 (1.00x) (-2) +Testing collisions (low 24-36 bits) - Worst is 28 bits: 8200/8178 (1.00x) +Testing distribution - Worst bias is the 18-bit window at bit 49 - 0.101% + + +[[[ Keyset 'Permutation' Tests ]]] + +Combination Lowbits Tests: +Keyset 'Combination' - up to 7 blocks from a set of 8 - 2396744 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 668.6, actual 661 (0.99x) (-7) +Testing collisions (high 24-37 bits) - Worst is 28 bits: 10767/10667 (1.01x) +Testing collisions (low 32-bit) - Expected 668.6, actual 756 (1.13x) (88) +Testing collisions (low 24-37 bits) - Worst is 35 bits: 99/83 (1.18x) +Testing distribution - Worst bias is the 18-bit window at bit 41 - 0.081% + + +Combination Highbits Tests +Keyset 'Combination' - up to 7 blocks from a set of 8 - 2396744 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 668.6, actual 672 (1.01x) (4) +Testing collisions (high 24-37 bits) - Worst is 31 bits: 1379/1336 (1.03x) +Testing collisions (low 32-bit) - Expected 668.6, actual 680 (1.02x) (12) +Testing collisions (low 24-37 bits) - Worst is 31 bits: 1387/1336 (1.04x) +Testing distribution - Worst bias is the 18-bit window at bit 26 - 0.054% + + +Combination Hi-Lo Tests: +Keyset 'Combination' - up to 6 blocks from a set of 15 - 12204240 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 17322.9, actual 17435 (1.01x) (113) +Testing collisions (high 27-41 bits) - Worst is 41 bits: 39/33 (1.15x) +Testing collisions (low 32-bit) - Expected 17322.9, actual 17089 (0.99x) (-233) +Testing collisions (low 27-41 bits) - Worst is 40 bits: 79/67 (1.17x) +Testing distribution - Worst bias is the 20-bit window at bit 15 - 0.026% + + +Combination 0x8000000 Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8186.7, actual 8218 (1.00x) (32) +Testing collisions (high 26-40 bits) - Worst is 40 bits: 40/31 (1.25x) +Testing collisions (low 32-bit) - Expected 8186.7, actual 8210 (1.00x) (24) +Testing collisions (low 26-40 bits) - Worst is 32 bits: 8210/8186 (1.00x) +Testing distribution - Worst bias is the 20-bit window at bit 16 - 0.047% + + +Combination 0x0000001 Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8186.7, actual 8118 (0.99x) (-68) +Testing collisions (high 26-40 bits) - Worst is 26 bits: 503735/503108 (1.00x) +Testing collisions (low 32-bit) - Expected 8186.7, actual 8308 (1.01x) (122) +Testing collisions (low 26-40 bits) - Worst is 37 bits: 272/255 (1.06x) +Testing distribution - Worst bias is the 20-bit window at bit 59 - 0.056% + + +Combination 0x800000000000000 Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8186.7, actual 8204 (1.00x) (18) +Testing collisions (high 26-40 bits) - Worst is 39 bits: 70/63 (1.09x) +Testing collisions (low 32-bit) - Expected 8186.7, actual 8149 (1.00x) (-37) +Testing collisions (low 26-40 bits) - Worst is 30 bits: 32824/32682 (1.00x) +Testing distribution - Worst bias is the 20-bit window at bit 61 - 0.039% + + +Combination 0x000000000000001 Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8186.7, actual 8288 (1.01x) (102) +Testing collisions (high 26-40 bits) - Worst is 31 bits: 16594/16362 (1.01x) +Testing collisions (low 32-bit) - Expected 8186.7, actual 8159 (1.00x) (-27) +Testing collisions (low 26-40 bits) - Worst is 34 bits: 2078/2047 (1.01x) +Testing distribution - Worst bias is the 20-bit window at bit 33 - 0.030% + + +Combination 16-bytes [0-1] Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8186.7, actual 8107 (0.99x) (-79) +Testing collisions (high 26-40 bits) - Worst is 38 bits: 134/127 (1.05x) +Testing collisions (low 32-bit) - Expected 8186.7, actual 8153 (1.00x) (-33) +Testing collisions (low 26-40 bits) - Worst is 39 bits: 70/63 (1.09x) +Testing distribution - Worst bias is the 20-bit window at bit 10 - 0.046% + + +Combination 16-bytes [0-last] Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8186.7, actual 8163 (1.00x) (-23) +Testing collisions (high 26-40 bits) - Worst is 38 bits: 144/127 (1.13x) +Testing collisions (low 32-bit) - Expected 8186.7, actual 8116 (0.99x) (-70) +Testing collisions (low 26-40 bits) - Worst is 26 bits: 504097/503108 (1.00x) +Testing distribution - Worst bias is the 20-bit window at bit 16 - 0.042% + + +Combination 32-bytes [0-1] Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8186.7, actual 8390 (1.02x) (204) +Testing collisions (high 26-40 bits) - Worst is 40 bits: 34/31 (1.06x) +Testing collisions (low 32-bit) - Expected 8186.7, actual 8106 (0.99x) (-80) +Testing collisions (low 26-40 bits) - Worst is 26 bits: 502218/503108 (1.00x) +Testing distribution - Worst bias is the 20-bit window at bit 6 - 0.037% + + +Combination 32-bytes [0-last] Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8186.7, actual 8387 (1.02x) (201) +Testing collisions (high 26-40 bits) - Worst is 38 bits: 144/127 (1.13x) +Testing collisions (low 32-bit) - Expected 8186.7, actual 7860 (0.96x) +Testing collisions (low 26-40 bits) - Worst is 26 bits: 503416/503108 (1.00x) +Testing distribution - Worst bias is the 20-bit window at bit 22 - 0.030% + + +Combination 64-bytes [0-1] Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8186.7, actual 8126 (0.99x) (-60) +Testing collisions (high 26-40 bits) - Worst is 38 bits: 148/127 (1.16x) +Testing collisions (low 32-bit) - Expected 8186.7, actual 8171 (1.00x) (-15) +Testing collisions (low 26-40 bits) - Worst is 36 bits: 523/511 (1.02x) +Testing distribution - Worst bias is the 20-bit window at bit 40 - 0.042% + + +Combination 64-bytes [0-last] Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8186.7, actual 8289 (1.01x) (103) +Testing collisions (high 26-40 bits) - Worst is 36 bits: 546/511 (1.07x) +Testing collisions (low 32-bit) - Expected 8186.7, actual 8002 (0.98x) +Testing collisions (low 26-40 bits) - Worst is 39 bits: 66/63 (1.03x) +Testing distribution - Worst bias is the 20-bit window at bit 7 - 0.039% + + +Combination 128-bytes [0-1] Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8186.7, actual 8099 (0.99x) (-87) +Testing collisions (high 26-40 bits) - Worst is 40 bits: 38/31 (1.19x) +Testing collisions (low 32-bit) - Expected 8186.7, actual 8269 (1.01x) (83) +Testing collisions (low 26-40 bits) - Worst is 40 bits: 40/31 (1.25x) +Testing distribution - Worst bias is the 20-bit window at bit 10 - 0.029% + + +Combination 128-bytes [0-last] Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8186.7, actual 8279 (1.01x) (93) +Testing collisions (high 26-40 bits) - Worst is 40 bits: 39/31 (1.22x) +Testing collisions (low 32-bit) - Expected 8186.7, actual 8252 (1.01x) (66) +Testing collisions (low 26-40 bits) - Worst is 39 bits: 75/63 (1.17x) +Testing distribution - Worst bias is the 20-bit window at bit 9 - 0.029% + + +[[[ Keyset 'Window' Tests ]]] + +Keyset 'Window' - 32-bit key, 25-bit window - 32 tests, 33554432 keys per test +Window at 0 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 1 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 2 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 3 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 4 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 5 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 6 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 7 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 8 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 9 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 10 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 11 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 12 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 13 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 14 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 15 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 16 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 17 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 18 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 19 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 20 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 21 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 22 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 23 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 24 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 25 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 26 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 27 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 28 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 29 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 30 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 31 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 32 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) + +[[[ Keyset 'Cyclic' Tests ]]] + +Keyset 'Cyclic' - 8 cycles of 8 bytes - 1000000 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 116.4, actual 103 (0.88x) +Testing collisions (high 23-34 bits) - Worst is 30 bits: 495/465 (1.06x) +Testing collisions (low 32-bit) - Expected 116.4, actual 109 (0.94x) +Testing collisions (low 23-34 bits) - Worst is 30 bits: 468/465 (1.01x) +Testing distribution - Worst bias is the 17-bit window at bit 37 - 0.111% + +Keyset 'Cyclic' - 8 cycles of 9 bytes - 1000000 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 116.4, actual 106 (0.91x) +Testing collisions (high 23-34 bits) - Worst is 33 bits: 62/58 (1.07x) +Testing collisions (low 32-bit) - Expected 116.4, actual 120 (1.03x) (4) +Testing collisions (low 23-34 bits) - Worst is 34 bits: 46/29 (1.58x) +Testing distribution - Worst bias is the 17-bit window at bit 48 - 0.132% + +Keyset 'Cyclic' - 8 cycles of 10 bytes - 1000000 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 116.4, actual 116 (1.00x) +Testing collisions (high 23-34 bits) - Worst is 33 bits: 63/58 (1.08x) +Testing collisions (low 32-bit) - Expected 116.4, actual 116 (1.00x) +Testing collisions (low 23-34 bits) - Worst is 33 bits: 68/58 (1.17x) +Testing distribution - Worst bias is the 17-bit window at bit 60 - 0.103% + +Keyset 'Cyclic' - 8 cycles of 11 bytes - 1000000 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 116.4, actual 129 (1.11x) (13) +Testing collisions (high 23-34 bits) - Worst is 33 bits: 69/58 (1.19x) +Testing collisions (low 32-bit) - Expected 116.4, actual 120 (1.03x) (4) +Testing collisions (low 23-34 bits) - Worst is 32 bits: 120/116 (1.03x) +Testing distribution - Worst bias is the 17-bit window at bit 27 - 0.109% + +Keyset 'Cyclic' - 8 cycles of 12 bytes - 1000000 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 116.4, actual 95 (0.82x) +Testing collisions (high 23-34 bits) - Worst is 23 bits: 56886/57305 (0.99x) +Testing collisions (low 32-bit) - Expected 116.4, actual 120 (1.03x) (4) +Testing collisions (low 23-34 bits) - Worst is 34 bits: 34/29 (1.17x) +Testing distribution - Worst bias is the 17-bit window at bit 46 - 0.134% + +Keyset 'Cyclic' - 8 cycles of 16 bytes - 1000000 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 116.4, actual 126 (1.08x) (10) +Testing collisions (high 23-34 bits) - Worst is 33 bits: 79/58 (1.36x) +Testing collisions (low 32-bit) - Expected 116.4, actual 98 (0.84x) +Testing collisions (low 23-34 bits) - Worst is 23 bits: 57131/57305 (1.00x) +Testing distribution - Worst bias is the 17-bit window at bit 31 - 0.147% + + +[[[ Keyset 'TwoBytes' Tests ]]] + +Keyset 'TwoBytes' - up-to-4-byte keys, 652545 total keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 49.6, actual 42 (0.85x) +Testing collisions (high 23-33 bits) - Worst is 24 bits: 12603/12527 (1.01x) +Testing collisions (low 32-bit) - Expected 49.6, actual 44 (0.89x) +Testing collisions (low 23-33 bits) - Worst is 27 bits: 1606/1583 (1.01x) +Testing distribution - Worst bias is the 16-bit window at bit 36 - 0.093% + +Keyset 'TwoBytes' - up-to-8-byte keys, 5471025 total keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 3483.1, actual 3401 (0.98x) +Testing collisions (high 26-39 bits) - Worst is 37 bits: 111/108 (1.02x) +Testing collisions (low 32-bit) - Expected 3483.1, actual 3448 (0.99x) (-35) +Testing collisions (low 26-39 bits) - Worst is 37 bits: 121/108 (1.11x) +Testing distribution - Worst bias is the 20-bit window at bit 57 - 0.040% + +Keyset 'TwoBytes' - up-to-12-byte keys, 18616785 total keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 40289.5, actual 39941 (0.99x) (-348) +Testing collisions (high 27-42 bits) - Worst is 27 bits: 1233062/1233446 (1.00x) +Testing collisions (low 32-bit) - Expected 40289.5, actual 40360 (1.00x) (71) +Testing collisions (low 27-42 bits) - Worst is 37 bits: 1310/1260 (1.04x) +Testing distribution - Worst bias is the 20-bit window at bit 62 - 0.019% + +Keyset 'TwoBytes' - up-to-16-byte keys, 44251425 total keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 227182.3, actual 227244 (1.00x) (62) +Testing collisions (high 29-45 bits) - Worst is 44 bits: 60/55 (1.08x) +Testing collisions (low 32-bit) - Expected 227182.3, actual 227447 (1.00x) (265) +Testing collisions (low 29-45 bits) - Worst is 37 bits: 7356/7123 (1.03x) +Testing distribution - Worst bias is the 19-bit window at bit 1 - 0.004% + +Keyset 'TwoBytes' - up-to-20-byte keys, 86536545 total keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 865959.1, actual 866640 (1.00x) (681) +Testing collisions (high 30-47 bits) - Worst is 44 bits: 230/212 (1.08x) +Testing collisions (low 32-bit) - Expected 865959.1, actual 866255 (1.00x) (296) +Testing collisions (low 30-47 bits) - Worst is 38 bits: 13774/13620 (1.01x) +Testing distribution - Worst bias is the 20-bit window at bit 50 - 0.005% + + +[[[ Keyset 'Text' Tests ]]] + +Keyset 'Text' - keys of form "FooXXXXBar" - 14776336 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 25389.0, actual 25650 (1.01x) (261) +Testing collisions (high 27-42 bits) - Worst is 39 bits: 208/198 (1.05x) +Testing collisions (low 32-bit) - Expected 25389.0, actual 25416 (1.00x) (27) +Testing collisions (low 27-42 bits) - Worst is 36 bits: 1653/1588 (1.04x) +Testing distribution - Worst bias is the 20-bit window at bit 7 - 0.019% + +Keyset 'Text' - keys of form "FooBarXXXX" - 14776336 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 25389.0, actual 25488 (1.00x) (99) +Testing collisions (high 27-42 bits) - Worst is 40 bits: 106/99 (1.07x) +Testing collisions (low 32-bit) - Expected 25389.0, actual 25444 (1.00x) (55) +Testing collisions (low 27-42 bits) - Worst is 42 bits: 27/24 (1.09x) +Testing distribution - Worst bias is the 19-bit window at bit 58 - 0.011% + +Keyset 'Text' - keys of form "XXXXFooBar" - 14776336 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 25389.0, actual 25061 (0.99x) (-328) +Testing collisions (high 27-42 bits) - Worst is 41 bits: 58/49 (1.17x) +Testing collisions (low 32-bit) - Expected 25389.0, actual 25212 (0.99x) (-177) +Testing collisions (low 27-42 bits) - Worst is 37 bits: 799/794 (1.01x) +Testing distribution - Worst bias is the 20-bit window at bit 6 - 0.024% + +Keyset 'Words' - 4000000 random keys of len 6-16 from alnum charset +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 1862.1, actual 1864 (1.00x) (2) +Testing collisions (high 25-38 bits) - Worst is 38 bits: 41/29 (1.41x) +Testing collisions (low 32-bit) - Expected 1862.1, actual 1930 (1.04x) (68) +Testing collisions (low 25-38 bits) - Worst is 35 bits: 251/232 (1.08x) +Testing distribution - Worst bias is the 19-bit window at bit 51 - 0.057% + +Keyset 'Words' - 4000000 random keys of len 6-16 from password charset +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 1862.1, actual 1875 (1.01x) (13) +Testing collisions (high 25-38 bits) - Worst is 33 bits: 954/931 (1.02x) +Testing collisions (low 32-bit) - Expected 1862.1, actual 1891 (1.02x) (29) +Testing collisions (low 25-38 bits) - Worst is 38 bits: 31/29 (1.07x) +Testing distribution - Worst bias is the 19-bit window at bit 36 - 0.055% + +Keyset 'Words' - 104334 dict words +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 1.3, actual 0 (0.00x) +Testing collisions (high 20-28 bits) - Worst is 21 bits: 2566/2552 (1.01x) +Testing collisions (low 32-bit) - Expected 1.3, actual 1 (0.79x) +Testing collisions (low 20-28 bits) - Worst is 22 bits: 1301/1286 (1.01x) +Testing distribution - Worst bias is the 14-bit window at bit 35 - 0.260% + + +[[[ Keyset 'Zeroes' Tests ]]] + +Keyset 'Zeroes' - 204800 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 4.9, actual 8 (1.64x) (4) +Testing collisions (high 21-29 bits) - Worst is 27 bits: 161/156 (1.03x) +Testing collisions (low 32-bit) - Expected 4.9, actual 4 (0.82x) +Testing collisions (low 21-29 bits) - Worst is 26 bits: 317/312 (1.02x) +Testing distribution - Worst bias is the 15-bit window at bit 51 - 0.517% + + +[[[ Keyset 'Seed' Tests ]]] + +Keyset 'Seed' - 5000000 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 2909.3, actual 2977 (1.02x) (68) +Testing collisions (high 26-39 bits) - Worst is 38 bits: 52/45 (1.14x) +Testing collisions (low 32-bit) - Expected 2909.3, actual 2918 (1.00x) (9) +Testing collisions (low 26-39 bits) - Worst is 37 bits: 100/90 (1.10x) +Testing distribution - Worst bias is the 19-bit window at bit 54 - 0.037% + + +[[[ Keyset 'PerlinNoise' Tests ]]] + +Testing 16777216 coordinates (L2) : +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 32725.4, actual 32878 (1.00x) (153) +Testing collisions (high 27-42 bits) - Worst is 34 bits: 8352/8189 (1.02x) +Testing collisions (low 32-bit) - Expected 32725.4, actual 32870 (1.00x) (145) +Testing collisions (low 27-42 bits) - Worst is 34 bits: 8327/8189 (1.02x) + +Testing AV variant, 128 count with 4 spacing, 4-12: +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 1116.2, actual 1100 (0.99x) (-16) +Testing collisions (high 25-37 bits) - Worst is 37 bits: 36/34 (1.03x) +Testing collisions (low 32-bit) - Expected 1116.2, actual 1150 (1.03x) (34) +Testing collisions (low 25-37 bits) - Worst is 33 bits: 584/558 (1.05x) + + +[[[ Diff 'Differential' Tests ]]] + +Testing 8303632 up-to-5-bit differentials in 64-bit keys -> 64 bit hashes. +1000 reps, 8303632000 total tests, expecting 0.00 random collisions.......... +0 total collisions, of which 0 single collisions were ignored + +Testing 11017632 up-to-4-bit differentials in 128-bit keys -> 64 bit hashes. +1000 reps, 11017632000 total tests, expecting 0.00 random collisions.......... +0 total collisions, of which 0 single collisions were ignored + +Testing 2796416 up-to-3-bit differentials in 256-bit keys -> 64 bit hashes. +1000 reps, 2796416000 total tests, expecting 0.00 random collisions.......... +0 total collisions, of which 0 single collisions were ignored + + +[[[ DiffDist 'Differential Distribution' Tests ]]] + +Testing bit 0 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 525 (1.03x) (14) +Testing collisions (high 24-36 bits) - Worst is 33 bits: 289/255 (1.13x) +Testing collisions (low 32-bit) - Expected 511.9, actual 555 (1.08x) (44) +Testing collisions (low 24-36 bits) - Worst is 34 bits: 141/127 (1.10x) +Testing distribution - Worst bias is the 18-bit window at bit 45 - 0.075% + +Testing bit 1 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 514 (1.00x) (3) +Testing collisions (high 24-36 bits) - Worst is 31 bits: 1045/1023 (1.02x) +Testing collisions (low 32-bit) - Expected 511.9, actual 543 (1.06x) (32) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 41/31 (1.28x) +Testing distribution - Worst bias is the 18-bit window at bit 33 - 0.083% + +Testing bit 2 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 493 (0.96x) +Testing collisions (high 24-36 bits) - Worst is 26 bits: 32575/32429 (1.00x) +Testing collisions (low 32-bit) - Expected 511.9, actual 519 (1.01x) (8) +Testing collisions (low 24-36 bits) - Worst is 34 bits: 134/127 (1.05x) +Testing distribution - Worst bias is the 18-bit window at bit 43 - 0.101% + +Testing bit 3 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 511 (1.00x) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 78/63 (1.22x) +Testing collisions (low 32-bit) - Expected 511.9, actual 521 (1.02x) (10) +Testing collisions (low 24-36 bits) - Worst is 35 bits: 77/63 (1.20x) +Testing distribution - Worst bias is the 18-bit window at bit 31 - 0.067% + +Testing bit 4 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 483 (0.94x) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 36/31 (1.13x) +Testing collisions (low 32-bit) - Expected 511.9, actual 492 (0.96x) +Testing collisions (low 24-36 bits) - Worst is 25 bits: 64466/64191 (1.00x) +Testing distribution - Worst bias is the 17-bit window at bit 36 - 0.052% + +Testing bit 5 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 519 (1.01x) (8) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 39/31 (1.22x) +Testing collisions (low 32-bit) - Expected 511.9, actual 542 (1.06x) (31) +Testing collisions (low 24-36 bits) - Worst is 35 bits: 77/63 (1.20x) +Testing distribution - Worst bias is the 18-bit window at bit 38 - 0.055% + +Testing bit 6 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 549 (1.07x) (38) +Testing collisions (high 24-36 bits) - Worst is 31 bits: 1115/1023 (1.09x) +Testing collisions (low 32-bit) - Expected 511.9, actual 547 (1.07x) (36) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 40/31 (1.25x) +Testing distribution - Worst bias is the 18-bit window at bit 4 - 0.116% + +Testing bit 7 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 515 (1.01x) (4) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 33/31 (1.03x) +Testing collisions (low 32-bit) - Expected 511.9, actual 483 (0.94x) +Testing collisions (low 24-36 bits) - Worst is 24 bits: 125823/125777 (1.00x) +Testing distribution - Worst bias is the 18-bit window at bit 62 - 0.067% + +Testing bit 8 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 514 (1.00x) (3) +Testing collisions (high 24-36 bits) - Worst is 31 bits: 1051/1023 (1.03x) +Testing collisions (low 32-bit) - Expected 511.9, actual 511 (1.00x) +Testing collisions (low 24-36 bits) - Worst is 35 bits: 67/63 (1.05x) +Testing distribution - Worst bias is the 18-bit window at bit 36 - 0.091% + +Testing bit 9 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 524 (1.02x) (13) +Testing collisions (high 24-36 bits) - Worst is 33 bits: 264/255 (1.03x) +Testing collisions (low 32-bit) - Expected 511.9, actual 514 (1.00x) (3) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 45/31 (1.41x) +Testing distribution - Worst bias is the 18-bit window at bit 42 - 0.069% + +Testing bit 10 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 502 (0.98x) (-9) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 75/63 (1.17x) +Testing collisions (low 32-bit) - Expected 511.9, actual 503 (0.98x) (-8) +Testing collisions (low 24-36 bits) - Worst is 30 bits: 2102/2046 (1.03x) +Testing distribution - Worst bias is the 17-bit window at bit 43 - 0.085% + +Testing bit 11 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 480 (0.94x) +Testing collisions (high 24-36 bits) - Worst is 30 bits: 2073/2046 (1.01x) +Testing collisions (low 32-bit) - Expected 511.9, actual 527 (1.03x) (16) +Testing collisions (low 24-36 bits) - Worst is 32 bits: 527/511 (1.03x) +Testing distribution - Worst bias is the 18-bit window at bit 60 - 0.112% + +Testing bit 12 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 513 (1.00x) (2) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 71/63 (1.11x) +Testing collisions (low 32-bit) - Expected 511.9, actual 524 (1.02x) (13) +Testing collisions (low 24-36 bits) - Worst is 33 bits: 265/255 (1.04x) +Testing distribution - Worst bias is the 18-bit window at bit 35 - 0.068% + +Testing bit 13 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 559 (1.09x) (48) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 73/63 (1.14x) +Testing collisions (low 32-bit) - Expected 511.9, actual 555 (1.08x) (44) +Testing collisions (low 24-36 bits) - Worst is 34 bits: 150/127 (1.17x) +Testing distribution - Worst bias is the 18-bit window at bit 26 - 0.103% + +Testing bit 14 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 512 (1.00x) (1) +Testing collisions (high 24-36 bits) - Worst is 34 bits: 134/127 (1.05x) +Testing collisions (low 32-bit) - Expected 511.9, actual 506 (0.99x) (-5) +Testing collisions (low 24-36 bits) - Worst is 35 bits: 69/63 (1.08x) +Testing distribution - Worst bias is the 18-bit window at bit 28 - 0.064% + +Testing bit 15 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 526 (1.03x) (15) +Testing collisions (high 24-36 bits) - Worst is 32 bits: 526/511 (1.03x) +Testing collisions (low 32-bit) - Expected 511.9, actual 532 (1.04x) (21) +Testing collisions (low 24-36 bits) - Worst is 31 bits: 1067/1023 (1.04x) +Testing distribution - Worst bias is the 18-bit window at bit 18 - 0.076% + +Testing bit 16 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 542 (1.06x) (31) +Testing collisions (high 24-36 bits) - Worst is 33 bits: 291/255 (1.14x) +Testing collisions (low 32-bit) - Expected 511.9, actual 481 (0.94x) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 36/31 (1.13x) +Testing distribution - Worst bias is the 18-bit window at bit 49 - 0.077% + +Testing bit 17 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 527 (1.03x) (16) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 37/31 (1.16x) +Testing collisions (low 32-bit) - Expected 511.9, actual 546 (1.07x) (35) +Testing collisions (low 24-36 bits) - Worst is 35 bits: 75/63 (1.17x) +Testing distribution - Worst bias is the 18-bit window at bit 56 - 0.079% + +Testing bit 18 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 502 (0.98x) (-9) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 35/31 (1.09x) +Testing collisions (low 32-bit) - Expected 511.9, actual 498 (0.97x) +Testing collisions (low 24-36 bits) - Worst is 34 bits: 130/127 (1.02x) +Testing distribution - Worst bias is the 18-bit window at bit 16 - 0.066% + +Testing bit 19 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 522 (1.02x) (11) +Testing collisions (high 24-36 bits) - Worst is 33 bits: 264/255 (1.03x) +Testing collisions (low 32-bit) - Expected 511.9, actual 559 (1.09x) (48) +Testing collisions (low 24-36 bits) - Worst is 33 bits: 281/255 (1.10x) +Testing distribution - Worst bias is the 18-bit window at bit 20 - 0.089% + +Testing bit 20 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 547 (1.07x) (36) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 71/63 (1.11x) +Testing collisions (low 32-bit) - Expected 511.9, actual 524 (1.02x) (13) +Testing collisions (low 24-36 bits) - Worst is 34 bits: 139/127 (1.09x) +Testing distribution - Worst bias is the 18-bit window at bit 27 - 0.064% + +Testing bit 21 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 487 (0.95x) +Testing collisions (high 24-36 bits) - Worst is 34 bits: 135/127 (1.05x) +Testing collisions (low 32-bit) - Expected 511.9, actual 510 (1.00x) (-1) +Testing collisions (low 24-36 bits) - Worst is 35 bits: 69/63 (1.08x) +Testing distribution - Worst bias is the 18-bit window at bit 34 - 0.091% + +Testing bit 22 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 517 (1.01x) (6) +Testing collisions (high 24-36 bits) - Worst is 33 bits: 269/255 (1.05x) +Testing collisions (low 32-bit) - Expected 511.9, actual 490 (0.96x) +Testing collisions (low 24-36 bits) - Worst is 29 bits: 4116/4090 (1.01x) +Testing distribution - Worst bias is the 18-bit window at bit 55 - 0.120% + +Testing bit 23 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 480 (0.94x) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 33/31 (1.03x) +Testing collisions (low 32-bit) - Expected 511.9, actual 508 (0.99x) (-3) +Testing collisions (low 24-36 bits) - Worst is 30 bits: 2076/2046 (1.01x) +Testing distribution - Worst bias is the 18-bit window at bit 5 - 0.060% + +Testing bit 24 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 493 (0.96x) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 39/31 (1.22x) +Testing collisions (low 32-bit) - Expected 511.9, actual 492 (0.96x) +Testing collisions (low 24-36 bits) - Worst is 30 bits: 2079/2046 (1.02x) +Testing distribution - Worst bias is the 18-bit window at bit 54 - 0.078% + +Testing bit 25 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 511 (1.00x) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 65/63 (1.02x) +Testing collisions (low 32-bit) - Expected 511.9, actual 493 (0.96x) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 33/31 (1.03x) +Testing distribution - Worst bias is the 18-bit window at bit 7 - 0.093% + +Testing bit 26 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 533 (1.04x) (22) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 71/63 (1.11x) +Testing collisions (low 32-bit) - Expected 511.9, actual 514 (1.00x) (3) +Testing collisions (low 24-36 bits) - Worst is 30 bits: 2088/2046 (1.02x) +Testing distribution - Worst bias is the 18-bit window at bit 33 - 0.084% + +Testing bit 27 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 456 (0.89x) +Testing collisions (high 24-36 bits) - Worst is 29 bits: 4111/4090 (1.00x) +Testing collisions (low 32-bit) - Expected 511.9, actual 519 (1.01x) (8) +Testing collisions (low 24-36 bits) - Worst is 31 bits: 1054/1023 (1.03x) +Testing distribution - Worst bias is the 18-bit window at bit 24 - 0.074% + +Testing bit 28 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 528 (1.03x) (17) +Testing collisions (high 24-36 bits) - Worst is 33 bits: 274/255 (1.07x) +Testing collisions (low 32-bit) - Expected 511.9, actual 490 (0.96x) +Testing collisions (low 24-36 bits) - Worst is 35 bits: 80/63 (1.25x) +Testing distribution - Worst bias is the 18-bit window at bit 40 - 0.097% + +Testing bit 29 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 491 (0.96x) +Testing collisions (high 24-36 bits) - Worst is 27 bits: 16375/16298 (1.00x) +Testing collisions (low 32-bit) - Expected 511.9, actual 505 (0.99x) (-6) +Testing collisions (low 24-36 bits) - Worst is 24 bits: 125841/125777 (1.00x) +Testing distribution - Worst bias is the 18-bit window at bit 3 - 0.067% + +Testing bit 30 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 512 (1.00x) (1) +Testing collisions (high 24-36 bits) - Worst is 34 bits: 142/127 (1.11x) +Testing collisions (low 32-bit) - Expected 511.9, actual 497 (0.97x) +Testing collisions (low 24-36 bits) - Worst is 34 bits: 134/127 (1.05x) +Testing distribution - Worst bias is the 18-bit window at bit 9 - 0.062% + +Testing bit 31 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 475 (0.93x) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 38/31 (1.19x) +Testing collisions (low 32-bit) - Expected 511.9, actual 523 (1.02x) (12) +Testing collisions (low 24-36 bits) - Worst is 34 bits: 146/127 (1.14x) +Testing distribution - Worst bias is the 18-bit window at bit 48 - 0.071% + +Testing bit 32 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 485 (0.95x) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 35/31 (1.09x) +Testing collisions (low 32-bit) - Expected 511.9, actual 568 (1.11x) (57) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 39/31 (1.22x) +Testing distribution - Worst bias is the 18-bit window at bit 8 - 0.068% + +Testing bit 33 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 537 (1.05x) (26) +Testing collisions (high 24-36 bits) - Worst is 32 bits: 537/511 (1.05x) +Testing collisions (low 32-bit) - Expected 511.9, actual 556 (1.09x) (45) +Testing collisions (low 24-36 bits) - Worst is 34 bits: 145/127 (1.13x) +Testing distribution - Worst bias is the 18-bit window at bit 55 - 0.080% + +Testing bit 34 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 498 (0.97x) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 38/31 (1.19x) +Testing collisions (low 32-bit) - Expected 511.9, actual 514 (1.00x) (3) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 45/31 (1.41x) +Testing distribution - Worst bias is the 18-bit window at bit 22 - 0.065% + +Testing bit 35 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 514 (1.00x) (3) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 34/31 (1.06x) +Testing collisions (low 32-bit) - Expected 511.9, actual 521 (1.02x) (10) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 44/31 (1.38x) +Testing distribution - Worst bias is the 18-bit window at bit 28 - 0.081% + +Testing bit 36 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 575 (1.12x) (64) +Testing collisions (high 24-36 bits) - Worst is 32 bits: 575/511 (1.12x) +Testing collisions (low 32-bit) - Expected 511.9, actual 548 (1.07x) (37) +Testing collisions (low 24-36 bits) - Worst is 32 bits: 548/511 (1.07x) +Testing distribution - Worst bias is the 18-bit window at bit 28 - 0.080% + +Testing bit 37 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 553 (1.08x) (42) +Testing collisions (high 24-36 bits) - Worst is 33 bits: 303/255 (1.18x) +Testing collisions (low 32-bit) - Expected 511.9, actual 469 (0.92x) +Testing collisions (low 24-36 bits) - Worst is 29 bits: 4183/4090 (1.02x) +Testing distribution - Worst bias is the 18-bit window at bit 44 - 0.076% + +Testing bit 38 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 495 (0.97x) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 66/63 (1.03x) +Testing collisions (low 32-bit) - Expected 511.9, actual 524 (1.02x) (13) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 35/31 (1.09x) +Testing distribution - Worst bias is the 18-bit window at bit 7 - 0.067% + +Testing bit 39 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 480 (0.94x) +Testing collisions (high 24-36 bits) - Worst is 24 bits: 125741/125777 (1.00x) +Testing collisions (low 32-bit) - Expected 511.9, actual 542 (1.06x) (31) +Testing collisions (low 24-36 bits) - Worst is 35 bits: 73/63 (1.14x) +Testing distribution - Worst bias is the 17-bit window at bit 0 - 0.053% + +Testing bit 40 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 523 (1.02x) (12) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 67/63 (1.05x) +Testing collisions (low 32-bit) - Expected 511.9, actual 523 (1.02x) (12) +Testing collisions (low 24-36 bits) - Worst is 35 bits: 71/63 (1.11x) +Testing distribution - Worst bias is the 18-bit window at bit 18 - 0.098% + +Testing bit 41 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 520 (1.02x) (9) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 34/31 (1.06x) +Testing collisions (low 32-bit) - Expected 511.9, actual 519 (1.01x) (8) +Testing collisions (low 24-36 bits) - Worst is 35 bits: 71/63 (1.11x) +Testing distribution - Worst bias is the 18-bit window at bit 44 - 0.072% + +Testing bit 42 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 503 (0.98x) (-8) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 40/31 (1.25x) +Testing collisions (low 32-bit) - Expected 511.9, actual 531 (1.04x) (20) +Testing collisions (low 24-36 bits) - Worst is 33 bits: 273/255 (1.07x) +Testing distribution - Worst bias is the 18-bit window at bit 4 - 0.072% + +Testing bit 43 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 546 (1.07x) (35) +Testing collisions (high 24-36 bits) - Worst is 33 bits: 287/255 (1.12x) +Testing collisions (low 32-bit) - Expected 511.9, actual 480 (0.94x) +Testing collisions (low 24-36 bits) - Worst is 34 bits: 133/127 (1.04x) +Testing distribution - Worst bias is the 18-bit window at bit 43 - 0.073% + +Testing bit 44 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 530 (1.04x) (19) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 40/31 (1.25x) +Testing collisions (low 32-bit) - Expected 511.9, actual 510 (1.00x) (-1) +Testing collisions (low 24-36 bits) - Worst is 27 bits: 16377/16298 (1.00x) +Testing distribution - Worst bias is the 18-bit window at bit 27 - 0.057% + +Testing bit 45 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 510 (1.00x) (-1) +Testing collisions (high 24-36 bits) - Worst is 26 bits: 32880/32429 (1.01x) +Testing collisions (low 32-bit) - Expected 511.9, actual 525 (1.03x) (14) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 39/31 (1.22x) +Testing distribution - Worst bias is the 18-bit window at bit 35 - 0.076% + +Testing bit 46 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 513 (1.00x) (2) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 34/31 (1.06x) +Testing collisions (low 32-bit) - Expected 511.9, actual 573 (1.12x) (62) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 40/31 (1.25x) +Testing distribution - Worst bias is the 17-bit window at bit 53 - 0.061% + +Testing bit 47 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 503 (0.98x) (-8) +Testing collisions (high 24-36 bits) - Worst is 30 bits: 2078/2046 (1.02x) +Testing collisions (low 32-bit) - Expected 511.9, actual 475 (0.93x) +Testing collisions (low 24-36 bits) - Worst is 24 bits: 125854/125777 (1.00x) +Testing distribution - Worst bias is the 18-bit window at bit 7 - 0.077% + +Testing bit 48 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 511 (1.00x) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 67/63 (1.05x) +Testing collisions (low 32-bit) - Expected 511.9, actual 487 (0.95x) +Testing collisions (low 24-36 bits) - Worst is 35 bits: 65/63 (1.02x) +Testing distribution - Worst bias is the 18-bit window at bit 57 - 0.075% + +Testing bit 49 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 530 (1.04x) (19) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 34/31 (1.06x) +Testing collisions (low 32-bit) - Expected 511.9, actual 530 (1.04x) (19) +Testing collisions (low 24-36 bits) - Worst is 30 bits: 2125/2046 (1.04x) +Testing distribution - Worst bias is the 18-bit window at bit 55 - 0.071% + +Testing bit 50 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 548 (1.07x) (37) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 37/31 (1.16x) +Testing collisions (low 32-bit) - Expected 511.9, actual 560 (1.09x) (49) +Testing collisions (low 24-36 bits) - Worst is 34 bits: 144/127 (1.13x) +Testing distribution - Worst bias is the 18-bit window at bit 7 - 0.123% + +Testing bit 51 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 533 (1.04x) (22) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 74/63 (1.16x) +Testing collisions (low 32-bit) - Expected 511.9, actual 520 (1.02x) (9) +Testing collisions (low 24-36 bits) - Worst is 29 bits: 4156/4090 (1.02x) +Testing distribution - Worst bias is the 18-bit window at bit 59 - 0.070% + +Testing bit 52 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 489 (0.96x) +Testing collisions (high 24-36 bits) - Worst is 30 bits: 2066/2046 (1.01x) +Testing collisions (low 32-bit) - Expected 511.9, actual 503 (0.98x) (-8) +Testing collisions (low 24-36 bits) - Worst is 26 bits: 32529/32429 (1.00x) +Testing distribution - Worst bias is the 18-bit window at bit 42 - 0.084% + +Testing bit 53 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 527 (1.03x) (16) +Testing collisions (high 24-36 bits) - Worst is 30 bits: 2145/2046 (1.05x) +Testing collisions (low 32-bit) - Expected 511.9, actual 504 (0.98x) (-7) +Testing collisions (low 24-36 bits) - Worst is 26 bits: 32595/32429 (1.01x) +Testing distribution - Worst bias is the 18-bit window at bit 46 - 0.084% + +Testing bit 54 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 515 (1.01x) (4) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 71/63 (1.11x) +Testing collisions (low 32-bit) - Expected 511.9, actual 540 (1.05x) (29) +Testing collisions (low 24-36 bits) - Worst is 34 bits: 153/127 (1.20x) +Testing distribution - Worst bias is the 18-bit window at bit 18 - 0.089% + +Testing bit 55 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 551 (1.08x) (40) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 77/63 (1.20x) +Testing collisions (low 32-bit) - Expected 511.9, actual 529 (1.03x) (18) +Testing collisions (low 24-36 bits) - Worst is 32 bits: 529/511 (1.03x) +Testing distribution - Worst bias is the 18-bit window at bit 24 - 0.118% + +Testing bit 56 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 513 (1.00x) (2) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 42/31 (1.31x) +Testing collisions (low 32-bit) - Expected 511.9, actual 489 (0.96x) +Testing collisions (low 24-36 bits) - Worst is 30 bits: 2079/2046 (1.02x) +Testing distribution - Worst bias is the 18-bit window at bit 58 - 0.104% + +Testing bit 57 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 516 (1.01x) (5) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 44/31 (1.38x) +Testing collisions (low 32-bit) - Expected 511.9, actual 526 (1.03x) (15) +Testing collisions (low 24-36 bits) - Worst is 34 bits: 146/127 (1.14x) +Testing distribution - Worst bias is the 18-bit window at bit 24 - 0.101% + +Testing bit 58 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 562 (1.10x) (51) +Testing collisions (high 24-36 bits) - Worst is 33 bits: 290/255 (1.13x) +Testing collisions (low 32-bit) - Expected 511.9, actual 549 (1.07x) (38) +Testing collisions (low 24-36 bits) - Worst is 32 bits: 549/511 (1.07x) +Testing distribution - Worst bias is the 18-bit window at bit 3 - 0.080% + +Testing bit 59 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 501 (0.98x) +Testing collisions (high 24-36 bits) - Worst is 34 bits: 133/127 (1.04x) +Testing collisions (low 32-bit) - Expected 511.9, actual 516 (1.01x) (5) +Testing collisions (low 24-36 bits) - Worst is 34 bits: 143/127 (1.12x) +Testing distribution - Worst bias is the 18-bit window at bit 30 - 0.076% + +Testing bit 60 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 509 (0.99x) (-2) +Testing collisions (high 24-36 bits) - Worst is 34 bits: 129/127 (1.01x) +Testing collisions (low 32-bit) - Expected 511.9, actual 537 (1.05x) (26) +Testing collisions (low 24-36 bits) - Worst is 34 bits: 142/127 (1.11x) +Testing distribution - Worst bias is the 18-bit window at bit 41 - 0.104% + +Testing bit 61 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 502 (0.98x) (-9) +Testing collisions (high 24-36 bits) - Worst is 33 bits: 263/255 (1.03x) +Testing collisions (low 32-bit) - Expected 511.9, actual 525 (1.03x) (14) +Testing collisions (low 24-36 bits) - Worst is 35 bits: 66/63 (1.03x) +Testing distribution - Worst bias is the 18-bit window at bit 60 - 0.089% + +Testing bit 62 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 541 (1.06x) (30) +Testing collisions (high 24-36 bits) - Worst is 32 bits: 541/511 (1.06x) +Testing collisions (low 32-bit) - Expected 511.9, actual 502 (0.98x) (-9) +Testing collisions (low 24-36 bits) - Worst is 35 bits: 73/63 (1.14x) +Testing distribution - Worst bias is the 18-bit window at bit 4 - 0.057% + +Testing bit 63 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 479 (0.94x) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 37/31 (1.16x) +Testing collisions (low 32-bit) - Expected 511.9, actual 562 (1.10x) (51) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 37/31 (1.16x) +Testing distribution - Worst bias is the 18-bit window at bit 50 - 0.061% + + +[[[ MomentChi2 Tests ]]] + +Analyze hashes produced from a serie of linearly increasing numbers of 32-bit, using a step of 2 ... +Target values to approximate : 38918200.000000 - 273633.333333 +4 threads starting... done +Popcount 1 stats : 38919070.880649 - 273658.516930 +Popcount 0 stats : 38919194.839021 - 273657.339256 +MomentChi2 for bits 1 : 1.38579 +MomentChi2 for bits 0 : 1.80837 + +Derivative stats (transition from 2 consecutive values) : +Popcount 1 stats : 38918610.739435 - 273628.413070 +Popcount 0 stats : 38919023.148389 - 273649.013652 +MomentChi2 for deriv b1 : 0.308275 +MomentChi2 for deriv b0 : 1.23807 + + Great + + +[[[ Prng Tests ]]] + +Generating 33554432 random numbers : +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 130731.3, actual 130656 (1.00x) (-75) +Testing collisions (high 28-44 bits) - Worst is 43 bits: 66/63 (1.03x) +Testing collisions (low 32-bit) - Expected 130731.3, actual 130961 (1.00x) (230) +Testing collisions (low 28-44 bits) - Worst is 37 bits: 4145/4095 (1.01x) + +[[[ BadSeeds Tests ]]] + +Testing 0 internal secrets: +0x0 PASS + + +Input vcode 0x00000001, Output vcode 0x00000001, Result vcode 0x00000001 +Verification value is 0x00000001 - Testing took 594.176606 seconds +------------------------------------------------------------------------------- diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/smhasher/clone_smhasher.sh b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/smhasher/clone_smhasher.sh new file mode 100755 index 0000000..f98379e --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/smhasher/clone_smhasher.sh @@ -0,0 +1 @@ +git clone https://github.com/rurban/smhasher.git diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/smhasher/fallbackNoFoldedOutput.txt b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/smhasher/fallbackNoFoldedOutput.txt new file mode 100644 index 0000000..8b6040b --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/smhasher/fallbackNoFoldedOutput.txt @@ -0,0 +1,1137 @@ +------------------------------------------------------------------------------- +--- Testing ahash64 "ahash 64bit" GOOD + +[[[ Sanity Tests ]]] + +Verification value 0x4F80BA96 ....... SKIP (self- or unseeded) +Running sanity check 1 .......... PASS +Running AppendedZeroesTest .......... PASS + +[[[ Speed Tests ]]] + +Bulk speed test - 262144-byte keys +Alignment 7 - 18.833 bytes/cycle - 53881.77 MiB/sec @ 3 ghz +Alignment 6 - 18.835 bytes/cycle - 53887.84 MiB/sec @ 3 ghz +Alignment 5 - 18.835 bytes/cycle - 53888.73 MiB/sec @ 3 ghz +Alignment 4 - 19.338 bytes/cycle - 55327.26 MiB/sec @ 3 ghz +Alignment 3 - 19.422 bytes/cycle - 55566.47 MiB/sec @ 3 ghz +Alignment 2 - 19.475 bytes/cycle - 55717.32 MiB/sec @ 3 ghz +Alignment 1 - 19.266 bytes/cycle - 55120.73 MiB/sec @ 3 ghz +Alignment 0 - 19.932 bytes/cycle - 57026.80 MiB/sec @ 3 ghz +Average - 19.242 bytes/cycle - 55052.12 MiB/sec @ 3 ghz + +Small key speed test - 1-byte keys - 33.00 cycles/hash +Small key speed test - 2-byte keys - 33.00 cycles/hash +Small key speed test - 3-byte keys - 32.02 cycles/hash +Small key speed test - 4-byte keys - 30.73 cycles/hash +Small key speed test - 5-byte keys - 30.81 cycles/hash +Small key speed test - 6-byte keys - 31.95 cycles/hash +Small key speed test - 7-byte keys - 33.00 cycles/hash +Small key speed test - 8-byte keys - 33.00 cycles/hash +Small key speed test - 9-byte keys - 30.83 cycles/hash +Small key speed test - 10-byte keys - 30.79 cycles/hash +Small key speed test - 11-byte keys - 30.86 cycles/hash +Small key speed test - 12-byte keys - 31.79 cycles/hash +Small key speed test - 13-byte keys - 32.00 cycles/hash +Small key speed test - 14-byte keys - 32.31 cycles/hash +Small key speed test - 15-byte keys - 30.51 cycles/hash +Small key speed test - 16-byte keys - 30.93 cycles/hash +Small key speed test - 17-byte keys - 33.07 cycles/hash +Small key speed test - 18-byte keys - 35.00 cycles/hash +Small key speed test - 19-byte keys - 35.00 cycles/hash +Small key speed test - 20-byte keys - 33.93 cycles/hash +Small key speed test - 21-byte keys - 32.86 cycles/hash +Small key speed test - 22-byte keys - 32.96 cycles/hash +Small key speed test - 23-byte keys - 34.30 cycles/hash +Small key speed test - 24-byte keys - 35.00 cycles/hash +Small key speed test - 25-byte keys - 35.00 cycles/hash +Small key speed test - 26-byte keys - 32.65 cycles/hash +Small key speed test - 27-byte keys - 33.00 cycles/hash +Small key speed test - 28-byte keys - 33.44 cycles/hash +Small key speed test - 29-byte keys - 35.00 cycles/hash +Small key speed test - 30-byte keys - 35.00 cycles/hash +Small key speed test - 31-byte keys - 34.00 cycles/hash +Average 32.830 cycles/hash + +[[[ 'Hashmap' Speed Tests ]]] + +std::unordered_map +Init std HashMapTest: 199.037 cycles/op (102774 inserts, 1% deletions) +Running std HashMapTest: 125.873 cycles/op (2.4 stdv) + +greg7mdp/parallel-hashmap +Init fast HashMapTest: 113.297 cycles/op (102774 inserts, 1% deletions) +Running fast HashMapTest: 85.337 cycles/op (2.7 stdv) ....... PASS + +[[[ Avalanche Tests ]]] + +Testing 24-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.653333% +Testing 32-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.654667% +Testing 40-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.725333% +Testing 48-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.680667% +Testing 56-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.686000% +Testing 64-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.676000% +Testing 72-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.676000% +Testing 80-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.620667% +Testing 96-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.699333% +Testing 112-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.684667% +Testing 128-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.734000% +Testing 160-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.673333% +Testing 512-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.748000% +Testing 1024-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.780000% + +[[[ Keyset 'Sparse' Tests ]]] + +Keyset 'Sparse' - 16-bit keys with up to 9 bits set - 50643 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 0.3, actual 0 (0.00x) +Testing collisions (high 19-25 bits) - Worst is 22 bits: 313/304 (1.03x) +Testing collisions (low 32-bit) - Expected 0.3, actual 0 (0.00x) +Testing collisions (low 19-25 bits) - Worst is 25 bits: 43/38 (1.13x) +Testing distribution - Worst bias is the 13-bit window at bit 9 - 0.766% + +Keyset 'Sparse' - 24-bit keys with up to 8 bits set - 1271626 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 188.2, actual 179 (0.95x) +Testing collisions (high 24-35 bits) - Worst is 30 bits: 772/752 (1.03x) +Testing collisions (low 32-bit) - Expected 188.2, actual 180 (0.96x) +Testing collisions (low 24-35 bits) - Worst is 24 bits: 46572/46996 (0.99x) +Testing distribution - Worst bias is the 17-bit window at bit 52 - 0.099% + +Keyset 'Sparse' - 32-bit keys with up to 7 bits set - 4514873 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 2372.2, actual 2386 (1.01x) (14) +Testing collisions (high 25-38 bits) - Worst is 33 bits: 1206/1186 (1.02x) +Testing collisions (low 32-bit) - Expected 2372.2, actual 2291 (0.97x) +Testing collisions (low 25-38 bits) - Worst is 35 bits: 299/296 (1.01x) +Testing distribution - Worst bias is the 19-bit window at bit 7 - 0.048% + +Keyset 'Sparse' - 40-bit keys with up to 6 bits set - 4598479 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 2460.8, actual 2467 (1.00x) (7) +Testing collisions (high 25-38 bits) - Worst is 38 bits: 42/38 (1.09x) +Testing collisions (low 32-bit) - Expected 2460.8, actual 2431 (0.99x) (-29) +Testing collisions (low 25-38 bits) - Worst is 37 bits: 80/76 (1.04x) +Testing distribution - Worst bias is the 18-bit window at bit 32 - 0.044% + +Keyset 'Sparse' - 48-bit keys with up to 6 bits set - 14196869 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 23437.8, actual 23394 (1.00x) (-43) +Testing collisions (high 27-42 bits) - Worst is 41 bits: 58/45 (1.27x) +Testing collisions (low 32-bit) - Expected 23437.8, actual 23042 (0.98x) (-395) +Testing collisions (low 27-42 bits) - Worst is 40 bits: 97/91 (1.06x) +Testing distribution - Worst bias is the 20-bit window at bit 27 - 0.026% + +Keyset 'Sparse' - 56-bit keys with up to 5 bits set - 4216423 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 2069.0, actual 2131 (1.03x) (63) +Testing collisions (high 25-38 bits) - Worst is 38 bits: 44/32 (1.36x) +Testing collisions (low 32-bit) - Expected 2069.0, actual 2134 (1.03x) (66) +Testing collisions (low 25-38 bits) - Worst is 38 bits: 40/32 (1.24x) +Testing distribution - Worst bias is the 19-bit window at bit 28 - 0.078% + +Keyset 'Sparse' - 64-bit keys with up to 5 bits set - 8303633 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8021.7, actual 8004 (1.00x) (-17) +Testing collisions (high 26-40 bits) - Worst is 35 bits: 1003/1003 (1.00x) +Testing collisions (low 32-bit) - Expected 8021.7, actual 8045 (1.00x) (24) +Testing collisions (low 26-40 bits) - Worst is 40 bits: 39/31 (1.24x) +Testing distribution - Worst bias is the 20-bit window at bit 25 - 0.045% + +Keyset 'Sparse' - 72-bit keys with up to 5 bits set - 15082603 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 26451.8, actual 26592 (1.01x) (141) +Testing collisions (high 27-42 bits) - Worst is 33 bits: 13368/13233 (1.01x) +Testing collisions (low 32-bit) - Expected 26451.8, actual 26315 (0.99x) (-136) +Testing collisions (low 27-42 bits) - Worst is 40 bits: 113/103 (1.09x) +Testing distribution - Worst bias is the 20-bit window at bit 59 - 0.018% + +Keyset 'Sparse' - 96-bit keys with up to 4 bits set - 3469497 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 1401.0, actual 1354 (0.97x) +Testing collisions (high 25-38 bits) - Worst is 36 bits: 88/87 (1.00x) +Testing collisions (low 32-bit) - Expected 1401.0, actual 1422 (1.02x) (22) +Testing collisions (low 25-38 bits) - Worst is 36 bits: 96/87 (1.10x) +Testing distribution - Worst bias is the 18-bit window at bit 43 - 0.055% + +Keyset 'Sparse' - 160-bit keys with up to 4 bits set - 26977161 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 84546.1, actual 84656 (1.00x) (110) +Testing collisions (high 28-44 bits) - Worst is 42 bits: 84/82 (1.02x) +Testing collisions (low 32-bit) - Expected 84546.1, actual 84598 (1.00x) (52) +Testing collisions (low 28-44 bits) - Worst is 41 bits: 199/165 (1.20x) +Testing distribution - Worst bias is the 20-bit window at bit 3 - 0.014% + +Keyset 'Sparse' - 256-bit keys with up to 3 bits set - 2796417 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 910.2, actual 914 (1.00x) (4) +Testing collisions (high 25-37 bits) - Worst is 36 bits: 62/56 (1.09x) +Testing collisions (low 32-bit) - Expected 910.2, actual 887 (0.97x) +Testing collisions (low 25-37 bits) - Worst is 35 bits: 130/113 (1.14x) +Testing distribution - Worst bias is the 19-bit window at bit 47 - 0.068% + +Keyset 'Sparse' - 512-bit keys with up to 3 bits set - 22370049 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 58155.4, actual 58437 (1.00x) (282) +Testing collisions (high 28-43 bits) - Worst is 33 bits: 29437/29102 (1.01x) +Testing collisions (low 32-bit) - Expected 58155.4, actual 58276 (1.00x) (121) +Testing collisions (low 28-43 bits) - Worst is 35 bits: 7362/7280 (1.01x) +Testing distribution - Worst bias is the 19-bit window at bit 11 - 0.011% + +Keyset 'Sparse' - 1024-bit keys with up to 2 bits set - 524801 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 32.1, actual 39 (1.22x) (7) +Testing collisions (high 22-32 bits) - Worst is 32 bits: 39/32 (1.22x) +Testing collisions (low 32-bit) - Expected 32.1, actual 29 (0.90x) +Testing collisions (low 22-32 bits) - Worst is 30 bits: 136/128 (1.06x) +Testing distribution - Worst bias is the 16-bit window at bit 59 - 0.126% + +Keyset 'Sparse' - 2048-bit keys with up to 2 bits set - 2098177 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.4, actual 513 (1.00x) (1) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 38/32 (1.19x) +Testing collisions (low 32-bit) - Expected 512.4, actual 491 (0.96x) +Testing collisions (low 24-36 bits) - Worst is 34 bits: 134/128 (1.05x) +Testing distribution - Worst bias is the 18-bit window at bit 17 - 0.134% + + +[[[ Keyset 'Permutation' Tests ]]] + +Combination Lowbits Tests: +Keyset 'Combination' - up to 7 blocks from a set of 8 - 2396744 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 668.6, actual 705 (1.05x) (37) +Testing collisions (high 24-37 bits) - Worst is 32 bits: 705/668 (1.05x) +Testing collisions (low 32-bit) - Expected 668.6, actual 619 (0.93x) +Testing collisions (low 24-37 bits) - Worst is 24 bits: 163754/163326 (1.00x) +Testing distribution - Worst bias is the 18-bit window at bit 19 - 0.061% + + +Combination Highbits Tests +Keyset 'Combination' - up to 7 blocks from a set of 8 - 2396744 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 668.6, actual 662 (0.99x) (-6) +Testing collisions (high 24-37 bits) - Worst is 30 bits: 2701/2672 (1.01x) +Testing collisions (low 32-bit) - Expected 668.6, actual 689 (1.03x) (21) +Testing collisions (low 24-37 bits) - Worst is 36 bits: 48/41 (1.15x) +Testing distribution - Worst bias is the 18-bit window at bit 47 - 0.053% + + +Combination Hi-Lo Tests: +Keyset 'Combination' - up to 6 blocks from a set of 15 - 12204240 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 17322.9, actual 17227 (0.99x) (-95) +Testing collisions (high 27-41 bits) - Worst is 27 bits: 538234/538415 (1.00x) +Testing collisions (low 32-bit) - Expected 17322.9, actual 17271 (1.00x) (-51) +Testing collisions (low 27-41 bits) - Worst is 41 bits: 43/33 (1.27x) +Testing distribution - Worst bias is the 20-bit window at bit 5 - 0.027% + + +Combination 0x8000000 Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8186.7, actual 8305 (1.01x) (119) +Testing collisions (high 26-40 bits) - Worst is 32 bits: 8305/8186 (1.01x) +Testing collisions (low 32-bit) - Expected 8186.7, actual 8198 (1.00x) (12) +Testing collisions (low 26-40 bits) - Worst is 34 bits: 2097/2047 (1.02x) +Testing distribution - Worst bias is the 20-bit window at bit 57 - 0.044% + + +Combination 0x0000001 Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8186.7, actual 8255 (1.01x) (69) +Testing collisions (high 26-40 bits) - Worst is 38 bits: 142/127 (1.11x) +Testing collisions (low 32-bit) - Expected 8186.7, actual 8105 (0.99x) (-81) +Testing collisions (low 26-40 bits) - Worst is 40 bits: 34/31 (1.06x) +Testing distribution - Worst bias is the 20-bit window at bit 48 - 0.036% + + +Combination 0x800000000000000 Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8186.7, actual 8071 (0.99x) (-115) +Testing collisions (high 26-40 bits) - Worst is 27 bits: 256884/256766 (1.00x) +Testing collisions (low 32-bit) - Expected 8186.7, actual 8209 (1.00x) (23) +Testing collisions (low 26-40 bits) - Worst is 40 bits: 38/31 (1.19x) +Testing distribution - Worst bias is the 20-bit window at bit 25 - 0.032% + + +Combination 0x000000000000001 Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8186.7, actual 8052 (0.98x) (-134) +Testing collisions (high 26-40 bits) - Worst is 35 bits: 1029/1023 (1.00x) +Testing collisions (low 32-bit) - Expected 8186.7, actual 8128 (0.99x) (-58) +Testing collisions (low 26-40 bits) - Worst is 40 bits: 40/31 (1.25x) +Testing distribution - Worst bias is the 20-bit window at bit 21 - 0.070% + + +Combination 16-bytes [0-1] Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8186.7, actual 8235 (1.01x) (49) +Testing collisions (high 26-40 bits) - Worst is 38 bits: 134/127 (1.05x) +Testing collisions (low 32-bit) - Expected 8186.7, actual 8072 (0.99x) (-114) +Testing collisions (low 26-40 bits) - Worst is 26 bits: 503674/503108 (1.00x) +Testing distribution - Worst bias is the 20-bit window at bit 54 - 0.046% + + +Combination 16-bytes [0-last] Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8186.7, actual 8207 (1.00x) (21) +Testing collisions (high 26-40 bits) - Worst is 34 bits: 2088/2047 (1.02x) +Testing collisions (low 32-bit) - Expected 8186.7, actual 8017 (0.98x) +Testing collisions (low 26-40 bits) - Worst is 40 bits: 37/31 (1.16x) +Testing distribution - Worst bias is the 20-bit window at bit 10 - 0.037% + + +Combination 32-bytes [0-1] Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8186.7, actual 8218 (1.00x) (32) +Testing collisions (high 26-40 bits) - Worst is 32 bits: 8218/8186 (1.00x) +Testing collisions (low 32-bit) - Expected 8186.7, actual 8233 (1.01x) (47) +Testing collisions (low 26-40 bits) - Worst is 38 bits: 152/127 (1.19x) +Testing distribution - Worst bias is the 20-bit window at bit 2 - 0.029% + + +Combination 32-bytes [0-last] Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8186.7, actual 8324 (1.02x) (138) +Testing collisions (high 26-40 bits) - Worst is 37 bits: 268/255 (1.05x) +Testing collisions (low 32-bit) - Expected 8186.7, actual 8099 (0.99x) (-87) +Testing collisions (low 26-40 bits) - Worst is 36 bits: 525/511 (1.03x) +Testing distribution - Worst bias is the 20-bit window at bit 13 - 0.044% + + +Combination 64-bytes [0-1] Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8186.7, actual 8033 (0.98x) (-153) +Testing collisions (high 26-40 bits) - Worst is 39 bits: 67/63 (1.05x) +Testing collisions (low 32-bit) - Expected 8186.7, actual 8293 (1.01x) (107) +Testing collisions (low 26-40 bits) - Worst is 37 bits: 274/255 (1.07x) +Testing distribution - Worst bias is the 20-bit window at bit 29 - 0.037% + + +Combination 64-bytes [0-last] Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8186.7, actual 8335 (1.02x) (149) +Testing collisions (high 26-40 bits) - Worst is 32 bits: 8335/8186 (1.02x) +Testing collisions (low 32-bit) - Expected 8186.7, actual 8163 (1.00x) (-23) +Testing collisions (low 26-40 bits) - Worst is 40 bits: 35/31 (1.09x) +Testing distribution - Worst bias is the 20-bit window at bit 20 - 0.033% + + +Combination 128-bytes [0-1] Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8186.7, actual 8238 (1.01x) (52) +Testing collisions (high 26-40 bits) - Worst is 31 bits: 16565/16362 (1.01x) +Testing collisions (low 32-bit) - Expected 8186.7, actual 8062 (0.98x) (-124) +Testing collisions (low 26-40 bits) - Worst is 37 bits: 262/255 (1.02x) +Testing distribution - Worst bias is the 20-bit window at bit 16 - 0.042% + + +Combination 128-bytes [0-last] Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8186.7, actual 8270 (1.01x) (84) +Testing collisions (high 26-40 bits) - Worst is 39 bits: 70/63 (1.09x) +Testing collisions (low 32-bit) - Expected 8186.7, actual 8144 (0.99x) (-42) +Testing collisions (low 26-40 bits) - Worst is 40 bits: 41/31 (1.28x) +Testing distribution - Worst bias is the 20-bit window at bit 29 - 0.042% + + +[[[ Keyset 'Window' Tests ]]] + +Keyset 'Window' - 32-bit key, 25-bit window - 32 tests, 33554432 keys per test +Window at 0 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 1 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 2 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 3 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 4 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 5 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 6 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 7 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 8 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 9 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 10 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 11 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 12 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 13 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 14 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 15 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 16 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 17 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 18 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 19 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 20 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 21 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 22 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 23 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 24 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 25 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 26 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 27 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 28 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 29 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 30 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 31 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 32 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) + +[[[ Keyset 'Cyclic' Tests ]]] + +Keyset 'Cyclic' - 8 cycles of 8 bytes - 1000000 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 116.4, actual 129 (1.11x) (13) +Testing collisions (high 23-34 bits) - Worst is 34 bits: 35/29 (1.20x) +Testing collisions (low 32-bit) - Expected 116.4, actual 105 (0.90x) +Testing collisions (low 23-34 bits) - Worst is 26 bits: 7507/7413 (1.01x) +Testing distribution - Worst bias is the 17-bit window at bit 40 - 0.089% + +Keyset 'Cyclic' - 8 cycles of 9 bytes - 1000000 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 116.4, actual 112 (0.96x) +Testing collisions (high 23-34 bits) - Worst is 28 bits: 1915/1860 (1.03x) +Testing collisions (low 32-bit) - Expected 116.4, actual 109 (0.94x) +Testing collisions (low 23-34 bits) - Worst is 30 bits: 472/465 (1.01x) +Testing distribution - Worst bias is the 17-bit window at bit 28 - 0.111% + +Keyset 'Cyclic' - 8 cycles of 10 bytes - 1000000 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 116.4, actual 106 (0.91x) +Testing collisions (high 23-34 bits) - Worst is 25 bits: 14825/14754 (1.00x) +Testing collisions (low 32-bit) - Expected 116.4, actual 130 (1.12x) (14) +Testing collisions (low 23-34 bits) - Worst is 34 bits: 39/29 (1.34x) +Testing distribution - Worst bias is the 17-bit window at bit 51 - 0.114% + +Keyset 'Cyclic' - 8 cycles of 11 bytes - 1000000 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 116.4, actual 110 (0.94x) +Testing collisions (high 23-34 bits) - Worst is 27 bits: 3703/3716 (1.00x) +Testing collisions (low 32-bit) - Expected 116.4, actual 105 (0.90x) +Testing collisions (low 23-34 bits) - Worst is 29 bits: 977/930 (1.05x) +Testing distribution - Worst bias is the 17-bit window at bit 32 - 0.120% + +Keyset 'Cyclic' - 8 cycles of 12 bytes - 1000000 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 116.4, actual 107 (0.92x) +Testing collisions (high 23-34 bits) - Worst is 23 bits: 57386/57305 (1.00x) +Testing collisions (low 32-bit) - Expected 116.4, actual 132 (1.13x) (16) +Testing collisions (low 23-34 bits) - Worst is 34 bits: 40/29 (1.37x) +Testing distribution - Worst bias is the 17-bit window at bit 57 - 0.073% + +Keyset 'Cyclic' - 8 cycles of 16 bytes - 1000000 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 116.4, actual 132 (1.13x) (16) +Testing collisions (high 23-34 bits) - Worst is 32 bits: 132/116 (1.13x) +Testing collisions (low 32-bit) - Expected 116.4, actual 118 (1.01x) (2) +Testing collisions (low 23-34 bits) - Worst is 32 bits: 118/116 (1.01x) +Testing distribution - Worst bias is the 17-bit window at bit 46 - 0.095% + + +[[[ Keyset 'TwoBytes' Tests ]]] + +Keyset 'TwoBytes' - up-to-4-byte keys, 652545 total keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 49.6, actual 53 (1.07x) (4) +Testing collisions (high 23-33 bits) - Worst is 32 bits: 53/49 (1.07x) +Testing collisions (low 32-bit) - Expected 49.6, actual 60 (1.21x) (11) +Testing collisions (low 23-33 bits) - Worst is 33 bits: 35/24 (1.41x) +Testing distribution - Worst bias is the 16-bit window at bit 21 - 0.145% + +Keyset 'TwoBytes' - up-to-8-byte keys, 5471025 total keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 3483.1, actual 3402 (0.98x) +Testing collisions (high 26-39 bits) - Worst is 29 bits: 27946/27781 (1.01x) +Testing collisions (low 32-bit) - Expected 3483.1, actual 3541 (1.02x) (58) +Testing collisions (low 26-39 bits) - Worst is 38 bits: 56/54 (1.03x) +Testing distribution - Worst bias is the 19-bit window at bit 30 - 0.034% + +Keyset 'TwoBytes' - up-to-12-byte keys, 18616785 total keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 40289.5, actual 39891 (0.99x) (-398) +Testing collisions (high 27-42 bits) - Worst is 27 bits: 1232174/1233446 (1.00x) +Testing collisions (low 32-bit) - Expected 40289.5, actual 40423 (1.00x) (134) +Testing collisions (low 27-42 bits) - Worst is 42 bits: 42/39 (1.07x) +Testing distribution - Worst bias is the 20-bit window at bit 6 - 0.016% + +Keyset 'TwoBytes' - up-to-16-byte keys, 44251425 total keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 227182.3, actual 227113 (1.00x) (-69) +Testing collisions (high 29-45 bits) - Worst is 45 bits: 32/27 (1.15x) +Testing collisions (low 32-bit) - Expected 227182.3, actual 227820 (1.00x) (638) +Testing collisions (low 29-45 bits) - Worst is 45 bits: 30/27 (1.08x) +Testing distribution - Worst bias is the 20-bit window at bit 11 - 0.006% + +Keyset 'TwoBytes' - up-to-20-byte keys, 86536545 total keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 865959.1, actual 866474 (1.00x) (515) +Testing collisions (high 30-47 bits) - Worst is 45 bits: 108/106 (1.01x) +Testing collisions (low 32-bit) - Expected 865959.1, actual 865864 (1.00x) (-95) +Testing collisions (low 30-47 bits) - Worst is 37 bits: 27468/27237 (1.01x) +Testing distribution - Worst bias is the 20-bit window at bit 18 - 0.005% + + +[[[ Keyset 'Text' Tests ]]] + +Keyset 'Text' - keys of form "FooXXXXBar" - 14776336 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 25389.0, actual 25545 (1.01x) (156) +Testing collisions (high 27-42 bits) - Worst is 40 bits: 106/99 (1.07x) +Testing collisions (low 32-bit) - Expected 25389.0, actual 25253 (0.99x) (-136) +Testing collisions (low 27-42 bits) - Worst is 42 bits: 25/24 (1.01x) +Testing distribution - Worst bias is the 20-bit window at bit 51 - 0.027% + +Keyset 'Text' - keys of form "FooBarXXXX" - 14776336 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 25389.0, actual 25219 (0.99x) (-170) +Testing collisions (high 27-42 bits) - Worst is 31 bits: 50616/50719 (1.00x) +Testing collisions (low 32-bit) - Expected 25389.0, actual 25549 (1.01x) (160) +Testing collisions (low 27-42 bits) - Worst is 40 bits: 106/99 (1.07x) +Testing distribution - Worst bias is the 20-bit window at bit 60 - 0.022% + +Keyset 'Text' - keys of form "XXXXFooBar" - 14776336 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 25389.0, actual 25373 (1.00x) (-16) +Testing collisions (high 27-42 bits) - Worst is 42 bits: 29/24 (1.17x) +Testing collisions (low 32-bit) - Expected 25389.0, actual 25204 (0.99x) (-185) +Testing collisions (low 27-42 bits) - Worst is 39 bits: 221/198 (1.11x) +Testing distribution - Worst bias is the 20-bit window at bit 28 - 0.020% + +Keyset 'Words' - 4000000 random keys of len 6-16 from alnum charset +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 1862.1, actual 1800 (0.97x) +Testing collisions (high 25-38 bits) - Worst is 37 bits: 65/58 (1.12x) +Testing collisions (low 32-bit) - Expected 1862.1, actual 1819 (0.98x) +Testing collisions (low 25-38 bits) - Worst is 34 bits: 484/465 (1.04x) +Testing distribution - Worst bias is the 19-bit window at bit 63 - 0.041% + +Keyset 'Words' - 4000000 random keys of len 6-16 from password charset +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 1862.1, actual 1827 (0.98x) (-35) +Testing collisions (high 25-38 bits) - Worst is 35 bits: 237/232 (1.02x) +Testing collisions (low 32-bit) - Expected 1862.1, actual 1885 (1.01x) (23) +Testing collisions (low 25-38 bits) - Worst is 35 bits: 237/232 (1.02x) +Testing distribution - Worst bias is the 19-bit window at bit 60 - 0.059% + +Keyset 'Words' - 102774 dict words +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 1.2, actual 0 (0.00x) +Testing collisions (high 20-27 bits) - Worst is 27 bits: 46/39 (1.17x) +Testing collisions (low 32-bit) - Expected 1.2, actual 1 (0.81x) +Testing collisions (low 20-27 bits) - Worst is 25 bits: 173/157 (1.10x) +Testing distribution - Worst bias is the 14-bit window at bit 35 - 0.340% + + +[[[ Keyset 'Zeroes' Tests ]]] + +Keyset 'Zeroes' - 204800 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 4.9, actual 6 (1.23x) (2) +Testing collisions (high 21-29 bits) - Worst is 25 bits: 651/623 (1.04x) +Testing collisions (low 32-bit) - Expected 4.9, actual 5 (1.02x) (1) +Testing collisions (low 21-29 bits) - Worst is 27 bits: 166/156 (1.06x) +Testing distribution - Worst bias is the 15-bit window at bit 55 - 0.298% + + +[[[ Keyset 'Seed' Tests ]]] + +Keyset 'Seed' - 5000000 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 2909.3, actual 2790 (0.96x) +Testing collisions (high 26-39 bits) - Worst is 26 bits: 181311/181723 (1.00x) +Testing collisions (low 32-bit) - Expected 2909.3, actual 2885 (0.99x) (-24) +Testing collisions (low 26-39 bits) - Worst is 39 bits: 33/22 (1.45x) +Testing distribution - Worst bias is the 19-bit window at bit 55 - 0.051% + + +[[[ Keyset 'PerlinNoise' Tests ]]] + +Testing 16777216 coordinates (L2) : +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 32725.4, actual 32807 (1.00x) (82) +Testing collisions (high 27-42 bits) - Worst is 39 bits: 266/255 (1.04x) +Testing collisions (low 32-bit) - Expected 32725.4, actual 33071 (1.01x) (346) +Testing collisions (low 27-42 bits) - Worst is 42 bits: 44/31 (1.38x) + +Testing AV variant, 128 count with 4 spacing, 4-12: +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 1116.2, actual 1124 (1.01x) (8) +Testing collisions (high 25-37 bits) - Worst is 36 bits: 83/69 (1.19x) +Testing collisions (low 32-bit) - Expected 1116.2, actual 1026 (0.92x) +Testing collisions (low 25-37 bits) - Worst is 27 bits: 35507/35452 (1.00x) + + +[[[ Diff 'Differential' Tests ]]] + +Testing 8303632 up-to-5-bit differentials in 64-bit keys -> 64 bit hashes. +1000 reps, 8303632000 total tests, expecting 0.00 random collisions.......... +0 total collisions, of which 0 single collisions were ignored + +Testing 11017632 up-to-4-bit differentials in 128-bit keys -> 64 bit hashes. +1000 reps, 11017632000 total tests, expecting 0.00 random collisions.......... +0 total collisions, of which 0 single collisions were ignored + +Testing 2796416 up-to-3-bit differentials in 256-bit keys -> 64 bit hashes. +1000 reps, 2796416000 total tests, expecting 0.00 random collisions.......... +0 total collisions, of which 0 single collisions were ignored + + +[[[ DiffDist 'Differential Distribution' Tests ]]] + +Testing bit 0 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 530 (1.04x) (19) +Testing collisions (high 24-36 bits) - Worst is 33 bits: 273/255 (1.07x) +Testing collisions (low 32-bit) - Expected 511.9, actual 537 (1.05x) (26) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 42/31 (1.31x) +Testing distribution - Worst bias is the 18-bit window at bit 10 - 0.083% + +Testing bit 1 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 518 (1.01x) (7) +Testing collisions (high 24-36 bits) - Worst is 32 bits: 518/511 (1.01x) +Testing collisions (low 32-bit) - Expected 511.9, actual 526 (1.03x) (15) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 36/31 (1.13x) +Testing distribution - Worst bias is the 18-bit window at bit 63 - 0.070% + +Testing bit 2 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 524 (1.02x) (13) +Testing collisions (high 24-36 bits) - Worst is 31 bits: 1063/1023 (1.04x) +Testing collisions (low 32-bit) - Expected 511.9, actual 528 (1.03x) (17) +Testing collisions (low 24-36 bits) - Worst is 31 bits: 1062/1023 (1.04x) +Testing distribution - Worst bias is the 18-bit window at bit 10 - 0.078% + +Testing bit 3 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 531 (1.04x) (20) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 68/63 (1.06x) +Testing collisions (low 32-bit) - Expected 511.9, actual 494 (0.97x) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 38/31 (1.19x) +Testing distribution - Worst bias is the 18-bit window at bit 14 - 0.059% + +Testing bit 4 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 519 (1.01x) (8) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 72/63 (1.13x) +Testing collisions (low 32-bit) - Expected 511.9, actual 492 (0.96x) +Testing collisions (low 24-36 bits) - Worst is 24 bits: 125969/125777 (1.00x) +Testing distribution - Worst bias is the 18-bit window at bit 6 - 0.068% + +Testing bit 5 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 498 (0.97x) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 35/31 (1.09x) +Testing collisions (low 32-bit) - Expected 511.9, actual 504 (0.98x) (-7) +Testing collisions (low 24-36 bits) - Worst is 35 bits: 75/63 (1.17x) +Testing distribution - Worst bias is the 18-bit window at bit 39 - 0.077% + +Testing bit 6 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 477 (0.93x) +Testing collisions (high 24-36 bits) - Worst is 34 bits: 134/127 (1.05x) +Testing collisions (low 32-bit) - Expected 511.9, actual 465 (0.91x) +Testing collisions (low 24-36 bits) - Worst is 26 bits: 32805/32429 (1.01x) +Testing distribution - Worst bias is the 18-bit window at bit 34 - 0.086% + +Testing bit 7 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 514 (1.00x) (3) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 34/31 (1.06x) +Testing collisions (low 32-bit) - Expected 511.9, actual 498 (0.97x) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 48/31 (1.50x) +Testing distribution - Worst bias is the 18-bit window at bit 33 - 0.090% + +Testing bit 8 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 474 (0.93x) +Testing collisions (high 24-36 bits) - Worst is 29 bits: 4132/4090 (1.01x) +Testing collisions (low 32-bit) - Expected 511.9, actual 483 (0.94x) +Testing collisions (low 24-36 bits) - Worst is 28 bits: 8305/8170 (1.02x) +Testing distribution - Worst bias is the 16-bit window at bit 37 - 0.063% + +Testing bit 9 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 481 (0.94x) +Testing collisions (high 24-36 bits) - Worst is 31 bits: 1048/1023 (1.02x) +Testing collisions (low 32-bit) - Expected 511.9, actual 501 (0.98x) +Testing collisions (low 24-36 bits) - Worst is 35 bits: 68/63 (1.06x) +Testing distribution - Worst bias is the 18-bit window at bit 24 - 0.065% + +Testing bit 10 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 504 (0.98x) (-7) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 37/31 (1.16x) +Testing collisions (low 32-bit) - Expected 511.9, actual 494 (0.97x) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 36/31 (1.13x) +Testing distribution - Worst bias is the 18-bit window at bit 43 - 0.068% + +Testing bit 11 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 509 (0.99x) (-2) +Testing collisions (high 24-36 bits) - Worst is 34 bits: 140/127 (1.09x) +Testing collisions (low 32-bit) - Expected 511.9, actual 572 (1.12x) (61) +Testing collisions (low 24-36 bits) - Worst is 32 bits: 572/511 (1.12x) +Testing distribution - Worst bias is the 18-bit window at bit 51 - 0.091% + +Testing bit 12 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 486 (0.95x) +Testing collisions (high 24-36 bits) - Worst is 24 bits: 125213/125777 (1.00x) +Testing collisions (low 32-bit) - Expected 511.9, actual 520 (1.02x) (9) +Testing collisions (low 24-36 bits) - Worst is 31 bits: 1043/1023 (1.02x) +Testing distribution - Worst bias is the 18-bit window at bit 6 - 0.083% + +Testing bit 13 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 547 (1.07x) (36) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 78/63 (1.22x) +Testing collisions (low 32-bit) - Expected 511.9, actual 515 (1.01x) (4) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 35/31 (1.09x) +Testing distribution - Worst bias is the 18-bit window at bit 32 - 0.074% + +Testing bit 14 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 457 (0.89x) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 72/63 (1.13x) +Testing collisions (low 32-bit) - Expected 511.9, actual 509 (0.99x) (-2) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 35/31 (1.09x) +Testing distribution - Worst bias is the 18-bit window at bit 24 - 0.084% + +Testing bit 15 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 510 (1.00x) (-1) +Testing collisions (high 24-36 bits) - Worst is 30 bits: 2133/2046 (1.04x) +Testing collisions (low 32-bit) - Expected 511.9, actual 476 (0.93x) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 37/31 (1.16x) +Testing distribution - Worst bias is the 18-bit window at bit 52 - 0.071% + +Testing bit 16 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 503 (0.98x) (-8) +Testing collisions (high 24-36 bits) - Worst is 28 bits: 8161/8170 (1.00x) +Testing collisions (low 32-bit) - Expected 511.9, actual 508 (0.99x) (-3) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 38/31 (1.19x) +Testing distribution - Worst bias is the 18-bit window at bit 49 - 0.062% + +Testing bit 17 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 513 (1.00x) (2) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 41/31 (1.28x) +Testing collisions (low 32-bit) - Expected 511.9, actual 520 (1.02x) (9) +Testing collisions (low 24-36 bits) - Worst is 33 bits: 279/255 (1.09x) +Testing distribution - Worst bias is the 18-bit window at bit 50 - 0.070% + +Testing bit 18 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 546 (1.07x) (35) +Testing collisions (high 24-36 bits) - Worst is 33 bits: 283/255 (1.11x) +Testing collisions (low 32-bit) - Expected 511.9, actual 487 (0.95x) +Testing collisions (low 24-36 bits) - Worst is 28 bits: 8185/8170 (1.00x) +Testing distribution - Worst bias is the 18-bit window at bit 22 - 0.058% + +Testing bit 19 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 514 (1.00x) (3) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 37/31 (1.16x) +Testing collisions (low 32-bit) - Expected 511.9, actual 498 (0.97x) +Testing collisions (low 24-36 bits) - Worst is 24 bits: 125639/125777 (1.00x) +Testing distribution - Worst bias is the 18-bit window at bit 54 - 0.082% + +Testing bit 20 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 525 (1.03x) (14) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 74/63 (1.16x) +Testing collisions (low 32-bit) - Expected 511.9, actual 541 (1.06x) (30) +Testing collisions (low 24-36 bits) - Worst is 30 bits: 2173/2046 (1.06x) +Testing distribution - Worst bias is the 18-bit window at bit 10 - 0.062% + +Testing bit 21 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 510 (1.00x) (-1) +Testing collisions (high 24-36 bits) - Worst is 33 bits: 275/255 (1.07x) +Testing collisions (low 32-bit) - Expected 511.9, actual 517 (1.01x) (6) +Testing collisions (low 24-36 bits) - Worst is 34 bits: 135/127 (1.05x) +Testing distribution - Worst bias is the 17-bit window at bit 29 - 0.059% + +Testing bit 22 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 505 (0.99x) (-6) +Testing collisions (high 24-36 bits) - Worst is 27 bits: 16472/16298 (1.01x) +Testing collisions (low 32-bit) - Expected 511.9, actual 529 (1.03x) (18) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 39/31 (1.22x) +Testing distribution - Worst bias is the 18-bit window at bit 45 - 0.071% + +Testing bit 23 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 526 (1.03x) (15) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 38/31 (1.19x) +Testing collisions (low 32-bit) - Expected 511.9, actual 542 (1.06x) (31) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 43/31 (1.34x) +Testing distribution - Worst bias is the 18-bit window at bit 57 - 0.070% + +Testing bit 24 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 515 (1.01x) (4) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 38/31 (1.19x) +Testing collisions (low 32-bit) - Expected 511.9, actual 532 (1.04x) (21) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 38/31 (1.19x) +Testing distribution - Worst bias is the 18-bit window at bit 50 - 0.060% + +Testing bit 25 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 511 (1.00x) +Testing collisions (high 24-36 bits) - Worst is 28 bits: 8353/8170 (1.02x) +Testing collisions (low 32-bit) - Expected 511.9, actual 497 (0.97x) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 42/31 (1.31x) +Testing distribution - Worst bias is the 18-bit window at bit 4 - 0.067% + +Testing bit 26 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 499 (0.97x) +Testing collisions (high 24-36 bits) - Worst is 34 bits: 132/127 (1.03x) +Testing collisions (low 32-bit) - Expected 511.9, actual 538 (1.05x) (27) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 40/31 (1.25x) +Testing distribution - Worst bias is the 18-bit window at bit 24 - 0.073% + +Testing bit 27 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 533 (1.04x) (22) +Testing collisions (high 24-36 bits) - Worst is 32 bits: 533/511 (1.04x) +Testing collisions (low 32-bit) - Expected 511.9, actual 485 (0.95x) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 36/31 (1.13x) +Testing distribution - Worst bias is the 18-bit window at bit 10 - 0.105% + +Testing bit 28 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 532 (1.04x) (21) +Testing collisions (high 24-36 bits) - Worst is 34 bits: 136/127 (1.06x) +Testing collisions (low 32-bit) - Expected 511.9, actual 506 (0.99x) (-5) +Testing collisions (low 24-36 bits) - Worst is 33 bits: 265/255 (1.04x) +Testing distribution - Worst bias is the 18-bit window at bit 63 - 0.073% + +Testing bit 29 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 494 (0.97x) +Testing collisions (high 24-36 bits) - Worst is 29 bits: 4145/4090 (1.01x) +Testing collisions (low 32-bit) - Expected 511.9, actual 492 (0.96x) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 35/31 (1.09x) +Testing distribution - Worst bias is the 18-bit window at bit 51 - 0.081% + +Testing bit 30 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 505 (0.99x) (-6) +Testing collisions (high 24-36 bits) - Worst is 26 bits: 32853/32429 (1.01x) +Testing collisions (low 32-bit) - Expected 511.9, actual 500 (0.98x) +Testing collisions (low 24-36 bits) - Worst is 30 bits: 2081/2046 (1.02x) +Testing distribution - Worst bias is the 18-bit window at bit 4 - 0.073% + +Testing bit 31 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 503 (0.98x) (-8) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 37/31 (1.16x) +Testing collisions (low 32-bit) - Expected 511.9, actual 503 (0.98x) (-8) +Testing collisions (low 24-36 bits) - Worst is 26 bits: 32504/32429 (1.00x) +Testing distribution - Worst bias is the 18-bit window at bit 48 - 0.068% + +Testing bit 32 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 536 (1.05x) (25) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 69/63 (1.08x) +Testing collisions (low 32-bit) - Expected 511.9, actual 526 (1.03x) (15) +Testing collisions (low 24-36 bits) - Worst is 33 bits: 274/255 (1.07x) +Testing distribution - Worst bias is the 18-bit window at bit 29 - 0.072% + +Testing bit 33 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 500 (0.98x) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 39/31 (1.22x) +Testing collisions (low 32-bit) - Expected 511.9, actual 562 (1.10x) (51) +Testing collisions (low 24-36 bits) - Worst is 33 bits: 292/255 (1.14x) +Testing distribution - Worst bias is the 18-bit window at bit 19 - 0.116% + +Testing bit 34 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 569 (1.11x) (58) +Testing collisions (high 24-36 bits) - Worst is 34 bits: 151/127 (1.18x) +Testing collisions (low 32-bit) - Expected 511.9, actual 529 (1.03x) (18) +Testing collisions (low 24-36 bits) - Worst is 31 bits: 1087/1023 (1.06x) +Testing distribution - Worst bias is the 18-bit window at bit 42 - 0.070% + +Testing bit 35 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 518 (1.01x) (7) +Testing collisions (high 24-36 bits) - Worst is 29 bits: 4155/4090 (1.02x) +Testing collisions (low 32-bit) - Expected 511.9, actual 546 (1.07x) (35) +Testing collisions (low 24-36 bits) - Worst is 34 bits: 149/127 (1.16x) +Testing distribution - Worst bias is the 18-bit window at bit 9 - 0.097% + +Testing bit 36 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 519 (1.01x) (8) +Testing collisions (high 24-36 bits) - Worst is 31 bits: 1084/1023 (1.06x) +Testing collisions (low 32-bit) - Expected 511.9, actual 502 (0.98x) (-9) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 35/31 (1.09x) +Testing distribution - Worst bias is the 18-bit window at bit 59 - 0.069% + +Testing bit 37 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 542 (1.06x) (31) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 81/63 (1.27x) +Testing collisions (low 32-bit) - Expected 511.9, actual 544 (1.06x) (33) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 37/31 (1.16x) +Testing distribution - Worst bias is the 17-bit window at bit 36 - 0.069% + +Testing bit 38 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 516 (1.01x) (5) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 67/63 (1.05x) +Testing collisions (low 32-bit) - Expected 511.9, actual 486 (0.95x) +Testing collisions (low 24-36 bits) - Worst is 27 bits: 16424/16298 (1.01x) +Testing distribution - Worst bias is the 18-bit window at bit 16 - 0.116% + +Testing bit 39 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 516 (1.01x) (5) +Testing collisions (high 24-36 bits) - Worst is 34 bits: 139/127 (1.09x) +Testing collisions (low 32-bit) - Expected 511.9, actual 536 (1.05x) (25) +Testing collisions (low 24-36 bits) - Worst is 35 bits: 70/63 (1.09x) +Testing distribution - Worst bias is the 18-bit window at bit 43 - 0.066% + +Testing bit 40 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 533 (1.04x) (22) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 35/31 (1.09x) +Testing collisions (low 32-bit) - Expected 511.9, actual 540 (1.05x) (29) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 40/31 (1.25x) +Testing distribution - Worst bias is the 18-bit window at bit 25 - 0.065% + +Testing bit 41 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 501 (0.98x) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 33/31 (1.03x) +Testing collisions (low 32-bit) - Expected 511.9, actual 548 (1.07x) (37) +Testing collisions (low 24-36 bits) - Worst is 33 bits: 277/255 (1.08x) +Testing distribution - Worst bias is the 18-bit window at bit 60 - 0.091% + +Testing bit 42 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 516 (1.01x) (5) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 39/31 (1.22x) +Testing collisions (low 32-bit) - Expected 511.9, actual 553 (1.08x) (42) +Testing collisions (low 24-36 bits) - Worst is 32 bits: 553/511 (1.08x) +Testing distribution - Worst bias is the 18-bit window at bit 23 - 0.057% + +Testing bit 43 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 545 (1.06x) (34) +Testing collisions (high 24-36 bits) - Worst is 32 bits: 545/511 (1.06x) +Testing collisions (low 32-bit) - Expected 511.9, actual 497 (0.97x) +Testing collisions (low 24-36 bits) - Worst is 28 bits: 8234/8170 (1.01x) +Testing distribution - Worst bias is the 18-bit window at bit 61 - 0.090% + +Testing bit 44 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 461 (0.90x) +Testing collisions (high 24-36 bits) - Worst is 24 bits: 125866/125777 (1.00x) +Testing collisions (low 32-bit) - Expected 511.9, actual 526 (1.03x) (15) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 38/31 (1.19x) +Testing distribution - Worst bias is the 18-bit window at bit 10 - 0.043% + +Testing bit 45 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 551 (1.08x) (40) +Testing collisions (high 24-36 bits) - Worst is 32 bits: 551/511 (1.08x) +Testing collisions (low 32-bit) - Expected 511.9, actual 512 (1.00x) (1) +Testing collisions (low 24-36 bits) - Worst is 35 bits: 65/63 (1.02x) +Testing distribution - Worst bias is the 17-bit window at bit 52 - 0.060% + +Testing bit 46 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 506 (0.99x) (-5) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 67/63 (1.05x) +Testing collisions (low 32-bit) - Expected 511.9, actual 490 (0.96x) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 36/31 (1.13x) +Testing distribution - Worst bias is the 18-bit window at bit 21 - 0.079% + +Testing bit 47 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 536 (1.05x) (25) +Testing collisions (high 24-36 bits) - Worst is 33 bits: 282/255 (1.10x) +Testing collisions (low 32-bit) - Expected 511.9, actual 483 (0.94x) +Testing collisions (low 24-36 bits) - Worst is 35 bits: 70/63 (1.09x) +Testing distribution - Worst bias is the 18-bit window at bit 9 - 0.079% + +Testing bit 48 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 527 (1.03x) (16) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 72/63 (1.13x) +Testing collisions (low 32-bit) - Expected 511.9, actual 503 (0.98x) (-8) +Testing collisions (low 24-36 bits) - Worst is 35 bits: 70/63 (1.09x) +Testing distribution - Worst bias is the 18-bit window at bit 56 - 0.081% + +Testing bit 49 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 560 (1.09x) (49) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 74/63 (1.16x) +Testing collisions (low 32-bit) - Expected 511.9, actual 523 (1.02x) (12) +Testing collisions (low 24-36 bits) - Worst is 33 bits: 263/255 (1.03x) +Testing distribution - Worst bias is the 17-bit window at bit 41 - 0.058% + +Testing bit 50 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 522 (1.02x) (11) +Testing collisions (high 24-36 bits) - Worst is 33 bits: 271/255 (1.06x) +Testing collisions (low 32-bit) - Expected 511.9, actual 519 (1.01x) (8) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 40/31 (1.25x) +Testing distribution - Worst bias is the 18-bit window at bit 39 - 0.079% + +Testing bit 51 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 531 (1.04x) (20) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 76/63 (1.19x) +Testing collisions (low 32-bit) - Expected 511.9, actual 489 (0.96x) +Testing collisions (low 24-36 bits) - Worst is 29 bits: 4122/4090 (1.01x) +Testing distribution - Worst bias is the 18-bit window at bit 6 - 0.071% + +Testing bit 52 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 512 (1.00x) (1) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 67/63 (1.05x) +Testing collisions (low 32-bit) - Expected 511.9, actual 562 (1.10x) (51) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 46/31 (1.44x) +Testing distribution - Worst bias is the 18-bit window at bit 15 - 0.055% + +Testing bit 53 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 501 (0.98x) +Testing collisions (high 24-36 bits) - Worst is 29 bits: 4137/4090 (1.01x) +Testing collisions (low 32-bit) - Expected 511.9, actual 535 (1.05x) (24) +Testing collisions (low 24-36 bits) - Worst is 32 bits: 535/511 (1.05x) +Testing distribution - Worst bias is the 18-bit window at bit 62 - 0.093% + +Testing bit 54 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 465 (0.91x) +Testing collisions (high 24-36 bits) - Worst is 27 bits: 16437/16298 (1.01x) +Testing collisions (low 32-bit) - Expected 511.9, actual 515 (1.01x) (4) +Testing collisions (low 24-36 bits) - Worst is 34 bits: 139/127 (1.09x) +Testing distribution - Worst bias is the 18-bit window at bit 46 - 0.076% + +Testing bit 55 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 555 (1.08x) (44) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 39/31 (1.22x) +Testing collisions (low 32-bit) - Expected 511.9, actual 491 (0.96x) +Testing collisions (low 24-36 bits) - Worst is 34 bits: 138/127 (1.08x) +Testing distribution - Worst bias is the 18-bit window at bit 52 - 0.074% + +Testing bit 56 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 539 (1.05x) (28) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 36/31 (1.13x) +Testing collisions (low 32-bit) - Expected 511.9, actual 533 (1.04x) (22) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 39/31 (1.22x) +Testing distribution - Worst bias is the 18-bit window at bit 31 - 0.108% + +Testing bit 57 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 513 (1.00x) (2) +Testing collisions (high 24-36 bits) - Worst is 33 bits: 272/255 (1.06x) +Testing collisions (low 32-bit) - Expected 511.9, actual 522 (1.02x) (11) +Testing collisions (low 24-36 bits) - Worst is 35 bits: 68/63 (1.06x) +Testing distribution - Worst bias is the 18-bit window at bit 8 - 0.114% + +Testing bit 58 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 514 (1.00x) (3) +Testing collisions (high 24-36 bits) - Worst is 28 bits: 8230/8170 (1.01x) +Testing collisions (low 32-bit) - Expected 511.9, actual 545 (1.06x) (34) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 43/31 (1.34x) +Testing distribution - Worst bias is the 18-bit window at bit 7 - 0.092% + +Testing bit 59 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 500 (0.98x) +Testing collisions (high 24-36 bits) - Worst is 30 bits: 2120/2046 (1.04x) +Testing collisions (low 32-bit) - Expected 511.9, actual 503 (0.98x) (-8) +Testing collisions (low 24-36 bits) - Worst is 35 bits: 69/63 (1.08x) +Testing distribution - Worst bias is the 18-bit window at bit 31 - 0.065% + +Testing bit 60 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 496 (0.97x) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 65/63 (1.02x) +Testing collisions (low 32-bit) - Expected 511.9, actual 486 (0.95x) +Testing collisions (low 24-36 bits) - Worst is 29 bits: 4218/4090 (1.03x) +Testing distribution - Worst bias is the 18-bit window at bit 22 - 0.081% + +Testing bit 61 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 520 (1.02x) (9) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 67/63 (1.05x) +Testing collisions (low 32-bit) - Expected 511.9, actual 486 (0.95x) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 39/31 (1.22x) +Testing distribution - Worst bias is the 18-bit window at bit 6 - 0.064% + +Testing bit 62 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 522 (1.02x) (11) +Testing collisions (high 24-36 bits) - Worst is 32 bits: 522/511 (1.02x) +Testing collisions (low 32-bit) - Expected 511.9, actual 533 (1.04x) (22) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 35/31 (1.09x) +Testing distribution - Worst bias is the 18-bit window at bit 52 - 0.084% + +Testing bit 63 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 511.9, actual 498 (0.97x) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 34/31 (1.06x) +Testing collisions (low 32-bit) - Expected 511.9, actual 496 (0.97x) +Testing collisions (low 24-36 bits) - Worst is 30 bits: 2053/2046 (1.00x) +Testing distribution - Worst bias is the 18-bit window at bit 53 - 0.104% + + +[[[ MomentChi2 Tests ]]] + +Analyze hashes produced from a serie of linearly increasing numbers of 32-bit, using a step of 2 ... +Target values to approximate : 38918200.000000 - 273633.333333 +4 threads starting... done +Popcount 1 stats : 38918835.315783 - 273623.606930 +Popcount 0 stats : 38918226.200577 - 273605.413971 +MomentChi2 for bits 1 : 0.737544 +MomentChi2 for bits 0 : 0.00125443 + +Derivative stats (transition from 2 consecutive values) : +Popcount 1 stats : 38919083.803108 - 273655.817065 +Popcount 0 stats : 38919331.387736 - 273661.792772 +MomentChi2 for deriv b1 : 1.42723 +MomentChi2 for deriv b0 : 2.33884 + + Great + + +[[[ Prng Tests ]]] + +Generating 33554432 random numbers : +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 130731.3, actual 131908 (1.01x) (1177) +Testing collisions (high 28-44 bits) - Worst is 37 bits: 4198/4095 (1.02x) +Testing collisions (low 32-bit) - Expected 130731.3, actual 131430 (1.01x) (699) +Testing collisions (low 28-44 bits) - Worst is 42 bits: 144/127 (1.13x) + +[[[ BadSeeds Tests ]]] + +Testing 0 internal secrets: +0x0 PASS + + +Input vcode 0x00000001, Output vcode 0x00000001, Result vcode 0x00000001 +Verification value is 0x00000001 - Testing took 631.594488 seconds +------------------------------------------------------------------------------- diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/smhasher/fallbackOutput.txt b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/smhasher/fallbackOutput.txt new file mode 100644 index 0000000..28f4930 --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/smhasher/fallbackOutput.txt @@ -0,0 +1,1516 @@ +------------------------------------------------------------------------------- +--- Testing ahash64 "ahash 64bit" GOOD + +[[[ Sanity Tests ]]] + +Verification value 0xE15404B7 ....... SKIP (self- or unseeded) +Running sanity check 1 .......... PASS +Running AppendedZeroesTest .......... PASS + +[[[ Speed Tests ]]] + +Bulk speed test - 262144-byte keys +Alignment 7 - 7.097 bytes/cycle - 20304.54 MiB/sec @ 3 ghz +Alignment 6 - 7.075 bytes/cycle - 20242.50 MiB/sec @ 3 ghz +Alignment 5 - 7.070 bytes/cycle - 20228.27 MiB/sec @ 3 ghz +Alignment 4 - 7.079 bytes/cycle - 20253.31 MiB/sec @ 3 ghz +Alignment 3 - 7.053 bytes/cycle - 20178.99 MiB/sec @ 3 ghz +Alignment 2 - 7.059 bytes/cycle - 20194.86 MiB/sec @ 3 ghz +Alignment 1 - 7.066 bytes/cycle - 20215.71 MiB/sec @ 3 ghz +Alignment 0 - 7.166 bytes/cycle - 20501.12 MiB/sec @ 3 ghz +Average - 7.083 bytes/cycle - 20264.91 MiB/sec @ 3 ghz + +Small key speed test - 1-byte keys - 13.92 cycles/hash +Small key speed test - 2-byte keys - 13.98 cycles/hash +Small key speed test - 3-byte keys - 13.98 cycles/hash +Small key speed test - 4-byte keys - 13.99 cycles/hash +Small key speed test - 5-byte keys - 13.98 cycles/hash +Small key speed test - 6-byte keys - 13.98 cycles/hash +Small key speed test - 7-byte keys - 13.99 cycles/hash +Small key speed test - 8-byte keys - 13.98 cycles/hash +Small key speed test - 9-byte keys - 13.25 cycles/hash +Small key speed test - 10-byte keys - 13.25 cycles/hash +Small key speed test - 11-byte keys - 13.26 cycles/hash +Small key speed test - 12-byte keys - 13.26 cycles/hash +Small key speed test - 13-byte keys - 13.30 cycles/hash +Small key speed test - 14-byte keys - 13.26 cycles/hash +Small key speed test - 15-byte keys - 13.63 cycles/hash +Small key speed test - 16-byte keys - 13.70 cycles/hash +Small key speed test - 17-byte keys - 21.55 cycles/hash +Small key speed test - 18-byte keys - 27.87 cycles/hash +Small key speed test - 19-byte keys - 27.96 cycles/hash +Small key speed test - 20-byte keys - 14.57 cycles/hash +Small key speed test - 21-byte keys - 15.23 cycles/hash +Small key speed test - 22-byte keys - 15.56 cycles/hash +Small key speed test - 23-byte keys - 15.67 cycles/hash +Small key speed test - 24-byte keys - 15.60 cycles/hash +Small key speed test - 25-byte keys - 15.67 cycles/hash +Small key speed test - 26-byte keys - 15.69 cycles/hash +Small key speed test - 27-byte keys - 15.68 cycles/hash +Small key speed test - 28-byte keys - 15.69 cycles/hash +Small key speed test - 29-byte keys - 16.94 cycles/hash +Small key speed test - 30-byte keys - 16.95 cycles/hash +Small key speed test - 31-byte keys - 16.95 cycles/hash +Average 15.688 cycles/hash + +[[[ 'Hashmap' Speed Tests ]]] + +std::unordered_map +Init std HashMapTest: 343.665 cycles/op (102401 inserts, 1% deletions) +Running std HashMapTest: 122.429 cycles/op (1.9 stdv) + +greg7mdp/parallel-hashmap +Init fast HashMapTest: 119.334 cycles/op (102401 inserts, 1% deletions) +Running fast HashMapTest: 84.563 cycles/op (1.5 stdv) ....... PASS + +[[[ Avalanche Tests ]]] + +Testing 24-bit keys -> 64-bit hashes, 300000 reps worst bias is 0.784000% +Testing 32-bit keys -> 64-bit hashes, 300000 reps worst bias is 0.640667% +Testing 40-bit keys -> 64-bit hashes, 300000 reps worst bias is 0.592000% +Testing 48-bit keys -> 64-bit hashes, 300000 reps worst bias is 0.704667% +Testing 56-bit keys -> 64-bit hashes, 300000 reps worst bias is 0.772667% +Testing 64-bit keys -> 64-bit hashes, 300000 reps worst bias is 0.766000% +Testing 72-bit keys -> 64-bit hashes, 300000 reps worst bias is 0.738667% +Testing 80-bit keys -> 64-bit hashes, 300000 reps worst bias is 0.665333% +Testing 96-bit keys -> 64-bit hashes, 300000 reps worst bias is 0.744000% +Testing 112-bit keys -> 64-bit hashes, 300000 reps worst bias is 0.706000% +Testing 128-bit keys -> 64-bit hashes, 300000 reps worst bias is 0.731333% +Testing 160-bit keys -> 64-bit hashes, 300000 reps worst bias is 0.685333% +Testing 512-bit keys -> 64-bit hashes, 300000 reps worst bias is 0.830667% +Testing 1024-bit keys -> 64-bit hashes, 300000 reps worst bias is 0.796000% + +[[[ Keyset 'Sparse' Tests ]]] + +Keyset 'Sparse' - 16-bit keys with up to 9 bits set - 50643 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 0.3, actual 0 (0.00x) +Testing collisions (high 19-25 bits) - Worst is 25 bits: 48/38 (1.26x) +Testing collisions (high 12-bit) - Expected 46547.0, actual 46547 (1.00x) +Testing collisions (high 8-bit) - Expected 50387.0, actual 50387 (1.00x) +Testing collisions (low 32-bit) - Expected 0.3, actual 0 (0.00x) +Testing collisions (low 19-25 bits) - Worst is 23 bits: 170/152 (1.11x) +Testing collisions (low 12-bit) - Expected 46547.0, actual 46547 (1.00x) +Testing collisions (low 8-bit) - Expected 50387.0, actual 50387 (1.00x) +Testing distribution - Worst bias is the 13-bit window at bit 26 - 0.598% + +Keyset 'Sparse' - 24-bit keys with up to 8 bits set - 1271626 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 188.2, actual 193 (1.03x) (5) +Testing collisions (high 24-35 bits) - Worst is 32 bits: 193/188 (1.03x) +Testing collisions (high 12-bit) - Expected 1267530.0, actual 1267530 (1.00x) +Testing collisions (high 8-bit) - Expected 1271370.0, actual 1271370 (1.00x) +Testing collisions (low 32-bit) - Expected 188.2, actual 154 (0.82x) +Testing collisions (low 24-35 bits) - Worst is 26 bits: 11981/12047 (0.99x) +Testing collisions (low 12-bit) - Expected 1267530.0, actual 1267530 (1.00x) +Testing collisions (low 8-bit) - Expected 1271370.0, actual 1271370 (1.00x) +Testing distribution - Worst bias is the 17-bit window at bit 26 - 0.074% + +Keyset 'Sparse' - 32-bit keys with up to 7 bits set - 4514873 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 2373.0, actual 2361 (0.99x) (-12) +Testing collisions (high 25-38 bits) - Worst is 37 bits: 84/74 (1.13x) +Testing collisions (high 12-bit) - Expected 4510777.0, actual 4510777 (1.00x) +Testing collisions (high 8-bit) - Expected 4514617.0, actual 4514617 (1.00x) +Testing collisions (low 32-bit) - Expected 2373.0, actual 2372 (1.00x) (-1) +Testing collisions (low 25-38 bits) - Worst is 33 bits: 1215/1186 (1.02x) +Testing collisions (low 12-bit) - Expected 4510777.0, actual 4510777 (1.00x) +Testing collisions (low 8-bit) - Expected 4514617.0, actual 4514617 (1.00x) +Testing distribution - Worst bias is the 19-bit window at bit 62 - 0.060% + +Keyset 'Sparse' - 40-bit keys with up to 6 bits set - 4598479 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 2461.7, actual 2479 (1.01x) (18) +Testing collisions (high 25-38 bits) - Worst is 36 bits: 160/153 (1.04x) +Testing collisions (high 12-bit) - Expected 4594383.0, actual 4594383 (1.00x) +Testing collisions (high 8-bit) - Expected 4598223.0, actual 4598223 (1.00x) +Testing collisions (low 32-bit) - Expected 2461.7, actual 2461 (1.00x) +Testing collisions (low 25-38 bits) - Worst is 30 bits: 9912/9846 (1.01x) +Testing collisions (low 12-bit) - Expected 4594383.0, actual 4594383 (1.00x) +Testing collisions (low 8-bit) - Expected 4598223.0, actual 4598223 (1.00x) +Testing distribution - Worst bias is the 19-bit window at bit 37 - 0.049% + +Keyset 'Sparse' - 48-bit keys with up to 6 bits set - 14196869 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 23463.6, actual 23570 (1.00x) (107) +Testing collisions (high 27-42 bits) - Worst is 41 bits: 60/45 (1.31x) +Testing collisions (high 12-bit) - Expected 14192773.0, actual 14192773 (1.00x) +Testing collisions (high 8-bit) - Expected 14196613.0, actual 14196613 (1.00x) +Testing collisions (low 32-bit) - Expected 23463.6, actual 23383 (1.00x) (-80) +Testing collisions (low 27-42 bits) - Worst is 42 bits: 27/22 (1.18x) +Testing collisions (low 12-bit) - Expected 14192773.0, actual 14192773 (1.00x) +Testing collisions (low 8-bit) - Expected 14196613.0, actual 14196613 (1.00x) +Testing distribution - Worst bias is the 20-bit window at bit 27 - 0.021% + +Keyset 'Sparse' - 56-bit keys with up to 5 bits set - 4216423 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 2069.7, actual 2105 (1.02x) (36) +Testing collisions (high 25-38 bits) - Worst is 33 bits: 1070/1034 (1.03x) +Testing collisions (high 12-bit) - Expected 4212327.0, actual 4212327 (1.00x) +Testing collisions (high 8-bit) - Expected 4216167.0, actual 4216167 (1.00x) +Testing collisions (low 32-bit) - Expected 2069.7, actual 2124 (1.03x) (55) +Testing collisions (low 25-38 bits) - Worst is 34 bits: 557/517 (1.08x) +Testing collisions (low 12-bit) - Expected 4212327.0, actual 4212327 (1.00x) +Testing collisions (low 8-bit) - Expected 4216167.0, actual 4216167 (1.00x) +Testing distribution - Worst bias is the 19-bit window at bit 31 - 0.057% + +Keyset 'Sparse' - 64-bit keys with up to 5 bits set - 8303633 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8026.9, actual 7860 (0.98x) +Testing collisions (high 26-40 bits) - Worst is 30 bits: 31911/32107 (0.99x) +Testing collisions (high 12-bit) - Expected 8299537.0, actual 8299537 (1.00x) +Testing collisions (high 8-bit) - Expected 8303377.0, actual 8303377 (1.00x) +Testing collisions (low 32-bit) - Expected 8026.9, actual 7934 (0.99x) (-92) +Testing collisions (low 26-40 bits) - Worst is 39 bits: 78/62 (1.24x) +Testing collisions (low 12-bit) - Expected 8299537.0, actual 8299537 (1.00x) +Testing collisions (low 8-bit) - Expected 8303377.0, actual 8303377 (1.00x) +Testing distribution - Worst bias is the 20-bit window at bit 38 - 0.047% + +Keyset 'Sparse' - 72-bit keys with up to 5 bits set - 15082603 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 26482.7, actual 26535 (1.00x) (53) +Testing collisions (high 27-42 bits) - Worst is 42 bits: 30/25 (1.16x) +Testing collisions (high 12-bit) - Expected 15078507.0, actual 15078507 (1.00x) +Testing collisions (high 8-bit) - Expected 15082347.0, actual 15082347 (1.00x) +Testing collisions (low 32-bit) - Expected 26482.7, actual 26509 (1.00x) (27) +Testing collisions (low 27-42 bits) - Worst is 39 bits: 218/206 (1.05x) +Testing collisions (low 12-bit) - Expected 15078507.0, actual 15078507 (1.00x) +Testing collisions (low 8-bit) - Expected 15082347.0, actual 15082347 (1.00x) +Testing distribution - Worst bias is the 20-bit window at bit 34 - 0.022% + +Keyset 'Sparse' - 96-bit keys with up to 4 bits set - 3469497 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 1401.3, actual 1459 (1.04x) (58) +Testing collisions (high 25-38 bits) - Worst is 38 bits: 29/21 (1.32x) +Testing collisions (high 12-bit) - Expected 3465401.0, actual 3465401 (1.00x) +Testing collisions (high 8-bit) - Expected 3469241.0, actual 3469241 (1.00x) +Testing collisions (low 32-bit) - Expected 1401.3, actual 1445 (1.03x) (44) +Testing collisions (low 25-38 bits) - Worst is 38 bits: 27/21 (1.23x) +Testing collisions (low 12-bit) - Expected 3465401.0, actual 3465401 (1.00x) +Testing collisions (low 8-bit) - Expected 3469241.0, actual 3469241 (1.00x) +Testing distribution - Worst bias is the 19-bit window at bit 54 - 0.068% + +Keyset 'Sparse' - 160-bit keys with up to 4 bits set - 26977161 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 84723.3, actual 85179 (1.01x) (456) +Testing collisions (high 28-44 bits) - Worst is 38 bits: 1340/1323 (1.01x) +Testing collisions (high 12-bit) - Expected 26973065.0, actual 26973065 (1.00x) +Testing collisions (high 8-bit) - Expected 26976905.0, actual 26976905 (1.00x) +Testing collisions (low 32-bit) - Expected 84723.3, actual 84918 (1.00x) (195) +Testing collisions (low 28-44 bits) - Worst is 44 bits: 28/20 (1.35x) +Testing collisions (low 12-bit) - Expected 26973065.0, actual 26973065 (1.00x) +Testing collisions (low 8-bit) - Expected 26976905.0, actual 26976905 (1.00x) +Testing distribution - Worst bias is the 20-bit window at bit 47 - 0.014% + +Keyset 'Sparse' - 256-bit keys with up to 3 bits set - 2796417 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 910.4, actual 867 (0.95x) +Testing collisions (high 25-37 bits) - Worst is 37 bits: 31/28 (1.09x) +Testing collisions (high 12-bit) - Expected 2792321.0, actual 2792321 (1.00x) +Testing collisions (high 8-bit) - Expected 2796161.0, actual 2796161 (1.00x) +Testing collisions (low 32-bit) - Expected 910.4, actual 947 (1.04x) (37) +Testing collisions (low 25-37 bits) - Worst is 34 bits: 238/227 (1.05x) +Testing collisions (low 12-bit) - Expected 2792321.0, actual 2792321 (1.00x) +Testing collisions (low 8-bit) - Expected 2796161.0, actual 2796161 (1.00x) +Testing distribution - Worst bias is the 19-bit window at bit 41 - 0.082% + +Keyset 'Sparse' - 512-bit keys with up to 3 bits set - 22370049 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 58256.4, actual 58441 (1.00x) (185) +Testing collisions (high 28-43 bits) - Worst is 43 bits: 43/28 (1.51x) +Testing collisions (high 12-bit) - Expected 22365953.0, actual 22365953 (1.00x) +Testing collisions (high 8-bit) - Expected 22369793.0, actual 22369793 (1.00x) +Testing collisions (low 32-bit) - Expected 58256.4, actual 58230 (1.00x) (-26) +Testing collisions (low 28-43 bits) - Worst is 40 bits: 241/227 (1.06x) +Testing collisions (low 12-bit) - Expected 22365953.0, actual 22365953 (1.00x) +Testing collisions (low 8-bit) - Expected 22369793.0, actual 22369793 (1.00x) +Testing distribution - Worst bias is the 20-bit window at bit 43 - 0.013% + +Keyset 'Sparse' - 1024-bit keys with up to 2 bits set - 524801 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 32.1, actual 38 (1.19x) (6) +Testing collisions (high 22-32 bits) - Worst is 32 bits: 38/32 (1.19x) +Testing collisions (high 12-bit) - Expected 520705.0, actual 520705 (1.00x) +Testing collisions (high 8-bit) - Expected 524545.0, actual 524545 (1.00x) +Testing collisions (low 32-bit) - Expected 32.1, actual 33 (1.03x) (1) +Testing collisions (low 22-32 bits) - Worst is 31 bits: 72/64 (1.12x) +Testing collisions (low 12-bit) - Expected 520705.0, actual 520705 (1.00x) +Testing collisions (low 8-bit) - Expected 524545.0, actual 524545 (1.00x) +Testing distribution - Worst bias is the 16-bit window at bit 38 - 0.117% + +Keyset 'Sparse' - 2048-bit keys with up to 2 bits set - 2098177 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.5, actual 536 (1.05x) (24) +Testing collisions (high 24-36 bits) - Worst is 32 bits: 536/512 (1.05x) +Testing collisions (high 12-bit) - Expected 2094081.0, actual 2094081 (1.00x) +Testing collisions (high 8-bit) - Expected 2097921.0, actual 2097921 (1.00x) +Testing collisions (low 32-bit) - Expected 512.5, actual 492 (0.96x) +Testing collisions (low 24-36 bits) - Worst is 27 bits: 16444/16400 (1.00x) +Testing collisions (low 12-bit) - Expected 2094081.0, actual 2094081 (1.00x) +Testing collisions (low 8-bit) - Expected 2097921.0, actual 2097921 (1.00x) +Testing distribution - Worst bias is the 18-bit window at bit 44 - 0.056% + + +[[[ Keyset 'Permutation' Tests ]]] + +Combination Lowbits Tests: +Keyset 'Combination' - up to 7 blocks from a set of 8 - 2396744 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 668.7, actual 701 (1.05x) (33) +Testing collisions (high 25-37 bits) - Worst is 36 bits: 48/41 (1.15x) +Testing collisions (high 12-bit) - Expected 2392648.0, actual 2392648 (1.00x) +Testing collisions (high 8-bit) - Expected 2396488.0, actual 2396488 (1.00x) +Testing collisions (low 32-bit) - Expected 668.7, actual 671 (1.00x) (3) +Testing collisions (low 25-37 bits) - Worst is 36 bits: 57/41 (1.36x) +Testing collisions (low 12-bit) - Expected 2392648.0, actual 2392648 (1.00x) +Testing collisions (low 8-bit) - Expected 2396488.0, actual 2396488 (1.00x) +Testing distribution - Worst bias is the 18-bit window at bit 61 - 0.065% + + +Combination Highbits Tests +Keyset 'Combination' - up to 7 blocks from a set of 8 - 2396744 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 668.7, actual 652 (0.97x) +Testing collisions (high 25-37 bits) - Worst is 34 bits: 182/167 (1.09x) +Testing collisions (high 12-bit) - Expected 2392648.0, actual 2392648 (1.00x) +Testing collisions (high 8-bit) - Expected 2396488.0, actual 2396488 (1.00x) +Testing collisions (low 32-bit) - Expected 668.7, actual 660 (0.99x) (-8) +Testing collisions (low 25-37 bits) - Worst is 37 bits: 25/20 (1.20x) +Testing collisions (low 12-bit) - Expected 2392648.0, actual 2392648 (1.00x) +Testing collisions (low 8-bit) - Expected 2396488.0, actual 2396488 (1.00x) +Testing distribution - Worst bias is the 18-bit window at bit 0 - 0.052% + + +Combination Hi-Lo Tests: +Keyset 'Combination' - up to 6 blocks from a set of 15 - 12204240 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 17339.3, actual 17349 (1.00x) (10) +Testing collisions (high 27-41 bits) - Worst is 41 bits: 37/33 (1.09x) +Testing collisions (high 12-bit) - Expected 12200144.0, actual 12200144 (1.00x) +Testing collisions (high 8-bit) - Expected 12203984.0, actual 12203984 (1.00x) +Testing collisions (low 32-bit) - Expected 17339.3, actual 17458 (1.01x) (119) +Testing collisions (low 27-41 bits) - Worst is 40 bits: 74/67 (1.09x) +Testing collisions (low 12-bit) - Expected 12200144.0, actual 12200144 (1.00x) +Testing collisions (low 8-bit) - Expected 12203984.0, actual 12203984 (1.00x) +Testing distribution - Worst bias is the 20-bit window at bit 15 - 0.032% + + +Combination 0x8000000 Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8192.0, actual 8225 (1.00x) (34) +Testing collisions (high 26-40 bits) - Worst is 40 bits: 35/31 (1.09x) +Testing collisions (high 12-bit) - Expected 8384510.0, actual 8384510 (1.00x) +Testing collisions (high 8-bit) - Expected 8388350.0, actual 8388350 (1.00x) +Testing collisions (low 32-bit) - Expected 8192.0, actual 8174 (1.00x) (-17) +Testing collisions (low 26-40 bits) - Worst is 40 bits: 35/31 (1.09x) +Testing collisions (low 12-bit) - Expected 8384510.0, actual 8384510 (1.00x) +Testing collisions (low 8-bit) - Expected 8388350.0, actual 8388350 (1.00x) +Testing distribution - Worst bias is the 20-bit window at bit 44 - 0.040% + + +Combination 0x0000001 Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8192.0, actual 8146 (0.99x) (-45) +Testing collisions (high 26-40 bits) - Worst is 39 bits: 73/63 (1.14x) +Testing collisions (high 12-bit) - Expected 8384510.0, actual 8384510 (1.00x) +Testing collisions (high 8-bit) - Expected 8388350.0, actual 8388350 (1.00x) +Testing collisions (low 32-bit) - Expected 8192.0, actual 8268 (1.01x) (77) +Testing collisions (low 26-40 bits) - Worst is 40 bits: 37/31 (1.16x) +Testing collisions (low 12-bit) - Expected 8384510.0, actual 8384510 (1.00x) +Testing collisions (low 8-bit) - Expected 8388350.0, actual 8388350 (1.00x) +Testing distribution - Worst bias is the 20-bit window at bit 30 - 0.031% + + +Combination 0x800000000000000 Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8192.0, actual 8259 (1.01x) (68) +Testing collisions (high 26-40 bits) - Worst is 32 bits: 8259/8191 (1.01x) +Testing collisions (high 12-bit) - Expected 8384510.0, actual 8384510 (1.00x) +Testing collisions (high 8-bit) - Expected 8388350.0, actual 8388350 (1.00x) +Testing collisions (low 32-bit) - Expected 8192.0, actual 8238 (1.01x) (47) +Testing collisions (low 26-40 bits) - Worst is 40 bits: 38/31 (1.19x) +Testing collisions (low 12-bit) - Expected 8384510.0, actual 8384510 (1.00x) +Testing collisions (low 8-bit) - Expected 8388350.0, actual 8388350 (1.00x) +Testing distribution - Worst bias is the 20-bit window at bit 3 - 0.036% + + +Combination 0x000000000000001 Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8192.0, actual 8145 (0.99x) (-46) +Testing collisions (high 26-40 bits) - Worst is 40 bits: 35/31 (1.09x) +Testing collisions (high 12-bit) - Expected 8384510.0, actual 8384510 (1.00x) +Testing collisions (high 8-bit) - Expected 8388350.0, actual 8388350 (1.00x) +Testing collisions (low 32-bit) - Expected 8192.0, actual 7977 (0.97x) +Testing collisions (low 26-40 bits) - Worst is 40 bits: 35/31 (1.09x) +Testing collisions (low 12-bit) - Expected 8384510.0, actual 8384510 (1.00x) +Testing collisions (low 8-bit) - Expected 8388350.0, actual 8388350 (1.00x) +Testing distribution - Worst bias is the 20-bit window at bit 12 - 0.042% + + +Combination 16-bytes [0-1] Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8192.0, actual 8278 (1.01x) (87) +Testing collisions (high 26-40 bits) - Worst is 40 bits: 39/31 (1.22x) +Testing collisions (high 12-bit) - Expected 8384510.0, actual 8384510 (1.00x) +Testing collisions (high 8-bit) - Expected 8388350.0, actual 8388350 (1.00x) +Testing collisions (low 32-bit) - Expected 8192.0, actual 8070 (0.99x) (-121) +Testing collisions (low 26-40 bits) - Worst is 37 bits: 267/255 (1.04x) +Testing collisions (low 12-bit) - Expected 8384510.0, actual 8384510 (1.00x) +Testing collisions (low 8-bit) - Expected 8388350.0, actual 8388350 (1.00x) +Testing distribution - Worst bias is the 20-bit window at bit 23 - 0.033% + + +Combination 16-bytes [0-last] Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8192.0, actual 8038 (0.98x) (-153) +Testing collisions (high 26-40 bits) - Worst is 38 bits: 131/127 (1.02x) +Testing collisions (high 12-bit) - Expected 8384510.0, actual 8384510 (1.00x) +Testing collisions (high 8-bit) - Expected 8388350.0, actual 8388350 (1.00x) +Testing collisions (low 32-bit) - Expected 8192.0, actual 8156 (1.00x) (-35) +Testing collisions (low 26-40 bits) - Worst is 40 bits: 38/31 (1.19x) +Testing collisions (low 12-bit) - Expected 8384510.0, actual 8384510 (1.00x) +Testing collisions (low 8-bit) - Expected 8388350.0, actual 8388350 (1.00x) +Testing distribution - Worst bias is the 20-bit window at bit 22 - 0.035% + + +Combination 32-bytes [0-1] Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8192.0, actual 8268 (1.01x) (77) +Testing collisions (high 26-40 bits) - Worst is 38 bits: 130/127 (1.02x) +Testing collisions (high 12-bit) - Expected 8384510.0, actual 8384510 (1.00x) +Testing collisions (high 8-bit) - Expected 8388350.0, actual 8388350 (1.00x) +Testing collisions (low 32-bit) - Expected 8192.0, actual 8158 (1.00x) (-33) +Testing collisions (low 26-40 bits) - Worst is 30 bits: 32831/32767 (1.00x) +Testing collisions (low 12-bit) - Expected 8384510.0, actual 8384510 (1.00x) +Testing collisions (low 8-bit) - Expected 8388350.0, actual 8388350 (1.00x) +Testing distribution - Worst bias is the 20-bit window at bit 26 - 0.038% + + +Combination 32-bytes [0-last] Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8192.0, actual 8197 (1.00x) (6) +Testing collisions (high 26-40 bits) - Worst is 35 bits: 1055/1023 (1.03x) +Testing collisions (high 12-bit) - Expected 8384510.0, actual 8384510 (1.00x) +Testing collisions (high 8-bit) - Expected 8388350.0, actual 8388350 (1.00x) +Testing collisions (low 32-bit) - Expected 8192.0, actual 8202 (1.00x) (11) +Testing collisions (low 26-40 bits) - Worst is 36 bits: 529/511 (1.03x) +Testing collisions (low 12-bit) - Expected 8384510.0, actual 8384510 (1.00x) +Testing collisions (low 8-bit) - Expected 8388350.0, actual 8388350 (1.00x) +Testing distribution - Worst bias is the 20-bit window at bit 58 - 0.031% + + +Combination 64-bytes [0-1] Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8192.0, actual 8127 (0.99x) (-64) +Testing collisions (high 26-40 bits) - Worst is 39 bits: 69/63 (1.08x) +Testing collisions (high 12-bit) - Expected 8384510.0, actual 8384510 (1.00x) +Testing collisions (high 8-bit) - Expected 8388350.0, actual 8388350 (1.00x) +Testing collisions (low 32-bit) - Expected 8192.0, actual 8076 (0.99x) (-115) +Testing collisions (low 26-40 bits) - Worst is 37 bits: 261/255 (1.02x) +Testing collisions (low 12-bit) - Expected 8384510.0, actual 8384510 (1.00x) +Testing collisions (low 8-bit) - Expected 8388350.0, actual 8388350 (1.00x) +Testing distribution - Worst bias is the 20-bit window at bit 63 - 0.028% + + +Combination 64-bytes [0-last] Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8192.0, actual 8181 (1.00x) (-10) +Testing collisions (high 26-40 bits) - Worst is 40 bits: 35/31 (1.09x) +Testing collisions (high 12-bit) - Expected 8384510.0, actual 8384510 (1.00x) +Testing collisions (high 8-bit) - Expected 8388350.0, actual 8388350 (1.00x) +Testing collisions (low 32-bit) - Expected 8192.0, actual 8184 (1.00x) (-7) +Testing collisions (low 26-40 bits) - Worst is 39 bits: 68/63 (1.06x) +Testing collisions (low 12-bit) - Expected 8384510.0, actual 8384510 (1.00x) +Testing collisions (low 8-bit) - Expected 8388350.0, actual 8388350 (1.00x) +Testing distribution - Worst bias is the 20-bit window at bit 42 - 0.041% + + +Combination 128-bytes [0-1] Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8192.0, actual 8275 (1.01x) (84) +Testing collisions (high 26-40 bits) - Worst is 40 bits: 36/31 (1.13x) +Testing collisions (high 12-bit) - Expected 8384510.0, actual 8384510 (1.00x) +Testing collisions (high 8-bit) - Expected 8388350.0, actual 8388350 (1.00x) +Testing collisions (low 32-bit) - Expected 8192.0, actual 8208 (1.00x) (17) +Testing collisions (low 26-40 bits) - Worst is 37 bits: 270/255 (1.05x) +Testing collisions (low 12-bit) - Expected 8384510.0, actual 8384510 (1.00x) +Testing collisions (low 8-bit) - Expected 8388350.0, actual 8388350 (1.00x) +Testing distribution - Worst bias is the 20-bit window at bit 1 - 0.043% + + +Combination 128-bytes [0-last] Tests: +Keyset 'Combination' - up to 22 blocks from a set of 2 - 8388606 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 8192.0, actual 8243 (1.01x) (52) +Testing collisions (high 26-40 bits) - Worst is 34 bits: 2082/2047 (1.02x) +Testing collisions (high 12-bit) - Expected 8384510.0, actual 8384510 (1.00x) +Testing collisions (high 8-bit) - Expected 8388350.0, actual 8388350 (1.00x) +Testing collisions (low 32-bit) - Expected 8192.0, actual 8315 (1.02x) (124) +Testing collisions (low 26-40 bits) - Worst is 40 bits: 38/31 (1.19x) +Testing collisions (low 12-bit) - Expected 8384510.0, actual 8384510 (1.00x) +Testing collisions (low 8-bit) - Expected 8388350.0, actual 8388350 (1.00x) +Testing distribution - Worst bias is the 19-bit window at bit 25 - 0.039% + + +[[[ Keyset 'Window' Tests ]]] + +Keyset 'Window' - 32-bit key, 25-bit window - 32 tests, 33554432 keys per test +Window at 0 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 1 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 2 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 3 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 4 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 5 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 6 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 7 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 8 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 9 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 10 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 11 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 12 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 13 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 14 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 15 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 16 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 17 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 18 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 19 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 20 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 21 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 22 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 23 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 24 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 25 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 26 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 27 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 28 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 29 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 30 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 31 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Window at 32 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) + +[[[ Keyset 'Cyclic' Tests ]]] + +Keyset 'Cyclic' - 8 cycles of 8 bytes - 1000000 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 116.4, actual 96 (0.82x) +Testing collisions (high 23-34 bits) - Worst is 24 bits: 28916/29802 (0.97x) +Testing collisions (high 12-bit) - Expected 995904.0, actual 995904 (1.00x) +Testing collisions (high 8-bit) - Expected 999744.0, actual 999744 (1.00x) +Testing collisions (low 32-bit) - Expected 116.4, actual 126 (1.08x) (10) +Testing collisions (low 23-34 bits) - Worst is 32 bits: 126/116 (1.08x) +Testing collisions (low 12-bit) - Expected 995904.0, actual 995904 (1.00x) +Testing collisions (low 8-bit) - Expected 999744.0, actual 999744 (1.00x) +Testing distribution - Worst bias is the 17-bit window at bit 13 - 0.085% + +Keyset 'Cyclic' - 8 cycles of 9 bytes - 1000000 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 116.4, actual 95 (0.82x) +Testing collisions (high 23-34 bits) - Worst is 34 bits: 30/29 (1.03x) +Testing collisions (high 12-bit) - Expected 995904.0, actual 995904 (1.00x) +Testing collisions (high 8-bit) - Expected 999744.0, actual 999744 (1.00x) +Testing collisions (low 32-bit) - Expected 116.4, actual 123 (1.06x) (7) +Testing collisions (low 23-34 bits) - Worst is 34 bits: 37/29 (1.27x) +Testing collisions (low 12-bit) - Expected 995904.0, actual 995904 (1.00x) +Testing collisions (low 8-bit) - Expected 999744.0, actual 999744 (1.00x) +Testing distribution - Worst bias is the 17-bit window at bit 47 - 0.120% + +Keyset 'Cyclic' - 8 cycles of 10 bytes - 1000000 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 116.4, actual 115 (0.99x) (-1) +Testing collisions (high 23-34 bits) - Worst is 33 bits: 62/58 (1.07x) +Testing collisions (high 12-bit) - Expected 995904.0, actual 995904 (1.00x) +Testing collisions (high 8-bit) - Expected 999744.0, actual 999744 (1.00x) +Testing collisions (low 32-bit) - Expected 116.4, actual 114 (0.98x) +Testing collisions (low 23-34 bits) - Worst is 34 bits: 35/29 (1.20x) +Testing collisions (low 12-bit) - Expected 995904.0, actual 995904 (1.00x) +Testing collisions (low 8-bit) - Expected 999744.0, actual 999744 (1.00x) +Testing distribution - Worst bias is the 17-bit window at bit 7 - 0.123% + +Keyset 'Cyclic' - 8 cycles of 11 bytes - 1000000 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 116.4, actual 117 (1.01x) (1) +Testing collisions (high 23-34 bits) - Worst is 33 bits: 66/58 (1.13x) +Testing collisions (high 12-bit) - Expected 995904.0, actual 995904 (1.00x) +Testing collisions (high 8-bit) - Expected 999744.0, actual 999744 (1.00x) +Testing collisions (low 32-bit) - Expected 116.4, actual 106 (0.91x) +Testing collisions (low 23-34 bits) - Worst is 34 bits: 31/29 (1.07x) +Testing collisions (low 12-bit) - Expected 995904.0, actual 995904 (1.00x) +Testing collisions (low 8-bit) - Expected 999744.0, actual 999744 (1.00x) +Testing distribution - Worst bias is the 17-bit window at bit 57 - 0.192% + +Keyset 'Cyclic' - 8 cycles of 12 bytes - 1000000 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 116.4, actual 105 (0.90x) +Testing collisions (high 23-34 bits) - Worst is 34 bits: 38/29 (1.31x) +Testing collisions (high 12-bit) - Expected 995904.0, actual 995904 (1.00x) +Testing collisions (high 8-bit) - Expected 999744.0, actual 999744 (1.00x) +Testing collisions (low 32-bit) - Expected 116.4, actual 114 (0.98x) +Testing collisions (low 23-34 bits) - Worst is 28 bits: 1868/1862 (1.00x) +Testing collisions (low 12-bit) - Expected 995904.0, actual 995904 (1.00x) +Testing collisions (low 8-bit) - Expected 999744.0, actual 999744 (1.00x) +Testing distribution - Worst bias is the 17-bit window at bit 47 - 0.099% + +Keyset 'Cyclic' - 8 cycles of 16 bytes - 1000000 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 116.4, actual 99 (0.85x) +Testing collisions (high 23-34 bits) - Worst is 28 bits: 1951/1862 (1.05x) +Testing collisions (high 12-bit) - Expected 995904.0, actual 995904 (1.00x) +Testing collisions (high 8-bit) - Expected 999744.0, actual 999744 (1.00x) +Testing collisions (low 32-bit) - Expected 116.4, actual 123 (1.06x) (7) +Testing collisions (low 23-34 bits) - Worst is 32 bits: 123/116 (1.06x) +Testing collisions (low 12-bit) - Expected 995904.0, actual 995904 (1.00x) +Testing collisions (low 8-bit) - Expected 999744.0, actual 999744 (1.00x) +Testing distribution - Worst bias is the 17-bit window at bit 35 - 0.105% + + +[[[ Keyset 'TwoBytes' Tests ]]] + +Keyset 'TwoBytes' - up-to-4-byte keys, 652545 total keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 49.6, actual 58 (1.17x) (9) +Testing collisions (high 23-33 bits) - Worst is 32 bits: 58/49 (1.17x) +Testing collisions (high 12-bit) - Expected 648449.0, actual 648449 (1.00x) +Testing collisions (high 8-bit) - Expected 652289.0, actual 652289 (1.00x) +Testing collisions (low 32-bit) - Expected 49.6, actual 40 (0.81x) +Testing collisions (low 23-33 bits) - Worst is 30 bits: 213/198 (1.07x) +Testing collisions (low 12-bit) - Expected 648449.0, actual 648449 (1.00x) +Testing collisions (low 8-bit) - Expected 652289.0, actual 652289 (1.00x) +Testing distribution - Worst bias is the 16-bit window at bit 4 - 0.136% + +Keyset 'TwoBytes' - up-to-8-byte keys, 5471025 total keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 3484.6, actual 3477 (1.00x) (-7) +Testing collisions (high 26-39 bits) - Worst is 38 bits: 62/54 (1.14x) +Testing collisions (high 12-bit) - Expected 5466929.0, actual 5466929 (1.00x) +Testing collisions (high 8-bit) - Expected 5470769.0, actual 5470769 (1.00x) +Testing collisions (low 32-bit) - Expected 3484.6, actual 3518 (1.01x) (34) +Testing collisions (low 26-39 bits) - Worst is 36 bits: 224/217 (1.03x) +Testing collisions (low 12-bit) - Expected 5466929.0, actual 5466929 (1.00x) +Testing collisions (low 8-bit) - Expected 5470769.0, actual 5470769 (1.00x) +Testing distribution - Worst bias is the 20-bit window at bit 9 - 0.071% + +Keyset 'TwoBytes' - up-to-12-byte keys, 18616785 total keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 40347.8, actual 40448 (1.00x) (101) +Testing collisions (high 27-42 bits) - Worst is 35 bits: 5127/5043 (1.02x) +Testing collisions (high 12-bit) - Expected 18612689.0, actual 18612689 (1.00x) +Testing collisions (high 8-bit) - Expected 18616529.0, actual 18616529 (1.00x) +Testing collisions (low 32-bit) - Expected 40347.8, actual 40175 (1.00x) (-172) +Testing collisions (low 27-42 bits) - Worst is 33 bits: 20112/20173 (1.00x) +Testing collisions (low 12-bit) - Expected 18612689.0, actual 18612689 (1.00x) +Testing collisions (low 8-bit) - Expected 18616529.0, actual 18616529 (1.00x) +Testing distribution - Worst bias is the 20-bit window at bit 24 - 0.022% + +Keyset 'TwoBytes' - up-to-16-byte keys, 44251425 total keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 227963.2, actual 227655 (1.00x) (-308) +Testing collisions (high 29-45 bits) - Worst is 38 bits: 3590/3561 (1.01x) +Testing collisions (high 12-bit) - Expected 44247329.0, actual 44247329 (1.00x) +Testing collisions (high 8-bit) - Expected 44251169.0, actual 44251169 (1.00x) +Testing collisions (low 32-bit) - Expected 227963.2, actual 226913 (1.00x) (-1050) +Testing collisions (low 29-45 bits) - Worst is 37 bits: 7121/7123 (1.00x) +Testing collisions (low 12-bit) - Expected 44247329.0, actual 44247329 (1.00x) +Testing collisions (low 8-bit) - Expected 44251169.0, actual 44251169 (1.00x) +Testing distribution - Worst bias is the 20-bit window at bit 22 - 0.009% + +Keyset 'TwoBytes' - up-to-20-byte keys, 86536545 total keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 871784.7, actual 868710 (1.00x) (-3074) +Testing collisions (high 30-47 bits) - Worst is 47 bits: 30/26 (1.13x) +Testing collisions (high 12-bit) - Expected 86532449.0, actual 86532449 (1.00x) +Testing collisions (high 8-bit) - Expected 86536289.0, actual 86536289 (1.00x) +Testing collisions (low 32-bit) - Expected 871784.7, actual 864922 (0.99x) (-6862) +Testing collisions (low 30-47 bits) - Worst is 45 bits: 118/106 (1.11x) +Testing collisions (low 12-bit) - Expected 86532449.0, actual 86532449 (1.00x) +Testing collisions (low 8-bit) - Expected 86536289.0, actual 86536289 (1.00x) +Testing distribution - Worst bias is the 20-bit window at bit 24 - 0.004% + + +[[[ Keyset 'Text' Tests ]]] + +Keyset 'Text' - keys of form "FooXXXXBar" - 14776336 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 25418.1, actual 25174 (0.99x) (-244) +Testing collisions (high 27-42 bits) - Worst is 31 bits: 50550/50836 (0.99x) +Testing collisions (high 12-bit) - Expected 14772240.0, actual 14772240 (1.00x) +Testing collisions (high 8-bit) - Expected 14776080.0, actual 14776080 (1.00x) +Testing collisions (low 32-bit) - Expected 25418.1, actual 25567 (1.01x) (149) +Testing collisions (low 27-42 bits) - Worst is 41 bits: 55/49 (1.11x) +Testing collisions (low 12-bit) - Expected 14772240.0, actual 14772240 (1.00x) +Testing collisions (low 8-bit) - Expected 14776080.0, actual 14776080 (1.00x) +Testing distribution - Worst bias is the 20-bit window at bit 61 - 0.025% + +Keyset 'Text' - keys of form "FooBarXXXX" - 14776336 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 25418.1, actual 25389 (1.00x) (-29) +Testing collisions (high 27-42 bits) - Worst is 40 bits: 106/99 (1.07x) +Testing collisions (high 12-bit) - Expected 14772240.0, actual 14772240 (1.00x) +Testing collisions (high 8-bit) - Expected 14776080.0, actual 14776080 (1.00x) +Testing collisions (low 32-bit) - Expected 25418.1, actual 25370 (1.00x) (-48) +Testing collisions (low 27-42 bits) - Worst is 42 bits: 29/24 (1.17x) +Testing collisions (low 12-bit) - Expected 14772240.0, actual 14772240 (1.00x) +Testing collisions (low 8-bit) - Expected 14776080.0, actual 14776080 (1.00x) +Testing distribution - Worst bias is the 20-bit window at bit 55 - 0.020% + +Keyset 'Text' - keys of form "XXXXFooBar" - 14776336 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 25418.1, actual 25523 (1.00x) (105) +Testing collisions (high 27-42 bits) - Worst is 34 bits: 6505/6354 (1.02x) +Testing collisions (high 12-bit) - Expected 14772240.0, actual 14772240 (1.00x) +Testing collisions (high 8-bit) - Expected 14776080.0, actual 14776080 (1.00x) +Testing collisions (low 32-bit) - Expected 25418.1, actual 25486 (1.00x) (68) +Testing collisions (low 27-42 bits) - Worst is 39 bits: 219/198 (1.10x) +Testing collisions (low 12-bit) - Expected 14772240.0, actual 14772240 (1.00x) +Testing collisions (low 8-bit) - Expected 14776080.0, actual 14776080 (1.00x) +Testing distribution - Worst bias is the 20-bit window at bit 62 - 0.016% + +Keyset 'Words' - 4000000 random keys of len 6-16 from alnum charset +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 1862.6, actual 1928 (1.04x) (66) +Testing collisions (high 25-38 bits) - Worst is 32 bits: 1928/1862 (1.04x) +Testing collisions (high 12-bit) - Expected 3995904.0, actual 3995904 (1.00x) +Testing collisions (high 8-bit) - Expected 3999744.0, actual 3999744 (1.00x) +Testing collisions (low 32-bit) - Expected 1862.6, actual 1861 (1.00x) (-1) +Testing collisions (low 25-38 bits) - Worst is 38 bits: 34/29 (1.17x) +Testing collisions (low 12-bit) - Expected 3995904.0, actual 3995904 (1.00x) +Testing collisions (low 8-bit) - Expected 3999744.0, actual 3999744 (1.00x) +Testing distribution - Worst bias is the 19-bit window at bit 32 - 0.073% + +Keyset 'Words' - 4000000 random keys of len 6-16 from password charset +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 1862.6, actual 1964 (1.05x) (102) +Testing collisions (high 25-38 bits) - Worst is 33 bits: 1006/931 (1.08x) +Testing collisions (high 12-bit) - Expected 3995904.0, actual 3995904 (1.00x) +Testing collisions (high 8-bit) - Expected 3999744.0, actual 3999744 (1.00x) +Testing collisions (low 32-bit) - Expected 1862.6, actual 1913 (1.03x) (51) +Testing collisions (low 25-38 bits) - Worst is 38 bits: 34/29 (1.17x) +Testing collisions (low 12-bit) - Expected 3995904.0, actual 3995904 (1.00x) +Testing collisions (low 8-bit) - Expected 3999744.0, actual 3999744 (1.00x) +Testing distribution - Worst bias is the 19-bit window at bit 21 - 0.090% + +Keyset 'Words' - 102401 dict words +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 1.2, actual 2 (1.64x) (1) +Testing collisions (high 20-27 bits) - Worst is 24 bits: 351/312 (1.12x) +Testing collisions (high 12-bit) - Expected 98305.0, actual 98305 (1.00x) +Testing collisions (high 8-bit) - Expected 102145.0, actual 102145 (1.00x) +Testing collisions (low 32-bit) - Expected 1.2, actual 0 (0.00x) +Testing collisions (low 20-27 bits) - Worst is 27 bits: 45/39 (1.15x) +Testing collisions (low 12-bit) - Expected 98305.0, actual 98305 (1.00x) +Testing collisions (low 8-bit) - Expected 102145.0, actual 102145 (1.00x) +Testing distribution - Worst bias is the 14-bit window at bit 0 - 0.511% + + +[[[ Keyset 'Zeroes' Tests ]]] + +Keyset 'Zeroes' - 204800 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 4.9, actual 2 (0.41x) +Testing collisions (high 21-29 bits) - Worst is 25 bits: 647/624 (1.04x) +Testing collisions (high 12-bit) - Expected 200704.0, actual 200704 (1.00x) +Testing collisions (high 8-bit) - Expected 204544.0, actual 204544 (1.00x) +Testing collisions (low 32-bit) - Expected 4.9, actual 1 (0.20x) +Testing collisions (low 21-29 bits) - Worst is 23 bits: 2466/2499 (0.99x) +Testing collisions (low 12-bit) - Expected 200704.0, actual 200704 (1.00x) +Testing collisions (low 8-bit) - Expected 204544.0, actual 204544 (1.00x) +Testing distribution - Worst bias is the 15-bit window at bit 49 - 0.287% + + +[[[ Keyset 'Seed' Tests ]]] + +Keyset 'Seed' - 5000000 keys +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 2910.4, actual 2880 (0.99x) (-30) +Testing collisions (high 26-39 bits) - Worst is 34 bits: 728/727 (1.00x) +Testing collisions (high 12-bit) - Expected 4995904.0, actual 4995904 (1.00x) +Testing collisions (high 8-bit) - Expected 4999744.0, actual 4999744 (1.00x) +Testing collisions (low 32-bit) - Expected 2910.4, actual 2967 (1.02x) (57) +Testing collisions (low 26-39 bits) - Worst is 37 bits: 104/90 (1.14x) +Testing collisions (low 12-bit) - Expected 4995904.0, actual 4995904 (1.00x) +Testing collisions (low 8-bit) - Expected 4999744.0, actual 4999744 (1.00x) +Testing distribution - Worst bias is the 19-bit window at bit 1 - 0.073% + + +[[[ Keyset 'PerlinNoise' Tests ]]] + +Testing 16777216 coordinates (L2) : +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 32768.0, actual 32536 (0.99x) (-231) +Testing collisions (high 27-42 bits) - Worst is 42 bits: 49/31 (1.53x) +Testing collisions (high 12-bit) - Expected 16773120.0, actual 16773120 (1.00x) +Testing collisions (high 8-bit) - Expected 16776960.0, actual 16776960 (1.00x) +Testing collisions (low 32-bit) - Expected 32768.0, actual 32601 (0.99x) (-166) +Testing collisions (low 27-42 bits) - Worst is 35 bits: 4114/4095 (1.00x) +Testing collisions (low 12-bit) - Expected 16773120.0, actual 16773120 (1.00x) +Testing collisions (low 8-bit) - Expected 16776960.0, actual 16776960 (1.00x) + + +[[[ Diff 'Differential' Tests ]]] + +Testing 8303632 up-to-5-bit differentials in 64-bit keys -> 64 bit hashes. +1000 reps, 8303632000 total tests, expecting 0.00 random collisions.......... +0 total collisions, of which 0 single collisions were ignored + +Testing 11017632 up-to-4-bit differentials in 128-bit keys -> 64 bit hashes. +1000 reps, 11017632000 total tests, expecting 0.00 random collisions.......... +0 total collisions, of which 0 single collisions were ignored + +Testing 2796416 up-to-3-bit differentials in 256-bit keys -> 64 bit hashes. +1000 reps, 2796416000 total tests, expecting 0.00 random collisions.......... +0 total collisions, of which 0 single collisions were ignored + + +[[[ DiffDist 'Differential Distribution' Tests ]]] + +Testing bit 0 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 512 (1.00x) (1) +Testing collisions (high 24-36 bits) - Worst is 31 bits: 1034/1023 (1.01x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 533 (1.04x) (22) +Testing collisions (low 24-36 bits) - Worst is 34 bits: 145/127 (1.13x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 1 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 529 (1.03x) (18) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 36/31 (1.13x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 492 (0.96x) +Testing collisions (low 24-36 bits) - Worst is 27 bits: 16152/16383 (0.99x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 2 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 492 (0.96x) +Testing collisions (high 24-36 bits) - Worst is 34 bits: 136/127 (1.06x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 514 (1.00x) (3) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 38/31 (1.19x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 3 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 506 (0.99x) (-5) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 67/63 (1.05x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 507 (0.99x) (-4) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 34/31 (1.06x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 4 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 493 (0.96x) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 39/31 (1.22x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 530 (1.04x) (19) +Testing collisions (low 24-36 bits) - Worst is 34 bits: 146/127 (1.14x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 5 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 520 (1.02x) (9) +Testing collisions (high 24-36 bits) - Worst is 31 bits: 1052/1023 (1.03x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 500 (0.98x) +Testing collisions (low 24-36 bits) - Worst is 33 bits: 264/255 (1.03x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 6 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 549 (1.07x) (38) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 41/31 (1.28x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 514 (1.00x) (3) +Testing collisions (low 24-36 bits) - Worst is 34 bits: 130/127 (1.02x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 7 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 471 (0.92x) +Testing collisions (high 24-36 bits) - Worst is 30 bits: 2065/2047 (1.01x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 501 (0.98x) +Testing collisions (low 24-36 bits) - Worst is 28 bits: 8319/8191 (1.02x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 8 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 524 (1.02x) (13) +Testing collisions (high 24-36 bits) - Worst is 32 bits: 524/511 (1.02x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 524 (1.02x) (13) +Testing collisions (low 24-36 bits) - Worst is 35 bits: 78/63 (1.22x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 9 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 514 (1.00x) (3) +Testing collisions (high 24-36 bits) - Worst is 29 bits: 4161/4095 (1.02x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 494 (0.96x) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 33/31 (1.03x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 10 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 538 (1.05x) (27) +Testing collisions (high 24-36 bits) - Worst is 31 bits: 1086/1023 (1.06x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 536 (1.05x) (25) +Testing collisions (low 24-36 bits) - Worst is 35 bits: 77/63 (1.20x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 11 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 499 (0.97x) +Testing collisions (high 24-36 bits) - Worst is 33 bits: 274/255 (1.07x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 548 (1.07x) (37) +Testing collisions (low 24-36 bits) - Worst is 35 bits: 73/63 (1.14x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 12 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 500 (0.98x) +Testing collisions (high 24-36 bits) - Worst is 28 bits: 8243/8191 (1.01x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 490 (0.96x) +Testing collisions (low 24-36 bits) - Worst is 29 bits: 4076/4095 (1.00x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 13 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 509 (0.99x) (-2) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 42/31 (1.31x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 500 (0.98x) +Testing collisions (low 24-36 bits) - Worst is 35 bits: 76/63 (1.19x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 14 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 541 (1.06x) (30) +Testing collisions (high 24-36 bits) - Worst is 34 bits: 141/127 (1.10x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 518 (1.01x) (7) +Testing collisions (low 24-36 bits) - Worst is 32 bits: 518/511 (1.01x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 15 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 514 (1.00x) (3) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 69/63 (1.08x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 527 (1.03x) (16) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 42/31 (1.31x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 16 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 499 (0.97x) +Testing collisions (high 24-36 bits) - Worst is 34 bits: 131/127 (1.02x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 519 (1.01x) (8) +Testing collisions (low 24-36 bits) - Worst is 31 bits: 1052/1023 (1.03x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 17 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 500 (0.98x) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 35/31 (1.09x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 513 (1.00x) (2) +Testing collisions (low 24-36 bits) - Worst is 33 bits: 277/255 (1.08x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 18 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 531 (1.04x) (20) +Testing collisions (high 24-36 bits) - Worst is 33 bits: 276/255 (1.08x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 495 (0.97x) +Testing collisions (low 24-36 bits) - Worst is 35 bits: 69/63 (1.08x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 19 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 531 (1.04x) (20) +Testing collisions (high 24-36 bits) - Worst is 33 bits: 278/255 (1.09x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 557 (1.09x) (46) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 38/31 (1.19x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 20 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 544 (1.06x) (33) +Testing collisions (high 24-36 bits) - Worst is 32 bits: 544/511 (1.06x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 557 (1.09x) (46) +Testing collisions (low 24-36 bits) - Worst is 34 bits: 143/127 (1.12x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 21 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 500 (0.98x) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 35/31 (1.09x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 531 (1.04x) (20) +Testing collisions (low 24-36 bits) - Worst is 34 bits: 137/127 (1.07x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 22 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 520 (1.02x) (9) +Testing collisions (high 24-36 bits) - Worst is 34 bits: 134/127 (1.05x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 498 (0.97x) +Testing collisions (low 24-36 bits) - Worst is 27 bits: 16348/16383 (1.00x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 23 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 522 (1.02x) (11) +Testing collisions (high 24-36 bits) - Worst is 32 bits: 522/511 (1.02x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 509 (0.99x) (-2) +Testing collisions (low 24-36 bits) - Worst is 35 bits: 68/63 (1.06x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 24 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 517 (1.01x) (6) +Testing collisions (high 24-36 bits) - Worst is 33 bits: 261/255 (1.02x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 489 (0.96x) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 32/31 (1.00x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 25 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 532 (1.04x) (21) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 39/31 (1.22x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 499 (0.97x) +Testing collisions (low 24-36 bits) - Worst is 34 bits: 129/127 (1.01x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 26 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 494 (0.96x) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 70/63 (1.09x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 500 (0.98x) +Testing collisions (low 24-36 bits) - Worst is 31 bits: 1032/1023 (1.01x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 27 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 520 (1.02x) (9) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 37/31 (1.16x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 516 (1.01x) (5) +Testing collisions (low 24-36 bits) - Worst is 32 bits: 516/511 (1.01x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 28 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 486 (0.95x) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 66/63 (1.03x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 461 (0.90x) +Testing collisions (low 24-36 bits) - Worst is 28 bits: 8374/8191 (1.02x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 29 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 468 (0.91x) +Testing collisions (high 24-36 bits) - Worst is 29 bits: 4195/4095 (1.02x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 492 (0.96x) +Testing collisions (low 24-36 bits) - Worst is 27 bits: 16390/16383 (1.00x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 30 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 504 (0.98x) (-7) +Testing collisions (high 24-36 bits) - Worst is 33 bits: 269/255 (1.05x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 514 (1.00x) (3) +Testing collisions (low 24-36 bits) - Worst is 35 bits: 80/63 (1.25x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 31 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 508 (0.99x) (-3) +Testing collisions (high 24-36 bits) - Worst is 31 bits: 1017/1023 (0.99x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 532 (1.04x) (21) +Testing collisions (low 24-36 bits) - Worst is 35 bits: 77/63 (1.20x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 32 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 541 (1.06x) (30) +Testing collisions (high 24-36 bits) - Worst is 34 bits: 137/127 (1.07x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 487 (0.95x) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 33/31 (1.03x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 33 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 505 (0.99x) (-6) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 39/31 (1.22x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 474 (0.93x) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 36/31 (1.13x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 34 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 539 (1.05x) (28) +Testing collisions (high 24-36 bits) - Worst is 32 bits: 539/511 (1.05x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 523 (1.02x) (12) +Testing collisions (low 24-36 bits) - Worst is 34 bits: 145/127 (1.13x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 35 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 463 (0.90x) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 32/31 (1.00x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 564 (1.10x) (53) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 42/31 (1.31x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 36 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 519 (1.01x) (8) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 36/31 (1.13x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 506 (0.99x) (-5) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 36/31 (1.13x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 37 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 524 (1.02x) (13) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 79/63 (1.23x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 535 (1.04x) (24) +Testing collisions (low 24-36 bits) - Worst is 33 bits: 270/255 (1.05x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 38 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 536 (1.05x) (25) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 79/63 (1.23x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 538 (1.05x) (27) +Testing collisions (low 24-36 bits) - Worst is 32 bits: 538/511 (1.05x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 39 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 557 (1.09x) (46) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 80/63 (1.25x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 530 (1.04x) (19) +Testing collisions (low 24-36 bits) - Worst is 35 bits: 70/63 (1.09x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 40 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 543 (1.06x) (32) +Testing collisions (high 24-36 bits) - Worst is 34 bits: 144/127 (1.13x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 542 (1.06x) (31) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 36/31 (1.13x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 41 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 497 (0.97x) +Testing collisions (high 24-36 bits) - Worst is 31 bits: 1031/1023 (1.01x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 509 (0.99x) (-2) +Testing collisions (low 24-36 bits) - Worst is 34 bits: 139/127 (1.09x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 42 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 514 (1.00x) (3) +Testing collisions (high 24-36 bits) - Worst is 30 bits: 2135/2047 (1.04x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 535 (1.04x) (24) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 35/31 (1.09x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 43 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 498 (0.97x) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 68/63 (1.06x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 478 (0.93x) +Testing collisions (low 24-36 bits) - Worst is 28 bits: 8288/8191 (1.01x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 44 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 511 (1.00x) +Testing collisions (high 24-36 bits) - Worst is 31 bits: 1028/1023 (1.00x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 500 (0.98x) +Testing collisions (low 24-36 bits) - Worst is 31 bits: 1054/1023 (1.03x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 45 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 517 (1.01x) (6) +Testing collisions (high 24-36 bits) - Worst is 34 bits: 140/127 (1.09x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 526 (1.03x) (15) +Testing collisions (low 24-36 bits) - Worst is 32 bits: 526/511 (1.03x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 46 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 535 (1.04x) (24) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 34/31 (1.06x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 499 (0.97x) +Testing collisions (low 24-36 bits) - Worst is 30 bits: 2042/2047 (1.00x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 47 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 521 (1.02x) (10) +Testing collisions (high 24-36 bits) - Worst is 31 bits: 1054/1023 (1.03x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 486 (0.95x) +Testing collisions (low 24-36 bits) - Worst is 29 bits: 4074/4095 (0.99x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 48 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 502 (0.98x) (-9) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 44/31 (1.38x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 498 (0.97x) +Testing collisions (low 24-36 bits) - Worst is 28 bits: 8186/8191 (1.00x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 49 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 494 (0.96x) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 38/31 (1.19x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 508 (0.99x) (-3) +Testing collisions (low 24-36 bits) - Worst is 31 bits: 1016/1023 (0.99x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 50 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 508 (0.99x) (-3) +Testing collisions (high 24-36 bits) - Worst is 33 bits: 259/255 (1.01x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 519 (1.01x) (8) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 37/31 (1.16x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 51 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 518 (1.01x) (7) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 79/63 (1.23x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 523 (1.02x) (12) +Testing collisions (low 24-36 bits) - Worst is 33 bits: 272/255 (1.06x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 52 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 551 (1.08x) (40) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 38/31 (1.19x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 486 (0.95x) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 39/31 (1.22x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 53 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 495 (0.97x) +Testing collisions (high 24-36 bits) - Worst is 30 bits: 2090/2047 (1.02x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 510 (1.00x) (-1) +Testing collisions (low 24-36 bits) - Worst is 31 bits: 1038/1023 (1.01x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 54 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 543 (1.06x) (32) +Testing collisions (high 24-36 bits) - Worst is 34 bits: 137/127 (1.07x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 517 (1.01x) (6) +Testing collisions (low 24-36 bits) - Worst is 30 bits: 2099/2047 (1.02x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 55 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 471 (0.92x) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 36/31 (1.13x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 539 (1.05x) (28) +Testing collisions (low 24-36 bits) - Worst is 33 bits: 271/255 (1.06x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 56 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 519 (1.01x) (8) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 73/63 (1.14x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 475 (0.93x) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 33/31 (1.03x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 57 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 512 (1.00x) (1) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 67/63 (1.05x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 507 (0.99x) (-4) +Testing collisions (low 24-36 bits) - Worst is 35 bits: 65/63 (1.02x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 58 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 528 (1.03x) (17) +Testing collisions (high 24-36 bits) - Worst is 32 bits: 528/511 (1.03x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 512 (1.00x) (1) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 40/31 (1.25x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 59 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 506 (0.99x) (-5) +Testing collisions (high 24-36 bits) - Worst is 35 bits: 66/63 (1.03x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 511 (1.00x) +Testing collisions (low 24-36 bits) - Worst is 31 bits: 1022/1023 (1.00x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 60 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 502 (0.98x) (-9) +Testing collisions (high 24-36 bits) - Worst is 36 bits: 43/31 (1.34x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 519 (1.01x) (8) +Testing collisions (low 24-36 bits) - Worst is 34 bits: 136/127 (1.06x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 61 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 524 (1.02x) (13) +Testing collisions (high 24-36 bits) - Worst is 33 bits: 265/255 (1.04x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 529 (1.03x) (18) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 37/31 (1.16x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 62 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 496 (0.97x) +Testing collisions (high 24-36 bits) - Worst is 29 bits: 4125/4095 (1.01x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 490 (0.96x) +Testing collisions (low 24-36 bits) - Worst is 36 bits: 38/31 (1.19x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + +Testing bit 63 +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 512.0, actual 479 (0.94x) +Testing collisions (high 24-36 bits) - Worst is 33 bits: 262/255 (1.02x) +Testing collisions (high 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (high 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) +Testing collisions (low 32-bit) - Expected 512.0, actual 510 (1.00x) (-1) +Testing collisions (low 24-36 bits) - Worst is 34 bits: 133/127 (1.04x) +Testing collisions (low 12-bit) - Expected 2093056.0, actual 2093056 (1.00x) +Testing collisions (low 8-bit) - Expected 2096896.0, actual 2096896 (1.00x) + + +[[[ MomentChi2 Tests ]]] + +Analyze hashes produced from a serie of linearly increasing numbers of 32-bit, using a step of 3 ... +Target values to approximate : 38918200.000000 - 410450.000000 +Popcount 1 stats : 38919632.307917 - 410479.005598 +Popcount 0 stats : 38918367.673773 - 410464.964389 +MomentChi2 for bits 1 : 2.49901 +MomentChi2 for bits 0 : 0.0342478 + +Derivative stats (transition from 2 consecutive values) : +Popcount 1 stats : 38921086.495604 - 410506.484777 +Popcount 0 stats : 38916867.679739 - 410442.803573 +MomentChi2 for deriv b1 : 10.149 +MomentChi2 for deriv b0 : 2.16237 + + Good ! + + +[[[ Prng Tests ]]] + +Generating 33554432 random numbers : +Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) +Testing collisions (high 32-bit) - Expected 131072.0, actual 130738 (1.00x) (-333) +Testing collisions (high 28-44 bits) - Worst is 43 bits: 76/63 (1.19x) +Testing collisions (high 12-bit) - Expected 33550336.0, actual 33550336 (1.00x) +Testing collisions (high 8-bit) - Expected 33554176.0, actual 33554176 (1.00x) +Testing collisions (low 32-bit) - Expected 131072.0, actual 130564 (1.00x) (-507) +Testing collisions (low 28-44 bits) - Worst is 38 bits: 2080/2047 (1.02x) +Testing collisions (low 12-bit) - Expected 33550336.0, actual 33550336 (1.00x) +Testing collisions (low 8-bit) - Expected 33554176.0, actual 33554176 (1.00x) + + +Input vcode 0x00000001, Output vcode 0x00000001, Result vcode 0x00000001 +Verification value is 0x00000001 - Testing took 631.756439 seconds +------------------------------------------------------------------------------- diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/src/aes_hash.rs b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/src/aes_hash.rs new file mode 100644 index 0000000..d3b673f --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/src/aes_hash.rs @@ -0,0 +1,434 @@ +use crate::convert::*; +use crate::operations::*; +use crate::random_state::PI; +use crate::RandomState; +use core::hash::Hasher; + +/// A `Hasher` for hashing an arbitrary stream of bytes. +/// +/// Instances of [`AHasher`] represent state that is updated while hashing data. +/// +/// Each method updates the internal state based on the new data provided. Once +/// all of the data has been provided, the resulting hash can be obtained by calling +/// `finish()` +/// +/// [Clone] is also provided in case you wish to calculate hashes for two different items that +/// start with the same data. +/// +#[derive(Debug, Clone)] +pub struct AHasher { + enc: u128, + sum: u128, + key: u128, +} + +impl AHasher { + /// Creates a new hasher keyed to the provided keys. + /// + /// Normally hashers are created via `AHasher::default()` for fixed keys or `RandomState::new()` for randomly + /// generated keys and `RandomState::with_seeds(a,b)` for seeds that are set and can be reused. All of these work at + /// map creation time (and hence don't have any overhead on a per-item bais). + /// + /// This method directly creates the hasher instance and performs no transformation on the provided seeds. This may + /// be useful where a HashBuilder is not desired, such as for testing purposes. + /// + /// # Example + /// + /// ``` + /// use std::hash::Hasher; + /// use ahash::AHasher; + /// + /// let mut hasher = AHasher::new_with_keys(1234, 5678); + /// + /// hasher.write_u32(1989); + /// hasher.write_u8(11); + /// hasher.write_u8(9); + /// hasher.write(b"Huh?"); + /// + /// println!("Hash is {:x}!", hasher.finish()); + /// ``` + #[inline] + pub(crate) fn new_with_keys(key1: u128, key2: u128) -> Self { + let pi: [u128; 2] = PI.convert(); + let key1 = key1 ^ pi[0]; + let key2 = key2 ^ pi[1]; + Self { + enc: key1, + sum: key2, + key: key1 ^ key2, + } + } + + #[allow(unused)] // False positive + pub(crate) fn test_with_keys(key1: u128, key2: u128) -> Self { + Self { + enc: key1, + sum: key2, + key: key1 ^ key2, + } + } + + #[inline] + pub(crate) fn from_random_state(rand_state: &RandomState) -> Self { + let key1 = [rand_state.k0, rand_state.k1].convert(); + let key2 = [rand_state.k2, rand_state.k3].convert(); + Self { + enc: key1, + sum: key2, + key: key1 ^ key2, + } + } + + #[inline(always)] + fn hash_in(&mut self, new_value: u128) { + self.enc = aesenc(self.enc, new_value); + self.sum = shuffle_and_add(self.sum, new_value); + } + + #[inline(always)] + fn hash_in_2(&mut self, v1: u128, v2: u128) { + self.enc = aesenc(self.enc, v1); + self.sum = shuffle_and_add(self.sum, v1); + self.enc = aesenc(self.enc, v2); + self.sum = shuffle_and_add(self.sum, v2); + } + + #[inline] + #[cfg(feature = "specialize")] + fn short_finish(&self) -> u64 { + let combined = aesdec(self.sum, self.enc); + let result: [u64; 2] = aesenc(combined, combined).convert(); + result[0] + } +} + +/// Provides [Hasher] methods to hash all of the primitive types. +/// +/// [Hasher]: core::hash::Hasher +impl Hasher for AHasher { + #[inline] + fn write_u8(&mut self, i: u8) { + self.write_u64(i as u64); + } + + #[inline] + fn write_u16(&mut self, i: u16) { + self.write_u64(i as u64); + } + + #[inline] + fn write_u32(&mut self, i: u32) { + self.write_u64(i as u64); + } + + #[inline] + fn write_u128(&mut self, i: u128) { + self.hash_in(i); + } + + #[inline] + #[cfg(any( + target_pointer_width = "64", + target_pointer_width = "32", + target_pointer_width = "16" + ))] + fn write_usize(&mut self, i: usize) { + self.write_u64(i as u64); + } + + #[inline] + #[cfg(target_pointer_width = "128")] + fn write_usize(&mut self, i: usize) { + self.write_u128(i as u128); + } + + #[inline] + fn write_u64(&mut self, i: u64) { + self.write_u128(i as u128); + } + + #[inline] + #[allow(clippy::collapsible_if)] + fn write(&mut self, input: &[u8]) { + let mut data = input; + let length = data.len(); + add_in_length(&mut self.enc, length as u64); + + //A 'binary search' on sizes reduces the number of comparisons. + if data.len() <= 8 { + let value = read_small(data); + self.hash_in(value.convert()); + } else { + if data.len() > 32 { + if data.len() > 64 { + let tail = data.read_last_u128x4(); + let mut current: [u128; 4] = [self.key; 4]; + current[0] = aesenc(current[0], tail[0]); + current[1] = aesdec(current[1], tail[1]); + current[2] = aesenc(current[2], tail[2]); + current[3] = aesdec(current[3], tail[3]); + let mut sum: [u128; 2] = [self.key, !self.key]; + sum[0] = add_by_64s(sum[0].convert(), tail[0].convert()).convert(); + sum[1] = add_by_64s(sum[1].convert(), tail[1].convert()).convert(); + sum[0] = shuffle_and_add(sum[0], tail[2]); + sum[1] = shuffle_and_add(sum[1], tail[3]); + while data.len() > 64 { + let (blocks, rest) = data.read_u128x4(); + current[0] = aesenc(current[0], blocks[0]); + current[1] = aesenc(current[1], blocks[1]); + current[2] = aesenc(current[2], blocks[2]); + current[3] = aesenc(current[3], blocks[3]); + sum[0] = shuffle_and_add(sum[0], blocks[0]); + sum[1] = shuffle_and_add(sum[1], blocks[1]); + sum[0] = shuffle_and_add(sum[0], blocks[2]); + sum[1] = shuffle_and_add(sum[1], blocks[3]); + data = rest; + } + self.hash_in_2(current[0], current[1]); + self.hash_in_2(current[2], current[3]); + self.hash_in_2(sum[0], sum[1]); + } else { + //len 33-64 + let (head, _) = data.read_u128x2(); + let tail = data.read_last_u128x2(); + self.hash_in_2(head[0], head[1]); + self.hash_in_2(tail[0], tail[1]); + } + } else { + if data.len() > 16 { + //len 17-32 + self.hash_in_2(data.read_u128().0, data.read_last_u128()); + } else { + //len 9-16 + let value: [u64; 2] = [data.read_u64().0, data.read_last_u64()]; + self.hash_in(value.convert()); + } + } + } + } + #[inline] + fn finish(&self) -> u64 { + let combined = aesdec(self.sum, self.enc); + let result: [u64; 2] = aesenc(aesenc(combined, self.key), combined).convert(); + result[1] + } +} + +#[cfg(feature = "specialize")] +pub(crate) struct AHasherU64 { + pub(crate) buffer: u64, + pub(crate) pad: u64, +} + +/// A specialized hasher for only primitives under 64 bits. +#[cfg(feature = "specialize")] +impl Hasher for AHasherU64 { + #[inline] + fn finish(&self) -> u64 { + let rot = (self.pad & 63) as u32; + self.buffer.rotate_left(rot) + } + + #[inline] + fn write(&mut self, _bytes: &[u8]) { + unreachable!("Specialized hasher was called with a different type of object") + } + + #[inline] + fn write_u8(&mut self, i: u8) { + self.write_u64(i as u64); + } + + #[inline] + fn write_u16(&mut self, i: u16) { + self.write_u64(i as u64); + } + + #[inline] + fn write_u32(&mut self, i: u32) { + self.write_u64(i as u64); + } + + #[inline] + fn write_u64(&mut self, i: u64) { + self.buffer = folded_multiply(i ^ self.buffer, MULTIPLE); + } + + #[inline] + fn write_u128(&mut self, _i: u128) { + unreachable!("Specialized hasher was called with a different type of object") + } + + #[inline] + fn write_usize(&mut self, _i: usize) { + unreachable!("Specialized hasher was called with a different type of object") + } +} + +#[cfg(feature = "specialize")] +pub(crate) struct AHasherFixed(pub AHasher); + +/// A specialized hasher for fixed size primitives larger than 64 bits. +#[cfg(feature = "specialize")] +impl Hasher for AHasherFixed { + #[inline] + fn finish(&self) -> u64 { + self.0.short_finish() + } + + #[inline] + fn write(&mut self, bytes: &[u8]) { + self.0.write(bytes) + } + + #[inline] + fn write_u8(&mut self, i: u8) { + self.write_u64(i as u64); + } + + #[inline] + fn write_u16(&mut self, i: u16) { + self.write_u64(i as u64); + } + + #[inline] + fn write_u32(&mut self, i: u32) { + self.write_u64(i as u64); + } + + #[inline] + fn write_u64(&mut self, i: u64) { + self.0.write_u64(i); + } + + #[inline] + fn write_u128(&mut self, i: u128) { + self.0.write_u128(i); + } + + #[inline] + fn write_usize(&mut self, i: usize) { + self.0.write_usize(i); + } +} + +#[cfg(feature = "specialize")] +pub(crate) struct AHasherStr(pub AHasher); + +/// A specialized hasher for strings +/// Note that the other types don't panic because the hash impl for String tacks on an unneeded call. (As does vec) +#[cfg(feature = "specialize")] +impl Hasher for AHasherStr { + #[inline] + fn finish(&self) -> u64 { + let result: [u64; 2] = self.0.enc.convert(); + result[0] + } + + #[inline] + fn write(&mut self, bytes: &[u8]) { + if bytes.len() > 8 { + self.0.write(bytes); + self.0.enc = aesdec(self.0.sum, self.0.enc); + self.0.enc = aesenc(aesenc(self.0.enc, self.0.key), self.0.enc); + } else { + add_in_length(&mut self.0.enc, bytes.len() as u64); + + let value = read_small(bytes).convert(); + self.0.sum = shuffle_and_add(self.0.sum, value); + self.0.enc = aesdec(self.0.sum, self.0.enc); + self.0.enc = aesenc(aesenc(self.0.enc, self.0.key), self.0.enc); + } + } + + #[inline] + fn write_u8(&mut self, _i: u8) {} + + #[inline] + fn write_u16(&mut self, _i: u16) {} + + #[inline] + fn write_u32(&mut self, _i: u32) {} + + #[inline] + fn write_u64(&mut self, _i: u64) {} + + #[inline] + fn write_u128(&mut self, _i: u128) {} + + #[inline] + fn write_usize(&mut self, _i: usize) {} +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::convert::Convert; + use crate::operations::aesenc; + use crate::RandomState; + use std::hash::{BuildHasher, Hasher}; + #[test] + fn test_sanity() { + let mut hasher = RandomState::with_seeds(1, 2, 3, 4).build_hasher(); + hasher.write_u64(0); + let h1 = hasher.finish(); + hasher.write(&[1, 0, 0, 0, 0, 0, 0, 0]); + let h2 = hasher.finish(); + assert_ne!(h1, h2); + } + + #[cfg(feature = "compile-time-rng")] + #[test] + fn test_builder() { + use std::collections::HashMap; + use std::hash::BuildHasherDefault; + + let mut map = HashMap::>::default(); + map.insert(1, 3); + } + + #[cfg(feature = "compile-time-rng")] + #[test] + fn test_default() { + let hasher_a = AHasher::default(); + let a_enc: [u64; 2] = hasher_a.enc.convert(); + let a_sum: [u64; 2] = hasher_a.sum.convert(); + assert_ne!(0, a_enc[0]); + assert_ne!(0, a_enc[1]); + assert_ne!(0, a_sum[0]); + assert_ne!(0, a_sum[1]); + assert_ne!(a_enc[0], a_enc[1]); + assert_ne!(a_sum[0], a_sum[1]); + assert_ne!(a_enc[0], a_sum[0]); + assert_ne!(a_enc[1], a_sum[1]); + let hasher_b = AHasher::default(); + let b_enc: [u64; 2] = hasher_b.enc.convert(); + let b_sum: [u64; 2] = hasher_b.sum.convert(); + assert_eq!(a_enc[0], b_enc[0]); + assert_eq!(a_enc[1], b_enc[1]); + assert_eq!(a_sum[0], b_sum[0]); + assert_eq!(a_sum[1], b_sum[1]); + } + + #[test] + fn test_hash() { + let mut result: [u64; 2] = [0x6c62272e07bb0142, 0x62b821756295c58d]; + let value: [u64; 2] = [1 << 32, 0xFEDCBA9876543210]; + result = aesenc(value.convert(), result.convert()).convert(); + result = aesenc(result.convert(), result.convert()).convert(); + let mut result2: [u64; 2] = [0x6c62272e07bb0142, 0x62b821756295c58d]; + let value2: [u64; 2] = [1, 0xFEDCBA9876543210]; + result2 = aesenc(value2.convert(), result2.convert()).convert(); + result2 = aesenc(result2.convert(), result.convert()).convert(); + let result: [u8; 16] = result.convert(); + let result2: [u8; 16] = result2.convert(); + assert_ne!(hex::encode(result), hex::encode(result2)); + } + + #[test] + fn test_conversion() { + let input: &[u8] = "dddddddd".as_bytes(); + let bytes: u64 = as_array!(input, 8).convert(); + assert_eq!(bytes, 0x6464646464646464); + } +} diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/src/convert.rs b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/src/convert.rs new file mode 100644 index 0000000..712eae1 --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/src/convert.rs @@ -0,0 +1,162 @@ +pub(crate) trait Convert { + fn convert(self) -> To; +} + +macro_rules! convert { + ($a:ty, $b:ty) => { + impl Convert<$b> for $a { + #[inline(always)] + fn convert(self) -> $b { + zerocopy::transmute!(self) + } + } + impl Convert<$a> for $b { + #[inline(always)] + fn convert(self) -> $a { + zerocopy::transmute!(self) + } + } + }; +} + +convert!([u128; 4], [u64; 8]); +convert!([u128; 4], [u32; 16]); +convert!([u128; 4], [u16; 32]); +convert!([u128; 4], [u8; 64]); +convert!([u128; 2], [u64; 4]); +convert!([u128; 2], [u32; 8]); +convert!([u128; 2], [u16; 16]); +convert!([u128; 2], [u8; 32]); +convert!(u128, [u64; 2]); +convert!(u128, [u32; 4]); +convert!(u128, [u16; 8]); +convert!(u128, [u8; 16]); +convert!([u64; 8], [u32; 16]); +convert!([u64; 8], [u16; 32]); +convert!([u64; 8], [u8; 64]); +convert!([u64; 4], [u32; 8]); +convert!([u64; 4], [u16; 16]); +convert!([u64; 4], [u8; 32]); +convert!([u64; 2], [u32; 4]); +convert!([u64; 2], [u16; 8]); +convert!([u64; 2], [u8; 16]); +convert!([u32; 4], [u16; 8]); +convert!([u32; 4], [u8; 16]); +convert!([u16; 8], [u8; 16]); +convert!(u64, [u32; 2]); +convert!(u64, [u16; 4]); +convert!(u64, [u8; 8]); +convert!([u32; 2], [u16; 4]); +convert!([u32; 2], [u8; 8]); +convert!(u32, [u16; 2]); +convert!(u32, [u8; 4]); +convert!([u16; 2], [u8; 4]); +convert!(u16, [u8; 2]); +convert!([[u64; 4]; 2], [u8; 64]); + +convert!([f64; 2], [u8; 16]); +convert!([f32; 4], [u8; 16]); +convert!(f64, [u8; 8]); +convert!([f32; 2], [u8; 8]); +convert!(f32, [u8; 4]); + +macro_rules! as_array { + ($input:expr, $len:expr) => {{ + { + #[inline(always)] + fn as_array(slice: &[T]) -> &[T; $len] { + core::convert::TryFrom::try_from(slice).unwrap() + } + as_array($input) + } + }}; +} + +pub(crate) trait ReadFromSlice { + fn read_u16(&self) -> (u16, &[u8]); + fn read_u32(&self) -> (u32, &[u8]); + fn read_u64(&self) -> (u64, &[u8]); + fn read_u128(&self) -> (u128, &[u8]); + fn read_u128x2(&self) -> ([u128; 2], &[u8]); + fn read_u128x4(&self) -> ([u128; 4], &[u8]); + fn read_last_u16(&self) -> u16; + fn read_last_u32(&self) -> u32; + fn read_last_u64(&self) -> u64; + fn read_last_u128(&self) -> u128; + fn read_last_u128x2(&self) -> [u128; 2]; + fn read_last_u128x4(&self) -> [u128; 4]; +} + +impl ReadFromSlice for [u8] { + #[inline(always)] + fn read_u16(&self) -> (u16, &[u8]) { + let (value, rest) = self.split_at(2); + (as_array!(value, 2).convert(), rest) + } + + #[inline(always)] + fn read_u32(&self) -> (u32, &[u8]) { + let (value, rest) = self.split_at(4); + (as_array!(value, 4).convert(), rest) + } + + #[inline(always)] + fn read_u64(&self) -> (u64, &[u8]) { + let (value, rest) = self.split_at(8); + (as_array!(value, 8).convert(), rest) + } + + #[inline(always)] + fn read_u128(&self) -> (u128, &[u8]) { + let (value, rest) = self.split_at(16); + (as_array!(value, 16).convert(), rest) + } + + #[inline(always)] + fn read_u128x2(&self) -> ([u128; 2], &[u8]) { + let (value, rest) = self.split_at(32); + (as_array!(value, 32).convert(), rest) + } + + #[inline(always)] + fn read_u128x4(&self) -> ([u128; 4], &[u8]) { + let (value, rest) = self.split_at(64); + (as_array!(value, 64).convert(), rest) + } + + #[inline(always)] + fn read_last_u16(&self) -> u16 { + let (_, value) = self.split_at(self.len() - 2); + as_array!(value, 2).convert() + } + + #[inline(always)] + fn read_last_u32(&self) -> u32 { + let (_, value) = self.split_at(self.len() - 4); + as_array!(value, 4).convert() + } + + #[inline(always)] + fn read_last_u64(&self) -> u64 { + let (_, value) = self.split_at(self.len() - 8); + as_array!(value, 8).convert() + } + + #[inline(always)] + fn read_last_u128(&self) -> u128 { + let (_, value) = self.split_at(self.len() - 16); + as_array!(value, 16).convert() + } + + #[inline(always)] + fn read_last_u128x2(&self) -> [u128; 2] { + let (_, value) = self.split_at(self.len() - 32); + as_array!(value, 32).convert() + } + + #[inline(always)] + fn read_last_u128x4(&self) -> [u128; 4] { + let (_, value) = self.split_at(self.len() - 64); + as_array!(value, 64).convert() + } +} diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/src/fallback_hash.rs b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/src/fallback_hash.rs new file mode 100644 index 0000000..f78074d --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/src/fallback_hash.rs @@ -0,0 +1,368 @@ +use crate::convert::*; +use crate::operations::folded_multiply; +use crate::operations::read_small; +use crate::operations::MULTIPLE; +use crate::random_state::PI; +use crate::RandomState; +use core::hash::Hasher; + +const ROT: u32 = 23; //17 + +/// A `Hasher` for hashing an arbitrary stream of bytes. +/// +/// Instances of [`AHasher`] represent state that is updated while hashing data. +/// +/// Each method updates the internal state based on the new data provided. Once +/// all of the data has been provided, the resulting hash can be obtained by calling +/// `finish()` +/// +/// [Clone] is also provided in case you wish to calculate hashes for two different items that +/// start with the same data. +/// +#[derive(Debug, Clone)] +pub struct AHasher { + buffer: u64, + pad: u64, + extra_keys: [u64; 2], +} + +impl AHasher { + /// Creates a new hasher keyed to the provided key. + #[inline] + #[allow(dead_code)] // Is not called if non-fallback hash is used. + pub(crate) fn new_with_keys(key1: u128, key2: u128) -> AHasher { + let pi: [u128; 2] = PI.convert(); + let key1: [u64; 2] = (key1 ^ pi[0]).convert(); + let key2: [u64; 2] = (key2 ^ pi[1]).convert(); + AHasher { + buffer: key1[0], + pad: key1[1], + extra_keys: key2, + } + } + + #[allow(unused)] // False positive + pub(crate) fn test_with_keys(key1: u128, key2: u128) -> Self { + let key1: [u64; 2] = key1.convert(); + let key2: [u64; 2] = key2.convert(); + Self { + buffer: key1[0], + pad: key1[1], + extra_keys: key2, + } + } + + #[inline] + #[allow(dead_code)] // Is not called if non-fallback hash is used. + pub(crate) fn from_random_state(rand_state: &RandomState) -> AHasher { + AHasher { + buffer: rand_state.k0, + pad: rand_state.k1, + extra_keys: [rand_state.k2, rand_state.k3], + } + } + + /// This update function has the goal of updating the buffer with a single multiply + /// FxHash does this but is vulnerable to attack. To avoid this input needs to be masked to with an + /// unpredictable value. Other hashes such as murmurhash have taken this approach but were found vulnerable + /// to attack. The attack was based on the idea of reversing the pre-mixing (Which is necessarily + /// reversible otherwise bits would be lost) then placing a difference in the highest bit before the + /// multiply used to mix the data. Because a multiply can never affect the bits to the right of it, a + /// subsequent update that also differed in this bit could result in a predictable collision. + /// + /// This version avoids this vulnerability while still only using a single multiply. It takes advantage + /// of the fact that when a 64 bit multiply is performed the upper 64 bits are usually computed and thrown + /// away. Instead it creates two 128 bit values where the upper 64 bits are zeros and multiplies them. + /// (The compiler is smart enough to turn this into a 64 bit multiplication in the assembly) + /// Then the upper bits are xored with the lower bits to produce a single 64 bit result. + /// + /// To understand why this is a good scrambling function it helps to understand multiply-with-carry PRNGs: + /// https://en.wikipedia.org/wiki/Multiply-with-carry_pseudorandom_number_generator + /// If the multiple is chosen well, this creates a long period, decent quality PRNG. + /// Notice that this function is equivalent to this except the `buffer`/`state` is being xored with each + /// new block of data. In the event that data is all zeros, it is exactly equivalent to a MWC PRNG. + /// + /// This is impervious to attack because every bit buffer at the end is dependent on every bit in + /// `new_data ^ buffer`. For example suppose two inputs differed in only the 5th bit. Then when the + /// multiplication is performed the `result` will differ in bits 5-69. More specifically it will differ by + /// 2^5 * MULTIPLE. However in the next step bits 65-128 are turned into a separate 64 bit value. So the + /// differing bits will be in the lower 6 bits of this value. The two intermediate values that differ in + /// bits 5-63 and in bits 0-5 respectively get added together. Producing an output that differs in every + /// bit. The addition carries in the multiplication and at the end additionally mean that the even if an + /// attacker somehow knew part of (but not all) the contents of the buffer before hand, + /// they would not be able to predict any of the bits in the buffer at the end. + #[inline(always)] + fn update(&mut self, new_data: u64) { + self.buffer = folded_multiply(new_data ^ self.buffer, MULTIPLE); + } + + /// Similar to the above this function performs an update using a "folded multiply". + /// However it takes in 128 bits of data instead of 64. Both halves must be masked. + /// + /// This makes it impossible for an attacker to place a single bit difference between + /// two blocks so as to cancel each other. + /// + /// However this is not sufficient. to prevent (a,b) from hashing the same as (b,a) the buffer itself must + /// be updated between calls in a way that does not commute. To achieve this XOR and Rotate are used. + /// Add followed by xor is not the same as xor followed by add, and rotate ensures that the same out bits + /// can't be changed by the same set of input bits. To cancel this sequence with subsequent input would require + /// knowing the keys. + #[inline(always)] + fn large_update(&mut self, new_data: u128) { + let block: [u64; 2] = new_data.convert(); + let combined = folded_multiply(block[0] ^ self.extra_keys[0], block[1] ^ self.extra_keys[1]); + self.buffer = (self.buffer.wrapping_add(self.pad) ^ combined).rotate_left(ROT); + } + + #[inline] + #[cfg(feature = "specialize")] + fn short_finish(&self) -> u64 { + self.buffer.wrapping_add(self.pad) + } +} + +/// Provides [Hasher] methods to hash all of the primitive types. +/// +/// [Hasher]: core::hash::Hasher +impl Hasher for AHasher { + #[inline] + fn write_u8(&mut self, i: u8) { + self.update(i as u64); + } + + #[inline] + fn write_u16(&mut self, i: u16) { + self.update(i as u64); + } + + #[inline] + fn write_u32(&mut self, i: u32) { + self.update(i as u64); + } + + #[inline] + fn write_u64(&mut self, i: u64) { + self.update(i as u64); + } + + #[inline] + fn write_u128(&mut self, i: u128) { + self.large_update(i); + } + + #[inline] + #[cfg(any( + target_pointer_width = "64", + target_pointer_width = "32", + target_pointer_width = "16" + ))] + fn write_usize(&mut self, i: usize) { + self.write_u64(i as u64); + } + + #[inline] + #[cfg(target_pointer_width = "128")] + fn write_usize(&mut self, i: usize) { + self.write_u128(i as u128); + } + + #[inline] + #[allow(clippy::collapsible_if)] + fn write(&mut self, input: &[u8]) { + let mut data = input; + let length = data.len() as u64; + //Needs to be an add rather than an xor because otherwise it could be canceled with carefully formed input. + self.buffer = self.buffer.wrapping_add(length).wrapping_mul(MULTIPLE); + //A 'binary search' on sizes reduces the number of comparisons. + if data.len() > 8 { + if data.len() > 16 { + let tail = data.read_last_u128(); + self.large_update(tail); + while data.len() > 16 { + let (block, rest) = data.read_u128(); + self.large_update(block); + data = rest; + } + } else { + self.large_update([data.read_u64().0, data.read_last_u64()].convert()); + } + } else { + let value = read_small(data); + self.large_update(value.convert()); + } + } + + #[inline] + fn finish(&self) -> u64 { + let rot = (self.buffer & 63) as u32; + folded_multiply(self.buffer, self.pad).rotate_left(rot) + } +} + +#[cfg(feature = "specialize")] +pub(crate) struct AHasherU64 { + pub(crate) buffer: u64, + pub(crate) pad: u64, +} + +/// A specialized hasher for only primitives under 64 bits. +#[cfg(feature = "specialize")] +impl Hasher for AHasherU64 { + #[inline] + fn finish(&self) -> u64 { + let rot = (self.pad & 63) as u32; + self.buffer.rotate_left(rot) + } + + #[inline] + fn write(&mut self, _bytes: &[u8]) { + unreachable!("Specialized hasher was called with a different type of object") + } + + #[inline] + fn write_u8(&mut self, i: u8) { + self.write_u64(i as u64); + } + + #[inline] + fn write_u16(&mut self, i: u16) { + self.write_u64(i as u64); + } + + #[inline] + fn write_u32(&mut self, i: u32) { + self.write_u64(i as u64); + } + + #[inline] + fn write_u64(&mut self, i: u64) { + self.buffer = folded_multiply(i ^ self.buffer, MULTIPLE); + } + + #[inline] + fn write_u128(&mut self, _i: u128) { + unreachable!("Specialized hasher was called with a different type of object") + } + + #[inline] + fn write_usize(&mut self, _i: usize) { + unreachable!("Specialized hasher was called with a different type of object") + } +} + +#[cfg(feature = "specialize")] +pub(crate) struct AHasherFixed(pub AHasher); + +/// A specialized hasher for fixed size primitives larger than 64 bits. +#[cfg(feature = "specialize")] +impl Hasher for AHasherFixed { + #[inline] + fn finish(&self) -> u64 { + self.0.short_finish() + } + + #[inline] + fn write(&mut self, bytes: &[u8]) { + self.0.write(bytes) + } + + #[inline] + fn write_u8(&mut self, i: u8) { + self.write_u64(i as u64); + } + + #[inline] + fn write_u16(&mut self, i: u16) { + self.write_u64(i as u64); + } + + #[inline] + fn write_u32(&mut self, i: u32) { + self.write_u64(i as u64); + } + + #[inline] + fn write_u64(&mut self, i: u64) { + self.0.write_u64(i); + } + + #[inline] + fn write_u128(&mut self, i: u128) { + self.0.write_u128(i); + } + + #[inline] + fn write_usize(&mut self, i: usize) { + self.0.write_usize(i); + } +} + +#[cfg(feature = "specialize")] +pub(crate) struct AHasherStr(pub AHasher); + +/// A specialized hasher for a single string +/// Note that the other types don't panic because the hash impl for String tacks on an unneeded call. (As does vec) +#[cfg(feature = "specialize")] +impl Hasher for AHasherStr { + #[inline] + fn finish(&self) -> u64 { + self.0.finish() + } + + #[inline] + fn write(&mut self, bytes: &[u8]) { + if bytes.len() > 8 { + self.0.write(bytes) + } else { + let value = read_small(bytes); + self.0.buffer = folded_multiply(value[0] ^ self.0.buffer, value[1] ^ self.0.extra_keys[1]); + self.0.pad = self.0.pad.wrapping_add(bytes.len() as u64); + } + } + + #[inline] + fn write_u8(&mut self, _i: u8) {} + + #[inline] + fn write_u16(&mut self, _i: u16) {} + + #[inline] + fn write_u32(&mut self, _i: u32) {} + + #[inline] + fn write_u64(&mut self, _i: u64) {} + + #[inline] + fn write_u128(&mut self, _i: u128) {} + + #[inline] + fn write_usize(&mut self, _i: usize) {} +} + +#[cfg(test)] +mod tests { + use crate::convert::Convert; + use crate::fallback_hash::*; + + #[test] + fn test_hash() { + let mut hasher = AHasher::new_with_keys(0, 0); + let value: u64 = 1 << 32; + hasher.update(value); + let result = hasher.buffer; + let mut hasher = AHasher::new_with_keys(0, 0); + let value2: u64 = 1; + hasher.update(value2); + let result2 = hasher.buffer; + let result: [u8; 8] = result.convert(); + let result2: [u8; 8] = result2.convert(); + assert_ne!(hex::encode(result), hex::encode(result2)); + } + + #[test] + fn test_conversion() { + let input: &[u8] = "dddddddd".as_bytes(); + let bytes: u64 = as_array!(input, 8).convert(); + assert_eq!(bytes, 0x6464646464646464); + } +} diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/src/hash_map.rs b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/src/hash_map.rs new file mode 100644 index 0000000..2b6fbdc --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/src/hash_map.rs @@ -0,0 +1,501 @@ +use std::borrow::Borrow; +use std::collections::hash_map::{IntoKeys, IntoValues}; +use std::collections::{hash_map, HashMap}; +use std::fmt::{self, Debug}; +use std::hash::{BuildHasher, Hash}; +use std::iter::FromIterator; +use std::ops::{Deref, DerefMut, Index}; +use std::panic::UnwindSafe; + +#[cfg(feature = "serde")] +use serde::{ + de::{Deserialize, Deserializer}, + ser::{Serialize, Serializer}, +}; + +use crate::RandomState; + +/// A [`HashMap`](std::collections::HashMap) using [`RandomState`](crate::RandomState) to hash the items. +/// (Requires the `std` feature to be enabled.) +#[derive(Clone)] +pub struct AHashMap(HashMap); + +impl From> for AHashMap { + fn from(item: HashMap) -> Self { + AHashMap(item) + } +} + +impl From<[(K, V); N]> for AHashMap +where + K: Eq + Hash, +{ + /// # Examples + /// + /// ``` + /// use ahash::AHashMap; + /// + /// let map1 = AHashMap::from([(1, 2), (3, 4)]); + /// let map2: AHashMap<_, _> = [(1, 2), (3, 4)].into(); + /// assert_eq!(map1, map2); + /// ``` + fn from(arr: [(K, V); N]) -> Self { + Self::from_iter(arr) + } +} + +impl Into> for AHashMap { + fn into(self) -> HashMap { + self.0 + } +} + +impl AHashMap { + /// This crates a hashmap using [RandomState::new] which obtains its keys from [RandomSource]. + /// See the documentation in [RandomSource] for notes about key strength. + pub fn new() -> Self { + AHashMap(HashMap::with_hasher(RandomState::new())) + } + + /// This crates a hashmap with the specified capacity using [RandomState::new]. + /// See the documentation in [RandomSource] for notes about key strength. + pub fn with_capacity(capacity: usize) -> Self { + AHashMap(HashMap::with_capacity_and_hasher(capacity, RandomState::new())) + } +} + +impl AHashMap +where + S: BuildHasher, +{ + pub fn with_hasher(hash_builder: S) -> Self { + AHashMap(HashMap::with_hasher(hash_builder)) + } + + pub fn with_capacity_and_hasher(capacity: usize, hash_builder: S) -> Self { + AHashMap(HashMap::with_capacity_and_hasher(capacity, hash_builder)) + } +} + +impl AHashMap +where + K: Hash + Eq, + S: BuildHasher, +{ + /// Returns a reference to the value corresponding to the key. + /// + /// The key may be any borrowed form of the map's key type, but + /// [`Hash`] and [`Eq`] on the borrowed form *must* match those for + /// the key type. + /// + /// # Examples + /// + /// ``` + /// use std::collections::HashMap; + /// + /// let mut map = HashMap::new(); + /// map.insert(1, "a"); + /// assert_eq!(map.get(&1), Some(&"a")); + /// assert_eq!(map.get(&2), None); + /// ``` + #[inline] + pub fn get(&self, k: &Q) -> Option<&V> + where + K: Borrow, + Q: Hash + Eq, + { + self.0.get(k) + } + + /// Returns the key-value pair corresponding to the supplied key. + /// + /// The supplied key may be any borrowed form of the map's key type, but + /// [`Hash`] and [`Eq`] on the borrowed form *must* match those for + /// the key type. + /// + /// # Examples + /// + /// ``` + /// use std::collections::HashMap; + /// + /// let mut map = HashMap::new(); + /// map.insert(1, "a"); + /// assert_eq!(map.get_key_value(&1), Some((&1, &"a"))); + /// assert_eq!(map.get_key_value(&2), None); + /// ``` + #[inline] + pub fn get_key_value(&self, k: &Q) -> Option<(&K, &V)> + where + K: Borrow, + Q: Hash + Eq, + { + self.0.get_key_value(k) + } + + /// Returns a mutable reference to the value corresponding to the key. + /// + /// The key may be any borrowed form of the map's key type, but + /// [`Hash`] and [`Eq`] on the borrowed form *must* match those for + /// the key type. + /// + /// # Examples + /// + /// ``` + /// use std::collections::HashMap; + /// + /// let mut map = HashMap::new(); + /// map.insert(1, "a"); + /// if let Some(x) = map.get_mut(&1) { + /// *x = "b"; + /// } + /// assert_eq!(map[&1], "b"); + /// ``` + #[inline] + pub fn get_mut(&mut self, k: &Q) -> Option<&mut V> + where + K: Borrow, + Q: Hash + Eq, + { + self.0.get_mut(k) + } + + /// Inserts a key-value pair into the map. + /// + /// If the map did not have this key present, [`None`] is returned. + /// + /// If the map did have this key present, the value is updated, and the old + /// value is returned. The key is not updated, though; this matters for + /// types that can be `==` without being identical. See the [module-level + /// documentation] for more. + /// + /// # Examples + /// + /// ``` + /// use std::collections::HashMap; + /// + /// let mut map = HashMap::new(); + /// assert_eq!(map.insert(37, "a"), None); + /// assert_eq!(map.is_empty(), false); + /// + /// map.insert(37, "b"); + /// assert_eq!(map.insert(37, "c"), Some("b")); + /// assert_eq!(map[&37], "c"); + /// ``` + #[inline] + pub fn insert(&mut self, k: K, v: V) -> Option { + self.0.insert(k, v) + } + + /// Creates a consuming iterator visiting all the keys in arbitrary order. + /// The map cannot be used after calling this. + /// The iterator element type is `K`. + /// + /// # Examples + /// + /// ``` + /// use std::collections::HashMap; + /// + /// let map = HashMap::from([ + /// ("a", 1), + /// ("b", 2), + /// ("c", 3), + /// ]); + /// + /// let mut vec: Vec<&str> = map.into_keys().collect(); + /// // The `IntoKeys` iterator produces keys in arbitrary order, so the + /// // keys must be sorted to test them against a sorted array. + /// vec.sort_unstable(); + /// assert_eq!(vec, ["a", "b", "c"]); + /// ``` + /// + /// # Performance + /// + /// In the current implementation, iterating over keys takes O(capacity) time + /// instead of O(len) because it internally visits empty buckets too. + #[inline] + pub fn into_keys(self) -> IntoKeys { + self.0.into_keys() + } + + /// Creates a consuming iterator visiting all the values in arbitrary order. + /// The map cannot be used after calling this. + /// The iterator element type is `V`. + /// + /// # Examples + /// + /// ``` + /// use std::collections::HashMap; + /// + /// let map = HashMap::from([ + /// ("a", 1), + /// ("b", 2), + /// ("c", 3), + /// ]); + /// + /// let mut vec: Vec = map.into_values().collect(); + /// // The `IntoValues` iterator produces values in arbitrary order, so + /// // the values must be sorted to test them against a sorted array. + /// vec.sort_unstable(); + /// assert_eq!(vec, [1, 2, 3]); + /// ``` + /// + /// # Performance + /// + /// In the current implementation, iterating over values takes O(capacity) time + /// instead of O(len) because it internally visits empty buckets too. + #[inline] + pub fn into_values(self) -> IntoValues { + self.0.into_values() + } + + /// Removes a key from the map, returning the value at the key if the key + /// was previously in the map. + /// + /// The key may be any borrowed form of the map's key type, but + /// [`Hash`] and [`Eq`] on the borrowed form *must* match those for + /// the key type. + /// + /// # Examples + /// + /// ``` + /// use std::collections::HashMap; + /// + /// let mut map = HashMap::new(); + /// map.insert(1, "a"); + /// assert_eq!(map.remove(&1), Some("a")); + /// assert_eq!(map.remove(&1), None); + /// ``` + #[inline] + pub fn remove(&mut self, k: &Q) -> Option + where + K: Borrow, + Q: Hash + Eq, + { + self.0.remove(k) + } +} + +impl Deref for AHashMap { + type Target = HashMap; + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +impl DerefMut for AHashMap { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.0 + } +} + +impl UnwindSafe for AHashMap +where + K: UnwindSafe, + V: UnwindSafe, +{ +} + +impl PartialEq for AHashMap +where + K: Eq + Hash, + V: PartialEq, + S: BuildHasher, +{ + fn eq(&self, other: &AHashMap) -> bool { + self.0.eq(&other.0) + } +} + +impl Eq for AHashMap +where + K: Eq + Hash, + V: Eq, + S: BuildHasher, +{ +} + +impl Index<&Q> for AHashMap +where + K: Eq + Hash + Borrow, + Q: Eq + Hash, + S: BuildHasher, +{ + type Output = V; + + /// Returns a reference to the value corresponding to the supplied key. + /// + /// # Panics + /// + /// Panics if the key is not present in the `HashMap`. + #[inline] + fn index(&self, key: &Q) -> &V { + self.0.index(key) + } +} + +impl Debug for AHashMap +where + K: Debug, + V: Debug, + S: BuildHasher, +{ + fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { + self.0.fmt(fmt) + } +} + +impl FromIterator<(K, V)> for AHashMap +where + K: Eq + Hash, +{ + /// This crates a hashmap from the provided iterator using [RandomState::new]. + /// See the documentation in [RandomSource] for notes about key strength. + fn from_iter>(iter: T) -> Self { + let mut inner = HashMap::with_hasher(RandomState::new()); + inner.extend(iter); + AHashMap(inner) + } +} + +impl<'a, K, V, S> IntoIterator for &'a AHashMap { + type Item = (&'a K, &'a V); + type IntoIter = hash_map::Iter<'a, K, V>; + fn into_iter(self) -> Self::IntoIter { + (&self.0).iter() + } +} + +impl<'a, K, V, S> IntoIterator for &'a mut AHashMap { + type Item = (&'a K, &'a mut V); + type IntoIter = hash_map::IterMut<'a, K, V>; + fn into_iter(self) -> Self::IntoIter { + (&mut self.0).iter_mut() + } +} + +impl IntoIterator for AHashMap { + type Item = (K, V); + type IntoIter = hash_map::IntoIter; + fn into_iter(self) -> Self::IntoIter { + self.0.into_iter() + } +} + +impl Extend<(K, V)> for AHashMap +where + K: Eq + Hash, + S: BuildHasher, +{ + #[inline] + fn extend>(&mut self, iter: T) { + self.0.extend(iter) + } +} + +impl<'a, K, V, S> Extend<(&'a K, &'a V)> for AHashMap +where + K: Eq + Hash + Copy + 'a, + V: Copy + 'a, + S: BuildHasher, +{ + #[inline] + fn extend>(&mut self, iter: T) { + self.0.extend(iter) + } +} + +/// NOTE: For safety this trait impl is only available available if either of the flags `runtime-rng` (on by default) or +/// `compile-time-rng` are enabled. This is to prevent weakly keyed maps from being accidentally created. Instead one of +/// constructors for [RandomState] must be used. +#[cfg(any(feature = "compile-time-rng", feature = "runtime-rng", feature = "no-rng"))] +impl Default for AHashMap { + #[inline] + fn default() -> AHashMap { + AHashMap(HashMap::default()) + } +} + +#[cfg(feature = "serde")] +impl Serialize for AHashMap +where + K: Serialize + Eq + Hash, + V: Serialize, +{ + fn serialize(&self, serializer: S) -> Result { + self.deref().serialize(serializer) + } +} + +#[cfg(feature = "serde")] +impl<'de, K, V> Deserialize<'de> for AHashMap +where + K: Deserialize<'de> + Eq + Hash, + V: Deserialize<'de>, +{ + fn deserialize>(deserializer: D) -> Result { + let hash_map = HashMap::deserialize(deserializer); + hash_map.map(|hash_map| Self(hash_map)) + } + + fn deserialize_in_place>(deserializer: D, place: &mut Self) -> Result<(), D::Error> { + use serde::de::{MapAccess, Visitor}; + + struct MapInPlaceVisitor<'a, K: 'a, V: 'a>(&'a mut AHashMap); + + impl<'a, 'de, K, V> Visitor<'de> for MapInPlaceVisitor<'a, K, V> + where + K: Deserialize<'de> + Eq + Hash, + V: Deserialize<'de>, + { + type Value = (); + + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + formatter.write_str("a map") + } + + fn visit_map(self, mut map: A) -> Result + where + A: MapAccess<'de>, + { + self.0.clear(); + self.0.reserve(map.size_hint().unwrap_or(0).min(4096)); + + while let Some((key, value)) = map.next_entry()? { + self.0.insert(key, value); + } + + Ok(()) + } + } + + deserializer.deserialize_map(MapInPlaceVisitor(place)) + } +} + +#[cfg(test)] +mod test { + use super::*; + #[test] + fn test_borrow() { + let mut map: AHashMap = AHashMap::new(); + map.insert("foo".to_string(), "Bar".to_string()); + map.insert("Bar".to_string(), map.get("foo").unwrap().to_owned()); + } + + #[cfg(feature = "serde")] + #[test] + fn test_serde() { + let mut map = AHashMap::new(); + map.insert("for".to_string(), 0); + map.insert("bar".to_string(), 1); + let mut serialization = serde_json::to_string(&map).unwrap(); + let mut deserialization: AHashMap = serde_json::from_str(&serialization).unwrap(); + assert_eq!(deserialization, map); + + map.insert("baz".to_string(), 2); + serialization = serde_json::to_string(&map).unwrap(); + let mut deserializer = serde_json::Deserializer::from_str(&serialization); + AHashMap::deserialize_in_place(&mut deserializer, &mut deserialization).unwrap(); + assert_eq!(deserialization, map); + } +} diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/src/hash_quality_test.rs b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/src/hash_quality_test.rs new file mode 100644 index 0000000..25356e4 --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/src/hash_quality_test.rs @@ -0,0 +1,534 @@ +use core::hash::{Hash, Hasher}; +use std::collections::{HashMap}; + +fn assert_sufficiently_different(a: u64, b: u64, tolerance: i32) { + let (same_byte_count, same_nibble_count) = count_same_bytes_and_nibbles(a, b); + assert!(same_byte_count <= tolerance, "{:x} vs {:x}: {:}", a, b, same_byte_count); + assert!( + same_nibble_count <= tolerance * 3, + "{:x} vs {:x}: {:}", + a, + b, + same_nibble_count + ); + let flipped_bits = (a ^ b).count_ones(); + assert!( + flipped_bits > 12 && flipped_bits < 52, + "{:x} and {:x}: {:}", + a, + b, + flipped_bits + ); + for rotate in 0..64 { + let flipped_bits2 = (a ^ (b.rotate_left(rotate))).count_ones(); + assert!( + flipped_bits2 > 10 && flipped_bits2 < 54, + "{:x} and {:x}: {:}", + a, + b.rotate_left(rotate), + flipped_bits2 + ); + } +} + +fn count_same_bytes_and_nibbles(a: u64, b: u64) -> (i32, i32) { + let mut same_byte_count = 0; + let mut same_nibble_count = 0; + for byte in 0..8 { + let ba = (a >> (8 * byte)) as u8; + let bb = (b >> (8 * byte)) as u8; + if ba == bb { + same_byte_count += 1; + } + if ba & 0xF0u8 == bb & 0xF0u8 { + same_nibble_count += 1; + } + if ba & 0x0Fu8 == bb & 0x0Fu8 { + same_nibble_count += 1; + } + } + (same_byte_count, same_nibble_count) +} + +fn gen_combinations(options: &[u32; 11], depth: u32, so_far: Vec, combinations: &mut Vec>) { + if depth == 0 { + return; + } + for option in options { + let mut next = so_far.clone(); + next.push(*option); + combinations.push(next.clone()); + gen_combinations(options, depth - 1, next, combinations); + } +} + +fn test_no_full_collisions(gen_hash: impl Fn() -> T) { + let options: [u32; 11] = [ + 0x00000000, 0x10000000, 0x20000000, 0x40000000, 0x80000000, 0xF0000000, + 1, 2, 4, 8, 15 + ]; + let mut combinations = Vec::new(); + gen_combinations(&options, 7, Vec::new(), &mut combinations); + let mut map: HashMap> = HashMap::new(); + for combination in combinations { + use zerocopy::AsBytes; + let array = combination.as_slice().as_bytes().to_vec(); + let mut hasher = gen_hash(); + hasher.write(&array); + let hash = hasher.finish(); + if let Some(value) = map.get(&hash) { + assert_eq!( + value, &array, + "Found a collision between {:x?} and {:x?}. Hash: {:x?}", + value, &array, &hash + ); + } else { + map.insert(hash, array); + } + } + assert_eq!(21435887, map.len()); //11^7 + 11^6 ... +} + +fn test_keys_change_output(constructor: impl Fn(u128, u128) -> T) { + let mut a = constructor(1, 1); + let mut b = constructor(1, 2); + let mut c = constructor(2, 1); + let mut d = constructor(2, 2); + "test".hash(&mut a); + "test".hash(&mut b); + "test".hash(&mut c); + "test".hash(&mut d); + assert_sufficiently_different(a.finish(), b.finish(), 1); + assert_sufficiently_different(a.finish(), c.finish(), 1); + assert_sufficiently_different(a.finish(), d.finish(), 1); + assert_sufficiently_different(b.finish(), c.finish(), 1); + assert_sufficiently_different(b.finish(), d.finish(), 1); + assert_sufficiently_different(c.finish(), d.finish(), 1); +} + +fn test_input_affect_every_byte(constructor: impl Fn(u128, u128) -> T) { + let base = hash_with(&0, constructor(0, 0)); + for shift in 0..16 { + let mut alternitives = vec![]; + for v in 0..256 { + let input = (v as u128) << (shift * 8); + let hasher = constructor(0, 0); + alternitives.push(hash_with(&input, hasher)); + } + assert_each_byte_differs(shift, base, alternitives); + } +} + +///Ensures that for every bit in the output there is some value for each byte in the key that flips it. +fn test_keys_affect_every_byte(item: H, constructor: impl Fn(u128, u128) -> T) { + let base = hash_with(&item, constructor(0, 0)); + for shift in 0..16 { + let mut alternitives1 = vec![]; + let mut alternitives2 = vec![]; + for v in 0..256 { + let input = (v as u128) << (shift * 8); + let hasher1 = constructor(input, 0); + let hasher2 = constructor(0, input); + let h1 = hash_with(&item, hasher1); + let h2 = hash_with(&item, hasher2); + alternitives1.push(h1); + alternitives2.push(h2); + } + assert_each_byte_differs(shift, base, alternitives1); + assert_each_byte_differs(shift, base, alternitives2); + } +} + +fn assert_each_byte_differs(num: u64, base: u64, alternitives: Vec) { + let mut changed_bits = 0_u64; + for alternitive in alternitives { + changed_bits |= base ^ alternitive + } + assert_eq!( + core::u64::MAX, + changed_bits, + "Bits changed: {:x} on num: {:?}. base {:x}", + changed_bits, + num, + base + ); +} + +fn test_finish_is_consistent(constructor: impl Fn(u128, u128) -> T) { + let mut hasher = constructor(1, 2); + "Foo".hash(&mut hasher); + let a = hasher.finish(); + let b = hasher.finish(); + assert_eq!(a, b); +} + +fn test_single_key_bit_flip(constructor: impl Fn(u128, u128) -> T) { + for bit in 0..128 { + let mut a = constructor(0, 0); + let mut b = constructor(0, 1 << bit); + let mut c = constructor(1 << bit, 0); + "1234".hash(&mut a); + "1234".hash(&mut b); + "1234".hash(&mut c); + assert_sufficiently_different(a.finish(), b.finish(), 2); + assert_sufficiently_different(a.finish(), c.finish(), 2); + assert_sufficiently_different(b.finish(), c.finish(), 2); + let mut a = constructor(0, 0); + let mut b = constructor(0, 1 << bit); + let mut c = constructor(1 << bit, 0); + "12345678".hash(&mut a); + "12345678".hash(&mut b); + "12345678".hash(&mut c); + assert_sufficiently_different(a.finish(), b.finish(), 2); + assert_sufficiently_different(a.finish(), c.finish(), 2); + assert_sufficiently_different(b.finish(), c.finish(), 2); + let mut a = constructor(0, 0); + let mut b = constructor(0, 1 << bit); + let mut c = constructor(1 << bit, 0); + "1234567812345678".hash(&mut a); + "1234567812345678".hash(&mut b); + "1234567812345678".hash(&mut c); + assert_sufficiently_different(a.finish(), b.finish(), 2); + assert_sufficiently_different(a.finish(), c.finish(), 2); + assert_sufficiently_different(b.finish(), c.finish(), 2); + } +} + +fn test_all_bytes_matter(hasher: impl Fn() -> T) { + let mut item = vec![0; 256]; + let base_hash = hash(&item, &hasher); + for pos in 0..256 { + item[pos] = 255; + let hash = hash(&item, &hasher); + assert_ne!(base_hash, hash, "Position {} did not affect output", pos); + item[pos] = 0; + } +} + +fn test_no_pair_collisions(hasher: impl Fn() -> T) { + let base = [0_u64, 0_u64]; + let base_hash = hash(&base, &hasher); + for bitpos1 in 0..64 { + let a = 1_u64 << bitpos1; + for bitpos2 in 0..bitpos1 { + let b = 1_u64 << bitpos2; + let aa = hash(&[a, a], &hasher); + let ab = hash(&[a, b], &hasher); + let ba = hash(&[b, a], &hasher); + let bb = hash(&[b, b], &hasher); + assert_sufficiently_different(base_hash, aa, 3); + assert_sufficiently_different(base_hash, ab, 3); + assert_sufficiently_different(base_hash, ba, 3); + assert_sufficiently_different(base_hash, bb, 3); + assert_sufficiently_different(aa, ab, 3); + assert_sufficiently_different(ab, ba, 3); + assert_sufficiently_different(ba, bb, 3); + assert_sufficiently_different(aa, ba, 3); + assert_sufficiently_different(ab, bb, 3); + assert_sufficiently_different(aa, bb, 3); + } + } +} + +fn hash(b: &H, hash_builder: &dyn Fn() -> T) -> u64 { + let mut hasher = hash_builder(); + b.hash(&mut hasher); + hasher.finish() +} + +fn hash_with(b: &H, mut hasher: T) -> u64 { + b.hash(&mut hasher); + hasher.finish() +} + +fn test_single_bit_flip(hasher: impl Fn() -> T) { + let size = 32; + let compare_value = hash(&0u32, &hasher); + for pos in 0..size { + let test_value = hash(&(1u32 << pos), &hasher); + assert_sufficiently_different(compare_value, test_value, 2); + } + let size = 64; + let compare_value = hash(&0u64, &hasher); + for pos in 0..size { + let test_value = hash(&(1u64 << pos), &hasher); + assert_sufficiently_different(compare_value, test_value, 2); + } + let size = 128; + let compare_value = hash(&0u128, &hasher); + for pos in 0..size { + let test_value = hash(&(1u128 << pos), &hasher); + dbg!(compare_value, test_value); + assert_sufficiently_different(compare_value, test_value, 2); + } +} + +fn test_padding_doesnot_collide(hasher: impl Fn() -> T) { + for c in 0..128u8 { + for string in ["", "\0", "\x01", "1234", "12345678", "1234567812345678"].iter() { + let mut short = hasher(); + string.hash(&mut short); + let value = short.finish(); + let mut padded = string.to_string(); + for num in 1..=128 { + let mut long = hasher(); + padded.push(c as char); + padded.hash(&mut long); + let (same_bytes, same_nibbles) = count_same_bytes_and_nibbles(value, long.finish()); + assert!( + same_bytes <= 3, + "{} bytes of {} -> {:x} vs {:x}", + num, + c, + value, + long.finish() + ); + assert!( + same_nibbles <= 8, + "{} bytes of {} -> {:x} vs {:x}", + num, + c, + value, + long.finish() + ); + let flipped_bits = (value ^ long.finish()).count_ones(); + assert!(flipped_bits > 10); + } + if string.len() > 0 { + let mut padded = string[1..].to_string(); + padded.push(c as char); + for num in 2..=128 { + let mut long = hasher(); + padded.push(c as char); + padded.hash(&mut long); + let (same_bytes, same_nibbles) = count_same_bytes_and_nibbles(value, long.finish()); + assert!( + same_bytes <= 3, + "string {:?} + {} bytes of {} -> {:x} vs {:x}", + string, + num, + c, + value, + long.finish() + ); + assert!( + same_nibbles <= 8, + "string {:?} + {} bytes of {} -> {:x} vs {:x}", + string, + num, + c, + value, + long.finish() + ); + let flipped_bits = (value ^ long.finish()).count_ones(); + assert!(flipped_bits > 10); + } + } + } + } +} + +fn test_length_extension(hasher: impl Fn(u128, u128) -> T) { + for key in 0..256 { + let h1 = hasher(key, key); + let v1 = hash_with(&[0_u8, 0, 0, 0, 0, 0, 0, 0], h1); + let h2 = hasher(key, key); + let v2 = hash_with(&[1_u8, 0, 0, 0, 0, 0, 0, 0, 0], h2); + assert_ne!(v1, v2); + } +} + +fn test_sparse(hasher: impl Fn() -> T) { + let mut buf = [0u8; 256]; + let mut hashes = HashMap::new(); + for idx_1 in 0..256 { + for idx_2 in idx_1+1..256 { + for value_1 in [1, 2, 4, 8, 16, 32, 64, 128] { + for value_2 in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 15, 16, 17, 18, 20, 24, 31, 32, 33, 48, 64, 96, 127, 128, 129, 192, 254, 255] { + buf[idx_1] = value_1; + buf[idx_2] = value_2; + let hash_value = hash_with(&buf, &mut hasher()); + let keys = hashes.entry(hash_value).or_insert(Vec::new()); + keys.push((idx_1, value_1, idx_2, value_2)); + buf[idx_1] = 0; + buf[idx_2] = 0; + } + } + } + } + hashes.retain(|_key, value| value.len() != 1); + assert_eq!(0, hashes.len(), "Collision with: {:?}", hashes); +} + +#[cfg(test)] +mod fallback_tests { + use crate::fallback_hash::*; + use crate::hash_quality_test::*; + + #[test] + fn fallback_single_bit_flip() { + test_single_bit_flip(|| AHasher::new_with_keys(0, 0)) + } + + #[test] + fn fallback_single_key_bit_flip() { + test_single_key_bit_flip(AHasher::new_with_keys) + } + + #[test] + fn fallback_all_bytes_matter() { + test_all_bytes_matter(|| AHasher::new_with_keys(0, 0)); + } + + #[test] + fn fallback_test_no_pair_collisions() { + test_no_pair_collisions(|| AHasher::new_with_keys(0, 0)); + } + + #[test] + fn fallback_test_no_full_collisions() { + test_no_full_collisions(|| AHasher::new_with_keys(0, 0)); + } + + #[test] + fn fallback_keys_change_output() { + test_keys_change_output(AHasher::new_with_keys); + } + + #[test] + fn fallback_input_affect_every_byte() { + test_input_affect_every_byte(AHasher::new_with_keys); + } + + #[test] + fn fallback_keys_affect_every_byte() { + //For fallback second key is not used in every hash. + #[cfg(all(not(feature = "specialize"), feature = "folded_multiply"))] + test_keys_affect_every_byte(0, |a, b| AHasher::new_with_keys(a ^ b, a)); + test_keys_affect_every_byte("", |a, b| AHasher::new_with_keys(a ^ b, a)); + test_keys_affect_every_byte((0, 0), |a, b| AHasher::new_with_keys(a ^ b, a)); + } + + #[test] + fn fallback_finish_is_consistant() { + test_finish_is_consistent(AHasher::test_with_keys) + } + + #[test] + fn fallback_padding_doesnot_collide() { + test_padding_doesnot_collide(|| AHasher::new_with_keys(0, 0)); + test_padding_doesnot_collide(|| AHasher::new_with_keys(0, 2)); + test_padding_doesnot_collide(|| AHasher::new_with_keys(2, 0)); + test_padding_doesnot_collide(|| AHasher::new_with_keys(2, 2)); + } + + #[test] + fn fallback_length_extension() { + test_length_extension(|a, b| AHasher::new_with_keys(a, b)); + } + + #[test] + fn test_no_sparse_collisions() { + test_sparse(|| AHasher::new_with_keys(0, 0)); + test_sparse(|| AHasher::new_with_keys(1, 2)); + } +} + +///Basic sanity tests of the cypto properties of aHash. +#[cfg(any( + all(any(target_arch = "x86", target_arch = "x86_64"), target_feature = "aes", not(miri)), + all( + any(target_arch = "arm", target_arch = "aarch64"), + any(target_feature = "aes", target_feature = "crypto"), + not(miri), + feature = "stdsimd" + ) +))] +#[cfg(test)] +mod aes_tests { + use crate::aes_hash::*; + use crate::hash_quality_test::*; + use std::hash::{Hash, Hasher}; + + //This encrypts to 0. + const BAD_KEY2: u128 = 0x6363_6363_6363_6363_6363_6363_6363_6363; + //This decrypts to 0. + const BAD_KEY: u128 = 0x5252_5252_5252_5252_5252_5252_5252_5252; + + #[test] + fn test_single_bit_in_byte() { + let mut hasher1 = AHasher::test_with_keys(0, 0); + 8_u32.hash(&mut hasher1); + let mut hasher2 = AHasher::test_with_keys(0, 0); + 0_u32.hash(&mut hasher2); + assert_sufficiently_different(hasher1.finish(), hasher2.finish(), 1); + } + + #[test] + fn aes_single_bit_flip() { + test_single_bit_flip(|| AHasher::test_with_keys(BAD_KEY, BAD_KEY)); + test_single_bit_flip(|| AHasher::test_with_keys(BAD_KEY2, BAD_KEY2)); + } + + #[test] + fn aes_single_key_bit_flip() { + test_single_key_bit_flip(AHasher::test_with_keys) + } + + #[test] + fn aes_all_bytes_matter() { + test_all_bytes_matter(|| AHasher::test_with_keys(BAD_KEY, BAD_KEY)); + test_all_bytes_matter(|| AHasher::test_with_keys(BAD_KEY2, BAD_KEY2)); + } + + #[test] + fn aes_test_no_pair_collisions() { + test_no_pair_collisions(|| AHasher::test_with_keys(BAD_KEY, BAD_KEY)); + test_no_pair_collisions(|| AHasher::test_with_keys(BAD_KEY2, BAD_KEY2)); + } + + #[test] + fn ase_test_no_full_collisions() { + test_no_full_collisions(|| AHasher::test_with_keys(12345, 67890)); + } + + #[test] + fn aes_keys_change_output() { + test_keys_change_output(AHasher::test_with_keys); + } + + #[test] + fn aes_input_affect_every_byte() { + test_input_affect_every_byte(AHasher::test_with_keys); + } + + #[test] + fn aes_keys_affect_every_byte() { + #[cfg(not(feature = "specialize"))] + test_keys_affect_every_byte(0, AHasher::test_with_keys); + test_keys_affect_every_byte("", AHasher::test_with_keys); + test_keys_affect_every_byte((0, 0), AHasher::test_with_keys); + } + + #[test] + fn aes_finish_is_consistant() { + test_finish_is_consistent(AHasher::test_with_keys) + } + + #[test] + fn aes_padding_doesnot_collide() { + test_padding_doesnot_collide(|| AHasher::test_with_keys(BAD_KEY, BAD_KEY)); + test_padding_doesnot_collide(|| AHasher::test_with_keys(BAD_KEY2, BAD_KEY2)); + } + + #[test] + fn aes_length_extension() { + test_length_extension(|a, b| AHasher::test_with_keys(a, b)); + } + + #[test] + fn aes_no_sparse_collisions() { + test_sparse(|| AHasher::test_with_keys(0, 0)); + test_sparse(|| AHasher::test_with_keys(1, 2)); + } +} diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/src/hash_set.rs b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/src/hash_set.rs new file mode 100644 index 0000000..d03bef5 --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/src/hash_set.rs @@ -0,0 +1,352 @@ +use crate::RandomState; +use std::collections::{hash_set, HashSet}; +use std::fmt::{self, Debug}; +use std::hash::{BuildHasher, Hash}; +use std::iter::FromIterator; +use std::ops::{BitAnd, BitOr, BitXor, Deref, DerefMut, Sub}; + +#[cfg(feature = "serde")] +use serde::{ + de::{Deserialize, Deserializer}, + ser::{Serialize, Serializer}, +}; + +/// A [`HashSet`](std::collections::HashSet) using [`RandomState`](crate::RandomState) to hash the items. +/// (Requires the `std` feature to be enabled.) +#[derive(Clone)] +pub struct AHashSet(HashSet); + +impl From> for AHashSet { + fn from(item: HashSet) -> Self { + AHashSet(item) + } +} + +impl From<[T; N]> for AHashSet +where + T: Eq + Hash, +{ + /// # Examples + /// + /// ``` + /// use ahash::AHashSet; + /// + /// let set1 = AHashSet::from([1, 2, 3, 4]); + /// let set2: AHashSet<_> = [1, 2, 3, 4].into(); + /// assert_eq!(set1, set2); + /// ``` + fn from(arr: [T; N]) -> Self { + Self::from_iter(arr) + } +} + +impl Into> for AHashSet { + fn into(self) -> HashSet { + self.0 + } +} + +impl AHashSet { + /// This crates a hashset using [RandomState::new]. + /// See the documentation in [RandomSource] for notes about key strength. + pub fn new() -> Self { + AHashSet(HashSet::with_hasher(RandomState::new())) + } + + /// This crates a hashset with the specified capacity using [RandomState::new]. + /// See the documentation in [RandomSource] for notes about key strength. + pub fn with_capacity(capacity: usize) -> Self { + AHashSet(HashSet::with_capacity_and_hasher(capacity, RandomState::new())) + } +} + +impl AHashSet +where + S: BuildHasher, +{ + pub fn with_hasher(hash_builder: S) -> Self { + AHashSet(HashSet::with_hasher(hash_builder)) + } + + pub fn with_capacity_and_hasher(capacity: usize, hash_builder: S) -> Self { + AHashSet(HashSet::with_capacity_and_hasher(capacity, hash_builder)) + } +} + +impl Deref for AHashSet { + type Target = HashSet; + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +impl DerefMut for AHashSet { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.0 + } +} + +impl PartialEq for AHashSet +where + T: Eq + Hash, + S: BuildHasher, +{ + fn eq(&self, other: &AHashSet) -> bool { + self.0.eq(&other.0) + } +} + +impl Eq for AHashSet +where + T: Eq + Hash, + S: BuildHasher, +{ +} + +impl BitOr<&AHashSet> for &AHashSet +where + T: Eq + Hash + Clone, + S: BuildHasher + Default, +{ + type Output = AHashSet; + + /// Returns the union of `self` and `rhs` as a new `AHashSet`. + /// + /// # Examples + /// + /// ``` + /// use ahash::AHashSet; + /// + /// let a: AHashSet<_> = vec![1, 2, 3].into_iter().collect(); + /// let b: AHashSet<_> = vec![3, 4, 5].into_iter().collect(); + /// + /// let set = &a | &b; + /// + /// let mut i = 0; + /// let expected = [1, 2, 3, 4, 5]; + /// for x in &set { + /// assert!(expected.contains(x)); + /// i += 1; + /// } + /// assert_eq!(i, expected.len()); + /// ``` + fn bitor(self, rhs: &AHashSet) -> AHashSet { + AHashSet(self.0.bitor(&rhs.0)) + } +} + +impl BitAnd<&AHashSet> for &AHashSet +where + T: Eq + Hash + Clone, + S: BuildHasher + Default, +{ + type Output = AHashSet; + + /// Returns the intersection of `self` and `rhs` as a new `AHashSet`. + /// + /// # Examples + /// + /// ``` + /// use ahash::AHashSet; + /// + /// let a: AHashSet<_> = vec![1, 2, 3].into_iter().collect(); + /// let b: AHashSet<_> = vec![2, 3, 4].into_iter().collect(); + /// + /// let set = &a & &b; + /// + /// let mut i = 0; + /// let expected = [2, 3]; + /// for x in &set { + /// assert!(expected.contains(x)); + /// i += 1; + /// } + /// assert_eq!(i, expected.len()); + /// ``` + fn bitand(self, rhs: &AHashSet) -> AHashSet { + AHashSet(self.0.bitand(&rhs.0)) + } +} + +impl BitXor<&AHashSet> for &AHashSet +where + T: Eq + Hash + Clone, + S: BuildHasher + Default, +{ + type Output = AHashSet; + + /// Returns the symmetric difference of `self` and `rhs` as a new `AHashSet`. + /// + /// # Examples + /// + /// ``` + /// use ahash::AHashSet; + /// + /// let a: AHashSet<_> = vec![1, 2, 3].into_iter().collect(); + /// let b: AHashSet<_> = vec![3, 4, 5].into_iter().collect(); + /// + /// let set = &a ^ &b; + /// + /// let mut i = 0; + /// let expected = [1, 2, 4, 5]; + /// for x in &set { + /// assert!(expected.contains(x)); + /// i += 1; + /// } + /// assert_eq!(i, expected.len()); + /// ``` + fn bitxor(self, rhs: &AHashSet) -> AHashSet { + AHashSet(self.0.bitxor(&rhs.0)) + } +} + +impl Sub<&AHashSet> for &AHashSet +where + T: Eq + Hash + Clone, + S: BuildHasher + Default, +{ + type Output = AHashSet; + + /// Returns the difference of `self` and `rhs` as a new `AHashSet`. + /// + /// # Examples + /// + /// ``` + /// use ahash::AHashSet; + /// + /// let a: AHashSet<_> = vec![1, 2, 3].into_iter().collect(); + /// let b: AHashSet<_> = vec![3, 4, 5].into_iter().collect(); + /// + /// let set = &a - &b; + /// + /// let mut i = 0; + /// let expected = [1, 2]; + /// for x in &set { + /// assert!(expected.contains(x)); + /// i += 1; + /// } + /// assert_eq!(i, expected.len()); + /// ``` + fn sub(self, rhs: &AHashSet) -> AHashSet { + AHashSet(self.0.sub(&rhs.0)) + } +} + +impl Debug for AHashSet +where + T: Debug, + S: BuildHasher, +{ + fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { + self.0.fmt(fmt) + } +} + +impl FromIterator for AHashSet +where + T: Eq + Hash, +{ + /// This crates a hashset from the provided iterator using [RandomState::new]. + /// See the documentation in [RandomSource] for notes about key strength. + #[inline] + fn from_iter>(iter: I) -> AHashSet { + let mut inner = HashSet::with_hasher(RandomState::new()); + inner.extend(iter); + AHashSet(inner) + } +} + +impl<'a, T, S> IntoIterator for &'a AHashSet { + type Item = &'a T; + type IntoIter = hash_set::Iter<'a, T>; + fn into_iter(self) -> Self::IntoIter { + (&self.0).iter() + } +} + +impl IntoIterator for AHashSet { + type Item = T; + type IntoIter = hash_set::IntoIter; + fn into_iter(self) -> Self::IntoIter { + self.0.into_iter() + } +} + +impl Extend for AHashSet +where + T: Eq + Hash, + S: BuildHasher, +{ + #[inline] + fn extend>(&mut self, iter: I) { + self.0.extend(iter) + } +} + +impl<'a, T, S> Extend<&'a T> for AHashSet +where + T: 'a + Eq + Hash + Copy, + S: BuildHasher, +{ + #[inline] + fn extend>(&mut self, iter: I) { + self.0.extend(iter) + } +} + +/// NOTE: For safety this trait impl is only available available if either of the flags `runtime-rng` (on by default) or +/// `compile-time-rng` are enabled. This is to prevent weakly keyed maps from being accidentally created. Instead one of +/// constructors for [RandomState] must be used. +#[cfg(any(feature = "compile-time-rng", feature = "runtime-rng", feature = "no-rng"))] +impl Default for AHashSet { + /// Creates an empty `AHashSet` with the `Default` value for the hasher. + #[inline] + fn default() -> AHashSet { + AHashSet(HashSet::default()) + } +} + +#[cfg(feature = "serde")] +impl Serialize for AHashSet +where + T: Serialize + Eq + Hash, +{ + fn serialize(&self, serializer: S) -> Result { + self.deref().serialize(serializer) + } +} + +#[cfg(feature = "serde")] +impl<'de, T> Deserialize<'de> for AHashSet +where + T: Deserialize<'de> + Eq + Hash, +{ + fn deserialize>(deserializer: D) -> Result { + let hash_set = HashSet::deserialize(deserializer); + hash_set.map(|hash_set| Self(hash_set)) + } + + fn deserialize_in_place>(deserializer: D, place: &mut Self) -> Result<(), D::Error> { + HashSet::deserialize_in_place(deserializer, place) + } +} + +#[cfg(all(test, feature = "serde"))] +mod test { + use super::*; + + #[test] + fn test_serde() { + let mut set = AHashSet::new(); + set.insert("for".to_string()); + set.insert("bar".to_string()); + let mut serialization = serde_json::to_string(&set).unwrap(); + let mut deserialization: AHashSet = serde_json::from_str(&serialization).unwrap(); + assert_eq!(deserialization, set); + + set.insert("baz".to_string()); + serialization = serde_json::to_string(&set).unwrap(); + let mut deserializer = serde_json::Deserializer::from_str(&serialization); + AHashSet::deserialize_in_place(&mut deserializer, &mut deserialization).unwrap(); + assert_eq!(deserialization, set); + } +} diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/src/lib.rs b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/src/lib.rs new file mode 100644 index 0000000..0907786 --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/src/lib.rs @@ -0,0 +1,398 @@ +#![allow(warnings)] + +//! AHash is a high performance keyed hash function. +//! +//! It quickly provides a high quality hash where the result is not predictable without knowing the Key. +//! AHash works with `HashMap` to hash keys, but without allowing for the possibility that an malicious user can +//! induce a collision. +//! +//! # How aHash works +//! +//! When it is available aHash uses the hardware AES instructions to provide a keyed hash function. +//! When it is not, aHash falls back on a slightly slower alternative algorithm. +//! +//! Because aHash does not have a fixed standard for its output, it is able to improve over time. +//! But this also means that different computers or computers using different versions of ahash may observe different +//! hash values for the same input. +#![cfg_attr( + all(feature = "std", any(feature = "compile-time-rng", feature = "runtime-rng", feature = "no-rng")), + doc = r##" +# Basic Usage +AHash provides an implementation of the [Hasher] trait. +To construct a HashMap using aHash as its hasher do the following: +``` +use ahash::{AHasher, RandomState}; +use std::collections::HashMap; + +let mut map: HashMap = HashMap::default(); +map.insert(12, 34); +``` + +### Randomness + +The above requires a source of randomness to generate keys for the hashmap. By default this obtained from the OS. +It is also possible to have randomness supplied via the `compile-time-rng` flag, or manually. + +### If randomess is not available + +[AHasher::default()] can be used to hash using fixed keys. This works with +[BuildHasherDefault](std::hash::BuildHasherDefault). For example: + +``` +use std::hash::BuildHasherDefault; +use std::collections::HashMap; +use ahash::AHasher; + +let mut m: HashMap<_, _, BuildHasherDefault> = HashMap::default(); + # m.insert(12, 34); +``` +It is also possible to instantiate [RandomState] directly: + +``` +use ahash::HashMap; +use ahash::RandomState; + +let mut m = HashMap::with_hasher(RandomState::with_seed(42)); + # m.insert(1, 2); +``` +Or for uses besides a hashhmap: +``` +use std::hash::BuildHasher; +use ahash::RandomState; + +let hash_builder = RandomState::with_seed(42); +let hash = hash_builder.hash_one("Some Data"); +``` +There are several constructors for [RandomState] with different ways to supply seeds. + +# Convenience wrappers + +For convenience, both new-type wrappers and type aliases are provided. + +The new type wrappers are called called `AHashMap` and `AHashSet`. +``` +use ahash::AHashMap; + +let mut map: AHashMap = AHashMap::new(); +map.insert(12, 34); +``` +This avoids the need to type "RandomState". (For convience `From`, `Into`, and `Deref` are provided). + +# Aliases + +For even less typing and better interop with existing libraries (such as rayon) which require a `std::collection::HashMap` , +the type aliases [HashMap], [HashSet] are provided. + +``` +use ahash::{HashMap, HashMapExt}; + +let mut map: HashMap = HashMap::new(); +map.insert(12, 34); +``` +Note the import of [HashMapExt]. This is needed for the constructor. + +"## +)] +#![deny(clippy::correctness, clippy::complexity, clippy::perf)] +#![allow(clippy::pedantic, clippy::cast_lossless, clippy::unreadable_literal)] +#![cfg_attr(all(not(test), not(feature = "std")), no_std)] +#![cfg_attr(feature = "specialize", feature(min_specialization))] +#![cfg_attr(feature = "specialize", feature(build_hasher_simple_hash_one))] + +#[macro_use] +mod convert; + +mod fallback_hash; + +cfg_if::cfg_if! { + if #[cfg(any( + all(any(target_arch = "x86", target_arch = "x86_64"), target_feature = "aes", not(miri)), + all(any(target_arch = "arm", target_arch = "aarch64"), + any(target_feature = "aes", target_feature = "crypto"), + not(miri), + feature = "stdsimd") + ))] { + mod aes_hash; + pub use crate::aes_hash::AHasher; + } else { + pub use crate::fallback_hash::AHasher; + } +} + +cfg_if::cfg_if! { + if #[cfg(feature = "std")] { + mod hash_map; + mod hash_set; + + pub use crate::hash_map::AHashMap; + pub use crate::hash_set::AHashSet; + + /// [Hasher]: std::hash::Hasher + /// [HashMap]: std::collections::HashMap + /// Type alias for [HashMap] + pub type HashMap = std::collections::HashMap; + + /// Type alias for [HashSet] + pub type HashSet = std::collections::HashSet; + } +} + +#[cfg(test)] +mod hash_quality_test; + +mod operations; +pub mod random_state; +mod specialize; + +pub use crate::random_state::RandomState; + +use core::hash::BuildHasher; +use core::hash::Hash; +use core::hash::Hasher; + +#[cfg(feature = "std")] +/// A convenience trait that can be used together with the type aliases defined to +/// get access to the `new()` and `with_capacity()` methods for the HashMap type alias. +pub trait HashMapExt { + /// Constructs a new HashMap + fn new() -> Self; + /// Constructs a new HashMap with a given initial capacity + fn with_capacity(capacity: usize) -> Self; +} + +#[cfg(feature = "std")] +/// A convenience trait that can be used together with the type aliases defined to +/// get access to the `new()` and `with_capacity()` methods for the HashSet type aliases. +pub trait HashSetExt { + /// Constructs a new HashSet + fn new() -> Self; + /// Constructs a new HashSet with a given initial capacity + fn with_capacity(capacity: usize) -> Self; +} + +#[cfg(feature = "std")] +impl HashMapExt for std::collections::HashMap +where + S: BuildHasher + Default, +{ + fn new() -> Self { + std::collections::HashMap::with_hasher(S::default()) + } + + fn with_capacity(capacity: usize) -> Self { + std::collections::HashMap::with_capacity_and_hasher(capacity, S::default()) + } +} + +#[cfg(feature = "std")] +impl HashSetExt for std::collections::HashSet +where + S: BuildHasher + Default, +{ + fn new() -> Self { + std::collections::HashSet::with_hasher(S::default()) + } + + fn with_capacity(capacity: usize) -> Self { + std::collections::HashSet::with_capacity_and_hasher(capacity, S::default()) + } +} + +/// Provides a default [Hasher] with fixed keys. +/// This is typically used in conjunction with [BuildHasherDefault] to create +/// [AHasher]s in order to hash the keys of the map. +/// +/// Generally it is preferable to use [RandomState] instead, so that different +/// hashmaps will have different keys. However if fixed keys are desirable this +/// may be used instead. +/// +/// # Example +/// ``` +/// use std::hash::BuildHasherDefault; +/// use ahash::{AHasher, RandomState}; +/// use std::collections::HashMap; +/// +/// let mut map: HashMap> = HashMap::default(); +/// map.insert(12, 34); +/// ``` +/// +/// [BuildHasherDefault]: std::hash::BuildHasherDefault +/// [Hasher]: std::hash::Hasher +/// [HashMap]: std::collections::HashMap +impl Default for AHasher { + /// Constructs a new [AHasher] with fixed keys. + /// If `std` is enabled these will be generated upon first invocation. + /// Otherwise if the `compile-time-rng`feature is enabled these will be generated at compile time. + /// If neither of these features are available, hardcoded constants will be used. + /// + /// Because the values are fixed, different hashers will all hash elements the same way. + /// This could make hash values predictable, if DOS attacks are a concern. If this behaviour is + /// not required, it may be preferable to use [RandomState] instead. + /// + /// # Examples + /// + /// ``` + /// use ahash::AHasher; + /// use std::hash::Hasher; + /// + /// let mut hasher_1 = AHasher::default(); + /// let mut hasher_2 = AHasher::default(); + /// + /// hasher_1.write_u32(1234); + /// hasher_2.write_u32(1234); + /// + /// assert_eq!(hasher_1.finish(), hasher_2.finish()); + /// ``` + #[inline] + fn default() -> AHasher { + RandomState::with_fixed_keys().build_hasher() + } +} + +/// Used for specialization. (Sealed) +pub(crate) trait BuildHasherExt: BuildHasher { + #[doc(hidden)] + fn hash_as_u64(&self, value: &T) -> u64; + + #[doc(hidden)] + fn hash_as_fixed_length(&self, value: &T) -> u64; + + #[doc(hidden)] + fn hash_as_str(&self, value: &T) -> u64; +} + +impl BuildHasherExt for B { + #[inline] + #[cfg(feature = "specialize")] + default fn hash_as_u64(&self, value: &T) -> u64 { + let mut hasher = self.build_hasher(); + value.hash(&mut hasher); + hasher.finish() + } + #[inline] + #[cfg(not(feature = "specialize"))] + fn hash_as_u64(&self, value: &T) -> u64 { + let mut hasher = self.build_hasher(); + value.hash(&mut hasher); + hasher.finish() + } + #[inline] + #[cfg(feature = "specialize")] + default fn hash_as_fixed_length(&self, value: &T) -> u64 { + let mut hasher = self.build_hasher(); + value.hash(&mut hasher); + hasher.finish() + } + #[inline] + #[cfg(not(feature = "specialize"))] + fn hash_as_fixed_length(&self, value: &T) -> u64 { + let mut hasher = self.build_hasher(); + value.hash(&mut hasher); + hasher.finish() + } + #[inline] + #[cfg(feature = "specialize")] + default fn hash_as_str(&self, value: &T) -> u64 { + let mut hasher = self.build_hasher(); + value.hash(&mut hasher); + hasher.finish() + } + #[inline] + #[cfg(not(feature = "specialize"))] + fn hash_as_str(&self, value: &T) -> u64 { + let mut hasher = self.build_hasher(); + value.hash(&mut hasher); + hasher.finish() + } +} + +// #[inline(never)] +// #[doc(hidden)] +// pub fn hash_test(input: &[u8]) -> u64 { +// let a = RandomState::with_seeds(11, 22, 33, 44); +// <[u8]>::get_hash(input, &a) +// } + +#[cfg(feature = "std")] +#[cfg(test)] +mod test { + use crate::convert::Convert; + use crate::specialize::CallHasher; + use crate::*; + use std::collections::HashMap; + use std::hash::Hash; + + #[test] + fn test_ahash_alias_map_construction() { + let mut map = super::HashMap::with_capacity(1234); + map.insert(1, "test"); + } + + #[test] + fn test_ahash_alias_set_construction() { + let mut set = super::HashSet::with_capacity(1234); + set.insert(1); + } + + #[test] + fn test_default_builder() { + use core::hash::BuildHasherDefault; + + let mut map = HashMap::>::default(); + map.insert(1, 3); + } + + #[test] + fn test_builder() { + let mut map = HashMap::::default(); + map.insert(1, 3); + } + + #[test] + fn test_conversion() { + let input: &[u8] = b"dddddddd"; + let bytes: u64 = as_array!(input, 8).convert(); + assert_eq!(bytes, 0x6464646464646464); + } + + #[test] + fn test_non_zero() { + let mut hasher1 = AHasher::new_with_keys(0, 0); + let mut hasher2 = AHasher::new_with_keys(0, 0); + "foo".hash(&mut hasher1); + "bar".hash(&mut hasher2); + assert_ne!(hasher1.finish(), 0); + assert_ne!(hasher2.finish(), 0); + assert_ne!(hasher1.finish(), hasher2.finish()); + + let mut hasher1 = AHasher::new_with_keys(0, 0); + let mut hasher2 = AHasher::new_with_keys(0, 0); + 3_u64.hash(&mut hasher1); + 4_u64.hash(&mut hasher2); + assert_ne!(hasher1.finish(), 0); + assert_ne!(hasher2.finish(), 0); + assert_ne!(hasher1.finish(), hasher2.finish()); + } + + #[test] + fn test_non_zero_specialized() { + let hasher_build = RandomState::with_seeds(0, 0, 0, 0); + + let h1 = str::get_hash("foo", &hasher_build); + let h2 = str::get_hash("bar", &hasher_build); + assert_ne!(h1, 0); + assert_ne!(h2, 0); + assert_ne!(h1, h2); + + let h1 = u64::get_hash(&3_u64, &hasher_build); + let h2 = u64::get_hash(&4_u64, &hasher_build); + assert_ne!(h1, 0); + assert_ne!(h2, 0); + assert_ne!(h1, h2); + } + + #[test] + fn test_ahasher_construction() { + let _ = AHasher::new_with_keys(1234, 5678); + } +} diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/src/operations.rs b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/src/operations.rs new file mode 100644 index 0000000..23d4e22 --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/src/operations.rs @@ -0,0 +1,376 @@ +use crate::convert::*; +use zerocopy::transmute; + +///This constant comes from Kunth's prng (Empirically it works better than those from splitmix32). +pub(crate) const MULTIPLE: u64 = 6364136223846793005; + +/// This is a constant with a lot of special properties found by automated search. +/// See the unit tests below. (Below are alternative values) +#[cfg(all(target_feature = "ssse3", not(miri)))] +const SHUFFLE_MASK: u128 = 0x020a0700_0c01030e_050f0d08_06090b04_u128; +//const SHUFFLE_MASK: u128 = 0x000d0702_0a040301_05080f0c_0e0b0609_u128; +//const SHUFFLE_MASK: u128 = 0x040A0700_030E0106_0D050F08_020B0C09_u128; + +#[inline(always)] +#[cfg(feature = "folded_multiply")] +pub(crate) const fn folded_multiply(s: u64, by: u64) -> u64 { + let result = (s as u128).wrapping_mul(by as u128); + ((result & 0xffff_ffff_ffff_ffff) as u64) ^ ((result >> 64) as u64) +} + +#[inline(always)] +#[cfg(not(feature = "folded_multiply"))] +pub(crate) const fn folded_multiply(s: u64, by: u64) -> u64 { + let b1 = s.wrapping_mul(by.swap_bytes()); + let b2 = s.swap_bytes().wrapping_mul(!by); + b1 ^ b2.swap_bytes() +} + +/// Given a small (less than 8 byte slice) returns the same data stored in two u32s. +/// (order of and non-duplication of bytes is NOT guaranteed) +#[inline(always)] +pub(crate) fn read_small(data: &[u8]) -> [u64; 2] { + debug_assert!(data.len() <= 8); + if data.len() >= 2 { + if data.len() >= 4 { + //len 4-8 + [data.read_u32().0 as u64, data.read_last_u32() as u64] + } else { + //len 2-3 + [data.read_u16().0 as u64, data[data.len() - 1] as u64] + } + } else { + if data.len() > 0 { + [data[0] as u64, data[0] as u64] + } else { + [0, 0] + } + } +} + +#[inline(always)] +pub(crate) fn shuffle(a: u128) -> u128 { + #[cfg(all(target_feature = "ssse3", not(miri)))] + { + #[cfg(target_arch = "x86")] + use core::arch::x86::*; + #[cfg(target_arch = "x86_64")] + use core::arch::x86_64::*; + unsafe { transmute!(_mm_shuffle_epi8(transmute!(a), transmute!(SHUFFLE_MASK))) } + } + #[cfg(not(all(target_feature = "ssse3", not(miri))))] + { + a.swap_bytes() + } +} + +#[allow(unused)] //not used by fallback +#[inline(always)] +pub(crate) fn add_and_shuffle(a: u128, b: u128) -> u128 { + let sum = add_by_64s(a.convert(), b.convert()); + shuffle(sum.convert()) +} + +#[allow(unused)] //not used by fallback +#[inline(always)] +pub(crate) fn shuffle_and_add(base: u128, to_add: u128) -> u128 { + let shuffled: [u64; 2] = shuffle(base).convert(); + add_by_64s(shuffled, to_add.convert()).convert() +} + +#[cfg(all(any(target_arch = "x86", target_arch = "x86_64"), target_feature = "sse2", not(miri)))] +#[inline(always)] +pub(crate) fn add_by_64s(a: [u64; 2], b: [u64; 2]) -> [u64; 2] { + unsafe { + #[cfg(target_arch = "x86")] + use core::arch::x86::*; + #[cfg(target_arch = "x86_64")] + use core::arch::x86_64::*; + transmute!(_mm_add_epi64(transmute!(a), transmute!(b))) + } +} + +#[cfg(not(all(any(target_arch = "x86", target_arch = "x86_64"), target_feature = "sse2", not(miri))))] +#[inline(always)] +pub(crate) fn add_by_64s(a: [u64; 2], b: [u64; 2]) -> [u64; 2] { + [a[0].wrapping_add(b[0]), a[1].wrapping_add(b[1])] +} + +#[cfg(all(any(target_arch = "x86", target_arch = "x86_64"), target_feature = "aes", not(miri)))] +#[allow(unused)] +#[inline(always)] +pub(crate) fn aesenc(value: u128, xor: u128) -> u128 { + #[cfg(target_arch = "x86")] + use core::arch::x86::*; + #[cfg(target_arch = "x86_64")] + use core::arch::x86_64::*; + unsafe { + let value = transmute!(value); + transmute!(_mm_aesenc_si128(value, transmute!(xor))) + } +} + +#[cfg(all( + any(target_arch = "arm", target_arch = "aarch64"), + any(target_feature = "aes", target_feature = "crypto"), + not(miri), + feature = "stdsimd" +))] +#[allow(unused)] +#[inline(always)] +pub(crate) fn aesenc(value: u128, xor: u128) -> u128 { + #[cfg(target_arch = "aarch64")] + use core::arch::aarch64::*; + #[cfg(target_arch = "arm")] + use core::arch::arm::*; + let res = unsafe { vaesmcq_u8(vaeseq_u8(transmute!(value), transmute!(0u128))) }; + let value: u128 = transmute!(res); + xor ^ value +} + +#[cfg(all(any(target_arch = "x86", target_arch = "x86_64"), target_feature = "aes", not(miri)))] +#[allow(unused)] +#[inline(always)] +pub(crate) fn aesdec(value: u128, xor: u128) -> u128 { + #[cfg(target_arch = "x86")] + use core::arch::x86::*; + #[cfg(target_arch = "x86_64")] + use core::arch::x86_64::*; + unsafe { + let value = transmute!(value); + transmute!(_mm_aesdec_si128(value, transmute!(xor))) + } +} + +#[cfg(all( + any(target_arch = "arm", target_arch = "aarch64"), + any(target_feature = "aes", target_feature = "crypto"), + not(miri), + feature = "stdsimd" +))] +#[allow(unused)] +#[inline(always)] +pub(crate) fn aesdec(value: u128, xor: u128) -> u128 { + #[cfg(target_arch = "aarch64")] + use core::arch::aarch64::*; + #[cfg(target_arch = "arm")] + use core::arch::arm::*; + let res = unsafe { vaesimcq_u8(vaesdq_u8(transmute!(value), transmute!(0u128))) }; + let value: u128 = transmute!(res); + xor ^ value +} + +#[allow(unused)] +#[inline(always)] +pub(crate) fn add_in_length(enc: &mut u128, len: u64) { + #[cfg(all(target_arch = "x86_64", target_feature = "sse2", not(miri)))] + { + #[cfg(target_arch = "x86_64")] + use core::arch::x86_64::*; + + unsafe { + let enc = enc as *mut u128; + let len = _mm_cvtsi64_si128(len as i64); + let data = _mm_loadu_si128(enc.cast()); + let sum = _mm_add_epi64(data, len); + _mm_storeu_si128(enc.cast(), sum); + } + } + #[cfg(not(all(target_arch = "x86_64", target_feature = "sse2", not(miri))))] + { + let mut t: [u64; 2] = enc.convert(); + t[0] = t[0].wrapping_add(len); + *enc = t.convert(); + } +} + +#[cfg(test)] +mod test { + use super::*; + use crate::convert::Convert; + + // This is code to search for the shuffle constant + // + //thread_local! { static MASK: Cell = Cell::new(0); } + // + // fn shuffle(a: u128) -> u128 { + // use std::intrinsics::transmute; + // #[cfg(target_arch = "x86")] + // use core::arch::x86::*; + // #[cfg(target_arch = "x86_64")] + // use core::arch::x86_64::*; + // MASK.with(|mask| { + // unsafe { transmute!(_mm_shuffle_epi8(transmute!(a), transmute!(mask.get()))) } + // }) + // } + // + // #[test] + // fn find_shuffle() { + // use rand::prelude::*; + // use SliceRandom; + // use std::panic; + // use std::io::Write; + // + // let mut value: [u8; 16] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 ,13, 14, 15]; + // let mut rand = thread_rng(); + // let mut successful_list = HashMap::new(); + // for _attempt in 0..10000000 { + // rand.shuffle(&mut value); + // let test_val = value.convert(); + // MASK.with(|mask| { + // mask.set(test_val); + // }); + // if let Ok(successful) = panic::catch_unwind(|| { + // test_shuffle_does_not_collide_with_aes(); + // test_shuffle_moves_high_bits(); + // test_shuffle_moves_every_value(); + // //test_shuffle_does_not_loop(); + // value + // }) { + // let successful: u128 = successful.convert(); + // successful_list.insert(successful, iters_before_loop()); + // } + // } + // let write_file = File::create("/tmp/output").unwrap(); + // let mut writer = BufWriter::new(&write_file); + // + // for success in successful_list { + // writeln!(writer, "Found successful: {:x?} - {:?}", success.0, success.1); + // } + // } + // + // fn iters_before_loop() -> u32 { + // let numbered = 0x00112233_44556677_8899AABB_CCDDEEFF; + // let mut shuffled = shuffle(numbered); + // let mut count = 0; + // loop { + // // println!("{:>16x}", shuffled); + // if numbered == shuffled { + // break; + // } + // count += 1; + // shuffled = shuffle(shuffled); + // } + // count + // } + + #[cfg(all( + any(target_arch = "x86", target_arch = "x86_64"), + target_feature = "ssse3", + target_feature = "aes", + not(miri) + ))] + #[test] + fn test_shuffle_does_not_collide_with_aes() { + let mut value: [u8; 16] = [0; 16]; + let zero_mask_enc = aesenc(0, 0); + let zero_mask_dec = aesdec(0, 0); + for index in 0..16 { + value[index] = 1; + let excluded_positions_enc: [u8; 16] = aesenc(value.convert(), zero_mask_enc).convert(); + let excluded_positions_dec: [u8; 16] = aesdec(value.convert(), zero_mask_dec).convert(); + let actual_location: [u8; 16] = shuffle(value.convert()).convert(); + for pos in 0..16 { + if actual_location[pos] != 0 { + assert_eq!( + 0, excluded_positions_enc[pos], + "Forward Overlap between {:?} and {:?} at {}", + excluded_positions_enc, actual_location, index + ); + assert_eq!( + 0, excluded_positions_dec[pos], + "Reverse Overlap between {:?} and {:?} at {}", + excluded_positions_dec, actual_location, index + ); + } + } + value[index] = 0; + } + } + + #[test] + fn test_shuffle_contains_each_value() { + let value: [u8; 16] = 0x00010203_04050607_08090A0B_0C0D0E0F_u128.convert(); + let shuffled: [u8; 16] = shuffle(value.convert()).convert(); + for index in 0..16_u8 { + assert!(shuffled.contains(&index), "Value is missing {}", index); + } + } + + #[test] + fn test_shuffle_moves_every_value() { + let mut value: [u8; 16] = [0; 16]; + for index in 0..16 { + value[index] = 1; + let shuffled: [u8; 16] = shuffle(value.convert()).convert(); + assert_eq!(0, shuffled[index], "Value is not moved {}", index); + value[index] = 0; + } + } + + #[test] + fn test_shuffle_moves_high_bits() { + assert!( + shuffle(1) > (1_u128 << 80), + "Low bits must be moved to other half {:?} -> {:?}", + 0, + shuffle(1) + ); + + assert!( + shuffle(1_u128 << 58) >= (1_u128 << 64), + "High bits must be moved to other half {:?} -> {:?}", + 7, + shuffle(1_u128 << 58) + ); + assert!( + shuffle(1_u128 << 58) < (1_u128 << 112), + "High bits must not remain high {:?} -> {:?}", + 7, + shuffle(1_u128 << 58) + ); + assert!( + shuffle(1_u128 << 64) < (1_u128 << 64), + "Low bits must be moved to other half {:?} -> {:?}", + 8, + shuffle(1_u128 << 64) + ); + assert!( + shuffle(1_u128 << 64) >= (1_u128 << 16), + "Low bits must not remain low {:?} -> {:?}", + 8, + shuffle(1_u128 << 64) + ); + + assert!( + shuffle(1_u128 << 120) < (1_u128 << 50), + "High bits must be moved to low half {:?} -> {:?}", + 15, + shuffle(1_u128 << 120) + ); + } + + #[cfg(all( + any(target_arch = "x86", target_arch = "x86_64"), + target_feature = "ssse3", + not(miri) + ))] + #[test] + fn test_shuffle_does_not_loop() { + let numbered = 0x00112233_44556677_8899AABB_CCDDEEFF; + let mut shuffled = shuffle(numbered); + for count in 0..100 { + // println!("{:>16x}", shuffled); + assert_ne!(numbered, shuffled, "Equal after {} vs {:x}", count, shuffled); + shuffled = shuffle(shuffled); + } + } + + #[test] + fn test_add_length() { + let mut enc = (u64::MAX as u128) << 64 | 50; + add_in_length(&mut enc, u64::MAX); + assert_eq!(enc >> 64, u64::MAX as u128); + assert_eq!(enc as u64, 49); + } +} diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/src/random_state.rs b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/src/random_state.rs new file mode 100644 index 0000000..54b754d --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/src/random_state.rs @@ -0,0 +1,529 @@ +use core::hash::Hash; +cfg_if::cfg_if! { + if #[cfg(any( + all(any(target_arch = "x86", target_arch = "x86_64"), target_feature = "aes", not(miri)), + all(any(target_arch = "arm", target_arch = "aarch64"), any(target_feature = "aes", target_feature = "crypto"), not(miri), feature = "stdsimd") + ))] { + use crate::aes_hash::*; + } else { + use crate::fallback_hash::*; + } +} +cfg_if::cfg_if! { + if #[cfg(feature = "specialize")]{ + use crate::BuildHasherExt; + } +} +cfg_if::cfg_if! { + if #[cfg(feature = "std")] { + extern crate std as alloc; + } else { + extern crate alloc; + } +} + +#[cfg(feature = "atomic-polyfill")] +use atomic_polyfill as atomic; +#[cfg(not(feature = "atomic-polyfill"))] +use core::sync::atomic; + +use alloc::boxed::Box; +use atomic::{AtomicUsize, Ordering}; +use core::any::{Any, TypeId}; +use core::fmt; +use core::hash::BuildHasher; +use core::hash::Hasher; + +pub(crate) const PI: [u64; 4] = [ + 0x243f_6a88_85a3_08d3, + 0x1319_8a2e_0370_7344, + 0xa409_3822_299f_31d0, + 0x082e_fa98_ec4e_6c89, +]; + +pub(crate) const PI2: [u64; 4] = [ + 0x4528_21e6_38d0_1377, + 0xbe54_66cf_34e9_0c6c, + 0xc0ac_29b7_c97c_50dd, + 0x3f84_d5b5_b547_0917, +]; + +cfg_if::cfg_if! { + if #[cfg(all(feature = "compile-time-rng", any(test, fuzzing)))] { + #[inline] + fn get_fixed_seeds() -> &'static [[u64; 4]; 2] { + use const_random::const_random; + + const RAND: [[u64; 4]; 2] = [ + [ + const_random!(u64), + const_random!(u64), + const_random!(u64), + const_random!(u64), + ], [ + const_random!(u64), + const_random!(u64), + const_random!(u64), + const_random!(u64), + ] + ]; + &RAND + } + } else if #[cfg(all(feature = "runtime-rng", not(fuzzing)))] { + #[inline] + fn get_fixed_seeds() -> &'static [[u64; 4]; 2] { + use crate::convert::Convert; + + static SEEDS: OnceBox<[[u64; 4]; 2]> = OnceBox::new(); + + SEEDS.get_or_init(|| { + let mut result: [u8; 64] = [0; 64]; + getrandom::getrandom(&mut result).expect("getrandom::getrandom() failed."); + Box::new(result.convert()) + }) + } + } else if #[cfg(feature = "compile-time-rng")] { + #[inline] + fn get_fixed_seeds() -> &'static [[u64; 4]; 2] { + use const_random::const_random; + + const RAND: [[u64; 4]; 2] = [ + [ + const_random!(u64), + const_random!(u64), + const_random!(u64), + const_random!(u64), + ], [ + const_random!(u64), + const_random!(u64), + const_random!(u64), + const_random!(u64), + ] + ]; + &RAND + } + } else { + #[inline] + fn get_fixed_seeds() -> &'static [[u64; 4]; 2] { + &[PI, PI2] + } + } +} + +cfg_if::cfg_if! { + if #[cfg(not(all(target_arch = "arm", target_os = "none")))] { + use once_cell::race::OnceBox; + + static RAND_SOURCE: OnceBox> = OnceBox::new(); + } +} +/// A supplier of Randomness used for different hashers. +/// See [set_random_source]. +/// +/// If [set_random_source] aHash will default to the best available source of randomness. +/// In order this is: +/// 1. OS provided random number generator (available if the `runtime-rng` flag is enabled which it is by default) - This should be very strong. +/// 2. Strong compile time random numbers used to permute a static "counter". (available if `compile-time-rng` is enabled. +/// __Enabling this is recommended if `runtime-rng` is not possible__) +/// 3. A static counter that adds the memory address of each [RandomState] created permuted with fixed constants. +/// (Similar to above but with fixed keys) - This is the weakest option. The strength of this heavily depends on whether or not ASLR is enabled. +/// (Rust enables ASLR by default) +pub trait RandomSource { + fn gen_hasher_seed(&self) -> usize; +} + +struct DefaultRandomSource { + counter: AtomicUsize, +} + +impl DefaultRandomSource { + fn new() -> DefaultRandomSource { + DefaultRandomSource { + counter: AtomicUsize::new(&PI as *const _ as usize), + } + } + + #[cfg(all(target_arch = "arm", target_os = "none"))] + const fn default() -> DefaultRandomSource { + DefaultRandomSource { + counter: AtomicUsize::new(PI[3] as usize), + } + } +} + +impl RandomSource for DefaultRandomSource { + cfg_if::cfg_if! { + if #[cfg(all(target_arch = "arm", target_os = "none"))] { + fn gen_hasher_seed(&self) -> usize { + let stack = self as *const _ as usize; + let previous = self.counter.load(Ordering::Relaxed); + let new = previous.wrapping_add(stack); + self.counter.store(new, Ordering::Relaxed); + new + } + } else { + fn gen_hasher_seed(&self) -> usize { + let stack = self as *const _ as usize; + self.counter.fetch_add(stack, Ordering::Relaxed) + } + } + } +} + +cfg_if::cfg_if! { + if #[cfg(all(target_arch = "arm", target_os = "none"))] { + #[inline] + fn get_src() -> &'static dyn RandomSource { + static RAND_SOURCE: DefaultRandomSource = DefaultRandomSource::default(); + &RAND_SOURCE + } + } else { + /// Provides an optional way to manually supply a source of randomness for Hasher keys. + /// + /// The provided [RandomSource] will be used to be used as a source of randomness by [RandomState] to generate new states. + /// If this method is not invoked the standard source of randomness is used as described in the Readme. + /// + /// The source of randomness can only be set once, and must be set before the first RandomState is created. + /// If the source has already been specified `Err` is returned with a `bool` indicating if the set failed because + /// method was previously invoked (true) or if the default source is already being used (false). + #[cfg(not(all(target_arch = "arm", target_os = "none")))] + pub fn set_random_source(source: impl RandomSource + Send + Sync + 'static) -> Result<(), bool> { + RAND_SOURCE.set(Box::new(Box::new(source))).map_err(|s| s.as_ref().type_id() != TypeId::of::<&DefaultRandomSource>()) + } + + #[inline] + fn get_src() -> &'static dyn RandomSource { + RAND_SOURCE.get_or_init(|| Box::new(Box::new(DefaultRandomSource::new()))).as_ref() + } + } +} + +/// Provides a [Hasher] factory. This is typically used (e.g. by [HashMap]) to create +/// [AHasher]s in order to hash the keys of the map. See `build_hasher` below. +/// +/// [build_hasher]: ahash:: +/// [Hasher]: std::hash::Hasher +/// [BuildHasher]: std::hash::BuildHasher +/// [HashMap]: std::collections::HashMap +/// +/// There are multiple constructors each is documented in more detail below: +/// +/// | Constructor | Dynamically random? | Seed | +/// |---------------|---------------------|------| +/// |`new` | Each instance unique|_[RandomSource]_| +/// |`generate_with`| Each instance unique|`u64` x 4 + [RandomSource]| +/// |`with_seed` | Fixed per process |`u64` + static random number| +/// |`with_seeds` | Fixed |`u64` x 4| +/// +#[derive(Clone)] +pub struct RandomState { + pub(crate) k0: u64, + pub(crate) k1: u64, + pub(crate) k2: u64, + pub(crate) k3: u64, +} + +impl fmt::Debug for RandomState { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.pad("RandomState { .. }") + } +} + +impl RandomState { + + /// Create a new `RandomState` `BuildHasher` using random keys. + /// + /// Each instance will have a unique set of keys derived from [RandomSource]. + /// + #[inline] + pub fn new() -> RandomState { + let src = get_src(); + let fixed = get_fixed_seeds(); + Self::from_keys(&fixed[0], &fixed[1], src.gen_hasher_seed()) + } + + /// Create a new `RandomState` `BuildHasher` based on the provided seeds, but in such a way + /// that each time it is called the resulting state will be different and of high quality. + /// This allows fixed constant or poor quality seeds to be provided without the problem of different + /// `BuildHasher`s being identical or weak. + /// + /// This is done via permuting the provided values with the value of a static counter and memory address. + /// (This makes this method somewhat more expensive than `with_seeds` below which does not do this). + /// + /// The provided values (k0-k3) do not need to be of high quality but they should not all be the same value. + #[inline] + pub fn generate_with(k0: u64, k1: u64, k2: u64, k3: u64) -> RandomState { + let src = get_src(); + let fixed = get_fixed_seeds(); + RandomState::from_keys(&fixed[0], &[k0, k1, k2, k3], src.gen_hasher_seed()) + } + + fn from_keys(a: &[u64; 4], b: &[u64; 4], c: usize) -> RandomState { + let &[k0, k1, k2, k3] = a; + let mut hasher = AHasher::from_random_state(&RandomState { k0, k1, k2, k3 }); + hasher.write_usize(c); + let mix = |l: u64, r: u64| { + let mut h = hasher.clone(); + h.write_u64(l); + h.write_u64(r); + h.finish() + }; + RandomState { + k0: mix(b[0], b[2]), + k1: mix(b[1], b[3]), + k2: mix(b[2], b[1]), + k3: mix(b[3], b[0]), + } + } + + /// Internal. Used by Default. + #[inline] + pub(crate) fn with_fixed_keys() -> RandomState { + let [k0, k1, k2, k3] = get_fixed_seeds()[0]; + RandomState { k0, k1, k2, k3 } + } + + /// Build a `RandomState` from a single key. The provided key does not need to be of high quality, + /// but all `RandomState`s created from the same key will produce identical hashers. + /// (In contrast to `generate_with` above) + /// + /// This allows for explicitly setting the seed to be used. + /// + /// Note: This method does not require the provided seed to be strong. + #[inline] + pub fn with_seed(key: usize) -> RandomState { + let fixed = get_fixed_seeds(); + RandomState::from_keys(&fixed[0], &fixed[1], key) + } + + /// Allows for explicitly setting the seeds to used. + /// All `RandomState`s created with the same set of keys key will produce identical hashers. + /// (In contrast to `generate_with` above) + /// + /// Note: If DOS resistance is desired one of these should be a decent quality random number. + /// If 4 high quality random number are not cheaply available this method is robust against 0s being passed for + /// one or more of the parameters or the same value being passed for more than one parameter. + /// It is recommended to pass numbers in order from highest to lowest quality (if there is any difference). + #[inline] + pub const fn with_seeds(k0: u64, k1: u64, k2: u64, k3: u64) -> RandomState { + RandomState { + k0: k0 ^ PI2[0], + k1: k1 ^ PI2[1], + k2: k2 ^ PI2[2], + k3: k3 ^ PI2[3], + } + } + + /// Calculates the hash of a single value. This provides a more convenient (and faster) way to obtain a hash: + /// For example: + #[cfg_attr( + feature = "std", + doc = r##" # Examples +``` + use std::hash::BuildHasher; + use ahash::RandomState; + + let hash_builder = RandomState::new(); + let hash = hash_builder.hash_one("Some Data"); +``` + "## + )] + /// This is similar to: + #[cfg_attr( + feature = "std", + doc = r##" # Examples +``` + use std::hash::{BuildHasher, Hash, Hasher}; + use ahash::RandomState; + + let hash_builder = RandomState::new(); + let mut hasher = hash_builder.build_hasher(); + "Some Data".hash(&mut hasher); + let hash = hasher.finish(); +``` + "## + )] + /// (Note that these two ways to get a hash may not produce the same value for the same data) + /// + /// This is intended as a convenience for code which *consumes* hashes, such + /// as the implementation of a hash table or in unit tests that check + /// whether a custom [`Hash`] implementation behaves as expected. + /// + /// This must not be used in any code which *creates* hashes, such as in an + /// implementation of [`Hash`]. The way to create a combined hash of + /// multiple values is to call [`Hash::hash`] multiple times using the same + /// [`Hasher`], not to call this method repeatedly and combine the results. + #[inline] + pub fn hash_one(&self, x: T) -> u64 + where + Self: Sized, + { + use crate::specialize::CallHasher; + T::get_hash(&x, self) + } +} + +/// Creates an instance of RandomState using keys obtained from the random number generator. +/// Each instance created in this way will have a unique set of keys. (But the resulting instance +/// can be used to create many hashers each or which will have the same keys.) +/// +/// This is the same as [RandomState::new()] +/// +/// NOTE: For safety this trait impl is only available available if either of the flags `runtime-rng` (on by default) or +/// `compile-time-rng` are enabled. This is to prevent weakly keyed maps from being accidentally created. Instead one of +/// constructors for [RandomState] must be used. +#[cfg(any(feature = "compile-time-rng", feature = "runtime-rng", feature = "no-rng"))] +impl Default for RandomState { + #[inline] + fn default() -> Self { + Self::new() + } +} + +impl BuildHasher for RandomState { + type Hasher = AHasher; + + /// Constructs a new [AHasher] with keys based on this [RandomState] object. + /// This means that two different [RandomState]s will will generate + /// [AHasher]s that will return different hashcodes, but [Hasher]s created from the same [BuildHasher] + /// will generate the same hashes for the same input data. + /// + #[cfg_attr( + feature = "std", + doc = r##" # Examples +``` + use ahash::{AHasher, RandomState}; + use std::hash::{Hasher, BuildHasher}; + + let build_hasher = RandomState::new(); + let mut hasher_1 = build_hasher.build_hasher(); + let mut hasher_2 = build_hasher.build_hasher(); + + hasher_1.write_u32(1234); + hasher_2.write_u32(1234); + + assert_eq!(hasher_1.finish(), hasher_2.finish()); + + let other_build_hasher = RandomState::new(); + let mut different_hasher = other_build_hasher.build_hasher(); + different_hasher.write_u32(1234); + assert_ne!(different_hasher.finish(), hasher_1.finish()); +``` + "## + )] + /// [Hasher]: std::hash::Hasher + /// [BuildHasher]: std::hash::BuildHasher + /// [HashMap]: std::collections::HashMap + #[inline] + fn build_hasher(&self) -> AHasher { + AHasher::from_random_state(self) + } + + + /// Calculates the hash of a single value. This provides a more convenient (and faster) way to obtain a hash: + /// For example: + #[cfg_attr( + feature = "std", + doc = r##" # Examples +``` + use std::hash::BuildHasher; + use ahash::RandomState; + + let hash_builder = RandomState::new(); + let hash = hash_builder.hash_one("Some Data"); +``` + "## + )] + /// This is similar to: + #[cfg_attr( + feature = "std", + doc = r##" # Examples +``` + use std::hash::{BuildHasher, Hash, Hasher}; + use ahash::RandomState; + + let hash_builder = RandomState::new(); + let mut hasher = hash_builder.build_hasher(); + "Some Data".hash(&mut hasher); + let hash = hasher.finish(); +``` + "## + )] + /// (Note that these two ways to get a hash may not produce the same value for the same data) + /// + /// This is intended as a convenience for code which *consumes* hashes, such + /// as the implementation of a hash table or in unit tests that check + /// whether a custom [`Hash`] implementation behaves as expected. + /// + /// This must not be used in any code which *creates* hashes, such as in an + /// implementation of [`Hash`]. The way to create a combined hash of + /// multiple values is to call [`Hash::hash`] multiple times using the same + /// [`Hasher`], not to call this method repeatedly and combine the results. + #[cfg(feature = "specialize")] + #[inline] + fn hash_one(&self, x: T) -> u64 { + RandomState::hash_one(self, x) + } +} + +#[cfg(feature = "specialize")] +impl BuildHasherExt for RandomState { + #[inline] + fn hash_as_u64(&self, value: &T) -> u64 { + let mut hasher = AHasherU64 { + buffer: self.k0, + pad: self.k1, + }; + value.hash(&mut hasher); + hasher.finish() + } + + #[inline] + fn hash_as_fixed_length(&self, value: &T) -> u64 { + let mut hasher = AHasherFixed(self.build_hasher()); + value.hash(&mut hasher); + hasher.finish() + } + + #[inline] + fn hash_as_str(&self, value: &T) -> u64 { + let mut hasher = AHasherStr(self.build_hasher()); + value.hash(&mut hasher); + hasher.finish() + } +} + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn test_unique() { + let a = RandomState::generate_with(1, 2, 3, 4); + let b = RandomState::generate_with(1, 2, 3, 4); + assert_ne!(a.build_hasher().finish(), b.build_hasher().finish()); + } + + #[cfg(all(feature = "runtime-rng", not(all(feature = "compile-time-rng", test))))] + #[test] + fn test_not_pi() { + assert_ne!(PI, get_fixed_seeds()[0]); + } + + #[cfg(all(feature = "compile-time-rng", any(not(feature = "runtime-rng"), test)))] + #[test] + fn test_not_pi_const() { + assert_ne!(PI, get_fixed_seeds()[0]); + } + + #[cfg(all(not(feature = "runtime-rng"), not(feature = "compile-time-rng")))] + #[test] + fn test_pi() { + assert_eq!(PI, get_fixed_seeds()[0]); + } + + #[test] + fn test_with_seeds_const() { + const _CONST_RANDOM_STATE: RandomState = RandomState::with_seeds(17, 19, 21, 23); + } +} diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/src/specialize.rs b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/src/specialize.rs new file mode 100644 index 0000000..05d335b --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/src/specialize.rs @@ -0,0 +1,218 @@ +use core::hash::BuildHasher; +use core::hash::Hash; +use core::hash::Hasher; + +#[cfg(not(feature = "std"))] +extern crate alloc; +#[cfg(feature = "std")] +extern crate std as alloc; + +#[cfg(feature = "specialize")] +use crate::BuildHasherExt; +#[cfg(feature = "specialize")] +use alloc::string::String; +#[cfg(feature = "specialize")] +use alloc::vec::Vec; + +/// Provides a way to get an optimized hasher for a given data type. +/// Rather than using a Hasher generically which can hash any value, this provides a way to get a specialized hash +/// for a specific type. So this may be faster for primitive types. +pub(crate) trait CallHasher { + fn get_hash(value: &H, build_hasher: &B) -> u64; +} + +#[cfg(not(feature = "specialize"))] +impl CallHasher for T +where + T: Hash + ?Sized, +{ + #[inline] + fn get_hash(value: &H, build_hasher: &B) -> u64 { + let mut hasher = build_hasher.build_hasher(); + value.hash(&mut hasher); + hasher.finish() + } +} + +#[cfg(feature = "specialize")] +impl CallHasher for T +where + T: Hash + ?Sized, +{ + #[inline] + default fn get_hash(value: &H, build_hasher: &B) -> u64 { + let mut hasher = build_hasher.build_hasher(); + value.hash(&mut hasher); + hasher.finish() + } +} + +macro_rules! call_hasher_impl { + ($typ:ty) => { + #[cfg(feature = "specialize")] + impl CallHasher for $typ { + #[inline] + fn get_hash(value: &H, build_hasher: &B) -> u64 { + build_hasher.hash_as_u64(value) + } + } + }; +} +call_hasher_impl!(u8); +call_hasher_impl!(u16); +call_hasher_impl!(u32); +call_hasher_impl!(u64); +call_hasher_impl!(i8); +call_hasher_impl!(i16); +call_hasher_impl!(i32); +call_hasher_impl!(i64); + +#[cfg(feature = "specialize")] +impl CallHasher for u128 { + #[inline] + fn get_hash(value: &H, build_hasher: &B) -> u64 { + build_hasher.hash_as_fixed_length(value) + } +} + +#[cfg(feature = "specialize")] +impl CallHasher for i128 { + #[inline] + fn get_hash(value: &H, build_hasher: &B) -> u64 { + build_hasher.hash_as_fixed_length(value) + } +} + +#[cfg(feature = "specialize")] +impl CallHasher for usize { + #[inline] + fn get_hash(value: &H, build_hasher: &B) -> u64 { + build_hasher.hash_as_fixed_length(value) + } +} + +#[cfg(feature = "specialize")] +impl CallHasher for isize { + #[inline] + fn get_hash(value: &H, build_hasher: &B) -> u64 { + build_hasher.hash_as_fixed_length(value) + } +} + +#[cfg(feature = "specialize")] +impl CallHasher for [u8] { + #[inline] + fn get_hash(value: &H, build_hasher: &B) -> u64 { + build_hasher.hash_as_str(value) + } +} + +#[cfg(feature = "specialize")] +impl CallHasher for Vec { + #[inline] + fn get_hash(value: &H, build_hasher: &B) -> u64 { + build_hasher.hash_as_str(value) + } +} + +#[cfg(feature = "specialize")] +impl CallHasher for str { + #[inline] + fn get_hash(value: &H, build_hasher: &B) -> u64 { + build_hasher.hash_as_str(value) + } +} + +#[cfg(all(feature = "specialize"))] +impl CallHasher for String { + #[inline] + fn get_hash(value: &H, build_hasher: &B) -> u64 { + build_hasher.hash_as_str(value) + } +} + +#[cfg(test)] +mod test { + use super::*; + use crate::*; + + #[test] + #[cfg(feature = "specialize")] + pub fn test_specialized_invoked() { + let build_hasher = RandomState::with_seeds(1, 2, 3, 4); + let shortened = u64::get_hash(&0, &build_hasher); + let mut hasher = AHasher::new_with_keys(1, 2); + 0_u64.hash(&mut hasher); + assert_ne!(hasher.finish(), shortened); + } + + /// Tests that some non-trivial transformation takes place. + #[test] + pub fn test_input_processed() { + let build_hasher = RandomState::with_seeds(2, 2, 2, 2); + assert_ne!(0, u64::get_hash(&0, &build_hasher)); + assert_ne!(1, u64::get_hash(&0, &build_hasher)); + assert_ne!(2, u64::get_hash(&0, &build_hasher)); + assert_ne!(3, u64::get_hash(&0, &build_hasher)); + assert_ne!(4, u64::get_hash(&0, &build_hasher)); + assert_ne!(5, u64::get_hash(&0, &build_hasher)); + + assert_ne!(0, u64::get_hash(&1, &build_hasher)); + assert_ne!(1, u64::get_hash(&1, &build_hasher)); + assert_ne!(2, u64::get_hash(&1, &build_hasher)); + assert_ne!(3, u64::get_hash(&1, &build_hasher)); + assert_ne!(4, u64::get_hash(&1, &build_hasher)); + assert_ne!(5, u64::get_hash(&1, &build_hasher)); + + let xored = u64::get_hash(&0, &build_hasher) ^ u64::get_hash(&1, &build_hasher); + assert_ne!(0, xored); + assert_ne!(1, xored); + assert_ne!(2, xored); + assert_ne!(3, xored); + assert_ne!(4, xored); + assert_ne!(5, xored); + } + + #[test] + pub fn test_ref_independent() { + let build_hasher = RandomState::with_seeds(1, 2, 3, 4); + assert_eq!(u8::get_hash(&&1, &build_hasher), u8::get_hash(&1, &build_hasher)); + assert_eq!(u16::get_hash(&&2, &build_hasher), u16::get_hash(&2, &build_hasher)); + assert_eq!(u32::get_hash(&&3, &build_hasher), u32::get_hash(&3, &build_hasher)); + assert_eq!(u64::get_hash(&&4, &build_hasher), u64::get_hash(&4, &build_hasher)); + assert_eq!(u128::get_hash(&&5, &build_hasher), u128::get_hash(&5, &build_hasher)); + assert_eq!( + str::get_hash(&"test", &build_hasher), + str::get_hash("test", &build_hasher) + ); + assert_eq!( + str::get_hash(&"test", &build_hasher), + String::get_hash(&"test".to_string(), &build_hasher) + ); + #[cfg(feature = "specialize")] + assert_eq!( + str::get_hash(&"test", &build_hasher), + <[u8]>::get_hash("test".as_bytes(), &build_hasher) + ); + + let build_hasher = RandomState::with_seeds(10, 20, 30, 40); + assert_eq!(u8::get_hash(&&&1, &build_hasher), u8::get_hash(&1, &build_hasher)); + assert_eq!(u16::get_hash(&&&2, &build_hasher), u16::get_hash(&2, &build_hasher)); + assert_eq!(u32::get_hash(&&&3, &build_hasher), u32::get_hash(&3, &build_hasher)); + assert_eq!(u64::get_hash(&&&4, &build_hasher), u64::get_hash(&4, &build_hasher)); + assert_eq!(u128::get_hash(&&&5, &build_hasher), u128::get_hash(&5, &build_hasher)); + assert_eq!( + str::get_hash(&&"test", &build_hasher), + str::get_hash("test", &build_hasher) + ); + assert_eq!( + str::get_hash(&&"test", &build_hasher), + String::get_hash(&"test".to_string(), &build_hasher) + ); + #[cfg(feature = "specialize")] + assert_eq!( + str::get_hash(&&"test", &build_hasher), + <[u8]>::get_hash(&"test".to_string().into_bytes(), &build_hasher) + ); + } +} diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/tests/bench.rs b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/tests/bench.rs new file mode 100644 index 0000000..5bc0fc9 --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/tests/bench.rs @@ -0,0 +1,198 @@ +#![cfg_attr(feature = "specialize", feature(build_hasher_simple_hash_one))] + +use ahash::{AHasher, RandomState}; +use criterion::*; +use fxhash::FxHasher; +use rand::Rng; +use std::collections::hash_map::DefaultHasher; +use std::hash::{BuildHasherDefault, Hash, Hasher}; + +// Needs to be in sync with `src/lib.rs` +const AHASH_IMPL: &str = if cfg!(any( + all( + any(target_arch = "x86", target_arch = "x86_64"), + target_feature = "aes", + not(miri), + ), + all( + any(target_arch = "arm", target_arch = "aarch64"), + any(target_feature = "aes", target_feature = "crypto"), + not(miri), + feature = "stdsimd", + ), +)) { + "aeshash" +} else { + "fallbackhash" +}; + +fn ahash(b: &H) -> u64 { + let build_hasher = RandomState::with_seeds(1, 2, 3, 4); + build_hasher.hash_one(b) +} + +fn fnvhash(b: &H) -> u64 { + let mut hasher = fnv::FnvHasher::default(); + b.hash(&mut hasher); + hasher.finish() +} + +fn siphash(b: &H) -> u64 { + let mut hasher = DefaultHasher::default(); + b.hash(&mut hasher); + hasher.finish() +} + +fn fxhash(b: &H) -> u64 { + let mut hasher = FxHasher::default(); + b.hash(&mut hasher); + hasher.finish() +} + +fn seahash(b: &H) -> u64 { + let mut hasher = seahash::SeaHasher::default(); + b.hash(&mut hasher); + hasher.finish() +} + +const STRING_LENGTHS: [u32; 12] = [1, 3, 4, 7, 8, 15, 16, 24, 33, 68, 132, 1024]; + +fn gen_strings() -> Vec { + STRING_LENGTHS + .iter() + .map(|len| { + let mut string = String::default(); + for pos in 1..=*len { + let c = (48 + (pos % 10) as u8) as char; + string.push(c); + } + string + }) + .collect() +} + +macro_rules! bench_inputs { + ($group:ident, $hash:ident) => { + // Number of iterations per batch should be high enough to hide timing overhead. + let size = BatchSize::NumIterations(2_000); + + let mut rng = rand::thread_rng(); + $group.bench_function("u8", |b| b.iter_batched(|| rng.gen::(), |v| $hash(&v), size)); + $group.bench_function("u16", |b| b.iter_batched(|| rng.gen::(), |v| $hash(&v), size)); + $group.bench_function("u32", |b| b.iter_batched(|| rng.gen::(), |v| $hash(&v), size)); + $group.bench_function("u64", |b| b.iter_batched(|| rng.gen::(), |v| $hash(&v), size)); + $group.bench_function("u128", |b| b.iter_batched(|| rng.gen::(), |v| $hash(&v), size)); + $group.bench_with_input("strings", &gen_strings(), |b, s| b.iter(|| $hash(black_box(s)))); + }; +} + +fn bench_ahash(c: &mut Criterion) { + let mut group = c.benchmark_group(AHASH_IMPL); + bench_inputs!(group, ahash); +} + +fn bench_fx(c: &mut Criterion) { + let mut group = c.benchmark_group("fx"); + bench_inputs!(group, fxhash); +} + +fn bench_fnv(c: &mut Criterion) { + let mut group = c.benchmark_group("fnv"); + bench_inputs!(group, fnvhash); +} + +fn bench_sea(c: &mut Criterion) { + let mut group = c.benchmark_group("sea"); + bench_inputs!(group, seahash); +} + +fn bench_sip(c: &mut Criterion) { + let mut group = c.benchmark_group("sip"); + bench_inputs!(group, siphash); +} + +fn bench_map(c: &mut Criterion) { + #[cfg(feature = "std")] + { + let mut group = c.benchmark_group("map"); + group.bench_function("aHash-alias", |b| { + b.iter(|| { + let hm: ahash::HashMap = (0..1_000_000).map(|i| (i, i)).collect(); + let mut sum = 0; + for i in 0..1_000_000 { + if let Some(x) = hm.get(&i) { + sum += x; + } + } + }) + }); + group.bench_function("aHash-hashBrown", |b| { + b.iter(|| { + let hm: hashbrown::HashMap = (0..1_000_000).map(|i| (i, i)).collect(); + let mut sum = 0; + for i in 0..1_000_000 { + if let Some(x) = hm.get(&i) { + sum += x; + } + } + }) + }); + group.bench_function("aHash-hashBrown-explicit", |b| { + b.iter(|| { + let hm: hashbrown::HashMap = (0..1_000_000).map(|i| (i, i)).collect(); + let mut sum = 0; + for i in 0..1_000_000 { + if let Some(x) = hm.get(&i) { + sum += x; + } + } + }) + }); + group.bench_function("aHash-wrapper", |b| { + b.iter(|| { + let hm: ahash::AHashMap = (0..1_000_000).map(|i| (i, i)).collect(); + let mut sum = 0; + for i in 0..1_000_000 { + if let Some(x) = hm.get(&i) { + sum += x; + } + } + }) + }); + group.bench_function("aHash-rand", |b| { + b.iter(|| { + let hm: std::collections::HashMap = (0..1_000_000).map(|i| (i, i)).collect(); + let mut sum = 0; + for i in 0..1_000_000 { + if let Some(x) = hm.get(&i) { + sum += x; + } + } + }) + }); + group.bench_function("aHash-default", |b| { + b.iter(|| { + let hm: std::collections::HashMap> = + (0..1_000_000).map(|i| (i, i)).collect(); + let mut sum = 0; + for i in 0..1_000_000 { + if let Some(x) = hm.get(&i) { + sum += x; + } + } + }) + }); + } +} + +criterion_main!(benches); + +criterion_group!( + benches, + bench_ahash, + bench_fx, + bench_fnv, + bench_sea, + bench_sip, + bench_map +); diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/tests/map_tests.rs b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/tests/map_tests.rs new file mode 100644 index 0000000..8d798a0 --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/tests/map_tests.rs @@ -0,0 +1,234 @@ +#![cfg_attr(feature = "specialize", feature(build_hasher_simple_hash_one))] + +use std::hash::{BuildHasher, Hash, Hasher}; + +use ahash::RandomState; +use criterion::*; +use fxhash::FxHasher; + +fn gen_word_pairs() -> Vec { + let words: Vec<_> = r#" +a, ability, able, about, above, accept, according, account, across, act, action, +activity, actually, add, address, administration, admit, adult, affect, after, +again, against, age, agency, agent, ago, agree, agreement, ahead, air, all, +allow, almost, alone, along, already, also, although, always, American, among, +amount, analysis, and, animal, another, answer, any, anyone, anything, appear, +apply, approach, area, argue, arm, around, arrive, art, article, artist, as, +ask, assume, at, attack, attention, attorney, audience, author, authority, +available, avoid, away, baby, back, bad, bag, ball, bank, bar, base, be, beat, +beautiful, because, become, bed, before, begin, behavior, behind, believe, +benefit, best, better, between, beyond, big, bill, billion, bit, black, blood, +blue, board, body, book, born, both, box, boy, break, bring, brother, budget, +build, building, business, but, buy, by, call, camera, campaign, can, cancer, +candidate, capital, car, card, care, career, carry, case, catch, cause, cell, +center, central, century, certain, certainly, chair, challenge, chance, change, +character, charge, check, child, choice, choose, church, citizen, city, civil, +claim, class, clear, clearly, close, coach, cold, collection, college, color, +come, commercial, common, community, company, compare, computer, concern, +condition, conference, Congress, consider, consumer, contain, continue, control, +cost, could, country, couple, course, court, cover, create, crime, cultural, +culture, cup, current, customer, cut, dark, data, daughter, day, dead, deal, +death, debate, decade, decide, decision, deep, defense, degree, Democrat, +democratic, describe, design, despite, detail, determine, develop, development, +die, difference, different, difficult, dinner, direction, director, discover, +discuss, discussion, disease, do, doctor, dog, door, down, draw, dream, drive, +drop, drug, during, each, early, east, easy, eat, economic, economy, edge, +education, effect, effort, eight, either, election, else, employee, end, energy, +enjoy, enough, enter, entire, environment, environmental, especially, establish, +even, evening, event, ever, every, everybody, everyone, everything, evidence, +exactly, example, executive, exist, expect, experience, expert, explain, eye, +face, fact, factor, fail, fall, family, far, fast, father, fear, federal, feel, +feeling, few, field, fight, figure, fill, film, final, finally, financial, find, +fine, finger, finish, fire, firm, first, fish, five, floor, fly, focus, follow, +food, foot, for, force, foreign, forget, form, former, forward, four, free, +friend, from, front, full, fund, future, game, garden, gas, general, generation, +get, girl, give, glass, go, goal, good, government, great, green, ground, group, +grow, growth, guess, gun, guy, hair, half, hand, hang, happen, happy, hard, +have, he, head, health, hear, heart, heat, heavy, help, her, here, herself, +high, him, himself, his, history, hit, hold, home, hope, hospital, hot, hotel, +hour, house, how, however, huge, human, hundred, husband, I, idea, identify, if, +image, imagine, impact, important, improve, in, include, including, increase, +indeed, indicate, individual, industry, information, inside, instead, +institution, interest, interesting, international, interview, into, investment, +involve, issue, it, item, its, itself, job, join, just, keep, key, kid, kill, +kind, kitchen, know, knowledge, land, language, large, last, late, later, laugh, +law, lawyer, lay, lead, leader, learn, least, leave, left, leg, legal, less, +let, letter, level, lie, life, light, like, likely, line, list, listen, little, +live, local, long, look, lose, loss, lot, love, low, machine, magazine, main, +maintain, major, majority, make, man, manage, management, manager, many, market, +marriage, material, matter, may, maybe, me, mean, measure, media, medical, meet, +meeting, member, memory, mention, message, method, middle, might, military, +million, mind, minute, miss, mission, model, modern, moment, money, month, more, +morning, most, mother, mouth, move, movement, movie, Mr, Mrs, much, music, must, +my, myself, name, nation, national, natural, nature, near, nearly, necessary, +need, network, never, new, news, newspaper, next, nice, night, no, none, nor, +north, not, note, nothing, notice, now, n't, number, occur, of, off, offer, +office, officer, official, often, oh, oil, ok, old, on, once, one, only, onto, +open, operation, opportunity, option, or, order, organization, other, others, +our, out, outside, over, own, owner, page, pain, painting, paper, parent, part, +participant, particular, particularly, partner, party, pass, past, patient, +pattern, pay, peace, people, per, perform, performance, perhaps, period, person, +personal, phone, physical, pick, picture, piece, place, plan, plant, play, +player, PM, point, police, policy, political, politics, poor, popular, +population, position, positive, possible, power, practice, prepare, present, +president, pressure, pretty, prevent, price, private, probably, problem, +process, produce, product, production, professional, professor, program, +project, property, protect, prove, provide, public, pull, purpose, push, put, +quality, question, quickly, quite, race, radio, raise, range, rate, rather, +reach, read, ready, real, reality, realize, really, reason, receive, recent, +recently, recognize, record, red, reduce, reflect, region, relate, relationship, +religious, remain, remember, remove, report, represent, Republican, require, +research, resource, respond, response, responsibility, rest, result, return, +reveal, rich, right, rise, risk, road, rock, role, room, rule, run, safe, same, +save, say, scene, school, science, scientist, score, sea, season, seat, second, +section, security, see, seek, seem, sell, send, senior, sense, series, serious, +serve, service, set, seven, several, sex, sexual, shake, share, she, shoot, +short, shot, should, shoulder, show, side, sign, significant, similar, simple, +simply, since, sing, single, sister, sit, site, situation, six, size, skill, +skin, small, smile, so, social, society, soldier, some, somebody, someone, +something, sometimes, son, song, soon, sort, sound, source, south, southern, +space, speak, special, specific, speech, spend, sport, spring, staff, stage, +stand, standard, star, start, state, statement, station, stay, step, still, +stock, stop, store, story, strategy, street, strong, structure, student, study, +stuff, style, subject, success, successful, such, suddenly, suffer, suggest, +summer, support, sure, surface, system, table, take, talk, task, tax, teach, +teacher, team, technology, television, tell, ten, tend, term, test, than, thank, +that, the, their, them, themselves, then, theory, there, these, they, thing, +think, third, this, those, though, thought, thousand, threat, three, through, +throughout, throw, thus, time, to, today, together, tonight, too, top, total, +tough, toward, town, trade, traditional, training, travel, treat, treatment, +tree, trial, trip, trouble, true, truth, try, turn, TV, two, type, under, +understand, unit, until, up, upon, us, use, usually, value, various, very, +victim, view, violence, visit, voice, vote, wait, walk, wall, want, war, watch, +water, way, we, weapon, wear, week, weight, well, west, western, what, whatever, +when, where, whether, which, while, white, who, whole, whom, whose, why, wide, +wife, will, win, wind, window, wish, with, within, without, woman, wonder, word, +work, worker, world, worry, would, write, writer, wrong, yard, yeah, year, yes, +yet, you, young, your, yourself"# + .split(',') + .map(|word| word.trim()) + .collect(); + + let mut word_pairs: Vec<_> = Vec::new(); + for word in &words { + for other_word in &words { + word_pairs.push(word.to_string() + " " + other_word); + } + } + assert_eq!(1_000_000, word_pairs.len()); + word_pairs +} + +#[allow(unused)] // False positive +fn test_hash_common_words(build_hasher: &B) { + let word_pairs: Vec<_> = gen_word_pairs(); + check_for_collisions(build_hasher, &word_pairs, 32); +} + +#[allow(unused)] // False positive +fn check_for_collisions(build_hasher: &B, items: &[H], bucket_count: usize) { + let mut buckets = vec![0; bucket_count]; + for item in items { + let value = hash(item, build_hasher) as usize; + buckets[value % bucket_count] += 1; + } + let mean = items.len() / bucket_count; + let max = *buckets.iter().max().unwrap(); + let min = *buckets.iter().min().unwrap(); + assert!( + (min as f64) > (mean as f64) * 0.95, + "min: {}, max:{}, {:?}", + min, + max, + buckets + ); + assert!( + (max as f64) < (mean as f64) * 1.05, + "min: {}, max:{}, {:?}", + min, + max, + buckets + ); +} + +#[cfg(feature = "specialize")] +#[allow(unused)] // False positive +fn hash(b: &H, build_hasher: &B) -> u64 { + build_hasher.hash_one(b) +} + +#[cfg(not(feature = "specialize"))] +#[allow(unused)] // False positive +fn hash(b: &H, build_hasher: &B) -> u64 { + let mut hasher = build_hasher.build_hasher(); + b.hash(&mut hasher); + hasher.finish() +} + +#[test] +fn test_bucket_distribution() { + let build_hasher = RandomState::with_seeds(1, 2, 3, 4); + test_hash_common_words(&build_hasher); + let sequence: Vec<_> = (0..320000).collect(); + check_for_collisions(&build_hasher, &sequence, 32); + let sequence: Vec<_> = (0..2560000).collect(); + check_for_collisions(&build_hasher, &sequence, 256); + let sequence: Vec<_> = (0..320000).map(|i| i * 1024).collect(); + check_for_collisions(&build_hasher, &sequence, 32); + let sequence: Vec<_> = (0..2560000_u64).map(|i| i * 1024).collect(); + check_for_collisions(&build_hasher, &sequence, 256); +} + +#[cfg(feature = "std")] +#[test] +fn test_ahash_alias_map_construction() { + let mut map = ahash::HashMap::default(); + map.insert(1, "test"); + use ahash::HashMapExt; + let mut map = ahash::HashMap::with_capacity(1234); + map.insert(1, "test"); +} + +#[cfg(feature = "std")] +#[test] +fn test_ahash_alias_set_construction() { + let mut set = ahash::HashSet::default(); + set.insert(1); + + use ahash::HashSetExt; + let mut set = ahash::HashSet::with_capacity(1235); + set.insert(1); +} + +fn ahash_vec(b: &Vec) -> u64 { + let mut total: u64 = 0; + for item in b { + let mut hasher = RandomState::with_seeds(12, 34, 56, 78).build_hasher(); + item.hash(&mut hasher); + total = total.wrapping_add(hasher.finish()); + } + total +} + +fn fxhash_vec(b: &Vec) -> u64 { + let mut total: u64 = 0; + for item in b { + let mut hasher = FxHasher::default(); + item.hash(&mut hasher); + total = total.wrapping_add(hasher.finish()); + } + total +} + +fn bench_ahash_words(c: &mut Criterion) { + let words = gen_word_pairs(); + c.bench_function("aes_words", |b| b.iter(|| black_box(ahash_vec(&words)))); +} + +fn bench_fx_words(c: &mut Criterion) { + let words = gen_word_pairs(); + c.bench_function("fx_words", |b| b.iter(|| black_box(fxhash_vec(&words)))); +} + +criterion_main!(benches); +criterion_group!(benches, bench_ahash_words, bench_fx_words,); diff --git a/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/tests/nopanic.rs b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/tests/nopanic.rs new file mode 100644 index 0000000..56f754c --- /dev/null +++ b/rust/switchboard-on-demand/patches/ahash-0.8.5-stdsimd.patch/tests/nopanic.rs @@ -0,0 +1,81 @@ +use ahash::{AHasher, RandomState}; +use std::hash::{BuildHasher, Hash, Hasher}; + +#[macro_use] +extern crate no_panic; + +#[inline(never)] +#[no_panic] +fn hash_test_final(num: i32, string: &str) -> (u64, u64) { + use core::hash::Hasher; + let mut hasher1 = RandomState::with_seeds(1, 2, 3, 4).build_hasher(); + let mut hasher2 = RandomState::with_seeds(3, 4, 5, 6).build_hasher(); + hasher1.write_i32(num); + hasher2.write(string.as_bytes()); + (hasher1.finish(), hasher2.finish()) +} + +#[inline(never)] +fn hash_test_final_wrapper(num: i32, string: &str) { + hash_test_final(num, string); +} + +struct SimpleBuildHasher { + hasher: AHasher, +} + +impl SimpleBuildHasher { + fn hash_one(&self, x: T) -> u64 + where + Self: Sized, + { + let mut hasher = self.build_hasher(); + x.hash(&mut hasher); + hasher.finish() + } +} + +impl BuildHasher for SimpleBuildHasher { + type Hasher = AHasher; + + fn build_hasher(&self) -> Self::Hasher { + self.hasher.clone() + } +} + +#[inline(never)] +#[no_panic] +fn hash_test_specialize(num: i32, string: &str) -> (u64, u64) { + let hasher1 = RandomState::with_seeds(1, 2, 3, 4).build_hasher(); + let hasher2 = RandomState::with_seeds(1, 2, 3, 4).build_hasher(); + ( + SimpleBuildHasher { hasher: hasher1 }.hash_one(num), + SimpleBuildHasher { hasher: hasher2 }.hash_one(string.as_bytes()), + ) +} + +#[inline(never)] +fn hash_test_random_wrapper(num: i32, string: &str) { + hash_test_specialize(num, string); +} + +#[inline(never)] +#[no_panic] +fn hash_test_random(num: i32, string: &str) -> (u64, u64) { + let build_hasher1 = RandomState::with_seeds(1, 2, 3, 4); + let build_hasher2 = RandomState::with_seeds(1, 2, 3, 4); + (build_hasher1.hash_one(&num), build_hasher2.hash_one(string.as_bytes())) +} + +#[inline(never)] +fn hash_test_specialize_wrapper(num: i32, string: &str) { + hash_test_specialize(num, string); +} + +#[test] +fn test_no_panic() { + hash_test_final_wrapper(2, "Foo"); + hash_test_specialize_wrapper(2, "Bar"); + hash_test_random(2, "Baz"); + hash_test_random_wrapper(2, "Bat"); +} diff --git a/rust/switchboard-on-demand/scripts/compile_docs.ts b/rust/switchboard-on-demand/scripts/compile_docs.ts new file mode 100644 index 0000000..69d107d --- /dev/null +++ b/rust/switchboard-on-demand/scripts/compile_docs.ts @@ -0,0 +1,65 @@ +import { exec } from "child_process"; +import * as fs from "fs-extra"; +import path from "path"; + +type Replaces = { files: number }; + +async function replaceInFiles( + dir: string, + searchValue: string, + replaceValue: string +): Promise { + try { + const files = await fs.readdir(dir); + for (const file of files) { + const filePath = path.join(dir, file); + const stats = await fs.stat(filePath); + if (stats.isFile()) { + let content = await fs.readFile(filePath, "utf-8"); + content = content.replace(new RegExp(searchValue, "g"), replaceValue); + await fs.writeFile(filePath, content); + } else if (stats.isDirectory()) { + await replaceInFiles(filePath, searchValue, replaceValue); + } + } + } catch (error) { + console.error(`Error: ${error}`); + } +} + +(async () => { + // Copy docs site from ./target/doc to ./doc + const IN_DIR = path.join(__dirname, "../target/doc"); + const OUT_DIR = path.join(__dirname, "../doc"); + await fs.removeSync(OUT_DIR); + await fs.copy(IN_DIR, OUT_DIR, { overwrite: true }); + + // Remove the ../doc/crates.js file + await fs.remove(path.join(OUT_DIR, "crates.js")); + + // Find each file in ./doc/switchboard_on_demand and replace all "../static.files" with "static.files" + const SRC_DIR = path.join(OUT_DIR, "switchboard_on_demand"); + await replaceInFiles(SRC_DIR, "../static.files", "static.files"); + await replaceInFiles(SRC_DIR, "../src", "src"); + await replaceInFiles( + SRC_DIR, + "/switchboard_on_demand/index.html", + "/index.html" + ); + + // Find each file in ./doc/static.files and update search results. + const STATIC_DIR = path.join(OUT_DIR, "static.files"); + await replaceInFiles( + STATIC_DIR, + "link.href=item.href;", + `link.href=item.href.replace(/^\\.\\.\\/switchboard_on_demand\\//, '../');` + ); + + // Move contents of ./doc/switchboard_on_demand/ to ./doc + await fs.copy(SRC_DIR, OUT_DIR); + await fs.remove(SRC_DIR); + + // Need to use bash to copy over the font files. Using fs to do so was corrupting the woff2 files. + const STATIC_IN = path.join(IN_DIR, "static.files/*.woff2"); + exec(`cp ${STATIC_IN} ${STATIC_DIR}`); +})(); diff --git a/rust/switchboard-on-demand/src/accounts.rs b/rust/switchboard-on-demand/src/accounts.rs new file mode 100644 index 0000000..2a208b9 --- /dev/null +++ b/rust/switchboard-on-demand/src/accounts.rs @@ -0,0 +1 @@ +pub use crate::on_demand::accounts::*; diff --git a/rust/switchboard-on-demand/src/anchor_traits.rs b/rust/switchboard-on-demand/src/anchor_traits.rs new file mode 100644 index 0000000..ca0a7e5 --- /dev/null +++ b/rust/switchboard-on-demand/src/anchor_traits.rs @@ -0,0 +1,38 @@ +use borsh::ser::BorshSerialize; +use solana_program::instruction::AccountMeta; +use solana_program::pubkey::Pubkey; + +/// Traits pulled out of anchor-lang library to remove dependency conflicts +/// for users. + +pub trait Discriminator { + const DISCRIMINATOR: [u8; 8]; + fn discriminator() -> [u8; 8] { + Self::DISCRIMINATOR + } +} + +pub trait Owner { + fn owner() -> Pubkey; +} + +pub trait ToAccountMetas { + /// `is_signer` is given as an optional override for the signer meta field. + /// This covers the edge case when a program-derived-address needs to relay + /// a transaction from a client to another program but sign the transaction + /// before the relay. The client cannot mark the field as a signer, and so + /// we have to override the is_signer meta field given by the client. + fn to_account_metas(&self, is_signer: Option) -> Vec; +} + +/// Calculates the data for an instruction invocation, where the data is +/// `Sha256(:)[..8] || BorshSerialize(args)`. +/// `args` is a borsh serialized struct of named fields for each argument given +/// to an instruction. +pub trait InstructionData: Discriminator + BorshSerialize { + fn data(&self) -> Vec { + let mut d = Self::discriminator().to_vec(); + d.append(&mut self.try_to_vec().expect("Should always serialize")); + d + } +} diff --git a/rust/switchboard-on-demand/src/client/event_client.rs b/rust/switchboard-on-demand/src/client/event_client.rs new file mode 100644 index 0000000..8583a03 --- /dev/null +++ b/rust/switchboard-on-demand/src/client/event_client.rs @@ -0,0 +1,322 @@ +use async_trait::async_trait; +use anchor_lang::Event; +use solana_sdk::commitment_config::CommitmentConfig; +use solana_client::nonblocking::pubsub_client; +use solana_client::rpc_config::{RpcTransactionLogsConfig, RpcTransactionLogsFilter}; +use solana_program::pubkey::Pubkey; +use crate::OnDemandError; +use base64::engine::general_purpose; +use base64::Engine; +use futures::StreamExt; +use tokio::sync::mpsc; +use tokio::time::Duration; +use tokio_util::sync::CancellationToken; +use std::collections::HashMap; +use std::marker::PhantomData; +use std::sync::Arc; + +// Create a sender trait so we can handle both bounded and unbounded channels +// Then implement the trait for both mpsc::Sender and mpsc::UnboundedSender +// Originally I used an enum for each channel type but dynamic dispatch introduces performance concerns + +#[async_trait] +pub trait EventSenderTrait: Send + Sync { + async fn send(&self, event: E) -> Result<(), OnDemandError>; +} + +#[async_trait] +impl EventSenderTrait for mpsc::Sender +where + E: Event + Send + Sync + 'static, +{ + async fn send(&self, event: E) -> Result<(), OnDemandError> { + self.send(event).await.map_err(|_e| OnDemandError::NetworkError) + } +} + +#[async_trait] +impl EventSenderTrait for mpsc::UnboundedSender +where + E: Event + Send + Sync + 'static, +{ + async fn send(&self, event: E) -> Result<(), OnDemandError> { + self.send(event).map_err(|_e| OnDemandError::NetworkError) + } +} + +#[async_trait] +pub trait EventHandler: Send + Sync { + async fn handle_event(&self, data: &[u8]) -> Result<(), OnDemandError>; +} + +pub struct EventHandlerImpl +where + E: Event + Send + Sync + 'static, + S: EventSenderTrait, +{ + sender: Arc, + _marker: PhantomData, +} + +#[async_trait] +impl EventHandler for EventHandlerImpl +where + E: Event + Send + Sync + 'static, + S: EventSenderTrait, +{ + async fn handle_event(&self, data: &[u8]) -> Result<(), OnDemandError> { + match E::try_from_slice(data) { + Ok(event) => self.sender.send(event).await, + Err(_) => Err(OnDemandError::AnchorParseError), + } + } +} + +impl EventHandlerImpl +where + E: Event + Send + Sync + 'static, + S: EventSenderTrait, +{ + pub fn new(sender: S) -> Self { + EventHandlerImpl { + sender: Arc::new(sender), + _marker: PhantomData, + } + } +} + +/// A builder for creating a new PubSubEventClient +/// ``` +/// use tokio::sync::mpsc; +/// use switchboard_solana::{ FunctionVerifyEvent, *SWITCHBOARD_ON_DEMAND_PROGRAM_ID }; +/// +/// +/// let (fn_verify_sender, mut fn_verify_recv) = tokio::sync::mpsc::unbounded_channel::(); +/// +/// let event_watcher = pubsub::PubSubEventClientBuilder::new(*SWITCHBOARD_ON_DEMAND_PROGRAM_ID, "https://api.mainnet-beta.solana.com".to_string()) +/// .add_event_handler(fn_verify_sender); +/// +/// let handler = tokio::spawn(async move { +/// loop { +/// tokio::select! { +/// Some(event) = fn_verify_recv.recv() => { +/// info!("[Rpc][Event] FunctionVerifyEvent - Function: {:?}", event.function); +/// } +/// } +/// } +/// }); +/// +/// tokio::select! { +/// _ = handler => { +/// info!("[Rpc] handler exited"); +/// return Ok(()); +/// } +/// _ = event_watcher.start() => { +/// info!("[Rpc] event_watcher exited"); +/// return Ok(()); +/// } +/// } +/// ```` +pub struct PubSubEventClientBuilder { + program_id: Pubkey, + websocket_url: String, + + /// Other pubkeys to watch for mentions in order to process logs + other_pubkeys: Vec, + + /// The maximum number of times to retry connecting to the websocket. + /// None means the websocket will continiously retry. + max_retries: Option, +} + +pub struct PubSubEventClientWithHandlers { + program_id: Pubkey, + websocket_url: String, + other_pubkeys: Vec, + + // The maximum number of times to retry connecting to the websocket + max_retries: Option, + + cancellation_token: CancellationToken, + + event_handlers: HashMap<[u8; 8], Box>, +} + +impl PubSubEventClientBuilder { + // Creates a new builder with the provided WebSocket URL + pub fn new(program_id: Pubkey, websocket_url: String) -> Self { + Self { + program_id, + websocket_url: websocket_url + .replace("https://", "wss://") + .replace("http://", "ws://"), + other_pubkeys: Vec::new(), + + max_retries: None, + } + } + + pub fn mentions(mut self, pubkey: Pubkey) -> Self { + self.other_pubkeys.push(pubkey); + self + } + + pub fn set_max_retries(mut self, max_retries: i32) -> Self { + self.max_retries = Some(max_retries); + self + } + + pub fn add_event_handler + 'static>( + self, + sender: S, + ) -> PubSubEventClientWithHandlers { + PubSubEventClientWithHandlers { + program_id: self.program_id, + websocket_url: self.websocket_url, + other_pubkeys: self.other_pubkeys, + max_retries: self.max_retries, + cancellation_token: CancellationToken::new(), + event_handlers: HashMap::from([( + E::DISCRIMINATOR, + Box::new(EventHandlerImpl::::new(sender)) as Box, + )]), + } + } +} + +impl PubSubEventClientWithHandlers { + pub fn mentions(mut self, pubkey: Pubkey) -> Self { + self.other_pubkeys.push(pubkey); + self + } + + pub fn set_max_retries(mut self, max_retries: i32) -> Self { + self.max_retries = Some(max_retries); + self + } + + pub fn add_event_handler + 'static>( + mut self, + sender: S, + ) -> PubSubEventClientWithHandlers { + self.event_handlers.insert( + E::DISCRIMINATOR, + Box::new(EventHandlerImpl::::new(sender)) as Box, + ); + self + } + + pub fn abort(self) { + self.cancellation_token.cancel(); + } + + pub async fn start(self) { + let cancellation_token = self.cancellation_token.clone(); + tokio::select! { + _ = cancellation_token.cancelled() => { + // Perform cleanup + log::info!("pubsub token cancelled"); + }, + _ = self.start_pubsub() => { + // Perform cleanup + log::info!("start_pubsub returned unexpectedly"); + } + } + } + + // Starts the client + async fn start_pubsub(&self) { + let mut retry_count = 0; + // let max_retries = 3; + let mut delay = Duration::from_millis(500); // start with a 500ms delay + + loop { + // Create the pubsub client every iteration in case the internal channel closed + let pubsub_client = pubsub_client::PubsubClient::new(&self.websocket_url) + .await + .expect("Failed to create pubsub client"); + + // Attempt to connect + let connection_result = pubsub_client + .logs_subscribe( + RpcTransactionLogsFilter::Mentions( + vec![ + vec![self.program_id.to_string()], + self.other_pubkeys + .iter() + .map(|pubkey| pubkey.to_string()) + .collect(), + ] + .concat(), + ), + RpcTransactionLogsConfig { + commitment: Some(CommitmentConfig::processed()), + }, + ) + .await; + + match connection_result { + Ok((mut stream, _handler)) => { + retry_count = 0; // Reset retry count on successful connection + delay = Duration::from_millis(500); // Reset delay on successful connection + + while let Some(event) = stream.next().await { + // TODO: A better implementation might immediately spawn a new task to handle the event so we dont block here. We could push to a FIFO queue and have some workers ready to handle the events + + // Handle the rpc log event + for line in event.value.logs { + if let Some(encoded_data) = line.strip_prefix("Program data: ") { + if let Ok(decoded_data) = + general_purpose::STANDARD.decode(encoded_data) + { + if decoded_data.len() <= 8 { + continue; + } + + // Found a valid base64 string. Let's try to match a discriminator + let (disc, event_data) = decoded_data.split_at(8); + if let Some(sender) = self.event_handlers.get(disc) { + let _ = sender.handle_event(event_data).await; + } + } + } + } + } + + log::error!("[EVENT][WEBSOCKET] connection closed, attempting to reconnect..."); + } + Err(e) => { + log::error!("[EVENT][WEBSOCKET] Failed to connect: {:?}", e); + + match self.max_retries { + Some(max_retries) => { + if retry_count >= max_retries { + log::error!("[EVENT][WEBSOCKET] Maximum retry attempts reached, aborting..."); + break; + } + + tokio::time::sleep(delay).await; // wait before retrying + retry_count += 1; + delay = std::cmp::min(delay * 2, Duration::from_secs(5)); + // Double the delay for next retry, up to 5 seconds + } + None => { + tokio::time::sleep(delay).await; // wait before retrying + retry_count += 1; + delay = std::cmp::min(delay * 2, Duration::from_secs(5)); + // Double the delay for next retry, up to 5 seconds + continue; + } + } + } + } + + if let Some(max_retries) = self.max_retries { + if retry_count >= max_retries { + log::error!("[EVENT][WEBSOCKET] Maximum retry attempts reached, aborting..."); + break; + } + } + } + } +} diff --git a/rust/switchboard-on-demand/src/client/mod.rs b/rust/switchboard-on-demand/src/client/mod.rs new file mode 100644 index 0000000..66bf2ea --- /dev/null +++ b/rust/switchboard-on-demand/src/client/mod.rs @@ -0,0 +1,8 @@ +mod utils; +pub use utils::*; + +mod transaction_builder; +pub use transaction_builder::*; + +mod event_client; +pub use event_client::*; diff --git a/rust/switchboard-on-demand/src/client/transaction_builder.rs b/rust/switchboard-on-demand/src/client/transaction_builder.rs new file mode 100644 index 0000000..255a73c --- /dev/null +++ b/rust/switchboard-on-demand/src/client/transaction_builder.rs @@ -0,0 +1,817 @@ +use crate::*; + +use solana_program::pubkey::Pubkey; +use solana_program::instruction::Instruction; +use solana_address_lookup_table_program::state::AddressLookupTable; +use solana_client::nonblocking::rpc_client::RpcClient; +use solana_program::address_lookup_table_account::AddressLookupTableAccount; +use solana_program::hash::Hash; +use solana_sdk::compute_budget::ComputeBudgetInstruction; +use solana_program::message::v0; +use solana_program::message::VersionedMessage; +use solana_sdk::signer::Signer; +use solana_sdk::transaction::VersionedTransaction; +use tokio::sync::RwLockReadGuard; +use std::ops::Deref; +use std::sync::Arc; +use solana_sdk::transaction::Transaction; +pub use solana_sdk::signer::keypair::Keypair; + +/// A trait for types that can act as signers for transactions. +pub trait AsSigner: Send + Sync { + /// Returns a reference to the signer. + fn as_signer(&self) -> &dyn Signer; + + fn signer_pubkey(&self) -> Pubkey { + self.as_signer().pubkey() + } +} + +pub trait ToKeypair: Send + Sync { + fn keypair(&self) -> &Keypair; +} + +// Implement AsSigner for any type that implements ToKeypair +impl AsSigner for T +where + T: ToKeypair, +{ + fn as_signer(&self) -> &dyn Signer { + // Use the keypair method from the ToKeypair trait to get the Keypair + // and then return a reference to it as a &dyn Signer. + // The Keypair struct already implements the Signer trait. + self.keypair() + } +} + +// Implementations + +impl ToKeypair for Keypair { + fn keypair(&self) -> &Keypair { + &self + } +} +impl<'a> ToKeypair for &'a Keypair { + fn keypair(&self) -> &'a Keypair { + self + } +} + +// Arc + +impl ToKeypair for Arc { + fn keypair(&self) -> &Keypair { + &self + } +} +impl<'a> AsSigner for Arc<&'a Keypair> { + fn as_signer(&self) -> &dyn Signer { + *self.as_ref() + } +} +impl<'a> ToKeypair for &'a Arc { + fn keypair(&self) -> &Keypair { + &self + } +} +impl ToKeypair for Arc> { + fn keypair(&self) -> &Keypair { + &self.as_ref() + } +} +impl ToKeypair for Arc>> { + fn keypair(&self) -> &Keypair { + &self.as_ref().as_ref() + } +} + +// Box + +impl ToKeypair for Box +where + T: ToKeypair + ?Sized, +{ + fn keypair(&self) -> &Keypair { + self.as_ref().keypair() + } +} + +// ArcSwap + +impl ToKeypair for arc_swap::Guard> +where + T: ToKeypair, +{ + fn keypair(&self) -> &Keypair { + self.deref().keypair() + } +} + +// Tokio RwLock + +impl<'a, T> ToKeypair for RwLockReadGuard<'a, T> +where + T: ToKeypair + ?Sized, +{ + fn keypair(&self) -> &Keypair { + self.deref().keypair() + } +} + +impl<'a, T> ToKeypair for Arc> +where + T: ToKeypair + ?Sized, +{ + fn keypair(&self) -> &Keypair { + self.as_ref().keypair() + } +} + +impl<'a> AsSigner for &RwLockReadGuard<'a, Keypair> { + fn as_signer(&self) -> &dyn Signer { + (*self).deref() + } +} +impl<'a> AsSigner for &Arc> { + fn as_signer(&self) -> &dyn Signer { + self.as_ref().deref() + } +} + +/// Represents a transaction object used for building Solana transactions. +/// +/// The `TransactionBuilder` struct provides methods for constructing and manipulating Solana transactions. +/// It allows setting the payer, adding instructions, signers, and other transaction parameters. +/// The transaction can be converted to a legacy transaction format or executed directly using the Solana RPC client. +/// +/// # Examples +/// +/// Creating a new transaction object with a payer: +/// +/// ```rust +/// use solana_sdk::pubkey::Pubkey; +/// use solana_sdk::instruction::Instruction; +/// use std::sync::Arc; +/// +/// let payer = Pubkey::new_unique(); +/// let transaction = TransactionBuilder::new(payer); +/// ``` +/// +/// Adding an instruction to the transaction: +/// +/// ```rust +/// use solana_sdk::pubkey::Pubkey; +/// use solana_sdk::instruction::Instruction; +/// use std::sync::Arc; +/// +/// let payer = Pubkey::new_unique(); +/// let instruction = Instruction::new_with_bincode(program_id, data); +/// let transaction = TransactionBuilder::new(payer) +/// .add_ix(instruction); +/// ``` +/// +/// Converting the transaction object to a legacy transaction: +/// +/// ```rust +/// use solana_sdk::pubkey::Pubkey; +/// use solana_sdk::instruction::Instruction; +/// use std::sync::Arc; +/// +/// let payer = Pubkey::new_unique(); +/// let instruction = Instruction::new_with_bincode(program_id, data); +/// let transaction = TransactionBuilder::new(payer) +/// .add_ix(instruction) +/// .to_legacy_tx(); +/// ``` +#[derive(Default, Clone)] +pub struct TransactionBuilder { + payer: Pubkey, + ixs: Vec, + compute_units: Option, + priority_fees: Option, + recent_blockhash: Option, + min_context_slot: Option, + address_lookup_tables: Vec, + signers: Vec>, +} +impl TransactionBuilder { + pub fn new(payer: Pubkey) -> Self { + Self { + payer, + ..Default::default() + } + } + pub fn new_with_payer(payer: Arc) -> Self { + Self { + payer: payer.as_signer().pubkey(), + signers: vec![Arc::clone(&payer)], + ..Default::default() + } + } + + pub fn new_with_ixs(payer: Pubkey, ixs: impl IntoIterator) -> Self { + Self { + payer, + ixs: ixs.into_iter().collect::>(), + ..Default::default() + } + } + pub fn new_with_payer_and_ixs( + payer: Arc, + ixs: impl IntoIterator, + ) -> Self { + Self { + payer: payer.as_signer().pubkey(), + signers: vec![Arc::clone(&payer)], + ixs: ixs.into_iter().collect::>(), + ..Default::default() + } + } + + // Builder methods, consumes self and returns self + pub fn set_compute_units(mut self, compute_units: u32) -> Self { + self.compute_units = Some(compute_units); + self + } + pub fn set_priority_fees(mut self, priority_fees: u64) -> Self { + self.priority_fees = Some(priority_fees); + self + } + pub fn add_ix(mut self, ix: Instruction) -> Self { + self.ixs.push(ix); + self + } + pub fn has_signer(&self, signer: Pubkey) -> bool { + self.signers + .iter() + .find(|s| s.as_signer().pubkey() == signer) + .is_some() + } + pub fn has_payer(&self) -> bool { + self.has_signer(self.payer) + } + pub fn add_signer(mut self, signer: Arc) -> TransactionBuilder { + let signer_key = signer.as_signer().pubkey(); + if let None = self + .signers + .iter() + .find(|s| s.as_signer().pubkey() == signer_key) + { + self.signers.push(Arc::clone(&signer)); + } + + self + } + pub fn add_signers(mut self, signers: Vec>) -> TransactionBuilder { + for signer in signers { + let signer_key = signer.as_signer().pubkey(); + if let None = self + .signers + .iter() + .find(|s| s.as_signer().pubkey() == signer_key) + { + self.signers.push(Arc::clone(&signer)); + } + } + + self + } + pub fn set_recent_blockhash(mut self, blockhash: Hash) -> Self { + self.recent_blockhash = Some(blockhash); + self + } + pub fn set_min_context_slot(mut self, min_context_slot: u64) -> Self { + self.min_context_slot = Some(min_context_slot); + self + } + + pub fn add_address_lookup_account( + mut self, + address_lookup_table: AddressLookupTableAccount, + ) -> Self { + self.address_lookup_tables.push(address_lookup_table); + self + } + pub fn add_address_lookup_accounts( + mut self, + mut address_lookup_tables: &mut Vec, + ) -> Self { + self.address_lookup_tables + .append(&mut address_lookup_tables); + self + } + pub async fn add_address_lookup_table( + mut self, + rpc: &RpcClient, + address_lookup_table_pubkey: Pubkey, + ) -> Self { + if let Ok(address_lookup_table) = + TransactionBuilder::fetch_address_lookup_account(rpc, address_lookup_table_pubkey).await + { + self = self.add_address_lookup_account(address_lookup_table); + } + + self + } + pub async fn add_address_lookup_tables( + mut self, + rpc: &RpcClient, + address_lookup_table_pubkeys: Vec, + ) -> Self { + if let Ok(mut address_lookup_tables) = + TransactionBuilder::fetch_multiple_address_lookup_accounts( + rpc, + address_lookup_table_pubkeys, + ) + .await + { + self = self.add_address_lookup_accounts(&mut address_lookup_tables); + } + + self + } + + // Getters + pub fn payer(&self) -> Pubkey { + self.payer + } + + /// Return a vec of all of the required signers for the transaction. + pub fn required_signers(&self) -> Vec { + let mut signers_required: Vec = vec![]; + for ixn in self.ixs.clone() { + for account in ixn.accounts { + if account.is_signer && !signers_required.contains(&account.pubkey) { + signers_required.push(account.pubkey); + } + } + } + signers_required + } + + /// Returns the stored signers for the transaction, removing any un-needed signers using the provided ixn's AccountMeta's. + pub fn signers(&self) -> Result, OnDemandError> { + let mut signers: Vec<&dyn Signer> = vec![]; + for required_signer in self.required_signers().iter() { + let mut found = false; + + for signer in &self.signers { + let signer_key = signer.as_signer().pubkey(); + if signer_key == *required_signer { + found = true; + signers.push(signer.as_signer()); + break; + } + } + if !found { + return Err(OnDemandError::SolanaMissingSigner); + } + } + + Ok(signers) + } + fn signers_with_payer<'a, T: AsSigner>( + &'a self, + payer: &'a T, + ) -> Result, OnDemandError> { + let payer_signer = payer.as_signer(); + + if payer_signer.pubkey() != self.payer { + return Err(OnDemandError::SolanaPayerMismatch); + } + + let mut signers: Vec<&dyn Signer> = vec![]; + for required_signer in self.required_signers().iter() { + if required_signer == &self.payer { + signers.push(payer_signer); + continue; + } + + let mut found = false; + + for signer in self.signers.iter() { + let signer_key = signer.as_signer().pubkey(); + if signer_key == *required_signer { + found = true; + signers.push(signer.as_signer()); + break; + } + } + if !found { + return Err(OnDemandError::SolanaMissingSigner); + } + } + + Ok(signers) + } + pub fn ixs(&self) -> Result, OnDemandError> { + if self.ixs.len() == 0 { + return Err(OnDemandError::SolanaInstructionsEmpty); + } + + let mut pre_ixs = vec![]; + + if let Some(compute_units) = self.compute_units { + pre_ixs.push(ComputeBudgetInstruction::set_compute_unit_limit( + std::cmp::max(std::cmp::min(compute_units, 1_400_000), 200_000), + )); + } + // want this first so we unshift last + if let Some(priority_fees) = self.priority_fees { + pre_ixs.push(ComputeBudgetInstruction::set_compute_unit_price( + std::cmp::min(10_000, priority_fees), + )); + } + + let ixs = vec![pre_ixs, self.ixs.clone()].concat(); + + if ixs.len() > 10 { + return Err(OnDemandError::SolanaInstructionOverflow); + } + + Ok(ixs) + } + pub fn build_legacy_tx( + payer: Pubkey, + ixs: Vec, + signers: Vec<&dyn Signer>, + recent_blockhash: Hash, + ) -> Result { + let mut tx = Transaction::new_with_payer(&ixs, Some(&payer)); + tx.try_sign(&signers, recent_blockhash).map_err(|_| OnDemandError::SolanaSignError)?; + Ok(tx) + } + pub fn to_legacy_tx(&self) -> Result { + if !self.has_payer() { + return Err(OnDemandError::SolanaPayerSignerMissing); + } + + TransactionBuilder::build_legacy_tx( + self.payer, + self.ixs()?, + self.signers()?, + self.recent_blockhash.unwrap_or_default(), + ) + } + pub fn to_legacy_tx_with_payer( + &self, + payer: T, + ) -> Result { + if payer.as_signer().pubkey() != self.payer { + return Err(OnDemandError::SolanaPayerMismatch); + } + + TransactionBuilder::build_legacy_tx( + self.payer, + self.ixs()?, + self.signers_with_payer(&payer)?, + self.recent_blockhash.unwrap_or_default(), + ) + } + pub fn to_legacy_tx_with_payer_and_blockhash( + &self, + payer: T, + recent_blockhash: Option, + ) -> Result { + if payer.as_signer().pubkey() != self.payer { + return Err(OnDemandError::SolanaPayerMismatch); + } + + TransactionBuilder::build_legacy_tx( + self.payer, + self.ixs()?, + self.signers_with_payer(&payer)?, + recent_blockhash.unwrap_or(self.recent_blockhash.unwrap_or_default()), + ) + } + pub fn to_legacy_tx_with_blockhash( + &self, + recent_blockhash: Option, + ) -> Result { + TransactionBuilder::build_legacy_tx( + self.payer, + self.ixs()?, + self.signers()?, + self.recent_blockhash + .unwrap_or(recent_blockhash.unwrap_or_default()), + ) + } + + pub async fn fetch_address_lookup_account( + rpc: &RpcClient, + address_lookup_table_pubkey: Pubkey, + ) -> Result { + let account = rpc + .get_account(&address_lookup_table_pubkey) + .await + .map_err(|_e| OnDemandError::NetworkError)?; + let address_lookup_table = + AddressLookupTable::deserialize(&account.data).map_err(|_| OnDemandError::AccountDeserializeError)?; + let address_lookup_table_account = AddressLookupTableAccount { + key: address_lookup_table_pubkey, + addresses: address_lookup_table.addresses.to_vec(), + }; + Ok(address_lookup_table_account) + } + + pub async fn fetch_multiple_address_lookup_accounts( + rpc: &RpcClient, + address_lookup_pubkeys: Vec, + ) -> Result, OnDemandError> { + let address_lookup_accounts: Vec = + if address_lookup_pubkeys.is_empty() { + vec![] + } else { + let accounts = rpc + .get_multiple_accounts(&address_lookup_pubkeys) + .await + .map_err(|_| OnDemandError::NetworkError)?; + + let mut address_lookup_accounts: Vec = vec![]; + for (i, account) in accounts.iter().enumerate() { + let account = account.as_ref().ok_or(OnDemandError::AccountNotFound)?; + let address_lookup_table = AddressLookupTable::deserialize(&account.data) + .map_err(|_| OnDemandError::AccountDeserializeError)?; + let address_lookup_table_account = AddressLookupTableAccount { + key: address_lookup_pubkeys[i], + addresses: address_lookup_table.addresses.to_vec(), + }; + address_lookup_accounts.push(address_lookup_table_account); + } + + address_lookup_accounts + }; + + Ok(address_lookup_accounts) + } + + pub fn build_v0_tx( + payer: Pubkey, + ixs: Vec, + signers: Vec<&dyn Signer>, + address_lookup_accounts: Vec, + recent_blockhash: Hash, + ) -> Result { + let v0_message = + v0::Message::try_compile(&payer, &ixs, &address_lookup_accounts, recent_blockhash) + .unwrap(); + + let v0_tx = VersionedTransaction::try_new(VersionedMessage::V0(v0_message), &signers) + .unwrap(); + + Ok(v0_tx) + } + + pub fn to_v0_tx(&self) -> Result { + TransactionBuilder::build_v0_tx( + self.payer, + self.ixs()?, + self.signers()?, + self.address_lookup_tables.clone(), + self.recent_blockhash.unwrap_or_default(), + ) + } + + pub fn to_v0_tx_with_payer( + &self, + payer: T, + ) -> Result { + if payer.as_signer().pubkey() != self.payer { + return Err(OnDemandError::SolanaPayerMismatch); + } + + TransactionBuilder::build_v0_tx( + self.payer, + self.ixs()?, + self.signers_with_payer(&payer)?, + self.address_lookup_tables.clone(), + self.recent_blockhash.unwrap_or_default(), + ) + .into() + } +} + +impl TryFrom for Transaction { + type Error = OnDemandError; + + fn try_from(builder: TransactionBuilder) -> Result { + builder.to_legacy_tx() + } +} + +impl TryFrom for VersionedTransaction { + type Error = OnDemandError; + + fn try_from(builder: TransactionBuilder) -> Result { + builder.to_v0_tx() + } +} +// Types for TypeState builder pattern + +// #[derive(Default, Clone)] +// pub struct EmptyIxs; + +// #[derive(Default, Clone)] +// pub struct TransactionIxs(Vec); + +// #[derive(Default, Clone)] +// pub struct TransactionBuilderV0 { +// payer: Pubkey, +// ixs: U, +// compute_units: Option, +// priority_fees: Option, +// recent_blockhash: Option, +// min_context_slot: Option, +// address_lookup_tables: Vec, +// signers: Vec>, +// } +// impl TransactionBuilderV0 { +// pub fn new(payer: Pubkey) -> Self { +// Self { +// payer, +// ..Default::default() +// } +// } + +// pub fn add_ix(&self, ix: Instruction) -> TransactionBuilderV0 { +// TransactionBuilderV0 { +// payer: self.payer, +// ixs: TransactionIxs(vec![ix]), +// compute_units: self.compute_units, +// priority_fees: self.priority_fees, +// recent_blockhash: self.recent_blockhash, +// min_context_slot: self.min_context_slot, +// address_lookup_tables: self.address_lookup_tables.clone(), +// signers: self.signers.clone(), +// } +// } +// } + +#[cfg(test)] +mod tests { + use super::*; + + use solana_sdk::signer::keypair::Keypair; + use tokio::sync::{OnceCell, RwLock}; + + // #[test] + // fn test_missing_signer() { + // let program_id = Pubkey::new_unique(); + // let payer = Arc::new(Keypair::new()); + // let missing_signer = Arc::new(Keypair::new()); +// + // let ixn = Instruction::new_with_borsh( + // program_id, + // &vec![1u8, 2u8, 3u8, 4u8], + // vec![ + // AccountMeta::new(payer.pubkey(), true), + // AccountMeta::new_readonly(missing_signer.pubkey(), true), // missing signer here + // AccountMeta::new_readonly(Pubkey::new_unique(), false), + // ], + // ); +// + // let mut tx = TransactionBuilder::new(payer.pubkey()).add_ix(ixn); +// + // assert_eq!(tx.ixs().unwrap_or_default().len(), 1); + // assert_eq!(tx.payer(), payer.pubkey()); + // assert!(!tx.has_payer()); +// + // // 1. Should fail with missing payer + // let to_tx_result = tx.to_legacy_tx(); + // assert!(to_tx_result.is_err()); +// + // if let OnDemandError::SolanaPayerSignerMissing(expected_payer) = + // to_tx_result.as_ref().unwrap_err() + // { + // if *expected_payer != payer.pubkey().to_string() { + // panic!("Unexpected error message: {}", to_tx_result.unwrap_err()) + // } + // } else { + // panic!("Unexpected error: {:?}", to_tx_result.unwrap_err()) + // } +// + // // 2. Should fail with missing signer + // let to_tx_result = tx.to_legacy_tx_with_payer(payer.clone()); + // assert!(to_tx_result.is_err()); +// + // if let OnDemandError::SolanaMissingSigner(signer) = to_tx_result.as_ref().unwrap_err() { + // if *signer != missing_signer.pubkey().to_string() { + // panic!("Unexpected error message: {}", to_tx_result.unwrap_err()) + // } + // } else { + // panic!("Unexpected error: {:?}", to_tx_result.unwrap_err()) + // } +// + // // 3. Should succeed with missing signer added + // tx = tx.add_signer(missing_signer); + // let to_tx_result = tx.to_legacy_tx_with_payer(payer.clone()); + // assert!(to_tx_result.is_ok()); + // } + + #[test] + fn test_add_compute_budget_ixs() { + let payer = Arc::new(Keypair::new()); + let payer_pubkey = payer.pubkey(); + + let tx = TransactionBuilder::new_with_payer(payer.clone()) + .add_ix(Instruction::new_with_borsh( + Pubkey::new_unique(), + &vec![1u8, 2u8, 3u8, 4u8], + vec![ + AccountMeta::new(payer_pubkey, true), + AccountMeta::new_readonly(Pubkey::new_unique(), false), + ], + )) + .set_compute_units(750_000); + assert_eq!(tx.ixs().unwrap_or_default().len(), 2); + + let tx = TransactionBuilder::new_with_payer(payer.clone()) + .add_ix(Instruction::new_with_borsh( + Pubkey::new_unique(), + &vec![1u8, 2u8, 3u8, 4u8], + vec![ + AccountMeta::new(payer_pubkey, true), + AccountMeta::new_readonly(Pubkey::new_unique(), false), + ], + )) + .set_priority_fees(500); + assert_eq!(tx.ixs().unwrap_or_default().len(), 2); + + let tx = TransactionBuilder::new_with_payer(payer.clone()) + .add_ix(Instruction::new_with_borsh( + Pubkey::new_unique(), + &vec![1u8, 2u8, 3u8, 4u8], + vec![ + AccountMeta::new(payer_pubkey, true), + AccountMeta::new_readonly(Pubkey::new_unique(), false), + ], + )) + .set_compute_units(750_000) + .set_priority_fees(500); + assert_eq!(tx.ixs().unwrap_or_default().len(), 3); + } + + #[test] + fn test_transaction_builder_with_arc_payer() { + let payer = Arc::new(Keypair::new()); + + let tx = TransactionBuilder::new_with_payer(payer.clone()) + .add_ix(Instruction::new_with_borsh( + Pubkey::new_unique(), + &vec![1u8, 2u8, 3u8, 4u8], + vec![ + AccountMeta::new(payer.signer_pubkey(), true), + AccountMeta::new_readonly(Pubkey::new_unique(), false), + ], + )) + .set_compute_units(750_000); + + assert_eq!(tx.payer, payer.pubkey()); + } + + pub static PAYER_KEYPAIR: OnceCell>>> = OnceCell::const_new(); + + async fn get_payer_keypair() -> &'static Arc>> { + PAYER_KEYPAIR + .get_or_init(|| async { Arc::new(RwLock::new(Arc::new(Keypair::new()))) }) + .await + } + + #[tokio::test] + async fn test_transaction_builder_with_rwlock_payer() { + let payer = get_payer_keypair().await; + let payer_arc = payer.read().await.clone(); + + let tx = TransactionBuilder::new_with_payer(payer_arc.clone()) + .add_ix(Instruction::new_with_borsh( + Pubkey::new_unique(), + &vec![1u8, 2u8, 3u8, 4u8], + vec![ + AccountMeta::new(payer_arc.signer_pubkey(), true), + AccountMeta::new_readonly(Pubkey::new_unique(), false), + ], + )) + .set_compute_units(750_000); + + assert_eq!(tx.payer, payer_arc.pubkey()); + } + + #[tokio::test] + async fn test_transaction_builder_with_arcswap_payer() { + let payer = arc_swap::ArcSwap::new(Arc::new(Keypair::new())); + let payer_arc = payer.load(); + + let tx = TransactionBuilder::new_with_payer(payer_arc.clone()) + .add_ix(Instruction::new_with_borsh( + Pubkey::new_unique(), + &vec![1u8, 2u8, 3u8, 4u8], + vec![ + AccountMeta::new(payer_arc.signer_pubkey(), true), + AccountMeta::new_readonly(Pubkey::new_unique(), false), + ], + )) + .set_compute_units(750_000); + + assert_eq!(tx.payer, payer_arc.pubkey()); + } +} diff --git a/rust/switchboard-on-demand/src/client/utils.rs b/rust/switchboard-on-demand/src/client/utils.rs new file mode 100644 index 0000000..b9fd687 --- /dev/null +++ b/rust/switchboard-on-demand/src/client/utils.rs @@ -0,0 +1,345 @@ +use crate::prelude::*; +use sha2::{Digest, Sha256}; +use solana_client::nonblocking::rpc_client::RpcClient as NonblockingRpcClient; +use solana_sdk::client::SyncClient; +use solana_sdk::signer::keypair::{keypair_from_seed, read_keypair_file, Keypair}; +use solana_sdk::signer::Signer; +use std::env; +use std::result::Result; +use std::str::FromStr; +use std::sync::Arc; +use tokio::sync::RwLock; +use solana_sdk::transaction::Transaction; +use solana_program::message::Message; +use crate::anchor_traits::*; +use solana_program::pubkey::Pubkey; +use anchor_client::anchor_lang::AccountDeserialize; +use borsh::BorshSerialize; + +pub fn ix_to_tx( + ixs: &[Instruction], + signers: &[&Keypair], + blockhash: solana_program::hash::Hash, +) -> Result { + let msg = Message::new(ixs, Some(&signers[0].pubkey())); + let mut tx = Transaction::new_unsigned(msg); + tx.try_sign(&signers.to_vec(), blockhash) + .map_err(|_e| OnDemandError::SolanaSignError)?; + Ok(tx) +} + +pub async fn get_enclave_signer_pubkey( + enclave_signer: &Arc>, +) -> Result, OnDemandError> { + let enclave_signer = enclave_signer.clone(); + let ro_enclave_signer = enclave_signer.read().await; + let pubkey = Arc::new(ro_enclave_signer.pubkey()); + Ok(pubkey) +} + +pub fn load_env_pubkey(key: &str) -> Result { + Pubkey::from_str(&env::var(key).unwrap_or_default()) + .map_err(|_| OnDemandError::EnvVariableMissing) +} + +/// Parse a string into an optional Pubkey. If the string is empty, return None. +pub fn parse_optional_pubkey(var: &str) -> Option { + if var.is_empty() { + None + } else { + match Pubkey::from_str(var) { + Ok(pubkey) => { + if pubkey != Pubkey::default() { + Some(pubkey) + } else { + None + } + } + Err(_) => None, + } + } +} + +/// Generates a keypair from a base seed, secret key, optional additional bytes, and an optional program ID. +/// +/// # Arguments +/// +/// * `base` - The base seed as a string. +/// * `secret_key` - The secret key as a vector of bytes. +/// * `more_bytes` - Optional additional bytes to include in the seed. +/// * `program_id` - Optional program ID to include in the seed. +/// +/// # Returns +/// +/// Returns a `Result` containing an `Arc` if the keypair is successfully derived, or an `OnDemandError` if there is an error. +/// +/// # Errors +/// +/// Returns an `OnDemandError` with the message "InvalidSecretKey" if the length of the secret key is not 32 bytes. +/// Returns an `OnDemandError` with the message "Failed to derive keypair" if there is an error deriving the keypair. +/// +/// # Example +/// +/// ```rust +/// use solana_sdk::pubkey::Pubkey; +/// use solana_sdk::signature::{Keypair, keypair_from_seed}; +/// use solana_sdk::hash::Hash; +/// use sha2::{Digest, Sha256}; +/// use std::sync::Arc; +/// use switchboard_solana::OnDemandError; +/// +/// let base = "base_seed"; +/// let secret_key = vec![0; 32]; +/// let more_bytes = Some(vec![1, 2, 3]); +/// let program_id = Some(Pubkey::new_unique()); +/// +/// let result = switchboard_solana::client::utils::keypair_from_base_seed(base, secret_key, more_bytes, program_id); +/// match result { +/// Ok(keypair) => { +/// // Key pair successfully derived +/// println!("Derived keypair: {:?}", keypair); +/// } +/// Err(error) => { +/// // Error deriving key pair +/// println!("Failed to derive keypair: {:?}", error); +/// } +/// } +/// ``` +pub fn keypair_from_base_seed( + base: &str, + secret_key: Vec, + more_bytes: Option>, + program_id: Option, +) -> Result, OnDemandError> { + if secret_key.len() != 32 { + return Err(OnDemandError::InvalidSecretKey); + } + + let mut seed = base.as_bytes().to_vec(); + seed.extend_from_slice(&secret_key); + + if let Some(bytes) = more_bytes.as_ref() { + seed.extend_from_slice(bytes); + } + + // Optionally, allow the progam ID to be included in the bytes so we + // can create new environments on different program IDs without collisions. + if let Some(program_id) = program_id.as_ref() { + seed.extend_from_slice(&program_id.try_to_vec().unwrap_or_default()); + } else { + seed.extend_from_slice( + &*SWITCHBOARD_ON_DEMAND_PROGRAM_ID + .try_to_vec() + .unwrap_or_default(), + ); + } + + match keypair_from_seed(&Sha256::digest(&seed)) { + Ok(keypair) => Ok(Arc::new(keypair)), + Err(e) => { + if let Some(err) = e.source() { + println!("Failed to derive keypair -- {}", err); + } + + Err(OnDemandError::KeyDerivationFailed) + } + } +} + +pub fn signer_to_pubkey(signer: Arc) -> std::result::Result { + Ok(signer.pubkey()) +} + +pub fn load_keypair_fs(fs_path: &str) -> Result, OnDemandError> { + match read_keypair_file(fs_path) { + Ok(keypair) => Ok(Arc::new(keypair)), + Err(e) => { + if let Some(err) = e.source() { + println!("Failed to read keypair file -- {}", err); + } + + Err(OnDemandError::IoError) + } + } +} + +/// Fetches a zero-copy account from the Solana blockchain. +/// +/// # Arguments +/// +/// * `client` - The Solana RPC client used to interact with the blockchain. +/// * `pubkey` - The public key of the account to fetch. +/// +/// # Returns +/// +/// Returns a result containing the fetched account data as the specified type `T`, or an `OnDemandError` if an error occurs. +/// +/// # Errors +/// +/// This function can return the following errors: +/// +/// * `OnDemandError::AccountNotFound` - If the account with the specified public key is not found. +/// * `OnDemandError::Message("no discriminator found")` - If no discriminator is found in the account data. +/// * `OnDemandError::Message("Discriminator error, check the account type")` - If the discriminator in the account data does not match the expected discriminator for type `T`. +/// * `OnDemandError::Message("AnchorParseError")` - If an error occurs while parsing the account data into type `T`. +pub fn fetch_zerocopy_account( + client: &solana_client::rpc_client::RpcClient, + pubkey: Pubkey, +) -> Result { + let data = client + .get_account_data(&pubkey) + .map_err(|_| OnDemandError::AccountNotFound)?; + + if data.len() < T::discriminator().len() { + return Err(OnDemandError::InvalidDiscriminator); + } + + let mut disc_bytes = [0u8; 8]; + disc_bytes.copy_from_slice(&data[..8]); + if disc_bytes != T::discriminator() { + return Err(OnDemandError::InvalidDiscriminator); + } + + Ok(*bytemuck::try_from_bytes::(&data[8..]) + .map_err(|_| OnDemandError::AnchorParseError)?) +} + +/// Fetches the account data synchronously from the Solana blockchain using the provided client. +/// +/// # Arguments +/// +/// * `client` - The client used to interact with the Solana blockchain. +/// * `pubkey` - The public key of the account to fetch. +/// +/// # Generic Parameters +/// +/// * `C` - The type of the client, which must implement the `SyncClient` trait. +/// * `T` - The type of the account data, which must implement the `bytemuck::Pod`, `Discriminator`, and `Owner` traits. +/// +/// # Returns +/// +/// Returns a `Result` containing the fetched account data of type `T` if successful, or an `OnDemandError` if an error occurs. +pub fn fetch_zerocopy_account_sync( + client: &C, + pubkey: Pubkey, +) -> Result { + let data = client + .get_account_data(&pubkey) + .map_err(|_| OnDemandError::AccountNotFound)? + .ok_or(OnDemandError::AccountNotFound)?; + + if data.len() < T::discriminator().len() { + return Err(OnDemandError::InvalidDiscriminator); + } + + let mut disc_bytes = [0u8; 8]; + disc_bytes.copy_from_slice(&data[..8]); + if disc_bytes != T::discriminator() { + return Err(OnDemandError::InvalidDiscriminator); + } + + Ok(*bytemuck::try_from_bytes::(&data[8..]) + .map_err(|_| OnDemandError::AnchorParseError)?) +} + +/// Fetches an account asynchronously using the provided client and public key. +/// +/// # Arguments +/// +/// * `client` - The non-blocking RPC client used to fetch the account. +/// * `pubkey` - The public key of the account to fetch. +/// +/// # Generic Parameters +/// +/// * `T` - The type of the account data. Must implement `bytemuck::Pod`, `Discriminator`, and `Owner`. +/// +/// # Returns +/// +/// Returns a `Result` containing the fetched account data of type `T` if successful, or an `OnDemandError` if an error occurs. +/// +/// # Errors +/// +/// This function can return the following errors: +/// +/// * `OnDemandError::AccountNotFound` - If the account is not found. +/// * `OnDemandError::Message("no discriminator found")` - If no discriminator is found in the account data. +/// * `OnDemandError::Message("Discriminator error, check the account type")` - If the discriminator does not match the expected value. +/// * `OnDemandError::Message("AnchorParseError")` - If there is an error parsing the account data into type `T`. +/// +/// # Example +/// +/// ```rust +/// use switchboard_solana::client::NonblockingRpcClient; +/// use switchboard_solana::error::OnDemandError; +/// use switchboard_solana::types::{Discriminator, Owner}; +/// use bytemuck::Pod; +/// use solana_sdk::pubkey::Pubkey; +/// +/// async fn example(client: &NonblockingRpcClient, pubkey: Pubkey) -> Result<(), OnDemandError> { +/// let account_data: MyAccountType = fetch_zerocopy_account_async(client, pubkey).await?; +/// // Do something with the fetched account data... +/// Ok(()) +/// } +/// ``` +pub async fn fetch_zerocopy_account_async( + client: &NonblockingRpcClient, + pubkey: Pubkey, +) -> Result { + let data = client + .get_account_data(&pubkey) + .await + .map_err(|_| OnDemandError::AccountNotFound)?; + + if data.len() < T::discriminator().len() { + return Err(OnDemandError::InvalidDiscriminator); + } + + let mut disc_bytes = [0u8; 8]; + disc_bytes.copy_from_slice(&data[..8]); + if disc_bytes != T::discriminator() { + return Err(OnDemandError::InvalidDiscriminator); + } + + Ok(*bytemuck::try_from_bytes::(&data[8..]) + .map_err(|_| OnDemandError::AnchorParseError)?) +} + +pub fn fetch_borsh_account( + client: &solana_client::rpc_client::RpcClient, + pubkey: Pubkey, +) -> Result { + let account_data = client + .get_account_data(&pubkey) + .map_err(|_| OnDemandError::AccountNotFound)?; + + T::try_deserialize(&mut account_data.as_slice()) + .map_err(|_| OnDemandError::AnchorParseError) +} + +pub async fn fetch_borsh_account_async( + client: &NonblockingRpcClient, + pubkey: Pubkey, +) -> Result { + let account_data = client + .get_account_data(&pubkey) + .await + .map_err(|_| OnDemandError::AccountNotFound)?; + + T::try_deserialize(&mut account_data.as_slice()) + .map_err(|_| OnDemandError::AnchorParseError) +} + +pub fn fetch_borsh_account_sync( + client: &C, + pubkey: Pubkey, +) -> Result { + let data = client + .get_account_data(&pubkey) + .map_err(|_| OnDemandError::AccountNotFound)? + .ok_or(OnDemandError::AccountNotFound)?; + + T::try_deserialize(&mut data.as_slice()).map_err(|_| OnDemandError::AnchorParseError) +} + + +// type GenericError = Box; diff --git a/rust/switchboard-on-demand/src/clock.rs b/rust/switchboard-on-demand/src/clock.rs new file mode 100644 index 0000000..cee239c --- /dev/null +++ b/rust/switchboard-on-demand/src/clock.rs @@ -0,0 +1,15 @@ +use crate::OnDemandError; +use futures::TryFutureExt; +use solana_sdk::clock::Clock; + +pub async fn fetch_async( + client: &solana_client::nonblocking::rpc_client::RpcClient, +) -> std::result::Result { + let pubkey = solana_sdk::sysvar::clock::id(); + let data = client + .get_account_data(&pubkey) + .map_err(|_| OnDemandError::AccountNotFound) + .await? + .to_vec(); + bincode::deserialize(&data).map_err(|_| OnDemandError::AccountNotFound) +} diff --git a/rust/switchboard-on-demand/src/decimal.rs b/rust/switchboard-on-demand/src/decimal.rs new file mode 100644 index 0000000..feda2e0 --- /dev/null +++ b/rust/switchboard-on-demand/src/decimal.rs @@ -0,0 +1,220 @@ +// #![allow(unaligned_references)] +use crate::prelude::*; +use borsh::BorshDeserialize; +use borsh::BorshSerialize; +use core::cmp::Ordering; +use rust_decimal::prelude::FromPrimitive; +use rust_decimal::Decimal; + +#[derive(Default, Eq, PartialEq, Copy, Clone, BorshSerialize, BorshDeserialize)] +pub struct BorshDecimal { + pub mantissa: i128, + pub scale: u32, +} +impl From for BorshDecimal { + fn from(s: Decimal) -> Self { + Self { + mantissa: s.mantissa(), + scale: s.scale(), + } + } +} +impl From<&Decimal> for BorshDecimal { + fn from(s: &Decimal) -> Self { + Self { + mantissa: s.mantissa(), + scale: s.scale(), + } + } +} +impl From for BorshDecimal { + fn from(s: SwitchboardDecimal) -> Self { + Self { + mantissa: s.mantissa, + scale: s.scale, + } + } +} +impl From for SwitchboardDecimal { + fn from(val: BorshDecimal) -> Self { + SwitchboardDecimal { + mantissa: val.mantissa, + scale: val.scale, + } + } +} +impl TryInto for &BorshDecimal { + type Error = OnDemandError; + fn try_into(self) -> std::result::Result { + Decimal::try_from_i128_with_scale(self.mantissa, self.scale) + .map_err(|_| OnDemandError::DecimalConversionError) + } +} + +impl TryInto for BorshDecimal { + type Error = OnDemandError; + fn try_into(self) -> std::result::Result { + Decimal::try_from_i128_with_scale(self.mantissa, self.scale) + .map_err(|_| OnDemandError::DecimalConversionError) + } +} + +#[repr(packed)] +#[derive(Default, Debug, Eq, PartialEq, BorshDeserialize)] +pub struct SwitchboardDecimal { + /// The part of a floating-point number that represents the significant digits of that number, and that is multiplied by the base, 10, raised to the power of scale to give the actual value of the number. + pub mantissa: i128, + /// The number of decimal places to move to the left to yield the actual value. + pub scale: u32, +} + +impl SwitchboardDecimal { + pub fn new(mantissa: i128, scale: u32) -> SwitchboardDecimal { + Self { mantissa, scale } + } + pub fn from_rust_decimal(d: Decimal) -> SwitchboardDecimal { + Self::new(d.mantissa(), d.scale()) + } + pub fn from_f64(v: f64) -> SwitchboardDecimal { + let dec = Decimal::from_f64(v).unwrap(); + Self::from_rust_decimal(dec) + } + pub fn scale_to(&self, new_scale: u32) -> i128 { + match { self.scale }.cmp(&new_scale) { + std::cmp::Ordering::Greater => self + .mantissa + .checked_div(10_i128.pow(self.scale - new_scale)) + .unwrap(), + std::cmp::Ordering::Less => self + .mantissa + .checked_mul(10_i128.pow(new_scale - self.scale)) + .unwrap(), + std::cmp::Ordering::Equal => self.mantissa, + } + } + pub fn new_with_scale(&self, new_scale: u32) -> Self { + let mantissa = self.scale_to(new_scale); + SwitchboardDecimal { + mantissa, + scale: new_scale, + } + } +} +impl From for SwitchboardDecimal { + fn from(val: Decimal) -> Self { + SwitchboardDecimal::new(val.mantissa(), val.scale()) + } +} +impl TryInto for &SwitchboardDecimal { + type Error = OnDemandError; + fn try_into(self) -> std::result::Result { + Decimal::try_from_i128_with_scale(self.mantissa, self.scale) + .map_err(|_| OnDemandError::DecimalConversionError) + } +} + +impl TryInto for SwitchboardDecimal { + type Error = OnDemandError; + fn try_into(self) -> std::result::Result { + Decimal::try_from_i128_with_scale(self.mantissa, self.scale) + .map_err(|_| OnDemandError::DecimalConversionError) + } +} + +impl Ord for SwitchboardDecimal { + fn cmp(&self, other: &Self) -> Ordering { + let s: Decimal = self.try_into().unwrap(); + let other: Decimal = other.try_into().unwrap(); + s.cmp(&other) + } +} + +impl PartialOrd for SwitchboardDecimal { + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.cmp(other)) + } + fn lt(&self, other: &Self) -> bool { + let s: Decimal = self.try_into().unwrap(); + let other: Decimal = other.try_into().unwrap(); + s < other + } + fn le(&self, other: &Self) -> bool { + let s: Decimal = self.try_into().unwrap(); + let other: Decimal = other.try_into().unwrap(); + s <= other + } + fn gt(&self, other: &Self) -> bool { + let s: Decimal = self.try_into().unwrap(); + let other: Decimal = other.try_into().unwrap(); + s > other + } + fn ge(&self, other: &Self) -> bool { + let s: Decimal = self.try_into().unwrap(); + let other: Decimal = other.try_into().unwrap(); + s >= other + } +} + +impl From for bool { + fn from(s: SwitchboardDecimal) -> Self { + let dec: Decimal = (&s).try_into().unwrap(); + dec.round().mantissa() != 0 + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn switchboard_decimal_into_rust_decimal() { + let swb_decimal = &SwitchboardDecimal { + mantissa: 12345, + scale: 2, + }; + let decimal: Decimal = swb_decimal.try_into().unwrap(); + assert_eq!(decimal.mantissa(), 12345); + assert_eq!(decimal.scale(), 2); + } + + #[test] + fn empty_switchboard_decimal_is_false() { + let swb_decimal = SwitchboardDecimal { + mantissa: 0, + scale: 0, + }; + let b: bool = swb_decimal.into(); + assert!(!b); + let swb_decimal_neg = SwitchboardDecimal { + mantissa: -0, + scale: 0, + }; + let b: bool = swb_decimal_neg.into(); + assert!(!b); + } + + // #[test] + // fn switchboard_decimal_to_u64() { + // // 1234.5678 + // let swb_decimal = SwitchboardDecimal { + // mantissa: 12345678, + // scale: 4, + // }; + // let b: u64 = swb_decimal.try_into().unwrap(); + // assert_eq!(b, 1234); + // } + // + // #[test] + // fn switchboard_decimal_to_f64() { + // // 1234.5678 + // let swb_decimal = SwitchboardDecimal { + // mantissa: 12345678, + // scale: 4, + // }; + // let b: f64 = swb_decimal.try_into().unwrap(); + // assert_eq!(b, 1234.5678); + // + // let swb_f64 = SwitchboardDecimal::from_f64(1234.5678); + // assert_eq!(swb_decimal, swb_f64); + // } +} diff --git a/rust/switchboard-on-demand/src/instructions.rs b/rust/switchboard-on-demand/src/instructions.rs new file mode 100644 index 0000000..088a31d --- /dev/null +++ b/rust/switchboard-on-demand/src/instructions.rs @@ -0,0 +1 @@ +pub use crate::on_demand::instructions::*; diff --git a/rust/switchboard-on-demand/src/lib.rs b/rust/switchboard-on-demand/src/lib.rs new file mode 100644 index 0000000..0f55111 --- /dev/null +++ b/rust/switchboard-on-demand/src/lib.rs @@ -0,0 +1,45 @@ +#![allow(clippy::result_large_err)] + +mod macros; + +use solana_program::pubkey; +#[allow(unused_imports)] +use std::sync::Arc; + +pub mod decimal; +pub use decimal::*; + +pub mod on_demand; +pub use on_demand::*; + +pub mod utils; +pub use utils::*; + +pub mod anchor_traits; +pub use anchor_traits::*; + +pub mod program_id; +pub use program_id::*; + +pub mod accounts; +pub mod instructions; +pub mod types; + +pub mod prelude; + +pub mod sysvar; +pub use sysvar::*; + +cfg_client! { + use solana_sdk::signer::keypair::Keypair; + pub type AnchorClient = anchor_client::Client>; + mod client; + pub mod clock; + pub use clock::*; +} + +cfg_ipfs! { + pub mod ipfs { + pub use switchboard_common::ipfs::*; + } +} diff --git a/rust/switchboard-on-demand/src/macros.rs b/rust/switchboard-on-demand/src/macros.rs new file mode 100644 index 0000000..3d25415 --- /dev/null +++ b/rust/switchboard-on-demand/src/macros.rs @@ -0,0 +1,143 @@ +/// Macro used to include code if the target_os is not 'solana'. +/// This is intended to be used for code that is primarily for off-chain Switchboard Functions. +#[macro_export] +macro_rules! cfg_client { + ($($item:item)*) => { + $( + #[cfg(all(feature = "client"))] + $item + )* + }; +} + +/// Macro used to include code if the feature 'secrets' is enabled. +/// This is intended to be used for code that is primarily for off-chain Switchboard Secrets. +#[macro_export] +macro_rules! cfg_secrets { + ($($item:item)*) => { + $( + #[cfg(all(feature = "secrets"))] + $item + )* + }; +} + +/// Macro used to include IPFS code if the feature 'ipfs' is enabled. +#[macro_export] +macro_rules! cfg_ipfs { + ($($item:item)*) => { + $( + #[cfg(all(feature = "ipfs"))] + $item + )* + }; +} + +/// Retry a given expression a specified number of times with a delay between each attempt. +/// +/// # Arguments +/// +/// * `attempts` - The number of attempts to make. +/// * `delay_ms` - The delay in milliseconds between each attempt. +/// * `expr` - The expression to be retried. +/// +/// # Returns +/// +/// Returns a `Result` containing the value of the expression if it succeeds within the specified number of attempts, +/// or an error if it fails on all attempts. +/// +/// # Examples +/// ``` +/// use switchboard_solana::retry; +/// +/// // Retry a blockhash fetch 3 times with a delay of 500ms in between each failure +/// let blockhash = retry!(3, 500, rpc.get_latest_blockhash().await) +/// .await +/// .map_err(|e| OnDemandError::SolanaBlockhashFetchError(Arc::new(e)))?; +/// ``` +#[macro_export] +macro_rules! retry { + ($attempts:expr, $delay_ms:expr, $expr:expr) => {{ + async { + let mut attempts = $attempts; + loop { + match $expr { + Ok(val) => break Ok(val), + Err(_) if attempts > 1 => { + attempts -= 1; + tokio::time::sleep(tokio::time::Duration::from_millis($delay_ms)).await; + } + Err(e) => break Err(e), + } + } + } + }}; +} + +/// Retry a given expression a specified number of times with a delay between each attempt. +/// This will block the current thread until a value is resolved or the maximum number of attempts is reached. +/// +/// # Arguments +/// +/// * `attempts` - The number of attempts to make. +/// * `delay_ms` - The delay in milliseconds between each attempt. +/// * `expr` - The expression to be retried. +/// +/// # Returns +/// +/// Returns a `Result` containing the value of the expression if it succeeds within the specified number of attempts, +/// or an error if it fails on all attempts. +/// +/// # Examples +/// ``` +/// use switchboard_solana::blocking_retry; +/// +/// // Retry a blockhash fetch 3 times with a delay of 500ms in between each failure +/// let blockhash = blocking_retry!(3, 500, rpc.get_latest_blockhash()) +/// .map_err(|e| OnDemandError::SolanaBlockhashFetchError(Arc::new(e)))?; +/// ``` +#[macro_export] +macro_rules! blocking_retry { + ($attempts:expr, $delay_ms:expr, $expr:expr) => {{ + let mut attempts = $attempts; + loop { + match $expr { + Ok(val) => break Ok(val), + Err(_) if attempts > 1 => { + attempts -= 1; + std::thread::sleep(tokio::time::Duration::from_millis($delay_ms)); + } + Err(e) => break Err(e), + } + } + }}; +} + +#[macro_export] +macro_rules! impl_account_deserialize { + ($struct_name:ident) => { + use anchor_client; + use anchor_lang::prelude::Error; + use anchor_lang::prelude::ErrorCode; + + impl anchor_client::anchor_lang::AccountDeserialize for $struct_name { + fn try_deserialize(buf: &mut &[u8]) -> Result { + if buf.len() < $struct_name::discriminator().len() { + return Err(ErrorCode::AccountDiscriminatorMismatch.into()); + } + let given_disc = &buf[..8]; + if $struct_name::discriminator() != given_disc { + return Err(ErrorCode::AccountDiscriminatorMismatch.into()); + } + Self::try_deserialize_unchecked(buf) + } + + fn try_deserialize_unchecked(buf: &mut &[u8]) -> Result { + let data: &[u8] = &buf[8..]; + bytemuck::try_from_bytes(data) + .map(|r: &Self| *r) + .map_err(|_| ErrorCode::AccountDidNotDeserialize.into()) + } + } + }; +} diff --git a/rust/switchboard-on-demand/src/on_demand/accounts/mod.rs b/rust/switchboard-on-demand/src/on_demand/accounts/mod.rs new file mode 100644 index 0000000..d876930 --- /dev/null +++ b/rust/switchboard-on-demand/src/on_demand/accounts/mod.rs @@ -0,0 +1,12 @@ +pub mod oracle; +pub mod oracle_stats; +pub mod pull_feed; +pub mod queue; +pub mod state; +pub mod randomness; +pub use oracle::*; +pub use pull_feed::*; +pub use queue::*; +pub use state::*; +pub use randomness::*; +pub use oracle_stats::*; diff --git a/rust/switchboard-on-demand/src/on_demand/accounts/oracle.rs b/rust/switchboard-on-demand/src/on_demand/accounts/oracle.rs new file mode 100644 index 0000000..bcb7743 --- /dev/null +++ b/rust/switchboard-on-demand/src/on_demand/accounts/oracle.rs @@ -0,0 +1,314 @@ +use crate::anchor_traits::*; +use crate::cfg_client; +#[allow(unused_imports)] +use crate::impl_account_deserialize; +use crate::OnDemandError; +use crate::Quote; +use crate::get_sb_program_id; +use solana_program::account_info::AccountInfo; +use solana_program::pubkey::Pubkey; +use solana_program::sysvar::clock::Clock; +use std::cell::Ref; +cfg_client! { + use crate::address_lookup_table; + use crate::find_lut_of; + use solana_sdk::address_lookup_table::AddressLookupTableAccount; +} + +pub const ORACLE_FEED_STATS_SEED: &[u8; 15] = b"OracleFeedStats"; + +#[repr(u8)] +#[derive(Copy, Clone, Default, Debug, Eq, PartialEq)] +pub enum VerificationStatus { + #[default] + None = 0, + VerificationPending = 1 << 0, + VerificationFailure = 1 << 1, + VerificationSuccess = 1 << 2, + VerificationOverride = 1 << 3, +} +impl From for u8 { + fn from(value: VerificationStatus) -> Self { + match value { + VerificationStatus::VerificationPending => 1 << 0, + VerificationStatus::VerificationFailure => 1 << 1, + VerificationStatus::VerificationSuccess => 1 << 2, + VerificationStatus::VerificationOverride => 1 << 3, + _ => 0, + } + } +} +impl From for VerificationStatus { + fn from(value: u8) -> Self { + match value { + 1 => VerificationStatus::VerificationPending, + 2 => VerificationStatus::VerificationFailure, + 4 => VerificationStatus::VerificationSuccess, + 8 => VerificationStatus::VerificationOverride, + _ => VerificationStatus::default(), + } + } +} + +#[repr(C)] +#[derive(bytemuck::Zeroable, bytemuck::Pod, Debug, Copy, Clone)] +pub struct OracleAccountData { + /// Represents the state of the quote verifiers enclave. + pub enclave: Quote, + + // Accounts Config + /// The authority of the EnclaveAccount which is permitted to make account changes. + pub authority: Pubkey, + /// Queue used for attestation to verify a MRENCLAVE measurement. + pub queue: Pubkey, + + // Metadata Config + /// The unix timestamp when the quote was created. + pub created_at: i64, + + /// The last time the quote heartbeated on-chain. + pub last_heartbeat: i64, + + pub secp_authority: [u8; 64], + + /// URI location of the verifier's gateway. + pub gateway_uri: [u8; 64], + pub permissions: u64, + /// Whether the quote is located on the AttestationQueues buffer. + pub is_on_queue: u8, + _padding1: [u8; 7], + pub lut_slot: u64, + pub last_reward_epoch: u64, + + _ebuf4: [u8; 16], + _ebuf3: [u8; 32], + _ebuf2: [u8; 64], + _ebuf1: [u8; 1024], +} + +cfg_client! { + impl_account_deserialize!(OracleAccountData); +} + +impl Discriminator for OracleAccountData { + const DISCRIMINATOR: [u8; 8] = [128, 30, 16, 241, 170, 73, 55, 54]; +} + +impl Owner for OracleAccountData { + fn owner() -> Pubkey { + let cluster = std::env::var("CLUSTER").unwrap_or("mainnet".to_string()); + get_sb_program_id(&cluster) + } +} + +impl OracleAccountData { + pub fn size() -> usize { + 8 + std::mem::size_of::() + } + + /// Returns the deserialized Switchboard Quote account + /// + /// # Arguments + /// + /// * `quote_account_info` - A Solana AccountInfo referencing an existing Switchboard QuoteAccount + /// + /// # Examples + /// + /// ```ignore + /// use switchboard_on_demand::OracleAccountData; + /// + /// let quote_account = OracleAccountData::new(quote_account_info)?; + /// ``` + pub fn new<'info>( + quote_account_info: &'info AccountInfo<'info>, + ) -> Result, OnDemandError> { + let data = quote_account_info + .try_borrow_data() + .map_err(|_| OnDemandError::AccountBorrowError)?; + if data.len() < OracleAccountData::discriminator().len() { + return Err(OnDemandError::InvalidDiscriminator); + } + + let mut disc_bytes = [0u8; 8]; + disc_bytes.copy_from_slice(&data[..8]); + if disc_bytes != OracleAccountData::discriminator() { + return Err(OnDemandError::InvalidDiscriminator); + } + + Ok(Ref::map(data, |data| { + bytemuck::from_bytes(&data[8..std::mem::size_of::() + 8]) + })) + } + + /// Returns the deserialized Switchboard Quote account + /// + /// # Arguments + /// + /// * `data` - A Solana AccountInfo's data buffer + /// + /// # Examples + /// + /// ```ignore + /// use switchboard_on_demand::OracleAccountData; + /// + /// let quote_account = OracleAccountData::new(quote_account_info.try_borrow_data()?)?; + /// ``` + pub fn new_from_bytes(data: &[u8]) -> Result<&OracleAccountData, OnDemandError> { + if data.len() < OracleAccountData::discriminator().len() { + return Err(OnDemandError::InvalidDiscriminator); + } + + let mut disc_bytes = [0u8; 8]; + disc_bytes.copy_from_slice(&data[..8]); + if disc_bytes != OracleAccountData::discriminator() { + return Err(OnDemandError::InvalidDiscriminator); + } + + Ok(bytemuck::from_bytes( + &data[8..std::mem::size_of::() + 8], + )) + } + + pub fn signer(&self) -> Pubkey { + self.enclave.enclave_signer + } + + pub fn is_stale(&self, clock: &Clock) -> bool { + let staleness_minutes = (clock.unix_timestamp - self.last_heartbeat) / 60; + staleness_minutes > 30 + } + + pub fn is_verified(&self, clock: &Clock) -> bool { + match self.enclave.verification_status.into() { + VerificationStatus::VerificationOverride => true, + VerificationStatus::VerificationSuccess => { + self.enclave.valid_until > clock.unix_timestamp + } + _ => false, + } + } + + pub fn verify(&self, clock: &Clock) -> std::result::Result<(), OnDemandError> { + if !self.is_verified(clock) { + return Err(OnDemandError::InvalidQuote); + } + + Ok(()) + } + + pub fn gateway_uri(&self) -> Option { + let uri = self.gateway_uri; + let uri = String::from_utf8_lossy(&uri); + let uri = uri + .split_at(uri.find('\0').unwrap_or(uri.len())) + .0 + .to_string(); + if uri.is_empty() { + return None; + } + Some(uri) + } + + pub fn ed25519_signer(&self) -> Option { + let key = self.enclave.enclave_signer; + if key == Pubkey::default() { + return None; + } + Some(key) + } + + + pub fn secp_authority(&self) -> Option<[u8; 64]> { + let key = self.secp_authority; + if key == [0u8; 64] { + return None; + } + Some(key) + } + + pub fn secp256k1_signer(&self) -> Option<[u8; 64]> { + let key = self.enclave.secp256k1_signer; + if key == [0u8; 64] { + return None; + } + Some(key) + } + + pub fn libsecp256k1_signer(&self) -> Option { + let bytes = self.secp256k1_signer()?; + let tag_full_pubkey: Vec = vec![4u8]; + let bytes = [tag_full_pubkey, bytes.into()].concat().try_into().ok()?; + libsecp256k1::PublicKey::parse(&bytes).ok() + } + + pub fn stats_key(key: &Pubkey) -> Pubkey { + let pid = OracleAccountData::owner(); + let oracle_stats_seed = b"OracleStats"; + let (key, _) = Pubkey::find_program_address( + &[ + &oracle_stats_seed.as_slice(), + &key.to_bytes(), + ], + &pid, + ); + key + } + + pub fn feed_stats_key(feed: &Pubkey, oracle: &Pubkey) -> (Pubkey, u8) { + let pid = OracleAccountData::owner(); + Pubkey::find_program_address( + &Self::feed_stats_seed(&feed.to_bytes(), &oracle.to_bytes(), &[]), + &pid, + ) + } + + pub fn feed_stats_seed<'a>(feed: &'a [u8], oracle: &'a [u8], bump: &'a [u8]) -> [&'a [u8]; 4] { + [ + &ORACLE_FEED_STATS_SEED.as_slice(), + feed, + oracle, + bump, + ] + } + + cfg_client! { + + pub async fn fetch_async( + client: &solana_client::nonblocking::rpc_client::RpcClient, + pubkey: Pubkey, + ) -> std::result::Result { + crate::client::fetch_zerocopy_account_async(client, pubkey).await + } + + pub async fn fetch_many( + client: &solana_client::nonblocking::rpc_client::RpcClient, + oracles: &[Pubkey], + ) -> std::result::Result, crate::OnDemandError> { + Ok(client + .get_multiple_accounts(&oracles) + .await + .map_err(|_e| crate::OnDemandError::NetworkError)? + .into_iter() + .filter_map(|x| x) + .map(|x| x.data.clone()) + .collect::>() + .iter() + .map(|x| OracleAccountData::new_from_bytes(x)) + .filter_map(|x| x.ok()) + .map(|x| x.clone()) + .collect()) + } + + pub async fn fetch_lut( + &self, + oracle_pubkey: &Pubkey, + client: &solana_client::nonblocking::rpc_client::RpcClient, + ) -> std::result::Result { + let oracle = Self::fetch_async(client, *oracle_pubkey).await?; + let lut_slot = oracle.lut_slot; + let lut = find_lut_of(oracle_pubkey, lut_slot); + Ok(address_lookup_table::fetch(client, &lut).await?) + } + } + +} diff --git a/rust/switchboard-on-demand/src/on_demand/accounts/oracle_stats.rs b/rust/switchboard-on-demand/src/on_demand/accounts/oracle_stats.rs new file mode 100644 index 0000000..b382c65 --- /dev/null +++ b/rust/switchboard-on-demand/src/on_demand/accounts/oracle_stats.rs @@ -0,0 +1,70 @@ +use crate::anchor_traits::*; +use switchboard_common::cfg_client; +use crate::impl_account_deserialize; +use crate::get_sb_program_id; +use solana_program::pubkey::Pubkey; + +#[derive(Default)] +#[repr(C)] +#[derive(bytemuck::Zeroable, bytemuck::Pod, Debug, Copy, Clone)] +pub struct OracleEpochInfo { + pub id: u64, + pub reserved1: u64, + pub slot_end: u64, + pub slash_score: u64, + pub reward_score: u64, + pub stake_score: u64, +} + +#[derive(Default)] +#[repr(C)] +#[derive(bytemuck::Zeroable, bytemuck::Pod, Debug, Copy, Clone)] +pub struct MegaSlotInfo { + pub reserved1: u64, + pub slot_end: u64, + pub perf_goal: i64, + pub current_signature_count: i64, +} + +#[repr(C)] +#[derive(bytemuck::Zeroable, bytemuck::Pod, Debug, Copy, Clone)] +pub struct OracleStatsAccountData { + pub owner: Pubkey, + pub oracle: Pubkey, + /// The last epoch that has completed. cleared after registered with the + /// staking program. + pub finalized_epoch: OracleEpochInfo, + /// The current epoch info being used by the oracle. for stake. Will moved + /// to finalized_epoch as soon as the epoch is over. + pub current_epoch: OracleEpochInfo, + pub mega_slot_info: MegaSlotInfo, + pub last_transfer_slot: u64, + pub bump: u8, + pub padding1: [u8; 7], + /// Reserved. + pub _ebuf: [u8; 1024], +} +impl Owner for OracleStatsAccountData { + fn owner() -> Pubkey { + let cluster = std::env::var("CLUSTER").unwrap_or("mainnet".to_string()); + get_sb_program_id(&cluster) + } +} +impl Discriminator for OracleStatsAccountData { + const DISCRIMINATOR: [u8; 8] = [180, 157, 178, 234, 240, 27, 152, 179]; +} +cfg_client! { + impl_account_deserialize!(OracleStatsAccountData); +} +impl OracleStatsAccountData { + cfg_client! { + + pub async fn fetch_async( + client: &solana_client::nonblocking::rpc_client::RpcClient, + pubkey: Pubkey, + ) -> std::result::Result { + crate::client::fetch_zerocopy_account_async(client, pubkey).await + } + + } +} diff --git a/rust/switchboard-on-demand/src/on_demand/accounts/pull_feed.rs b/rust/switchboard-on-demand/src/on_demand/accounts/pull_feed.rs new file mode 100644 index 0000000..fb64bdd --- /dev/null +++ b/rust/switchboard-on-demand/src/on_demand/accounts/pull_feed.rs @@ -0,0 +1,339 @@ +use crate::*; +use rust_decimal::Decimal; +use sha2::{Digest, Sha256}; +use solana_program::pubkey::Pubkey; +use solana_program::clock::Clock; +use std::cell::Ref; +use bytemuck; + +pub const PRECISION: u32 = 18; + +#[repr(C)] +#[derive(Clone, Copy, Debug, bytemuck::Pod, bytemuck::Zeroable)] +pub struct CurrentResult { + /// The median value of the submissions needed for quorom size + pub value: i128, + /// The standard deviation of the submissions needed for quorom size + pub std_dev: i128, + /// The mean of the submissions needed for quorom size + pub mean: i128, + /// The range of the submissions needed for quorom size + pub range: i128, + /// The minimum value of the submissions needed for quorom size + pub min_value: i128, + /// The maximum value of the submissions needed for quorom size + pub max_value: i128, + /// The number of samples used to calculate this result + pub num_samples: u8, + /// The index of the submission that was used to calculate this result + pub submission_idx: u8, + pub padding1: [u8; 6], + /// The slot at which this value was signed. + pub slot: u64, + /// The slot at which the first considered submission was made + pub min_slot: u64, + /// The slot at which the last considered submission was made + pub max_slot: u64, +} +impl CurrentResult { + /// The median value of the submissions needed for quorom size + pub fn value(&self) -> Option { + if self.slot == 0 { + return None; + } + Some(Decimal::from_i128_with_scale(self.value, PRECISION)) + } + + /// The standard deviation of the submissions needed for quorom size + pub fn std_dev(&self) -> Option { + if self.slot == 0 { + return None; + } + Some(Decimal::from_i128_with_scale(self.std_dev, PRECISION)) + } + + /// The mean of the submissions needed for quorom size + pub fn mean(&self) -> Option { + if self.slot == 0 { + return None; + } + Some(Decimal::from_i128_with_scale(self.mean, PRECISION)) + } + + /// The range of the submissions needed for quorom size + pub fn range(&self) -> Option { + if self.slot == 0 { + return None; + } + Some(Decimal::from_i128_with_scale(self.range, PRECISION)) + } + + /// The minimum value of the submissions needed for quorom size + pub fn min_value(&self) -> Option { + if self.slot == 0 { + return None; + } + Some(Decimal::from_i128_with_scale(self.min_value, PRECISION)) + } + + /// The maximum value of the submissions needed for quorom size + pub fn max_value(&self) -> Option { + if self.slot == 0 { + return None; + } + Some(Decimal::from_i128_with_scale(self.max_value, PRECISION)) + } + + pub fn result_slot(&self) -> Option { + if self.slot == 0 { + return None; + } + Some(self.slot) + } + + pub fn min_slot(&self) -> Option { + if self.slot == 0 { + return None; + } + Some(self.min_slot) + } + + pub fn max_slot(&self) -> Option { + if self.slot == 0 { + return None; + } + Some(self.max_slot) + } +} + +#[repr(C)] +#[derive(Clone, Copy, Debug, bytemuck::Pod, bytemuck::Zeroable)] +pub struct OracleSubmission { + /// The public key of the oracle that submitted this value. + pub oracle: Pubkey, + /// The slot at which this value was signed. + pub slot: u64, + /// The slot at which this value was landed on chain. + pub landed_at: u64, + /// The value that was submitted. + pub value: i128, +} + +#[repr(C)] +#[derive(Clone, Copy, Debug, bytemuck::Pod, bytemuck::Zeroable)] +pub struct CompactResult { + /// The standard deviation of the submissions needed for quorom size + pub std_dev: f32, + /// The mean of the submissions needed for quorom size + pub mean: f32, + /// The slot at which this value was signed. + pub slot: u64, +} + +/// A representation of the data in a pull feed account. +#[repr(C)] +#[derive(Clone, Copy, Debug, bytemuck::Pod, bytemuck::Zeroable)] +pub struct PullFeedAccountData { + /// The oracle submissions for this feed. + pub submissions: [OracleSubmission; 32], + /// The public key of the authority that can update the feed hash that + /// this account will use for registering updates. + pub authority: Pubkey, + /// The public key of the queue which oracles must be bound to in order to + /// submit data to this feed. + pub queue: Pubkey, + /// SHA-256 hash of the job schema oracles will execute to produce data + /// for this feed. + pub feed_hash: [u8; 32], + /// The slot at which this account was initialized. + pub initialized_at: i64, + pub permissions: u64, + pub max_variance: u64, + pub min_responses: u32, + pub name: [u8; 32], + padding1: [u8; 2], + pub historical_result_idx: u8, + pub min_sample_size: u8, + pub last_update_timestamp: i64, + pub lut_slot: u64, + _reserved1: [u8; 32], + pub result: CurrentResult, + pub max_staleness: u32, + padding2: [u8; 12], + pub historical_results: [CompactResult; 32], + _ebuf4: [u8; 8], + _ebuf3: [u8; 24], + _ebuf2: [u8; 256], +} + +impl OracleSubmission { + pub fn is_empty(&self) -> bool { + self.slot == 0 + } + + pub fn value(&self) -> Decimal { + Decimal::from_i128_with_scale(self.value, PRECISION) + } +} + +impl PullFeedAccountData { + + pub fn result_land_slot(&self) -> u64 { + let submission = self.submissions[self.result.submission_idx as usize]; + submission.landed_at + } + + pub fn discriminator() -> [u8; 8] { + [196, 27, 108, 196, 10, 215, 219, 40] + } + + pub fn parse<'info>( + data: Ref<'info, &mut [u8]>, + ) -> Result, OnDemandError> { + if data.len() < Self::discriminator().len() { + return Err(OnDemandError::InvalidDiscriminator); + } + + let mut disc_bytes = [0u8; 8]; + disc_bytes.copy_from_slice(&data[..8]); + if disc_bytes != Self::discriminator() { + return Err(OnDemandError::InvalidDiscriminator); + } + + Ok(Ref::map(data, |data: &&mut [u8]| { + bytemuck::from_bytes(&data[8..std::mem::size_of::() + 8]) + })) + } + + /// Generate a checksum for the given feed hash, result, slothash, max_variance and min_responses + /// This is signed by the oracle and used to verify that the data submitted by the oracles is valid. + pub fn generate_checksum(&self, result: i128, slothash: [u8; 32]) -> [u8; 32] { + Self::generate_checksum_inner( + self.queue, + self.feed_hash, + result, + slothash, + self.max_variance, + self.min_responses, + ) + } + + /// Generate a checksum for the given feed hash, result, slothash, max_variance and min_responses + /// This is signed by the oracle and used to verify that the data submitted by the oracles is valid. + pub fn generate_checksum_inner( + queue: Pubkey, + feed_hash: [u8; 32], + result: i128, + slothash: [u8; 32], + max_variance: u64, + min_responses: u32, + ) -> [u8; 32] { + let mut hasher = Sha256::new(); + hasher.update(queue.to_bytes()); + hasher.update(feed_hash); + hasher.update(result.to_le_bytes()); + hasher.update(slothash); + hasher.update(max_variance.to_le_bytes()); + hasher.update(min_responses.to_le_bytes()); + hasher.finalize().to_vec().try_into().unwrap() + } + + /// Generate a checksum for the given feed hash, result, slothash, max_variance and min_responses + /// This is signed by the oracle and used to verify that the data submitted by the oracles is valid. + pub fn generate_checksum_with_timestamp( + queue: Pubkey, + feed_hash: [u8; 32], + result: i128, + slothash: [u8; 32], + max_variance: u64, + min_responses: u32, + timestamp: u64, + ) -> [u8; 32] { + let mut hasher = Sha256::new(); + hasher.update(queue.to_bytes()); + hasher.update(feed_hash); + hasher.update(result.to_le_bytes()); + hasher.update(slothash); + hasher.update(max_variance.to_le_bytes()); + hasher.update(min_responses.to_le_bytes()); + hasher.update(timestamp.to_le_bytes()); + hasher.finalize().to_vec().try_into().unwrap() + } + + /// **method** + /// get_value + /// Returns the median value of the submissions in the last `max_staleness` slots. + /// If there are fewer than `min_samples` submissions, returns an error. + /// **arguments** + /// * `clock` - the clock to use for the current slot + /// * `max_staleness` - the maximum number of slots to consider + /// * `min_samples` - the minimum number of samples required to return a value + /// **returns** + /// * `Ok(Decimal)` - the median value of the submissions in the last `max_staleness` slots + pub fn get_value( + &self, + clock: &Clock, + max_staleness: u64, + min_samples: u32, + only_positive: bool, + ) -> Result { + let submissions = self + .submissions + .iter() + .take_while(|s| !s.is_empty()) + .filter(|s| s.slot > clock.slot - max_staleness) + .collect::>(); + if submissions.len() < min_samples as usize { + return Err(OnDemandError::NotEnoughSamples); + } + let median = + lower_bound_median(&mut submissions.iter().map(|s| s.value).collect::>()) + .ok_or(OnDemandError::NotEnoughSamples)?; + if only_positive && median <= 0 { + return Err(OnDemandError::IllegalFeedValue); + } + + Ok(Decimal::from_i128_with_scale(median, PRECISION)) + } + + /// The median value of the submissions needed for quorom size + pub fn value(&self) -> Option { + self.result.value() + } + + /// The standard deviation of the submissions needed for quorom size + pub fn std_dev(&self) -> Option { + self.result.std_dev() + } + + /// The mean of the submissions needed for quorom size + pub fn mean(&self) -> Option { + self.result.mean() + } + + /// The range of the submissions needed for quorom size + pub fn range(&self) -> Option { + self.result.range() + } + + /// The minimum value of the submissions needed for quorom size + pub fn min_value(&self) -> Option { + self.result.min_value() + } + + /// The maximum value of the submissions needed for quorom size + pub fn max_value(&self) -> Option { + self.result.max_value() + } +} + +// takes the rounded down median of a list of numbers +pub fn lower_bound_median(numbers: &mut Vec) -> Option { + numbers.sort(); // Sort the numbers in ascending order. + + let len = numbers.len(); + if len == 0 { + return None; // Return None for an empty list. + } + Some(numbers[len / 2]) +} diff --git a/rust/switchboard-on-demand/src/on_demand/accounts/queue.rs b/rust/switchboard-on-demand/src/on_demand/accounts/queue.rs new file mode 100644 index 0000000..706ca70 --- /dev/null +++ b/rust/switchboard-on-demand/src/on_demand/accounts/queue.rs @@ -0,0 +1,198 @@ +use crate::anchor_traits::*; +use crate::cfg_client; +#[allow(unused_imports)] +use crate::impl_account_deserialize; +use crate::OnDemandError; +#[allow(unused_imports)] +use crate::OracleAccountData; +use crate::get_sb_program_id; +use bytemuck::{Pod, Zeroable}; +use solana_program::account_info::AccountInfo; +use solana_program::pubkey::Pubkey; +use std::cell::Ref; + +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct QueueAccountData { + /// The address of the authority which is permitted to add/remove allowed enclave measurements. + pub authority: Pubkey, + /// Allowed enclave measurements. + pub mr_enclaves: [[u8; 32]; 32], + /// The addresses of the quote oracles who have a valid + /// verification status and have heartbeated on-chain recently. + pub oracle_keys: [Pubkey; 128], + /// The maximum allowable time until a EnclaveAccount needs to be re-verified on-chain. + pub max_quote_verification_age: i64, + /// The unix timestamp when the last quote oracle heartbeated on-chain. + pub last_heartbeat: i64, + pub node_timeout: i64, + /// The minimum number of lamports a quote oracle needs to lock-up in order to heartbeat and verify other quotes. + pub oracle_min_stake: u64, + pub allow_authority_override_after: i64, + + /// The number of allowed enclave measurements. + pub mr_enclaves_len: u32, + /// The length of valid quote oracles for the given attestation queue. + pub oracle_keys_len: u32, + /// The reward paid to quote oracles for attesting on-chain. + pub reward: u32, //TODO + /// Incrementer used to track the current quote oracle permitted to run any available functions. + pub curr_idx: u32, + /// Incrementer used to garbage collect and remove stale quote oracles. + pub gc_idx: u32, + + pub require_authority_heartbeat_permission: u8, + pub require_authority_verify_permission: u8, + pub require_usage_permissions: u8, + padding1: [u8; 1], + + pub mint: Pubkey, + + /// Reserved. + pub _ebuf: [u8; 1024], +} +unsafe impl Pod for QueueAccountData {} +unsafe impl Zeroable for QueueAccountData {} + +cfg_client! { + impl_account_deserialize!(QueueAccountData); +} + +impl Discriminator for QueueAccountData { + const DISCRIMINATOR: [u8; 8] = [217, 194, 55, 127, 184, 83, 138, 1]; +} + +impl Owner for QueueAccountData { + fn owner() -> Pubkey { + let cluster = std::env::var("CLUSTER").unwrap_or("mainnet".to_string()); + get_sb_program_id(&cluster) + } +} + +impl QueueAccountData { + pub fn size() -> usize { + 8 + std::mem::size_of::() + } + + /// Returns the deserialized Switchboard AttestationQueue account + /// + /// # Arguments + /// + /// * `attestation_queue_account_info` - A Solana AccountInfo referencing an existing Switchboard AttestationQueue + /// + /// # Examples + /// + /// ```ignore + /// use switchboard_solana::QueueAccountData; + /// + /// let attestation_queue = QueueAccountData::new(attestation_queue_account_info)?; + /// ``` + pub fn new<'info>( + attestation_queue_account_info: &'info AccountInfo<'info>, + ) -> Result, OnDemandError> { + let data = attestation_queue_account_info + .try_borrow_data() + .map_err(|_| OnDemandError::AccountBorrowError)?; + if data.len() < QueueAccountData::discriminator().len() { + return Err(OnDemandError::InvalidDiscriminator); + } + + let mut disc_bytes = [0u8; 8]; + disc_bytes.copy_from_slice(&data[..8]); + if disc_bytes != QueueAccountData::discriminator() { + return Err(OnDemandError::InvalidDiscriminator); + } + + Ok(Ref::map(data, |data| { + bytemuck::from_bytes(&data[8..std::mem::size_of::() + 8]) + })) + } + + /// Returns the deserialized Switchboard AttestationQueue account + /// + /// # Arguments + /// + /// * `data` - A Solana AccountInfo's data buffer + /// + /// # Examples + /// + /// ```ignore + /// use switchboard_solana::QueueAccountData; + /// + /// let attestation_queue = QueueAccountData::new(attestation_queue_account_info.try_borrow_data()?)?; + /// ``` + pub fn new_from_bytes(data: &[u8]) -> Result<&QueueAccountData, OnDemandError> { + if data.len() < QueueAccountData::discriminator().len() { + return Err(OnDemandError::InvalidDiscriminator); + } + + let mut disc_bytes = [0u8; 8]; + disc_bytes.copy_from_slice(&data[..8]); + if disc_bytes != QueueAccountData::discriminator() { + return Err(OnDemandError::InvalidDiscriminator); + } + + Ok(bytemuck::from_bytes( + &data[8..std::mem::size_of::() + 8], + )) + } + + pub fn has_mr_enclave(&self, mr_enclave: &[u8]) -> bool { + self.mr_enclaves[..self.mr_enclaves_len as usize] + .iter() + .any(|x| x.to_vec() == mr_enclave.to_vec()) + } + + pub fn permitted_enclaves(&self) -> Vec<[u8; 32]> { + self.mr_enclaves[..self.mr_enclaves_len as usize].to_vec() + } + + pub fn garbage_collection_node(&self) -> Option { + let gc_node = self.oracle_keys[self.gc_idx as usize]; + if gc_node != Pubkey::default() { + Some(gc_node) + } else { + None + } + } + + pub fn idx_of_oracle(&self, oracle: &Pubkey) -> Option { + self.oracle_keys[..self.oracle_keys_len as usize] + .iter() + .position(|x| x == oracle) + } + + pub fn oracle_keys(&self) -> Vec { + self.oracle_keys[..self.oracle_keys_len as usize].to_vec() + } + + cfg_client! { + pub async fn fetch_async( + client: &solana_client::nonblocking::rpc_client::RpcClient, + pubkey: Pubkey, + ) -> std::result::Result { + crate::client::fetch_zerocopy_account_async(client, pubkey).await + } + + pub async fn fetch_oracles( + &self, + client: &solana_client::nonblocking::rpc_client::RpcClient, + ) -> std::result::Result, crate::OnDemandError> { + let oracles = &self.oracle_keys[..self.oracle_keys_len as usize]; + let datas: Vec<_> = client + .get_multiple_accounts(&oracles) + .await + .map_err(|_e| crate::OnDemandError::NetworkError)? + .into_iter() + .filter_map(|x| x) + .map(|x| x.data.clone()) + .collect::>() + .iter() + .map(|x| OracleAccountData::new_from_bytes(x)) + .filter_map(|x| x.ok()) + .map(|x| x.clone()) + .collect(); + Ok(oracles.iter().cloned().zip(datas).collect()) + } + } +} diff --git a/rust/switchboard-on-demand/src/on_demand/accounts/randomness.rs b/rust/switchboard-on-demand/src/on_demand/accounts/randomness.rs new file mode 100644 index 0000000..f44f774 --- /dev/null +++ b/rust/switchboard-on-demand/src/on_demand/accounts/randomness.rs @@ -0,0 +1,77 @@ +use crate::*; +use crate::pubkey::Pubkey; +use std::cell::Ref; +use solana_program::clock::Clock; + +#[derive(Clone, Copy, Debug, bytemuck::Pod, bytemuck::Zeroable)] +#[repr(C)] +pub struct RandomnessAccountData { + pub authority: Pubkey, + pub queue: Pubkey, + + pub seed_slothash: [u8; 32], + pub seed_slot: u64, + pub oracle: Pubkey, + + pub reveal_slot: u64, + pub value: [u8; 32], + + _ebuf2: [u8; 96], + _ebuf1: [u8; 128], +} +impl Discriminator for RandomnessAccountData { + const DISCRIMINATOR: [u8; 8] = [10, 66, 229, 135, 220, 239, 217, 114]; +} +impl Owner for RandomnessAccountData { + fn owner() -> Pubkey { + let cluster = std::env::var("CLUSTER").unwrap_or("mainnet".to_string()); + get_sb_program_id(&cluster) + } +} + +cfg_client! { + impl_account_deserialize!(RandomnessAccountData); +} +impl RandomnessAccountData { + pub const fn size() -> usize { + std::mem::size_of::() + 8 + } + + pub fn get_value(&self, clock: &Clock) -> std::result::Result<[u8; 32], OnDemandError> { + if clock.slot != self.reveal_slot { + return Err(OnDemandError::SwitchboardRandomnessTooOld.into()); + } + Ok(self.value) + } + + pub fn is_revealable(&self, clock: &Clock) -> bool { + self.seed_slot < clock.slot + } + + pub fn parse<'info>( + data: Ref<'info, &mut [u8]>, + ) -> std::result::Result, OnDemandError> { + if data.len() < Self::discriminator().len() { + return Err(OnDemandError::InvalidDiscriminator); + } + + let mut disc_bytes = [0u8; 8]; + disc_bytes.copy_from_slice(&data[..8]); + if disc_bytes != Self::discriminator() { + return Err(OnDemandError::InvalidDiscriminator); + } + + Ok(Ref::map(data, |data: &&mut [u8]| { + bytemuck::from_bytes(&data[8..std::mem::size_of::() + 8]) + })) + } + + cfg_client! { + pub async fn fetch_async( + client: &solana_client::nonblocking::rpc_client::RpcClient, + pubkey: Pubkey, + ) -> std::result::Result { + crate::client::fetch_zerocopy_account_async(client, pubkey).await + } + } +} diff --git a/rust/switchboard-on-demand/src/on_demand/accounts/state.rs b/rust/switchboard-on-demand/src/on_demand/accounts/state.rs new file mode 100644 index 0000000..58bd5d3 --- /dev/null +++ b/rust/switchboard-on-demand/src/on_demand/accounts/state.rs @@ -0,0 +1,90 @@ +use crate::anchor_traits::*; +use crate::cfg_client; +#[allow(unused_imports)] +use crate::impl_account_deserialize; +use crate::get_sb_program_id; +use bytemuck::{Pod, Zeroable}; +use solana_program::pubkey::Pubkey; + +const STATE_SEED: &[u8] = b"STATE"; + +#[derive(Debug, Copy, Clone)] +pub struct StateEpochInfo { + pub id: u64, + pub reserved1: u64, + pub slot_end: u64, +} + +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct State { + pub bump: u8, + pub test_only_disable_mr_enclave_check: u8, + padding1: [u8; 6], + pub authority: Pubkey, + pub guardian_queue: Pubkey, + pub reserved1: u64, + pub epoch_length: u64, + pub current_epoch: StateEpochInfo, + pub next_epoch: StateEpochInfo, + pub finalized_epoch: StateEpochInfo, + // xswitch vault + pub stake_pool: Pubkey, + pub stake_program: Pubkey, + pub switch_mint: Pubkey, + pub sgx_advisories: [u16; 32], + pub advisories_len: u8, + _ebuf4: [u8; 15], + _ebuf3: [u8; 256], + _ebuf2: [u8; 512], + _ebuf1: [u8; 1024], +} +unsafe impl Pod for State {} +unsafe impl Zeroable for State {} + +cfg_client! { + impl_account_deserialize!(State); +} + +impl Discriminator for State { + const DISCRIMINATOR: [u8; 8] = [216, 146, 107, 94, 104, 75, 182, 177]; +} + +impl Owner for State { + fn owner() -> Pubkey { + let cluster = std::env::var("CLUSTER").unwrap_or("mainnet".to_string()); + get_sb_program_id(&cluster) + } +} + +impl State { + pub fn size() -> usize { + 8 + std::mem::size_of::() + } + + pub fn get_pda() -> Pubkey { + let cluster = std::env::var("CLUSTER").unwrap_or("mainnet".to_string()); + let pid = get_sb_program_id(&cluster); + let (pda_key, _) = Pubkey::find_program_address(&[STATE_SEED], &pid); + pda_key + } + + pub fn get_program_pda(program_id: Option) -> Pubkey { + let cluster = std::env::var("CLUSTER").unwrap_or("mainnet".to_string()); + let pid = get_sb_program_id(&cluster); + let (pda_key, _) = Pubkey::find_program_address( + &[STATE_SEED], + &program_id.unwrap_or(pid), + ); + pda_key + } + + cfg_client! { + pub async fn fetch_async( + client: &solana_client::nonblocking::rpc_client::RpcClient, + ) -> std::result::Result { + let pubkey = State::get_pda(); + crate::client::fetch_zerocopy_account_async(client, pubkey).await + } + } +} diff --git a/rust/switchboard-on-demand/src/on_demand/error.rs b/rust/switchboard-on-demand/src/on_demand/error.rs new file mode 100644 index 0000000..a802243 --- /dev/null +++ b/rust/switchboard-on-demand/src/on_demand/error.rs @@ -0,0 +1,73 @@ +use serde::ser::StdError; +use std::fmt; + +#[derive(Clone, Debug)] +#[repr(u32)] +pub enum OnDemandError { + Generic, + AccountBorrowError, + AccountNotFound, + AnchorParse, + AnchorParseError, + CheckSizeError, + DecimalConversionError, + DecryptError, + EventListenerRoutineFailure, + EvmError, + FunctionResultIxIncorrectTargetChain, + HeartbeatRoutineFailure, + IntegerOverflowError, + InvalidChain, + InvalidData, + InvalidDiscriminator, + InvalidInstructionError, + InvalidKeypairFile, + InvalidNativeMint, + InvalidQuote, + InvalidQuoteError, + InvalidSignature, + IpfsNetworkError, + IpfsParseError, + KeyParseError, + MrEnclaveMismatch, + NetworkError, + ParseError, + PdaDerivationError, + QuoteParseError, + QvnTxSendFailure, + SgxError, + SgxWriteError, + SolanaBlockhashError, + SolanaMissingSigner, + SolanaPayerSignerMissing, + SolanaPayerMismatch, + SolanaInstructionOverflow, + SolanaInstructionsEmpty, + TxCompileErr, + TxDeserializationError, + TxFailure, + Unexpected, + SolanaSignError, + IoError, + KeyDerivationFailed, + InvalidSecretKey, + EnvVariableMissing, + AccountDeserializeError, + NotEnoughSamples, + IllegalFeedValue, + CustomMessage(String), + SwitchboardRandomnessTooOld, + AddressLookupTableFetchError, + AddressLookupTableDeserializeError, +} + +impl StdError for OnDemandError { + fn source(&self) -> Option<&(dyn StdError + 'static)> { + None + } +} +impl fmt::Display for OnDemandError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{:#?}", self) + } +} diff --git a/rust/switchboard-on-demand/src/on_demand/instructions/guardian_quote_verify.rs b/rust/switchboard-on-demand/src/on_demand/instructions/guardian_quote_verify.rs new file mode 100644 index 0000000..99e6523 --- /dev/null +++ b/rust/switchboard-on-demand/src/on_demand/instructions/guardian_quote_verify.rs @@ -0,0 +1,109 @@ +use crate::anchor_traits::*; +use crate::prelude::*; +use borsh::BorshSerialize; +use solana_program::pubkey::Pubkey; +use crate::get_sb_program_id; + +pub struct GuardianQuoteVerify {} + +#[derive(Clone, Debug)] +pub struct GuardianQuoteVerifyParams { + pub timestamp: i64, + pub mr_enclave: [u8; 32], + pub idx: u32, + pub ed25519_key: Pubkey, + pub secp256k1_key: [u8; 64], + pub slot: u64, + pub signature: [u8; 64], + pub recovery_id: u8, + pub advisories: Vec, +} + +impl BorshSerialize for GuardianQuoteVerifyParams { + fn serialize(&self, writer: &mut W) -> std::io::Result<()> { + self.timestamp.serialize(writer)?; + self.mr_enclave.serialize(writer)?; + self.idx.serialize(writer)?; + writer.write_all(self.ed25519_key.as_ref())?; + self.secp256k1_key.serialize(writer)?; + self.slot.serialize(writer)?; + self.signature.serialize(writer)?; + self.recovery_id.serialize(writer)?; + self.advisories.serialize(writer)?; + Ok(()) + } +} + +impl InstructionData for GuardianQuoteVerifyParams {} + +impl Discriminator for GuardianQuoteVerifyParams { + const DISCRIMINATOR: [u8; 8] = GuardianQuoteVerify::DISCRIMINATOR; +} + +impl Discriminator for GuardianQuoteVerify { + const DISCRIMINATOR: [u8; 8] = [168, 36, 93, 156, 157, 150, 148, 45]; +} + +pub struct GuardianQuoteVerifyArgs { + pub guardian: Pubkey, + pub oracle: Pubkey, + pub authority: Pubkey, + pub guardian_queue: Pubkey, + pub timestamp: i64, + pub mr_enclave: [u8; 32], + pub idx: u32, + pub ed25519_key: Pubkey, + pub secp256k1_key: [u8; 64], + pub slot: u64, + pub signature: [u8; 64], + pub recovery_id: u8, + pub advisories: Vec, +} +pub struct GuardianQuoteVerifyAccounts { + pub guardian: Pubkey, + pub oracle: Pubkey, + pub authority: Pubkey, + pub guardian_queue: Pubkey, + pub state: Pubkey, + pub recent_slothashes: Pubkey, +} +impl ToAccountMetas for GuardianQuoteVerifyAccounts { + fn to_account_metas(&self, _: Option) -> Vec { + vec![ + AccountMeta::new(self.guardian, false), + AccountMeta::new(self.oracle, false), + AccountMeta::new_readonly(self.authority, true), + AccountMeta::new(self.guardian_queue, false), + AccountMeta::new_readonly(self.state, false), + AccountMeta::new_readonly(self.recent_slothashes, false), + ] + } +} + +impl GuardianQuoteVerify { + pub fn build_ix(args: GuardianQuoteVerifyArgs) -> Result { + let cluster = std::env::var("CLUSTER").unwrap_or("mainnet".to_string()); + Ok(crate::utils::build_ix( + &get_sb_program_id(&cluster), + &GuardianQuoteVerifyAccounts { + guardian: args.guardian, + oracle: args.oracle, + authority: args.authority, + guardian_queue: args.guardian_queue, + state: State::get_pda(), + recent_slothashes: solana_program::sysvar::slot_hashes::ID, + }, + &GuardianQuoteVerifyParams { + timestamp: args.timestamp, + mr_enclave: args.mr_enclave, + idx: args.idx, + ed25519_key: args.ed25519_key, + secp256k1_key: args.secp256k1_key, + slot: args.slot, + signature: args.signature, + recovery_id: args.recovery_id, + advisories: args.advisories, + }, + )) + } +} diff --git a/rust/switchboard-on-demand/src/on_demand/instructions/mod.rs b/rust/switchboard-on-demand/src/on_demand/instructions/mod.rs new file mode 100644 index 0000000..d3f9c60 --- /dev/null +++ b/rust/switchboard-on-demand/src/on_demand/instructions/mod.rs @@ -0,0 +1,12 @@ +pub mod guardian_quote_verify; +pub mod oracle_heartbeat; +pub mod oracle_set_configs; +pub mod permission_set; +pub mod queue_garbage_collect; +pub mod randomness_commit; +pub use guardian_quote_verify::*; +pub use oracle_heartbeat::*; +pub use permission_set::*; +pub use queue_garbage_collect::*; +pub use oracle_set_configs::*; +pub use randomness_commit::*; diff --git a/rust/switchboard-on-demand/src/on_demand/instructions/oracle_heartbeat.rs b/rust/switchboard-on-demand/src/on_demand/instructions/oracle_heartbeat.rs new file mode 100644 index 0000000..c4a63a5 --- /dev/null +++ b/rust/switchboard-on-demand/src/on_demand/instructions/oracle_heartbeat.rs @@ -0,0 +1,149 @@ +use crate::cfg_client; +use crate::anchor_traits::*; +use crate::prelude::*; +use borsh::BorshSerialize; +use solana_program::pubkey::Pubkey; +use solana_program::system_program; +use spl_token; +use crate::get_sb_program_id; + +pub struct OracleHeartbeat {} + +#[derive(Clone, BorshSerialize, Debug)] +pub struct OracleHeartbeatParams { + pub uri: Option<[u8; 64]>, +} + +impl InstructionData for OracleHeartbeatParams {} + +impl Discriminator for OracleHeartbeat { + const DISCRIMINATOR: [u8; 8] = [10, 175, 217, 130, 111, 35, 117, 54]; +} +impl Discriminator for OracleHeartbeatParams { + const DISCRIMINATOR: [u8; 8] = OracleHeartbeat::DISCRIMINATOR; +} + +pub struct OracleHeartbeatArgs { + pub oracle: Pubkey, + pub oracle_signer: Pubkey, + pub queue: Pubkey, + pub queue_authority: Pubkey, + pub gc_node: Pubkey, + pub uri: Option<[u8; 64]>, + // Feeds or randomness accounts + pub pending_paid_accounts: Vec, + // escrows of the pending paid accounts + pub escrows: Vec, + pub payer: Pubkey, +} +pub struct OracleHeartbeatAccounts { + pub oracle: Pubkey, + pub oracle_signer: Pubkey, + pub queue: Pubkey, + pub queue_authority: Pubkey, + pub gc_node: Pubkey, + pub payer: Pubkey, + pub stake_program: Pubkey, + pub delegation_pool: Pubkey, + pub delegation_group: Pubkey, + pub switch_mint: Pubkey, +} +impl ToAccountMetas for OracleHeartbeatAccounts { + fn to_account_metas(&self, _: Option) -> Vec { + let state_pubkey = State::get_pda(); + // global subsidy vault + let subsidy_vault = get_associated_token_address(&state_pubkey, &self.switch_mint); + let queue_escrow = get_associated_token_address(&self.queue, &spl_token::native_mint::ID); + let (oracle_wsol_reward_pool_escrow, _) = Pubkey::find_program_address( + &[ + b"RewardPool", + &self.delegation_pool.to_bytes(), + &spl_token::native_mint::ID.to_bytes(), + ], + &self.stake_program, + ); + let (oracle_switch_reward_pool_escrow, _) = Pubkey::find_program_address( + &[ + b"RewardPool", + &self.delegation_pool.to_bytes(), + &self.switch_mint.to_bytes(), + ], + &self.stake_program, + ); + vec![ + AccountMeta::new(self.oracle, false), + AccountMeta::new(OracleAccountData::stats_key(&self.oracle), false), + AccountMeta::new_readonly(self.oracle_signer, true), + AccountMeta::new(self.queue, false), + AccountMeta::new(self.gc_node, false), + AccountMeta::new(state_pubkey, false), + AccountMeta::new(self.payer, true), + AccountMeta::new_readonly(system_program::id(), false), + AccountMeta::new_readonly(spl_token::ID, false), + AccountMeta::new_readonly(spl_token::native_mint::ID, false), + AccountMeta::new(queue_escrow, false), + AccountMeta::new_readonly(self.stake_program, false), + AccountMeta::new(self.delegation_pool, false), + AccountMeta::new(self.delegation_group, false), + // ======================================== + // Too many for anchor ctx, rest must be passed as remaining accounts + AccountMeta::new(subsidy_vault, false), + AccountMeta::new(oracle_wsol_reward_pool_escrow, false), + AccountMeta::new(oracle_switch_reward_pool_escrow, false), + ] + } +} + +cfg_client! { +use solana_client::nonblocking::rpc_client::RpcClient; + +impl OracleHeartbeat { + pub async fn build_ix(client: &RpcClient, args: OracleHeartbeatArgs) -> Result { + let state_key = State::get_pda(); + let state = State::fetch_async(client).await?; + let (delegation_pool, _) = Pubkey::find_program_address( + &[ + b"Delegation", + &state_key.to_bytes(), + &OracleAccountData::stats_key(&args.oracle).to_bytes(), + &state.stake_pool.to_bytes(), + ], + &state.stake_program, + ); + let (delegation_group, _) = Pubkey::find_program_address( + &[ + b"Group", + &state_key.to_bytes(), + &state.stake_pool.to_bytes(), + &args.queue.to_bytes(), + ], + &state.stake_program, + ); + let cluster = std::env::var("CLUSTER").unwrap_or("mainnet".to_string()); + let pid = get_sb_program_id(&cluster); + let mut ix = crate::utils::build_ix( + &pid, + &OracleHeartbeatAccounts { + oracle: args.oracle, + oracle_signer: args.oracle_signer, + queue: args.queue, + queue_authority: args.queue_authority, + gc_node: args.gc_node, + payer: args.payer, + stake_program: state.stake_program, + delegation_pool: delegation_pool, + delegation_group: delegation_group, + switch_mint: state.switch_mint, + }, + &OracleHeartbeatParams { uri: args.uri }, + ); + for ppa in args.pending_paid_accounts { + ix.accounts.push(AccountMeta::new_readonly(ppa, false)); + } + for escrow in args.escrows { + ix.accounts.push(AccountMeta::new(escrow, false)); + } + Ok(ix) + } +} +} diff --git a/rust/switchboard-on-demand/src/on_demand/instructions/oracle_set_configs.rs b/rust/switchboard-on-demand/src/on_demand/instructions/oracle_set_configs.rs new file mode 100644 index 0000000..da43a38 --- /dev/null +++ b/rust/switchboard-on-demand/src/on_demand/instructions/oracle_set_configs.rs @@ -0,0 +1,65 @@ +use crate::cfg_client; +use crate::anchor_traits::*; +use crate::prelude::*; +use borsh::BorshSerialize; +use solana_program::pubkey::Pubkey; +use crate::get_sb_program_id; + +pub struct OracleSetConfigs {} + +#[derive(Clone, BorshSerialize, Debug)] +pub struct OracleSetConfigsParams { + pub new_authority: Option, + pub new_secp_authority: Option<[u8; 64]>, +} + +impl InstructionData for OracleSetConfigsParams {} + +impl Discriminator for OracleSetConfigs { + const DISCRIMINATOR: [u8; 8] = [129, 111, 223, 4, 191, 188, 70, 180]; +} +impl Discriminator for OracleSetConfigsParams { + const DISCRIMINATOR: [u8; 8] = OracleSetConfigs::DISCRIMINATOR; +} + +pub struct OracleSetConfigsArgs { + pub oracle: Pubkey, + pub authority: Pubkey, + pub secp_authority: [u8; 64], +} +pub struct OracleSetConfigsAccounts { + pub oracle: Pubkey, + pub authority: Pubkey, +} +impl ToAccountMetas for OracleSetConfigsAccounts { + fn to_account_metas(&self, _: Option) -> Vec { + vec![ + AccountMeta::new(self.oracle, false), + AccountMeta::new_readonly(self.authority, true), + ] + } +} + +cfg_client! { +use solana_client::nonblocking::rpc_client::RpcClient; + +impl OracleSetConfigs { + pub async fn build_ix(_client: &RpcClient, args: OracleSetConfigsArgs) -> Result { + let cluster = std::env::var("CLUSTER").unwrap_or("mainnet".to_string()); + let pid = get_sb_program_id(&cluster); + let ix = crate::utils::build_ix( + &pid, + &OracleSetConfigsAccounts { + oracle: args.oracle, + authority: args.authority, + }, + &OracleSetConfigsParams { + new_authority: Some(args.authority), + new_secp_authority: Some(args.secp_authority), + }, + ); + Ok(ix) + } +} +} + diff --git a/rust/switchboard-on-demand/src/on_demand/instructions/permission_set.rs b/rust/switchboard-on-demand/src/on_demand/instructions/permission_set.rs new file mode 100644 index 0000000..99b703d --- /dev/null +++ b/rust/switchboard-on-demand/src/on_demand/instructions/permission_set.rs @@ -0,0 +1,71 @@ +use crate::anchor_traits::*; +use crate::prelude::*; +use borsh::BorshSerialize; +use solana_program::pubkey::Pubkey; +use crate::get_sb_program_id; + +#[repr(u32)] +#[derive(Copy, Clone)] +pub enum SwitchboardPermission { + None = 0 << 0, + PermitOracleHeartbeat = 1 << 0, + PermitOracleQueueUsage = 1 << 1, +} + +pub struct AttestationPermissionSet {} + +#[derive(Clone, BorshSerialize, Debug)] +pub struct AttestationPermissionSetParams { + pub permission: u8, + pub enable: bool, +} + +impl InstructionData for AttestationPermissionSetParams {} + +impl Discriminator for AttestationPermissionSetParams { + const DISCRIMINATOR: [u8; 8] = AttestationPermissionSet::DISCRIMINATOR; +} + +impl Discriminator for AttestationPermissionSet { + const DISCRIMINATOR: [u8; 8] = [211, 122, 185, 120, 129, 182, 55, 103]; +} + +pub struct AttestationPermissionSetAccounts { + pub authority: Pubkey, + pub granter: Pubkey, + pub grantee: Pubkey, +} +impl ToAccountMetas for AttestationPermissionSetAccounts { + fn to_account_metas(&self, _: Option) -> Vec { + vec![ + AccountMeta::new_readonly(self.authority, true), + AccountMeta::new_readonly(self.granter, false), + AccountMeta::new(self.grantee, false), + ] + } +} + +impl AttestationPermissionSet { + pub fn build_ix( + granter: Pubkey, + authority: Pubkey, + grantee: Pubkey, + permission: SwitchboardPermission, + enable: bool, + ) -> Result { + let cluster = std::env::var("CLUSTER").unwrap_or("mainnet".to_string()); + let pid = get_sb_program_id(&cluster); + Ok(crate::utils::build_ix( + &pid, + &AttestationPermissionSetAccounts { + authority, + granter, + grantee, + }, + &AttestationPermissionSetParams { + permission: permission as u8, + enable, + }, + )) + } +} diff --git a/rust/switchboard-on-demand/src/on_demand/instructions/queue_garbage_collect.rs b/rust/switchboard-on-demand/src/on_demand/instructions/queue_garbage_collect.rs new file mode 100644 index 0000000..9100958 --- /dev/null +++ b/rust/switchboard-on-demand/src/on_demand/instructions/queue_garbage_collect.rs @@ -0,0 +1,53 @@ +use crate::anchor_traits::*; +use crate::prelude::*; +use borsh::BorshSerialize; +use solana_program::pubkey::Pubkey; +use crate::get_sb_program_id; + +pub struct QueueGarbageCollect {} + +#[derive(Clone, BorshSerialize, Debug)] +pub struct QueueGarbageCollectParams { + pub idx: u32, +} + +impl InstructionData for QueueGarbageCollectParams {} +impl Discriminator for QueueGarbageCollect { + const DISCRIMINATOR: [u8; 8] = [187, 208, 104, 247, 16, 91, 96, 98]; +} +impl Discriminator for QueueGarbageCollectParams { + const DISCRIMINATOR: [u8; 8] = QueueGarbageCollect::DISCRIMINATOR; +} + +pub struct QueueGarbageCollectArgs { + pub queue: Pubkey, + pub oracle: Pubkey, + pub idx: u32, +} +pub struct QueueGarbageCollectAccounts { + pub queue: Pubkey, + pub oracle: Pubkey, +} +impl ToAccountMetas for QueueGarbageCollectAccounts { + fn to_account_metas(&self, _: Option) -> Vec { + vec![ + AccountMeta::new(self.queue, false), + AccountMeta::new(self.oracle, false), + ] + } +} + +impl QueueGarbageCollect { + pub fn build_ix(args: QueueGarbageCollectArgs) -> Result { + let cluster = std::env::var("CLUSTER").unwrap_or("mainnet".to_string()); + let pid = get_sb_program_id(&cluster); + Ok(crate::utils::build_ix( + &pid, + &QueueGarbageCollectAccounts { + queue: args.queue, + oracle: args.oracle, + }, + &QueueGarbageCollectParams { idx: args.idx }, + )) + } +} diff --git a/rust/switchboard-on-demand/src/on_demand/instructions/randomness_commit.rs b/rust/switchboard-on-demand/src/on_demand/instructions/randomness_commit.rs new file mode 100644 index 0000000..c666c8d --- /dev/null +++ b/rust/switchboard-on-demand/src/on_demand/instructions/randomness_commit.rs @@ -0,0 +1,123 @@ +use crate::anchor_traits::*; +use crate::prelude::*; +use borsh::BorshSerialize; +use solana_program::pubkey::Pubkey; +use solana_program::sysvar::slot_hashes; +use solana_program::account_info::AccountInfo; +use solana_program::program_error::ProgramError; +use crate::get_sb_program_id; + +pub struct RandomnessCommit {} + +#[derive(Clone, BorshSerialize, Debug)] +pub struct RandomnessCommitParams {} + +impl InstructionData for RandomnessCommitParams {} + +impl Discriminator for RandomnessCommitParams { + const DISCRIMINATOR: [u8; 8] = RandomnessCommit::DISCRIMINATOR; +} + +impl Discriminator for RandomnessCommit { + const DISCRIMINATOR: [u8; 8] = [52, 170, 152, 201, 179, 133, 242, 141]; +} + +pub struct RandomnessCommitAccounts { + pub randomness: Pubkey, + pub queue: Pubkey, + pub oracle: Pubkey, + pub recent_slothashes: Pubkey, + pub authority: Pubkey, +} +impl ToAccountMetas for RandomnessCommitAccounts { + fn to_account_metas(&self, _: Option) -> Vec { + vec![ + AccountMeta::new(self.randomness, false), + AccountMeta::new_readonly(self.queue, false), + AccountMeta::new(self.oracle, false), + AccountMeta::new_readonly(slot_hashes::ID, false), + AccountMeta::new_readonly(self.authority, true), + ] + } +} + +impl RandomnessCommit { + pub fn build_ix( + randomness: Pubkey, + queue: Pubkey, + oracle: Pubkey, + authority: Pubkey, + ) -> Result { + let cluster = std::env::var("CLUSTER").unwrap_or("mainnet".to_string()); + let pid = get_sb_program_id(&cluster); + Ok(crate::utils::build_ix( + &pid, + &RandomnessCommitAccounts { + randomness, + queue, + oracle, + authority, + recent_slothashes: slot_hashes::ID, + }, + &RandomnessCommitParams {}, + )) + } + + /// Invokes the `randomness_commit` Switchboard CPI call. + /// + /// This call commits a new randomness value to the randomness account. + /// + /// # Requirements + /// + /// - The `authority` must be a signer. + /// + /// # Parameters + /// + /// - **switchboard**: Switchboard program account. + /// - **randomness**: Randomness account. + /// - **queue**: Queue account associated with the randomness account. + /// - **oracle**: Oracle account assigned for the randomness request. + /// - **authority**: Authority of the randomness account. + /// - **recent_slothashes**: Sysvar account to fetch recent slot hashes. + /// - **seeds**: Seeds for the CPI call. + /// + pub fn invoke<'a>( + switchboard: AccountInfo<'a>, + randomness: AccountInfo<'a>, + queue: AccountInfo<'a>, + oracle: AccountInfo<'a>, + authority: AccountInfo<'a>, + recent_slothashes: AccountInfo<'a>, + seeds: &[&[&[u8]]], + ) -> Result<(), ProgramError> { + let accounts = [ + randomness.clone(), + queue.clone(), + oracle.clone(), + recent_slothashes.clone(), + authority.clone(), + ]; + let account_metas = RandomnessCommitAccounts { + randomness: randomness.key.clone(), + queue: queue.key.clone(), + oracle: oracle.key.clone(), + recent_slothashes: recent_slothashes.key.clone(), + authority: authority.key.clone(), + }.to_account_metas(None); + let ix = Instruction { + program_id: switchboard.key.clone(), + accounts: account_metas, + data: ix_discriminator("randomness_commit").to_vec(), + }; + Ok(invoke_signed(&ix, &accounts, seeds)?) + } +} + +fn ix_discriminator(name: &str) -> [u8; 8] { + let preimage = format!("global:{}", name); + let mut sighash = [0u8; 8]; + sighash.copy_from_slice( + &solana_program::hash::hash(preimage.as_bytes()).to_bytes()[..8], + ); + sighash +} diff --git a/rust/switchboard-on-demand/src/on_demand/mod.rs b/rust/switchboard-on-demand/src/on_demand/mod.rs new file mode 100644 index 0000000..4867d22 --- /dev/null +++ b/rust/switchboard-on-demand/src/on_demand/mod.rs @@ -0,0 +1,72 @@ +mod error; +pub use error::*; + +pub mod accounts; +pub use accounts::*; + +pub mod instructions; +pub use instructions::*; + +pub mod types; +pub use types::*; + +use crate::pubkey::Pubkey; + +pub fn get_associated_token_address_and_bump_seed( + wallet_address: &Pubkey, + token_mint_address: &Pubkey, + program_id: &Pubkey, + token_program_id: &Pubkey, +) -> (Pubkey, u8) { + get_associated_token_address_and_bump_seed_internal( + wallet_address, + token_mint_address, + program_id, + token_program_id, + ) +} + +/// Derives the associated token account address for the given wallet address +/// and token mint +pub fn get_associated_token_address( + wallet_address: &Pubkey, + token_mint_address: &Pubkey, +) -> Pubkey { + get_associated_token_address_with_program_id( + wallet_address, + token_mint_address, + &spl_token::ID, + ) +} + +/// Derives the associated token account address for the given wallet address, +/// token mint and token program id +pub fn get_associated_token_address_with_program_id( + wallet_address: &Pubkey, + token_mint_address: &Pubkey, + token_program_id: &Pubkey, +) -> Pubkey { + get_associated_token_address_and_bump_seed( + wallet_address, + token_mint_address, + &spl_associated_token_account::ID, + token_program_id, + ) + .0 +} + +fn get_associated_token_address_and_bump_seed_internal( + wallet_address: &Pubkey, + token_mint_address: &Pubkey, + program_id: &Pubkey, + token_program_id: &Pubkey, +) -> (Pubkey, u8) { + Pubkey::find_program_address( + &[ + &wallet_address.to_bytes(), + &token_program_id.to_bytes(), + &token_mint_address.to_bytes(), + ], + program_id, + ) +} diff --git a/rust/switchboard-on-demand/src/on_demand/types.rs b/rust/switchboard-on-demand/src/on_demand/types.rs new file mode 100644 index 0000000..05423a3 --- /dev/null +++ b/rust/switchboard-on-demand/src/on_demand/types.rs @@ -0,0 +1,49 @@ +use crate::VerificationStatus; +use solana_program::pubkey::Pubkey; +use solana_program::sysvar::clock::Clock; + +pub type MrEnclave = [u8; 32]; + +#[repr(C)] +#[derive(Debug, Copy, Clone, bytemuck::Zeroable, bytemuck::Pod)] +pub struct Quote { + /// The address of the signer generated within an enclave. + pub enclave_signer: Pubkey, + /// The quotes MRENCLAVE measurement dictating the contents of the secure enclave. + pub mr_enclave: [u8; 32], + /// The VerificationStatus of the quote. + pub verification_status: u8, + padding1: [u8; 7], + /// The unix timestamp when the quote was last verified. + pub verification_timestamp: i64, + /// The unix timestamp when the quotes verification status expires. + pub valid_until: i64, + /// The off-chain registry where the verifiers quote can be located. + pub quote_registry: [u8; 32], + /// Key to lookup the buffer data on IPFS or an alternative decentralized storage solution. + pub registry_key: [u8; 64], + /// The secp256k1 public key of the enclave signer. Derived from the enclave_signer. + pub secp256k1_signer: [u8; 64], + pub last_ed25519_signer: Pubkey, + pub last_secp256k1_signer: [u8; 64], + pub last_rotate_slot: u64, + pub guardian_approvers: [Pubkey; 64], + pub guardian_approvers_len: u8, + padding2: [u8; 7], + /// Reserved. + pub _ebuf: [u8; 1024], +} +impl Default for Quote { + fn default() -> Self { + unsafe { std::mem::zeroed() } + } +} +impl Quote { + pub fn is_verified(&self, clock: &Clock) -> bool { + match self.verification_status.into() { + VerificationStatus::VerificationOverride => true, + VerificationStatus::VerificationSuccess => self.valid_until > clock.unix_timestamp, + _ => false, + } + } +} diff --git a/rust/switchboard-on-demand/src/prelude.rs b/rust/switchboard-on-demand/src/prelude.rs new file mode 100644 index 0000000..ad6448d --- /dev/null +++ b/rust/switchboard-on-demand/src/prelude.rs @@ -0,0 +1,22 @@ +pub use crate::accounts::*; +use crate::cfg_client; +pub use crate::decimal::*; +pub use crate::instructions::*; +pub use crate::types::*; +pub use crate::{SWITCHBOARD_ON_DEMAND_PROGRAM_ID, SWITCHBOARD_PROGRAM_ID}; +pub use rust_decimal; +pub use switchboard_common::{ + unix_timestamp, ChainResultInfo, FunctionResult, FunctionResultV0, FunctionResultV1, + LegacyChainResultInfo, LegacySolanaFunctionResult, SolanaFunctionRequestType, + SolanaFunctionResult, SolanaFunctionResultV0, SolanaFunctionResultV1, FUNCTION_RESULT_PREFIX, +}; +cfg_client! { + pub use crate::client::*; + use anchor_client; + use anchor_client::anchor_lang::solana_program; +} + +pub use solana_program::entrypoint::ProgramResult; +pub use solana_program::instruction::{AccountMeta, Instruction}; +pub use solana_program::program::{invoke, invoke_signed}; +pub use std::result::Result; diff --git a/rust/switchboard-on-demand/src/program_id.rs b/rust/switchboard-on-demand/src/program_id.rs new file mode 100644 index 0000000..bbdd820 --- /dev/null +++ b/rust/switchboard-on-demand/src/program_id.rs @@ -0,0 +1,39 @@ +use crate::*; +use lazy_static::lazy_static; +use solana_program::pubkey::Pubkey; +#[allow(unused_imports)] +use std::str::FromStr; + +/// Program id for the Switchboard oracle program +/// SW1TCH7qEPTdLsDHRgPuMQjbQxKdH2aBStViMFnt64f +pub const SWITCHBOARD_PROGRAM_ID: Pubkey = pubkey!("SW1TCH7qEPTdLsDHRgPuMQjbQxKdH2aBStViMFnt64f"); + +pub const ON_DEMAND_MAINNET_PID: Pubkey = pubkey!("SBondMDrcV3K4kxZR1HNVT7osZxAHVHgYXL5Ze1oMUv"); +pub const ON_DEMAND_DEVNET_PID: Pubkey = pubkey!("Aio4gaXjXzJNVLtzwtNVmSqGKpANtXhybbkhtAC94ji2"); +// Program id for the Switchboard oracle program +// sbattyXrzedoNATfc4L31wC9Mhxsi1BmFhTiN8gDshx +#[cfg(not(feature = "pid_override"))] +lazy_static! { + pub static ref SWITCHBOARD_ON_DEMAND_PROGRAM_ID: Pubkey = + if cfg!(feature = "devnet") { + ON_DEMAND_DEVNET_PID + } else { + ON_DEMAND_MAINNET_PID + }; +} +#[cfg(feature = "pid_override")] +lazy_static! { + pub static ref _DEFAULT_PID: Pubkey = + Pubkey::from_str("SBondMDrcV3K4kxZR1HNVT7osZxAHVHgYXL5Ze1oMUv").unwrap(); + pub static ref SWITCHBOARD_ON_DEMAND_PROGRAM_ID: Pubkey = + Pubkey::from_str(&std::env::var("SWITCHBOARD_ON_DEMAND_PROGRAM_ID").unwrap_or_default()) + .unwrap_or(*_DEFAULT_PID); +} + +pub fn get_sb_program_id(cluster: &str) -> Pubkey { + if !cluster.starts_with("mainnet") { + ON_DEMAND_DEVNET_PID + } else { + ON_DEMAND_MAINNET_PID + } +} diff --git a/rust/switchboard-on-demand/src/sysvar/address_lookup_table.rs b/rust/switchboard-on-demand/src/sysvar/address_lookup_table.rs new file mode 100644 index 0000000..6f072d2 --- /dev/null +++ b/rust/switchboard-on-demand/src/sysvar/address_lookup_table.rs @@ -0,0 +1,37 @@ +use crate::cfg_client; + +cfg_client! { + use solana_program::address_lookup_table::state::AddressLookupTable; + use solana_program::address_lookup_table::AddressLookupTableAccount; + use solana_client::nonblocking::rpc_client::RpcClient; + use crate::OnDemandError; + use solana_sdk::pubkey::Pubkey; + + const LUT_SIGNER_SEED: &[u8] = b"LutSigner"; + + pub fn find_lut_signer(k: &Pubkey) -> Pubkey { + Pubkey::find_program_address( + &[LUT_SIGNER_SEED, k.as_ref()], + &solana_address_lookup_table_program::id()).0 + } + + pub fn find_lut_of(k: &Pubkey, lut_slot: u64) -> Pubkey { + Pubkey::find_program_address(&[ + find_lut_signer(k).as_ref(), + lut_slot.to_le_bytes().as_ref(), + ], &solana_address_lookup_table_program::id()).0 + } + + pub async fn fetch(client: &RpcClient, address: &Pubkey) -> Result { + let account = client.get_account_data(address) + .await + .map_err(|_| OnDemandError::AddressLookupTableFetchError)?; + let lut = AddressLookupTable::deserialize(&account) + .map_err(|_| OnDemandError::AddressLookupTableDeserializeError)?; + let out = AddressLookupTableAccount { + key: address.clone(), + addresses: lut.addresses.iter().cloned().collect(), + }; + Ok(out) + } +} diff --git a/rust/switchboard-on-demand/src/sysvar/mod.rs b/rust/switchboard-on-demand/src/sysvar/mod.rs new file mode 100644 index 0000000..28737e8 --- /dev/null +++ b/rust/switchboard-on-demand/src/sysvar/mod.rs @@ -0,0 +1,3 @@ +pub mod address_lookup_table; +#[allow(unused_imports)] +pub use address_lookup_table::*; diff --git a/rust/switchboard-on-demand/src/types.rs b/rust/switchboard-on-demand/src/types.rs new file mode 100644 index 0000000..72097a6 --- /dev/null +++ b/rust/switchboard-on-demand/src/types.rs @@ -0,0 +1,3 @@ +pub use crate::decimal::SwitchboardDecimal; + +pub use crate::on_demand::*; diff --git a/rust/switchboard-on-demand/src/utils.rs b/rust/switchboard-on-demand/src/utils.rs new file mode 100644 index 0000000..6c8dfdb --- /dev/null +++ b/rust/switchboard-on-demand/src/utils.rs @@ -0,0 +1,45 @@ +use crate::anchor_traits::*; +use solana_program::hash; +use solana_program::instruction::Instruction; +use solana_program::pubkey; +use solana_program::pubkey::Pubkey; + +pub const SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID: Pubkey = + pubkey!("ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL"); + +pub const SPL_TOKEN_PROGRAM_ID: Pubkey = + pubkey!("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"); + +pub fn find_associated_token_address(owner: &Pubkey, mint: &Pubkey) -> Pubkey { + let (akey, _bump) = Pubkey::find_program_address( + &[owner.as_ref(), SPL_TOKEN_PROGRAM_ID.as_ref(), mint.as_ref()], + &SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID, + ); + akey +} + +pub fn get_ixn_discriminator(ixn_name: &str) -> [u8; 8] { + let preimage = format!("global:{}", ixn_name); + let mut sighash = [0u8; 8]; + sighash.copy_from_slice(&solana_program::hash::hash(preimage.as_bytes()).to_bytes()[..8]); + sighash +} + +pub fn get_account_discriminator(account_name: &str) -> [u8; 8] { + let id = format!("account:{}", account_name); + hash::hash(id.as_bytes()).to_bytes()[..8] + .try_into() + .unwrap() +} + +pub fn build_ix( + program_id: &Pubkey, + accounts: &A, + params: &I, +) -> Instruction { + Instruction { + program_id: *program_id, + accounts: accounts.to_account_metas(None), + data: params.data(), + } +}